diff --git a/sysmodules/pm/source/launch.c b/sysmodules/pm/source/launch.c index be6accf..efc40a4 100644 --- a/sysmodules/pm/source/launch.c +++ b/sysmodules/pm/source/launch.c @@ -218,8 +218,9 @@ static Result launchTitleImpl(Handle *debug, ProcessData **outProcessData, const programInfoUpdate = (launchFlags & PMLAUNCHFLAG_USE_UPDATE_TITLE) ? programInfoUpdate : programInfo; TRY(registerProgram(&programHandle, programInfo, programInfoUpdate)); + u32 coreVer = OS_KernelConfig->kernel_syscore_ver; res = LOADER_GetProgramInfo(exheaderInfo, programHandle); - res = R_SUCCEEDED(res) && SYSCOREVER == 2 && exheaderInfo->aci.local_caps.core_info.core_version != SYSCOREVER ? (Result)0xC8A05800 : res; + res = R_SUCCEEDED(res) && coreVer == 2 && exheaderInfo->aci.local_caps.core_info.core_version != coreVer ? (Result)0xC8A05800 : res; if (R_FAILED(res)) { LOADER_UnregisterProgram(programHandle); @@ -227,7 +228,7 @@ static Result launchTitleImpl(Handle *debug, ProcessData **outProcessData, const } // Change APPMEMALLOC if needed - if (IS_N3DS && APPMEMTYPE == 6 && (launchFlags & PMLAUNCHFLAG_NORMAL_APPLICATION) != 0) { + if (IS_N3DS && OS_KernelConfig->app_memtype == 6 && (launchFlags & PMLAUNCHFLAG_NORMAL_APPLICATION) != 0) { u32 limitMb; SystemMode n3dsSystemMode = exheaderInfo->aci.local_caps.core_info.n3ds_system_mode; bool forceO3dsAppMem = (launchFlags & PMLAUNCHFLAG_FORCE_USE_O3DS_APP_MEM) != 0; @@ -332,9 +333,11 @@ Result LaunchTitle(u32 *outPid, const FS_ProgramInfo *programInfo, u32 launchFla u32 tidh = (u32)(programInfo->programId >> 32); u32 tidl = (u32)programInfo->programId; - if ((tidh == 0x00040030 || tidh == 0x00040130) && (tidl & 0xFF) != SYSCOREVER) { + u32 coreVer = OS_KernelConfig->kernel_syscore_ver; + if (coreVer == 2 && (tidh == 0x00040030 || tidh == 0x00040130) && (tidl & 0xFF) != coreVer) { // Panic if launching SAFE_MODE sysmodules or applets (note: exheader syscorever check above only done for applications in official PM) // Official PM also hardcodes SYSCOREVER = 2 here. + // NATIVE_FIRM-only. panic(4); } @@ -520,8 +523,8 @@ Result autolaunchSysmodules(void) FS_ProgramInfo programInfo = { .mediaType = MEDIATYPE_NAND }; // Launch NS - if (NSTID != 0) { - programInfo.programId = NSTID; + if (OS_KernelConfig->ns_tid != 0) { + programInfo.programId = OS_KernelConfig->ns_tid; TRY(launchTitleImplWrapper(NULL, NULL, &programInfo, &programInfo, PMLAUNCHFLAG_LOAD_DEPENDENCIES)); } diff --git a/sysmodules/pm/source/process_monitor.c b/sysmodules/pm/source/process_monitor.c index cf65958..c2847d6 100644 --- a/sysmodules/pm/source/process_monitor.c +++ b/sysmodules/pm/source/process_monitor.c @@ -29,7 +29,7 @@ static void cleanupProcess(ProcessData *process) ProcessList_Lock(&g_manager.processList); if (g_manager.runningApplicationData != NULL && process->handle == g_manager.runningApplicationData->handle) { - if (IS_N3DS && APPMEMTYPE == 6) { + if (IS_N3DS && OS_KernelConfig->app_memtype == 6) { assertSuccess(resetAppMemLimit()); } g_manager.runningApplicationData = NULL; diff --git a/sysmodules/pm/source/reslimit.c b/sysmodules/pm/source/reslimit.c index 824c1aa..4dad971 100644 --- a/sysmodules/pm/source/reslimit.c +++ b/sysmodules/pm/source/reslimit.c @@ -252,7 +252,8 @@ static ReslimitValues *fixupReslimitValues(void) // Note: we lie in the reslimit and make as if neither KExt nor Roslina existed, to avoid breakage - u32 sysmemalloc = SYSMEMALLOC + (hasKExt() ? getStolenSystemMemRegionSize() : 0); + u32 appmemalloc = OS_KernelConfig->memregion_sz[0]; + u32 sysmemalloc = OS_KernelConfig->memregion_sz[1] + (hasKExt() ? getStolenSystemMemRegionSize() : 0); ReslimitValues *values = !IS_N3DS ? g_o3dsReslimitValues : g_n3dsReslimitValues; static const u32 minAppletMemAmount = 0x1200000; @@ -261,7 +262,7 @@ static ReslimitValues *fixupReslimitValues(void) u32 baseRegionSize = !IS_N3DS ? 0x1400000 : 0x2000000; if (sysmemalloc < minAppletMemAmount) { - values[1][0] = SYSMEMALLOC - minAppletMemAmount / 3; + values[1][0] = sysmemalloc - minAppletMemAmount / 3; values[2][0] = 0; values[3][0] = baseRegionSize + otherMinOvercommitAmount; } else { @@ -271,8 +272,8 @@ static ReslimitValues *fixupReslimitValues(void) values[3][0] = baseRegionSize + (otherMinOvercommitAmount + excess / 4); } - values[0][0] = APPMEMALLOC; - g_defaultAppMemLimit = APPMEMALLOC; + values[0][0] = appmemalloc; + g_defaultAppMemLimit = appmemalloc; return values; } diff --git a/sysmodules/pm/source/util.h b/sysmodules/pm/source/util.h index 0a3cf20..4618a4c 100644 --- a/sysmodules/pm/source/util.h +++ b/sysmodules/pm/source/util.h @@ -8,13 +8,7 @@ #define REG32(reg) (*(vu32 *)reg) #define REG64(reg) (*(vu64 *)reg) -#define NSTID REG64(0x1FF80008) -#define SYSCOREVER REG32(0x1FF80010) -#define APPMEMTYPE REG32(0x1FF80030) -#define APPMEMALLOC REG32(0x1FF80040) -#define SYSMEMALLOC REG32(0x1FF80044) - -#define IS_N3DS (*(vu32 *)0x1FF80030 >= 6) // APPMEMTYPE. Hacky but doesn't use APT +#define IS_N3DS (OS_KernelConfig->app_memtype >= 6) // APPMEMTYPE. Hacky but doesn't use APT #define N3DS_TID_MASK 0xF0000000ULL #define N3DS_TID_BIT 0x20000000ULL diff --git a/sysmodules/rosalina/source/hbloader.c b/sysmodules/rosalina/source/hbloader.c index de2c08d..3352089 100644 --- a/sysmodules/rosalina/source/hbloader.c +++ b/sysmodules/rosalina/source/hbloader.c @@ -36,9 +36,6 @@ #include "gdb/server.h" #include "pmdbgext.h" -#define SYSCOREVER (*(vu32 *)0x1FF80010) -#define APPMEMTYPE (*(vu32 *)0x1FF80030) - extern GDBContext *nextApplicationGdbCtx; extern GDBServer gdbServer; @@ -322,21 +319,22 @@ void HBLDR_HandleCommands(void *ctx) memcpy(&exhi->sci.codeset_info.stack_size, &stacksize, 4); memset(&exhi->sci.dependencies, 0, sizeof(exhi->sci.dependencies)); - if (SYSCOREVER == 2) + u32 coreVer = OS_KernelConfig->kernel_syscore_ver; + if (coreVer == 2) memcpy(exhi->sci.dependencies, dependencyListNativeFirm, sizeof(dependencyListNativeFirm)); - else if (SYSCOREVER == 3) + else if (coreVer == 3) memcpy(exhi->sci.dependencies, dependencyListSafeFirm, sizeof(dependencyListSafeFirm)); ExHeader_Arm11SystemLocalCapabilities* localcaps0 = &exhi->aci.local_caps; - localcaps0->core_info.core_version = SYSCOREVER; + localcaps0->core_info.core_version = coreVer; localcaps0->core_info.use_cpu_clockrate_804MHz = false; localcaps0->core_info.enable_l2c = false; localcaps0->core_info.ideal_processor = 0; localcaps0->core_info.affinity_mask = BIT(0); localcaps0->core_info.priority = 0x30; - u32 appmemtype = APPMEMTYPE; + u32 appmemtype = OS_KernelConfig->app_memtype; localcaps0->core_info.o3ds_system_mode = appmemtype < 6 ? (SystemMode)appmemtype : SYSMODE_O3DS_PROD; localcaps0->core_info.n3ds_system_mode = appmemtype >= 6 ? (SystemMode)(appmemtype - 6 + 1) : SYSMODE_N3DS_PROD; @@ -363,7 +361,7 @@ void HBLDR_HandleCommands(void *ctx) // Set kernel release version to the current kernel version kcaps0->descriptors[0] = 0xFC000000 | (osGetKernelVersion() >> 16); - if (GET_VERSION_MINOR(osGetKernelVersion()) >= 50 && SYSCOREVER == 2) // 9.6+ NFIRM + if (GET_VERSION_MINOR(osGetKernelVersion()) >= 50 && coreVer == 2) // 9.6+ NFIRM { u64 lastdep = sizeof(dependencyListNativeFirm)/8; exhi->sci.dependencies[lastdep++] = 0x0004013000004002ULL; // nfc