mirror of
https://github.com/mikage-emu/mikage-dev.git
synced 2025-01-06 21:40:59 +01:00
PXI: Migrate pxi:ps9 to ServiceHelper
This commit is contained in:
parent
ab198bcd61
commit
2b7ac71ab4
1 changed files with 12 additions and 38 deletions
|
@ -509,16 +509,19 @@ static std::tuple<Result> PSVerifyRsaSha256(FakeThread& thread, Context& context
|
|||
return std::make_tuple(RESULT_OK);
|
||||
}
|
||||
|
||||
static void PXIPSCommandHandler(FakeThread& thread, Context& context, const IPC::CommandHeader& header) try {
|
||||
static auto PXIPSCommandHandler(FakeThread& thread, Context& context, const IPC::CommandHeader& header) try {
|
||||
namespace PXIPS = Platform::PXI::PS;
|
||||
|
||||
switch (header.command_id) {
|
||||
case PXIPS::VerifyRsaSha256::id:
|
||||
return IPC::HandleIPCCommand<PXIPS::VerifyRsaSha256>(PSVerifyRsaSha256, thread, thread, context);
|
||||
IPC::HandleIPCCommand<PXIPS::VerifyRsaSha256>(PSVerifyRsaSha256, thread, thread, context);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw IPC::IPCError{header.raw, 0xdeadbef1};
|
||||
}
|
||||
|
||||
return OS::ServiceHelper::SendReply;
|
||||
} catch (const IPC::IPCError& err) {
|
||||
throw std::runtime_error(fmt::format("Unknown pxi:ps9 service command with header {:#010x}", err.header));
|
||||
}
|
||||
|
@ -534,44 +537,15 @@ void FakePXI::PSThread(FakeThread& thread, Context& context) {
|
|||
thread.WriteTLS(0x184 + 8 * buffer_index, buffer_addr);
|
||||
}
|
||||
|
||||
OS::ServiceUtil service(thread, "pxi:ps9", 1);
|
||||
OS::ServiceHelper service;
|
||||
service.Append(OS::ServiceUtil::SetupService(thread, "pxi:ps9", 1));
|
||||
|
||||
OS::Handle last_signalled = OS::HANDLE_INVALID;
|
||||
auto InvokeCommandHandler = [&context](FakeThread& thread, uint32_t /* index of signalled handle */) {
|
||||
Platform::IPC::CommandHeader header = { thread.ReadTLS(0x80) };
|
||||
return PXIPSCommandHandler(thread, context, header);
|
||||
};
|
||||
|
||||
for (;;) {
|
||||
Result result;
|
||||
int32_t index;
|
||||
std::tie(result,index) = service.ReplyAndReceive(thread, last_signalled);
|
||||
last_signalled = OS::HANDLE_INVALID;
|
||||
if (result != RESULT_OK)
|
||||
os.SVCBreak(thread, OSImpl::BreakReason::Panic);
|
||||
|
||||
if (index == 0) {
|
||||
// ServerPort: Incoming client connection
|
||||
|
||||
int32_t session_index;
|
||||
std::tie(result,session_index) = service.AcceptSession(thread, index);
|
||||
if (result != RESULT_OK) {
|
||||
auto session = service.GetObject<OS::ServerSession>(session_index);
|
||||
if (!session) {
|
||||
logger.error("{}Failed to accept session.", ThreadPrinter{thread});
|
||||
os.SVCBreak(thread, OSImpl::BreakReason::Panic);
|
||||
}
|
||||
|
||||
auto session_handle = service.GetHandle(session_index);
|
||||
logger.warn("{}Failed to accept session. Maximal number of sessions exhausted? Closing session handle {}",
|
||||
ThreadPrinter{thread}, OS::HandlePrinter{thread,session_handle});
|
||||
os.SVCCloseHandle(thread, session_handle);
|
||||
}
|
||||
} else {
|
||||
// server_session: Incoming IPC command from the indexed client
|
||||
logger.info("{}received IPC request, {:#08x}, {:#08x}, {:#08x}, {:#08x}", ThreadPrinter{thread}, thread.ReadTLS(0x80), thread.ReadTLS(0x84), thread.ReadTLS(0x88), thread.ReadTLS(0x8c));
|
||||
Platform::IPC::CommandHeader header = { thread.ReadTLS(0x80) };
|
||||
auto signalled_handle = service.GetHandle(index);
|
||||
PXIPSCommandHandler(thread, context, header);
|
||||
last_signalled = signalled_handle;
|
||||
}
|
||||
}
|
||||
service.Run(thread, std::move(InvokeCommandHandler));
|
||||
}
|
||||
|
||||
static std::tuple<Result> MCHandleUnknown0x1(FakeThread& thread, Context& context, uint32_t arg1) {
|
||||
|
|
Loading…
Reference in a new issue