From 2fcd2d862d2057ee635a0a6ecc64d071686da62b Mon Sep 17 00:00:00 2001 From: TuxSH <1922548+TuxSH@users.noreply.github.com> Date: Mon, 7 Dec 2020 20:17:30 +0000 Subject: [PATCH] Add small debug helper for sysmodule reimpls --- sysmodules/loader/source/util.h | 16 +++++++++---- sysmodules/pm/source/util.h | 14 +++++++++--- sysmodules/sm/source/common.h | 40 +++++++++++++++++++++++++++++---- sysmodules/sm/source/list.c | 2 +- sysmodules/sm/source/main.c | 16 ++++++------- 5 files changed, 68 insertions(+), 20 deletions(-) diff --git a/sysmodules/loader/source/util.h b/sysmodules/loader/source/util.h index dfe5340..1e8cd0a 100644 --- a/sysmodules/loader/source/util.h +++ b/sysmodules/loader/source/util.h @@ -5,7 +5,6 @@ #include <3ds/os.h> #include <3ds/srv.h> - #define REG32(reg) (*(vu32 *)reg) #define REG64(reg) (*(vu64 *)reg) @@ -27,6 +26,17 @@ static void hexItoa(u64 number, char *out, u32 digits, bool uppercase) while(i < digits) out[digits - 1 - i++] = '0'; } + +static inline void debugOutputHex(u64 number, u32 digits) +{ + char buf[16+2]; + hexItoa(number, buf, digits, false); + buf[digits] = '\n'; + buf[digits + 1] = '\0'; + + svcOutputDebugString(buf, digits + 1); +} + #endif static void __attribute__((noinline)) panic(Result res) @@ -35,9 +45,7 @@ static void __attribute__((noinline)) panic(Result res) (void)res; __builtin_trap(); #else - char buf[32] = {0}; - hexItoa(res, buf, 8, false); - svcOutputDebugString(buf, 8); + debugOutputHex(res, 8); svcBreak(USERBREAK_PANIC); #endif } diff --git a/sysmodules/pm/source/util.h b/sysmodules/pm/source/util.h index 4618a4c..57e325c 100644 --- a/sysmodules/pm/source/util.h +++ b/sysmodules/pm/source/util.h @@ -30,6 +30,16 @@ static void hexItoa(u64 number, char *out, u32 digits, bool uppercase) while(i < digits) out[digits - 1 - i++] = '0'; } + +static inline void debugOutputHex(u64 number, u32 digits) +{ + char buf[16+2]; + hexItoa(number, buf, digits, false); + buf[digits] = '\n'; + buf[digits + 1] = '\0'; + + svcOutputDebugString(buf, digits + 1); +} #endif static void __attribute__((noinline)) panic(Result res) @@ -38,9 +48,7 @@ static void __attribute__((noinline)) panic(Result res) (void)res; __builtin_trap(); #else - char buf[32] = {0}; - hexItoa(res, buf, 8, false); - svcOutputDebugString(buf, 8); + debugOutputHex(res, 8); svcBreak(USERBREAK_PANIC); #endif } diff --git a/sysmodules/sm/source/common.h b/sysmodules/sm/source/common.h index 7ee7f6b..ed807b4 100644 --- a/sysmodules/sm/source/common.h +++ b/sysmodules/sm/source/common.h @@ -40,14 +40,46 @@ extern SessionDataList sessionDataInUseList, freeSessionDataList; extern SessionDataList sessionDataWaitingForServiceOrPortRegisterList, sessionDataToWakeUpAfterServiceOrPortRegisterList; extern SessionDataList sessionDataWaitingPortReadyList; -static inline void panic(void) +#ifdef XDS +static void hexItoa(u64 number, char *out, u32 digits, bool uppercase) { - svcBreak(USERBREAK_PANIC); - for(;;) svcSleepThread(0); + const char hexDigits[] = "0123456789ABCDEF"; + const char hexDigitsLowercase[] = "0123456789abcdef"; + u32 i = 0; + + while(number > 0) + { + out[digits - 1 - i++] = uppercase ? hexDigits[number & 0xF] : hexDigitsLowercase[number & 0xF]; + number >>= 4; + } + + while(i < digits) out[digits - 1 - i++] = '0'; +} + +static inline void debugOutputHex(u64 number, u32 digits) +{ + char buf[16+2]; + hexItoa(number, buf, digits, false); + buf[digits] = '\n'; + buf[digits + 1] = '\0'; + + svcOutputDebugString(buf, digits + 1); +} +#endif + +static void __attribute__((noinline)) panic(Result res) +{ +#ifndef XDS + (void)res; + __builtin_trap(); +#else + debugOutputHex(res, 8); + svcBreak(USERBREAK_PANIC); +#endif } static inline void assertSuccess(Result res) { if(R_FAILED(res)) - panic(); + panic(res); } diff --git a/sysmodules/sm/source/list.c b/sysmodules/sm/source/list.c index 4dcbb89..8a76280 100644 --- a/sysmodules/sm/source/list.c +++ b/sysmodules/sm/source/list.c @@ -91,7 +91,7 @@ void *allocateNode(void *inUseList, void *freeList, u32 elementSize, bool back) ListBase *freeListB = (ListBase *)freeList; if(freeListB->first == NULL) - panic(); + panic(0); ListNodeBase *node = freeListB->first; ListNodeBase nodeBk = *node; diff --git a/sysmodules/sm/source/main.c b/sysmodules/sm/source/main.c index 28961f0..a1abac8 100644 --- a/sysmodules/sm/source/main.c +++ b/sysmodules/sm/source/main.c @@ -112,11 +112,11 @@ int main(void) { for(id = 0; (u32)id < nbHandles && handles[id] != replyTarget; id++); if((u32)id >= nbHandles) - panic(); + panic(res); } if(id < 3) - panic(); + panic(0); else if((u32)id < 3 + nbSessions) // Session closed { sessionData = NULL; @@ -132,7 +132,7 @@ int main(void) moveNode(sessionData, &freeSessionDataList, false); } else - panic(); + panic(0); } else // Port closed { @@ -156,7 +156,7 @@ int main(void) replyTarget = 0; } else if(R_FAILED(res)) - panic(); + panic(res); else { replyTarget = 0; @@ -172,7 +172,7 @@ int main(void) { Handle session; if(!IS_PRE_7X && srvPmSessionCreated) - panic(); + panic(0); assertSuccess(svcAcceptSession(&session, srvPmPort)); sessionData = (SessionData *)allocateNode(&sessionDataInUseList, &freeSessionDataList, sizeof(SessionData), false); sessionData->pid = (u32)-1; @@ -184,7 +184,7 @@ int main(void) if(id == 0) // Resume SRV:GetServiceHandle or GetPort due to service or named port not registered { if(sessionDataToWakeUpAfterServiceOrPortRegisterList.first == NULL) - panic(); + panic(0); sessionData = sessionDataToWakeUpAfterServiceOrPortRegisterList.first; moveNode(sessionData, &sessionDataInUseList, false); memcpy(cmdbuf, sessionData->replayCmdbuf, 16); @@ -205,7 +205,7 @@ int main(void) { for(sessionData = sessionDataInUseList.first; sessionData != NULL && sessionData->handle != handles[id]; sessionData = sessionData->next); if(sessionData == NULL) - panic(); + panic(0); } res = sessionData->isSrvPm ? srvPmHandleCommands(sessionData) : srvHandleCommands(sessionData); @@ -218,7 +218,7 @@ int main(void) else if(res == (Result)0xD0406402) // service full dstList = &sessionDataWaitingPortReadyList; else - panic(); + panic(res); moveNode(sessionData, dstList, true); }