From 797e989c33919b72e0a901c2f3d7d7007fea4a81 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sat, 6 Dec 2025 10:20:33 -0500 Subject: [PATCH] sysmodule: replace ipc with dynamic buffers to fix memory issues --- Source/sys-clk/common/src/client/ipc.c | 15 ++++++++--- Source/sys-clk/sysmodule/src/ipc_service.cpp | 28 +++++++++++++++----- Source/sys-clk/sysmodule/src/kip_handler.cpp | 3 +++ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Source/sys-clk/common/src/client/ipc.c b/Source/sys-clk/common/src/client/ipc.c index f8ab2281..32554682 100644 --- a/Source/sys-clk/common/src/client/ipc.c +++ b/Source/sys-clk/common/src/client/ipc.c @@ -111,7 +111,10 @@ Result sysclkIpcSetOverride(SysClkModule module, u32 hz) Result sysclkIpcGetProfiles(u64 tid, SysClkTitleProfileList* out_profiles) { - return serviceDispatchInOut(&g_sysclkSrv, SysClkIpcCmd_GetProfiles, tid, *out_profiles); + return serviceDispatchIn(&g_sysclkSrv, SysClkIpcCmd_GetProfiles, tid, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = {{out_profiles, sizeof(SysClkTitleProfileList)}}, + ); } Result sysclkIpcSetProfiles(u64 tid, SysClkTitleProfileList* profiles) @@ -124,12 +127,18 @@ Result sysclkIpcSetProfiles(u64 tid, SysClkTitleProfileList* profiles) Result sysclkIpcGetConfigValues(SysClkConfigValueList* out_configValues) { - return serviceDispatchOut(&g_sysclkSrv, SysClkIpcCmd_GetConfigValues, *out_configValues); + return serviceDispatch(&g_sysclkSrv, SysClkIpcCmd_GetConfigValues, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = {{out_configValues, sizeof(SysClkConfigValueList)}}, + ); } Result sysclkIpcSetConfigValues(SysClkConfigValueList* configValues) { - return serviceDispatchIn(&g_sysclkSrv, SysClkIpcCmd_SetConfigValues, *configValues); + return serviceDispatch(&g_sysclkSrv, SysClkIpcCmd_SetConfigValues, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_In }, + .buffers = {{configValues, sizeof(SysClkConfigValueList)}}, + ); } Result sysclkIpcGetFreqList(SysClkModule module, u32* list, u32 maxCount, u32* outCount) diff --git a/Source/sys-clk/sysmodule/src/ipc_service.cpp b/Source/sys-clk/sysmodule/src/ipc_service.cpp index ca88daae..5c3b3f66 100644 --- a/Source/sys-clk/sysmodule/src/ipc_service.cpp +++ b/Source/sys-clk/sysmodule/src/ipc_service.cpp @@ -134,10 +134,13 @@ Result IpcService::ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8* break; case SysClkIpcCmd_GetProfiles: - if(r->data.size >= sizeof(std::uint64_t)) + if(r->data.size >= sizeof(std::uint64_t) && r->hipc.meta.num_recv_buffers >= 1) { - *out_dataSize = sizeof(SysClkTitleProfileList); - return ipcSrv->GetProfiles((std::uint64_t*)r->data.ptr, (SysClkTitleProfileList*)out_data); + size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); + if(bufSize >= sizeof(SysClkTitleProfileList)) + { + return ipcSrv->GetProfiles((std::uint64_t*)r->data.ptr, (SysClkTitleProfileList*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + } } break; @@ -163,13 +166,24 @@ Result IpcService::ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8* break; case SysClkIpcCmd_GetConfigValues: - *out_dataSize = sizeof(SysClkConfigValueList); // bug in stock sys-clk. really stupid bug :skull: - return ipcSrv->GetConfigValues((SysClkConfigValueList*)out_data); + if(r->hipc.meta.num_recv_buffers >= 1) + { + size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers); + if(bufSize >= sizeof(SysClkConfigValueList)) + { + return ipcSrv->GetConfigValues((SysClkConfigValueList*)hipcGetBufferAddress(r->hipc.data.recv_buffers)); + } + } + break; case SysClkIpcCmd_SetConfigValues: - if(r->data.size >= sizeof(SysClkConfigValueList)) + if(r->hipc.meta.num_send_buffers >= 1) { - return ipcSrv->SetConfigValues((SysClkConfigValueList*)r->data.ptr); + size_t bufSize = hipcGetBufferSize(r->hipc.data.send_buffers); + if(bufSize >= sizeof(SysClkConfigValueList)) + { + return ipcSrv->SetConfigValues((SysClkConfigValueList*)hipcGetBufferAddress(r->hipc.data.send_buffers)); + } } break; case SysClkIpcCmd_GetFreqList: diff --git a/Source/sys-clk/sysmodule/src/kip_handler.cpp b/Source/sys-clk/sysmodule/src/kip_handler.cpp index 56c02c1f..dd60cffd 100644 --- a/Source/sys-clk/sysmodule/src/kip_handler.cpp +++ b/Source/sys-clk/sysmodule/src/kip_handler.cpp @@ -196,6 +196,7 @@ bool KipHandler::writeKip() { writeU32(data.custRev); writeU32(data.mtcConf); + writeU32(data.hpMode); writeU32(data.commonCpuBoostClock); writeU32(data.commonEmcMemVolt); writeU32(data.eristaCpuMaxVolt); @@ -230,6 +231,8 @@ bool KipHandler::writeKip() { writeU32(data.marikoGpuVmin); writeU32(data.marikoGpuVmax); + writeU32(data.marikoGpuFullUnlock); + // GPU voltages Mariko writeU32(data.g_volt_76800); writeU32(data.g_volt_153600);