Add small debug helper for sysmodule reimpls
This commit is contained in:
parent
cb4a23a2ba
commit
2fcd2d862d
@ -5,7 +5,6 @@
|
|||||||
#include <3ds/os.h>
|
#include <3ds/os.h>
|
||||||
#include <3ds/srv.h>
|
#include <3ds/srv.h>
|
||||||
|
|
||||||
|
|
||||||
#define REG32(reg) (*(vu32 *)reg)
|
#define REG32(reg) (*(vu32 *)reg)
|
||||||
#define REG64(reg) (*(vu64 *)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';
|
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
|
#endif
|
||||||
|
|
||||||
static void __attribute__((noinline)) panic(Result res)
|
static void __attribute__((noinline)) panic(Result res)
|
||||||
@ -35,9 +45,7 @@ static void __attribute__((noinline)) panic(Result res)
|
|||||||
(void)res;
|
(void)res;
|
||||||
__builtin_trap();
|
__builtin_trap();
|
||||||
#else
|
#else
|
||||||
char buf[32] = {0};
|
debugOutputHex(res, 8);
|
||||||
hexItoa(res, buf, 8, false);
|
|
||||||
svcOutputDebugString(buf, 8);
|
|
||||||
svcBreak(USERBREAK_PANIC);
|
svcBreak(USERBREAK_PANIC);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,16 @@ static void hexItoa(u64 number, char *out, u32 digits, bool uppercase)
|
|||||||
|
|
||||||
while(i < digits) out[digits - 1 - i++] = '0';
|
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
|
#endif
|
||||||
|
|
||||||
static void __attribute__((noinline)) panic(Result res)
|
static void __attribute__((noinline)) panic(Result res)
|
||||||
@ -38,9 +48,7 @@ static void __attribute__((noinline)) panic(Result res)
|
|||||||
(void)res;
|
(void)res;
|
||||||
__builtin_trap();
|
__builtin_trap();
|
||||||
#else
|
#else
|
||||||
char buf[32] = {0};
|
debugOutputHex(res, 8);
|
||||||
hexItoa(res, buf, 8, false);
|
|
||||||
svcOutputDebugString(buf, 8);
|
|
||||||
svcBreak(USERBREAK_PANIC);
|
svcBreak(USERBREAK_PANIC);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -40,14 +40,46 @@ extern SessionDataList sessionDataInUseList, freeSessionDataList;
|
|||||||
extern SessionDataList sessionDataWaitingForServiceOrPortRegisterList, sessionDataToWakeUpAfterServiceOrPortRegisterList;
|
extern SessionDataList sessionDataWaitingForServiceOrPortRegisterList, sessionDataToWakeUpAfterServiceOrPortRegisterList;
|
||||||
extern SessionDataList sessionDataWaitingPortReadyList;
|
extern SessionDataList sessionDataWaitingPortReadyList;
|
||||||
|
|
||||||
static inline void panic(void)
|
#ifdef XDS
|
||||||
|
static void hexItoa(u64 number, char *out, u32 digits, bool uppercase)
|
||||||
{
|
{
|
||||||
|
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);
|
svcBreak(USERBREAK_PANIC);
|
||||||
for(;;) svcSleepThread(0);
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void assertSuccess(Result res)
|
static inline void assertSuccess(Result res)
|
||||||
{
|
{
|
||||||
if(R_FAILED(res))
|
if(R_FAILED(res))
|
||||||
panic();
|
panic(res);
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ void *allocateNode(void *inUseList, void *freeList, u32 elementSize, bool back)
|
|||||||
ListBase *freeListB = (ListBase *)freeList;
|
ListBase *freeListB = (ListBase *)freeList;
|
||||||
|
|
||||||
if(freeListB->first == NULL)
|
if(freeListB->first == NULL)
|
||||||
panic();
|
panic(0);
|
||||||
|
|
||||||
ListNodeBase *node = freeListB->first;
|
ListNodeBase *node = freeListB->first;
|
||||||
ListNodeBase nodeBk = *node;
|
ListNodeBase nodeBk = *node;
|
||||||
|
@ -112,11 +112,11 @@ int main(void)
|
|||||||
{
|
{
|
||||||
for(id = 0; (u32)id < nbHandles && handles[id] != replyTarget; id++);
|
for(id = 0; (u32)id < nbHandles && handles[id] != replyTarget; id++);
|
||||||
if((u32)id >= nbHandles)
|
if((u32)id >= nbHandles)
|
||||||
panic();
|
panic(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(id < 3)
|
if(id < 3)
|
||||||
panic();
|
panic(0);
|
||||||
else if((u32)id < 3 + nbSessions) // Session closed
|
else if((u32)id < 3 + nbSessions) // Session closed
|
||||||
{
|
{
|
||||||
sessionData = NULL;
|
sessionData = NULL;
|
||||||
@ -132,7 +132,7 @@ int main(void)
|
|||||||
moveNode(sessionData, &freeSessionDataList, false);
|
moveNode(sessionData, &freeSessionDataList, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
panic();
|
panic(0);
|
||||||
}
|
}
|
||||||
else // Port closed
|
else // Port closed
|
||||||
{
|
{
|
||||||
@ -156,7 +156,7 @@ int main(void)
|
|||||||
replyTarget = 0;
|
replyTarget = 0;
|
||||||
}
|
}
|
||||||
else if(R_FAILED(res))
|
else if(R_FAILED(res))
|
||||||
panic();
|
panic(res);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
replyTarget = 0;
|
replyTarget = 0;
|
||||||
@ -172,7 +172,7 @@ int main(void)
|
|||||||
{
|
{
|
||||||
Handle session;
|
Handle session;
|
||||||
if(!IS_PRE_7X && srvPmSessionCreated)
|
if(!IS_PRE_7X && srvPmSessionCreated)
|
||||||
panic();
|
panic(0);
|
||||||
assertSuccess(svcAcceptSession(&session, srvPmPort));
|
assertSuccess(svcAcceptSession(&session, srvPmPort));
|
||||||
sessionData = (SessionData *)allocateNode(&sessionDataInUseList, &freeSessionDataList, sizeof(SessionData), false);
|
sessionData = (SessionData *)allocateNode(&sessionDataInUseList, &freeSessionDataList, sizeof(SessionData), false);
|
||||||
sessionData->pid = (u32)-1;
|
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(id == 0) // Resume SRV:GetServiceHandle or GetPort due to service or named port not registered
|
||||||
{
|
{
|
||||||
if(sessionDataToWakeUpAfterServiceOrPortRegisterList.first == NULL)
|
if(sessionDataToWakeUpAfterServiceOrPortRegisterList.first == NULL)
|
||||||
panic();
|
panic(0);
|
||||||
sessionData = sessionDataToWakeUpAfterServiceOrPortRegisterList.first;
|
sessionData = sessionDataToWakeUpAfterServiceOrPortRegisterList.first;
|
||||||
moveNode(sessionData, &sessionDataInUseList, false);
|
moveNode(sessionData, &sessionDataInUseList, false);
|
||||||
memcpy(cmdbuf, sessionData->replayCmdbuf, 16);
|
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);
|
for(sessionData = sessionDataInUseList.first; sessionData != NULL && sessionData->handle != handles[id]; sessionData = sessionData->next);
|
||||||
if(sessionData == NULL)
|
if(sessionData == NULL)
|
||||||
panic();
|
panic(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = sessionData->isSrvPm ? srvPmHandleCommands(sessionData) : srvHandleCommands(sessionData);
|
res = sessionData->isSrvPm ? srvPmHandleCommands(sessionData) : srvHandleCommands(sessionData);
|
||||||
@ -218,7 +218,7 @@ int main(void)
|
|||||||
else if(res == (Result)0xD0406402) // service full
|
else if(res == (Result)0xD0406402) // service full
|
||||||
dstList = &sessionDataWaitingPortReadyList;
|
dstList = &sessionDataWaitingPortReadyList;
|
||||||
else
|
else
|
||||||
panic();
|
panic(res);
|
||||||
|
|
||||||
moveNode(sessionData, dstList, true);
|
moveNode(sessionData, dstList, true);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user