#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 #include namespace orbis { struct IpmiSession; struct IpmiClient; struct Thread; struct IpmiServer : RcBase { struct IpmiPacketInfo { ulong inputSize; uint type; uint clientKid; ptr eventHandler; }; static_assert(sizeof(IpmiPacketInfo) == 0x18); struct Packet { IpmiPacketInfo info; lwpid_t clientTid; Ref session; kvector message; }; struct ConnectionRequest { Ref client; slong clientTid{}; slong clientPid{}; slong serverTid{}; }; kmap tidToClientTid; 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 { struct MessageQueue { shared_cv messageCv; kdeque> messages; }; struct AsyncResponse { uint methodId; sint errorCode; kvector> data; }; kstring name; ptr clientImpl; ptr userData; Ref session; shared_mutex mutex; shared_cv sessionCv; shared_cv asyncResponseCv; shared_cv connectCv; std::optional connectionStatus{}; Process *process; kdeque messageQueues; kdeque eventFlags; kdeque asyncResponses; explicit IpmiClient(kstring name) : name(std::move(name)) {} }; struct IpmiSession : RcBase { struct SyncResponse { sint errorCode; std::uint32_t callerTid; kvector> data; }; ptr sessionImpl; ptr userData; Ref client; Ref server; shared_mutex mutex; shared_cv responseCv; kdeque syncResponses; uint expectedOutput{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); struct IpmiCreateClientConfig { orbis::uint64_t size; orbis::uint32_t unk[80]; orbis::ptr userData; }; static_assert(sizeof(IpmiCreateClientConfig) == 0x150); struct IpmiBufferInfo { ptr data; uint64_t capacity; uint64_t size; }; struct IpmiDataInfo { ptr data; uint64_t size; }; static_assert(sizeof(IpmiBufferInfo) == 0x18); static_assert(sizeof(IpmiDataInfo) == 0x10); struct IpmiSyncCallParams { uint32_t method; uint32_t numInData; uint32_t numOutData; uint32_t unk; ptr pInData; ptr pOutData; ptr pResult; uint32_t flags; }; static_assert(sizeof(IpmiSyncCallParams) == 0x30); struct [[gnu::packed]] IpmiSyncMessageHeader { orbis::ptr sessionImpl; orbis::uint pid; orbis::uint methodId; orbis::uint numInData; orbis::uint numOutData; }; struct [[gnu::packed]] IpmiAsyncMessageHeader { orbis::ptr sessionImpl; orbis::uint methodId; orbis::uint pid; orbis::uint numInData; }; static_assert(sizeof(IpmiSyncMessageHeader) == 0x18); struct IpmiCreateClientParams { ptr clientImpl; ptr name; ptr config; }; static_assert(sizeof(IpmiCreateClientParams) == 0x18); struct IpmiClientConnectParams { ptr userData; ulong userDataLen; ptr status; ptr arg3; }; static_assert(sizeof(IpmiClientConnectParams) == 0x20); ErrorCode ipmiCreateClient(Process *proc, void *clientImpl, const char *name, const IpmiCreateClientConfig &config, Ref &result); ErrorCode ipmiCreateServer(Process *proc, 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 sysIpmiClientInvokeAsyncMethod(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysImpiSessionRespondAsync(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientTryGetResult(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientGetMessage(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientTryGetMessage(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiSessionTrySendMessage(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientDisconnect(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 sysIpmiSessionGetClientAppId(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); SysResult sysIpmiClientGetName(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientWaitEventFlag(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiClientPollEventFlag(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); SysResult sysIpmiSessionSetEventFlag(Thread *thread, ptr result, uint kid, ptr params, uint64_t paramsSz); } // namespace orbis