Services/APT: Implemented the Store/LoadSysMenuArg functions.
They are called by the Home Menu during initialization. These functions will not see much use until we actually implement application jumping and system rebooting. For now we just need them to prevent some unmapped reads in the Home Menu due to the static buffers not being properly set up.
This commit is contained in:
parent
49a686faee
commit
0d8c3ee1d3
4 changed files with 65 additions and 4 deletions
|
@ -650,6 +650,37 @@ void Module::APTInterface::CloseLibraryApplet(Kernel::HLERequestContext& ctx) {
|
||||||
rb.Push(apt->applet_manager->CloseLibraryApplet(std::move(object), std::move(buffer)));
|
rb.Push(apt->applet_manager->CloseLibraryApplet(std::move(object), std::move(buffer)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Module::APTInterface::LoadSysMenuArg(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp(ctx, 0x36, 1, 0); // 0x00360040
|
||||||
|
const auto size = std::min(std::size_t{rp.Pop<u32>()}, SysMenuArgSize);
|
||||||
|
|
||||||
|
// This service function does not clear the buffer.
|
||||||
|
|
||||||
|
std::vector<u8> buffer(size);
|
||||||
|
std::copy_n(apt->sys_menu_arg_buffer.cbegin(), size, buffer.begin());
|
||||||
|
|
||||||
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
rb.PushStaticBuffer(std::move(buffer), 0);
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_APT, "called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Module::APTInterface::StoreSysMenuArg(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp(ctx, 0x37, 1, 2); // 0x00370042
|
||||||
|
const auto size = std::min(std::size_t{rp.Pop<u32>()}, SysMenuArgSize);
|
||||||
|
const auto& buffer = rp.PopStaticBuffer();
|
||||||
|
|
||||||
|
ASSERT_MSG(buffer.size() >= size, "Buffer too small to hold requested data");
|
||||||
|
|
||||||
|
std::copy_n(buffer.cbegin(), size, apt->sys_menu_arg_buffer.begin());
|
||||||
|
|
||||||
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_APT, "called");
|
||||||
|
}
|
||||||
|
|
||||||
void Module::APTInterface::SendCaptureBufferInfo(Kernel::HLERequestContext& ctx) {
|
void Module::APTInterface::SendCaptureBufferInfo(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp(ctx, 0x40, 1, 2); // 0x00400042
|
IPC::RequestParser rp(ctx, 0x40, 1, 2); // 0x00400042
|
||||||
u32 size = rp.Pop<u32>();
|
u32 size = rp.Pop<u32>();
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
|
@ -42,6 +43,8 @@ struct CaptureBufferInfo {
|
||||||
};
|
};
|
||||||
static_assert(sizeof(CaptureBufferInfo) == 0x20, "CaptureBufferInfo struct has incorrect size");
|
static_assert(sizeof(CaptureBufferInfo) == 0x20, "CaptureBufferInfo struct has incorrect size");
|
||||||
|
|
||||||
|
constexpr std::size_t SysMenuArgSize = 0x40;
|
||||||
|
|
||||||
enum class StartupArgumentType : u32 {
|
enum class StartupArgumentType : u32 {
|
||||||
OtherApp = 0,
|
OtherApp = 0,
|
||||||
Restart = 1,
|
Restart = 1,
|
||||||
|
@ -518,6 +521,32 @@ public:
|
||||||
*/
|
*/
|
||||||
void CloseLibraryApplet(Kernel::HLERequestContext& ctx);
|
void CloseLibraryApplet(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APT::LoadSysMenuArg service function
|
||||||
|
* Inputs:
|
||||||
|
* 0 : Command header [0x00360040]
|
||||||
|
* 1 : Buffer size
|
||||||
|
* Outputs:
|
||||||
|
* 0 : Header code
|
||||||
|
* 1 : Result code
|
||||||
|
* 64 : Size << 14 | 2
|
||||||
|
* 65 : void* Output Buffer
|
||||||
|
*/
|
||||||
|
void LoadSysMenuArg(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APT::StoreSysMenuArg service function
|
||||||
|
* Inputs:
|
||||||
|
* 0 : Command header [0x00370042]
|
||||||
|
* 1 : Buffer size
|
||||||
|
* 2 : (Size << 14) | 2
|
||||||
|
* 3 : Input buffer virtual address
|
||||||
|
* Outputs:
|
||||||
|
* 0 : Header code
|
||||||
|
* 1 : Result code
|
||||||
|
*/
|
||||||
|
void StoreSysMenuArg(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APT::SendCaptureBufferInfo service function
|
* APT::SendCaptureBufferInfo service function
|
||||||
* Inputs:
|
* Inputs:
|
||||||
|
@ -625,6 +654,7 @@ private:
|
||||||
u8 unknown_ns_state_field = 0;
|
u8 unknown_ns_state_field = 0;
|
||||||
|
|
||||||
std::vector<u8> screen_capture_buffer;
|
std::vector<u8> screen_capture_buffer;
|
||||||
|
std::array<u8, SysMenuArgSize> sys_menu_arg_buffer;
|
||||||
|
|
||||||
ScreencapPostPermission screen_capture_post_permission =
|
ScreencapPostPermission screen_capture_post_permission =
|
||||||
ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
|
ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value
|
||||||
|
|
|
@ -62,8 +62,8 @@ APT_S::APT_S(std::shared_ptr<Module> apt)
|
||||||
{0x00330000, &APT_S::GetProgramIdOnApplicationJump, "GetProgramIdOnApplicationJump"},
|
{0x00330000, &APT_S::GetProgramIdOnApplicationJump, "GetProgramIdOnApplicationJump"},
|
||||||
{0x00340084, nullptr, "SendDeliverArg"},
|
{0x00340084, nullptr, "SendDeliverArg"},
|
||||||
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
||||||
{0x00360040, nullptr, "LoadSysMenuArg"},
|
{0x00360040, &APT_S::LoadSysMenuArg, "LoadSysMenuArg"},
|
||||||
{0x00370042, nullptr, "StoreSysMenuArg"},
|
{0x00370042, &APT_S::StoreSysMenuArg, "StoreSysMenuArg"},
|
||||||
{0x00380040, nullptr, "PreloadResidentApplet"},
|
{0x00380040, nullptr, "PreloadResidentApplet"},
|
||||||
{0x00390040, nullptr, "PrepareToStartResidentApplet"},
|
{0x00390040, nullptr, "PrepareToStartResidentApplet"},
|
||||||
{0x003A0044, nullptr, "StartResidentApplet"},
|
{0x003A0044, nullptr, "StartResidentApplet"},
|
||||||
|
|
|
@ -62,8 +62,8 @@ APT_U::APT_U(std::shared_ptr<Module> apt)
|
||||||
{0x00330000, &APT_U::GetProgramIdOnApplicationJump, "GetProgramIdOnApplicationJump"},
|
{0x00330000, &APT_U::GetProgramIdOnApplicationJump, "GetProgramIdOnApplicationJump"},
|
||||||
{0x00340084, nullptr, "SendDeliverArg"},
|
{0x00340084, nullptr, "SendDeliverArg"},
|
||||||
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
{0x00350080, nullptr, "ReceiveDeliverArg"},
|
||||||
{0x00360040, nullptr, "LoadSysMenuArg"},
|
{0x00360040, &APT_U::LoadSysMenuArg, "LoadSysMenuArg"},
|
||||||
{0x00370042, nullptr, "StoreSysMenuArg"},
|
{0x00370042, &APT_U::StoreSysMenuArg, "StoreSysMenuArg"},
|
||||||
{0x00380040, nullptr, "PreloadResidentApplet"},
|
{0x00380040, nullptr, "PreloadResidentApplet"},
|
||||||
{0x00390040, nullptr, "PrepareToStartResidentApplet"},
|
{0x00390040, nullptr, "PrepareToStartResidentApplet"},
|
||||||
{0x003A0044, nullptr, "StartResidentApplet"},
|
{0x003A0044, nullptr, "StartResidentApplet"},
|
||||||
|
|
Loading…
Reference in a new issue