#pragma once #include "KernelAllocator.hpp" #include "evf.hpp" #include "orbis-config.hpp" #include "orbis/utils/SharedCV.hpp" #include "orbis/utils/SharedMutex.hpp" #include "utils/Rc.hpp" #include namespace orbis { struct IpmiSession; struct IpmiClient; struct Thread; struct IpmiServer : RcBase { struct IpmiPacketInfo { ptr userData; uint type; uint clientKid; ptr eventHandler; }; static_assert(sizeof(IpmiPacketInfo) == 0x18); struct Packet { IpmiPacketInfo info; kvector message; }; struct ConnectionRequest { Ref client; slong clientTid{}; slong clientPid{}; slong serverTid{}; }; kstring name; ptr serverImpl; ptr eventHandler; ptr userData; shared_mutex mutex; shared_cv receiveCv; sint pid; kdeque packets; std::list> connectionRequests; explicit IpmiServer(kstring name) : name(std::move(name)) {} }; struct IpmiClient : RcBase { kstring name; ptr clientImpl; ptr userData; Ref session; shared_mutex mutex; shared_cv sessionCv; sint pid; explicit IpmiClient(kstring name) : name(std::move(name)) {} }; struct IpmiSession : RcBase { struct MessageResponse { sint errorCode; kvector data; }; ptr sessionImpl; ptr userData; Ref client; Ref server; shared_mutex mutex; shared_cv responseCv; kdeque messageResponses; EventFlag evf{0, 0}; shared_cv connectCv; bool expectedOutput = false; // TODO: verify bool connected = false; // TODO: implement more states sint connectionStatus{0}; }; struct IpmiCreateServerConfig { orbis::uint64_t size; orbis::uint32_t unk1; orbis::uint32_t unk2; orbis::uint32_t unk3; orbis::uint32_t unk4; orbis::uint32_t enableMultipleServerThreads; orbis::uint32_t unk5; orbis::uint64_t unk6; orbis::ptr userData; orbis::ptr eventHandler; }; static_assert(sizeof(IpmiCreateServerConfig) == 0x38); ErrorCode ipmiCreateClient(Thread *thread, void *clientImpl, const char *name, void *config, Ref &result); ErrorCode ipmiCreateServer(Thread *thread, void *serverImpl, const char *name, const IpmiCreateServerConfig &config, Ref &result); ErrorCode ipmiCreateSession(Thread *thread, void *sessionImpl, ptr userData, Ref &result); SysResult sysIpmiCreateClient(Thread *thread, ptr result, ptr params, uint64_t paramsSz); SysResult sysIpmiCreateServer(Thread *thread, ptr result, ptr params, uint64_t paramsSz); SysResult sysIpmiCreateSession(Thread *thread, ptr result, ptr params, uint64_t paramsSz); SysResult sysIpmiDestroyClient(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiDestroyServer(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiDestroySession(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiServerReceivePacket(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiSendConnectResult(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiSessionRespondSync(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiSessionGetClientPid(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientInvokeSyncMethod(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientConnect(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiSessionGetUserData(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiServerGetName(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); } // namespace orbis