mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2025-10-11 21:17:44 +00:00
This commit is contained in:
commit
7bd606bece
16 changed files with 798 additions and 136 deletions
|
@ -84,6 +84,7 @@ private:
|
|||
std::array<u64, 4> m_entropy{};
|
||||
bool m_is_signaled{};
|
||||
bool m_is_initialized{};
|
||||
u32 m_pointer_buffer_size = 0x8000; // Default pointer buffer size (can be game-specific later)
|
||||
bool m_is_application{};
|
||||
bool m_is_default_application_system_resource{};
|
||||
bool m_is_hbl{};
|
||||
|
@ -239,6 +240,14 @@ public:
|
|||
m_is_suspended = suspended;
|
||||
}
|
||||
|
||||
u32 GetPointerBufferSize() const {
|
||||
return m_pointer_buffer_size;
|
||||
}
|
||||
|
||||
void SetPointerBufferSize(u32 size) {
|
||||
m_pointer_buffer_size = size;
|
||||
}
|
||||
|
||||
Result Terminate();
|
||||
|
||||
bool IsTerminated() const {
|
||||
|
|
|
@ -38,7 +38,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Ap
|
|||
{30, nullptr, "GetHomeButtonReaderLockAccessor"},
|
||||
{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"},
|
||||
{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"},
|
||||
{40, D<&ICommonStateGetter::GetCradleFwVersion>, "GetCradleFwVersion"},
|
||||
{40, nullptr, "GetCradleFwVersion"},
|
||||
{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"},
|
||||
{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"},
|
||||
{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"},
|
||||
|
@ -172,17 +172,6 @@ Result ICommonStateGetter::GetBootMode(Out<PM::SystemBootMode> out_boot_mode) {
|
|||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ICommonStateGetter::GetCradleFwVersion(OutArray<uint32_t, 4> out_version) {
|
||||
LOG_DEBUG(Service_AM, "(STUBBED) called");
|
||||
|
||||
out_version[0] = 0;
|
||||
out_version[1] = 0;
|
||||
out_version[2] = 0;
|
||||
out_version[3] = 0;
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ICommonStateGetter::IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled) {
|
||||
LOG_DEBUG(Service_AM, "called");
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@ private:
|
|||
Result GetHdcpAuthenticationStateChangeEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||
Result GetOperationMode(Out<OperationMode> out_operation_mode);
|
||||
Result GetPerformanceMode(Out<APM::PerformanceMode> out_performance_mode);
|
||||
Result GetCradleFwVersion(OutArray<uint32_t, 4> out_version);
|
||||
Result GetBootMode(Out<PM::SystemBootMode> out_boot_mode);
|
||||
Result IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled);
|
||||
Result SetVrModeEnabled(bool is_vr_mode_enabled);
|
||||
|
|
|
@ -68,13 +68,46 @@ void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Controller::QueryPointerBufferSize(HLERequestContext& ctx) {
|
||||
LOG_WARNING(Service, "(STUBBED) called");
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto* process = Kernel::GetCurrentProcessPointer(kernel);
|
||||
ASSERT(process != nullptr);
|
||||
|
||||
u32 buffer_size = process->GetPointerBufferSize();
|
||||
if (buffer_size > std::numeric_limits<u16>::max()) {
|
||||
LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
|
||||
buffer_size = std::numeric_limits<u16>::max();
|
||||
}
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.Push<u16>(0x8000);
|
||||
rb.Push<u16>(static_cast<u16>(buffer_size));
|
||||
}
|
||||
|
||||
void Controller::SetPointerBufferSize(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto* process = Kernel::GetCurrentProcessPointer(kernel);
|
||||
ASSERT(process != nullptr);
|
||||
|
||||
IPC::RequestParser rp{ctx};
|
||||
|
||||
u32 requested_size = rp.PopRaw<u32>();
|
||||
|
||||
if (requested_size > std::numeric_limits<u16>::max()) {
|
||||
LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
|
||||
requested_size = std::numeric_limits<u16>::max();
|
||||
}
|
||||
|
||||
process->SetPointerBufferSize(requested_size);
|
||||
|
||||
LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 2};
|
||||
rb.Push(ResultSuccess);
|
||||
}
|
||||
|
||||
|
||||
// https://switchbrew.org/wiki/IPC_Marshalling
|
||||
Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {
|
||||
static const FunctionInfo functions[] = {
|
||||
|
@ -83,6 +116,7 @@ Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcCo
|
|||
{2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
|
||||
{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
|
||||
{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
|
||||
{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"},
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ private:
|
|||
void CloneCurrentObject(HLERequestContext& ctx);
|
||||
void CloneCurrentObjectEx(HLERequestContext& ctx);
|
||||
void QueryPointerBufferSize(HLERequestContext& ctx);
|
||||
void SetPointerBufferSize(HLERequestContext& ctx);
|
||||
};
|
||||
|
||||
} // namespace Service::SM
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue