sysmodule: replace ipc with dynamic buffers to fix memory issues

This commit is contained in:
souldbminersmwc
2025-12-06 10:20:33 -05:00
parent 71130997fe
commit 797e989c33
3 changed files with 36 additions and 10 deletions

View File

@@ -111,7 +111,10 @@ Result sysclkIpcSetOverride(SysClkModule module, u32 hz)
Result sysclkIpcGetProfiles(u64 tid, SysClkTitleProfileList* out_profiles) 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) Result sysclkIpcSetProfiles(u64 tid, SysClkTitleProfileList* profiles)
@@ -124,12 +127,18 @@ Result sysclkIpcSetProfiles(u64 tid, SysClkTitleProfileList* profiles)
Result sysclkIpcGetConfigValues(SysClkConfigValueList* out_configValues) 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) 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) Result sysclkIpcGetFreqList(SysClkModule module, u32* list, u32 maxCount, u32* outCount)

View File

@@ -134,10 +134,13 @@ Result IpcService::ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8*
break; break;
case SysClkIpcCmd_GetProfiles: 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); size_t bufSize = hipcGetBufferSize(r->hipc.data.recv_buffers);
return ipcSrv->GetProfiles((std::uint64_t*)r->data.ptr, (SysClkTitleProfileList*)out_data); if(bufSize >= sizeof(SysClkTitleProfileList))
{
return ipcSrv->GetProfiles((std::uint64_t*)r->data.ptr, (SysClkTitleProfileList*)hipcGetBufferAddress(r->hipc.data.recv_buffers));
}
} }
break; break;
@@ -163,13 +166,24 @@ Result IpcService::ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8*
break; break;
case SysClkIpcCmd_GetConfigValues: case SysClkIpcCmd_GetConfigValues:
*out_dataSize = sizeof(SysClkConfigValueList); // bug in stock sys-clk. really stupid bug :skull: if(r->hipc.meta.num_recv_buffers >= 1)
return ipcSrv->GetConfigValues((SysClkConfigValueList*)out_data); {
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: 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; break;
case SysClkIpcCmd_GetFreqList: case SysClkIpcCmd_GetFreqList:

View File

@@ -196,6 +196,7 @@ bool KipHandler::writeKip() {
writeU32(data.custRev); writeU32(data.custRev);
writeU32(data.mtcConf); writeU32(data.mtcConf);
writeU32(data.hpMode);
writeU32(data.commonCpuBoostClock); writeU32(data.commonCpuBoostClock);
writeU32(data.commonEmcMemVolt); writeU32(data.commonEmcMemVolt);
writeU32(data.eristaCpuMaxVolt); writeU32(data.eristaCpuMaxVolt);
@@ -230,6 +231,8 @@ bool KipHandler::writeKip() {
writeU32(data.marikoGpuVmin); writeU32(data.marikoGpuVmin);
writeU32(data.marikoGpuVmax); writeU32(data.marikoGpuVmax);
writeU32(data.marikoGpuFullUnlock);
// GPU voltages Mariko // GPU voltages Mariko
writeU32(data.g_volt_76800); writeU32(data.g_volt_76800);
writeU32(data.g_volt_153600); writeU32(data.g_volt_153600);