service/apt: Implement soft reset & CloseApplication
This commit is contained in:
parent
ca701e2610
commit
ad6b140cb0
9 changed files with 160 additions and 12 deletions
|
@ -543,6 +543,65 @@ void Module::Interface::StartLibraryApplet(Kernel::HLERequestContext& ctx) {
|
|||
rb.Push(apt->applet_manager->StartLibraryApplet(applet_id, object, buffer));
|
||||
}
|
||||
|
||||
void Module::Interface::CloseApplication(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x27, 1, 4);
|
||||
u32 parameters_size = rp.Pop<u32>();
|
||||
Kernel::SharedPtr<Kernel::Object> object = rp.PopGenericObject();
|
||||
std::vector<u8> buffer = rp.PopStaticBuffer();
|
||||
|
||||
LOG_DEBUG(Service_APT, "called");
|
||||
|
||||
Core::System::GetInstance().RequestShutdown();
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
}
|
||||
|
||||
void Module::Interface::PrepareToDoApplicationJump(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x31, 4, 0);
|
||||
u32 flags = rp.Pop<u8>();
|
||||
u32 program_id_low = rp.Pop<u32>();
|
||||
u32 program_id_high = rp.Pop<u32>();
|
||||
Service::FS::MediaType media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
|
||||
LOG_WARNING(Service_APT,
|
||||
"(STUBBED) called, flags={:08X}, program_id_low={:08X}, program_id_high={:08X}, "
|
||||
"media_type={:08X}",
|
||||
flags, program_id_low, program_id_high, static_cast<u8>(media_type));
|
||||
|
||||
if (flags == 0x2) {
|
||||
// It seems that flags 0x2 means jumping to the same application,
|
||||
// and ignore the parameters. This is used in Pokemon main series
|
||||
// to soft reset.
|
||||
application_reset_prepared = true;
|
||||
}
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
}
|
||||
|
||||
void Module::Interface::DoApplicationJump(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x32, 2, 4);
|
||||
u32 parameter_size = rp.Pop<u32>();
|
||||
u32 hmac_size = rp.Pop<u32>();
|
||||
std::vector<u8> parameter = rp.PopStaticBuffer();
|
||||
std::vector<u8> hmac = rp.PopStaticBuffer();
|
||||
|
||||
LOG_WARNING(Service_APT, "(STUBBED) called");
|
||||
|
||||
if (application_reset_prepared) {
|
||||
// Reset system
|
||||
Core::System::GetInstance().RequestReset();
|
||||
} else {
|
||||
// After the jump, the application should shutdown
|
||||
// TODO: Actually implement the jump
|
||||
Core::System::GetInstance().RequestShutdown();
|
||||
}
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
}
|
||||
|
||||
void Module::Interface::CancelLibraryApplet(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x3B, 1, 0); // 0x003B0040
|
||||
bool exiting = rp.Pop<bool>();
|
||||
|
|
|
@ -409,6 +409,49 @@ public:
|
|||
*/
|
||||
void StartLibraryApplet(Kernel::HLERequestContext& ctx);
|
||||
|
||||
/**
|
||||
* APT::CloseApplication service function
|
||||
* Inputs:
|
||||
* 0 : Command header [0x00270044]
|
||||
* 1 : Parameters Size
|
||||
* 2 : 0x0
|
||||
* 3 : Handle Parameter
|
||||
* 4 : (Parameters Size << 14) | 2
|
||||
* 5 : void*, Parameters
|
||||
* Outputs:
|
||||
* 1 : Result of function, 0 on success, otherwise error code
|
||||
*/
|
||||
void CloseApplication(Kernel::HLERequestContext& ctx);
|
||||
|
||||
/**
|
||||
* APT::PrepareToDoApplicationJump service function
|
||||
* Inputs:
|
||||
* 0 : Command header [0x00310100]
|
||||
* 1 : Flags
|
||||
* 2 : Program ID low
|
||||
* 3 : Program ID high
|
||||
* 4 : Media type
|
||||
* Outputs:
|
||||
* 1 : Result of function, 0 on success, otherwise error code
|
||||
* @param ctx
|
||||
*/
|
||||
void PrepareToDoApplicationJump(Kernel::HLERequestContext& ctx);
|
||||
|
||||
/**
|
||||
* APT::DoApplicationJump service function
|
||||
* Inputs:
|
||||
* 0 : Command header [0x00320084]
|
||||
* 1 : Parameter Size (capped to 0x300)
|
||||
* 2 : HMAC Size (capped to 0x20)
|
||||
* 3 : (Parameter Size << 14) | 2
|
||||
* 4 : void*, Parameter
|
||||
* 5 : (HMAC Size << 14) | 0x802
|
||||
* 6 : void*, HMAC
|
||||
* Outputs:
|
||||
* 1 : Result of function, 0 on success, otherwise error code
|
||||
*/
|
||||
void DoApplicationJump(Kernel::HLERequestContext& ctx);
|
||||
|
||||
/**
|
||||
* APT::CancelLibraryApplet service function
|
||||
* Inputs:
|
||||
|
@ -533,6 +576,7 @@ public:
|
|||
|
||||
private:
|
||||
std::shared_ptr<Module> apt;
|
||||
bool application_reset_prepared{};
|
||||
};
|
||||
|
||||
private:
|
||||
|
|
|
@ -48,7 +48,7 @@ APT_A::APT_A(std::shared_ptr<Module> apt)
|
|||
{0x00240044, nullptr, "JumpToApplication"},
|
||||
{0x002500C0, &APT_A::PrepareToCloseLibraryApplet, "PrepareToCloseLibraryApplet"},
|
||||
{0x00260000, nullptr, "PrepareToCloseSystemApplet"},
|
||||
{0x00270044, nullptr, "CloseApplication"},
|
||||
{0x00270044, &APT_A::CloseApplication, "CloseApplication"},
|
||||
{0x00280044, &APT_A::CloseLibraryApplet, "CloseLibraryApplet"},
|
||||
{0x00290044, nullptr, "CloseSystemApplet"},
|
||||
{0x002A0000, nullptr, "OrderToCloseSystemApplet"},
|
||||
|
@ -58,8 +58,8 @@ APT_A::APT_A(std::shared_ptr<Module> apt)
|
|||
{0x002E0044, nullptr, "LeaveHomeMenu"},
|
||||
{0x002F0040, nullptr, "PrepareToLeaveResidentApplet"},
|
||||
{0x00300044, nullptr, "LeaveResidentApplet"},
|
||||
{0x00310100, nullptr, "PrepareToDoApplicationJump"},
|
||||
{0x00320084, nullptr, "DoApplicationJump"},
|
||||
{0x00310100, &APT_A::PrepareToDoApplicationJump, "PrepareToDoApplicationJump"},
|
||||
{0x00320084, &APT_A::DoApplicationJump, "DoApplicationJump"},
|
||||
{0x00330000, nullptr, "GetProgramIdOnApplicationJump"},
|
||||
{0x00340084, nullptr, "SendDeliverArg"},
|
||||
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
||||
|
|
|
@ -48,7 +48,7 @@ APT_S::APT_S(std::shared_ptr<Module> apt)
|
|||
{0x00240044, nullptr, "JumpToApplication"},
|
||||
{0x002500C0, nullptr, "PrepareToCloseLibraryApplet"},
|
||||
{0x00260000, nullptr, "PrepareToCloseSystemApplet"},
|
||||
{0x00270044, nullptr, "CloseApplication"},
|
||||
{0x00270044, &APT_S::CloseApplication, "CloseApplication"},
|
||||
{0x00280044, nullptr, "CloseLibraryApplet"},
|
||||
{0x00290044, nullptr, "CloseSystemApplet"},
|
||||
{0x002A0000, nullptr, "OrderToCloseSystemApplet"},
|
||||
|
@ -58,8 +58,8 @@ APT_S::APT_S(std::shared_ptr<Module> apt)
|
|||
{0x002E0044, nullptr, "LeaveHomeMenu"},
|
||||
{0x002F0040, nullptr, "PrepareToLeaveResidentApplet"},
|
||||
{0x00300044, nullptr, "LeaveResidentApplet"},
|
||||
{0x00310100, nullptr, "PrepareToDoApplicationJump"},
|
||||
{0x00320084, nullptr, "DoApplicationJump"},
|
||||
{0x00310100, &APT_S::PrepareToDoApplicationJump, "PrepareToDoApplicationJump"},
|
||||
{0x00320084, &APT_S::DoApplicationJump, "DoApplicationJump"},
|
||||
{0x00330000, nullptr, "GetProgramIdOnApplicationJump"},
|
||||
{0x00340084, nullptr, "SendDeliverArg"},
|
||||
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
||||
|
|
|
@ -48,7 +48,7 @@ APT_U::APT_U(std::shared_ptr<Module> apt)
|
|||
{0x00240044, nullptr, "JumpToApplication"},
|
||||
{0x002500C0, &APT_U::PrepareToCloseLibraryApplet, "PrepareToCloseLibraryApplet"},
|
||||
{0x00260000, nullptr, "PrepareToCloseSystemApplet"},
|
||||
{0x00270044, nullptr, "CloseApplication"},
|
||||
{0x00270044, &APT_U::CloseApplication, "CloseApplication"},
|
||||
{0x00280044, &APT_U::CloseLibraryApplet, "CloseLibraryApplet"},
|
||||
{0x00290044, nullptr, "CloseSystemApplet"},
|
||||
{0x002A0000, nullptr, "OrderToCloseSystemApplet"},
|
||||
|
@ -58,8 +58,8 @@ APT_U::APT_U(std::shared_ptr<Module> apt)
|
|||
{0x002E0044, nullptr, "LeaveHomeMenu"},
|
||||
{0x002F0040, nullptr, "PrepareToLeaveResidentApplet"},
|
||||
{0x00300044, nullptr, "LeaveResidentApplet"},
|
||||
{0x00310100, nullptr, "PrepareToDoApplicationJump"},
|
||||
{0x00320084, nullptr, "DoApplicationJump"},
|
||||
{0x00310100, &APT_U::PrepareToDoApplicationJump, "PrepareToDoApplicationJump"},
|
||||
{0x00320084, &APT_U::DoApplicationJump, "DoApplicationJump"},
|
||||
{0x00330000, nullptr, "GetProgramIdOnApplicationJump"},
|
||||
{0x00340084, nullptr, "SendDeliverArg"},
|
||||
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue