rosalina: ndm + shutdown issue workaround
This commit is contained in:
parent
d6e72080d9
commit
748b771618
@ -21,6 +21,10 @@
|
|||||||
extern bool miniSocEnabled;
|
extern bool miniSocEnabled;
|
||||||
|
|
||||||
Result miniSocInit(void);
|
Result miniSocInit(void);
|
||||||
|
|
||||||
|
void miniSocLockState(void);
|
||||||
|
void miniSocUnlockState(bool force);
|
||||||
|
|
||||||
Result miniSocExitDirect(void);
|
Result miniSocExitDirect(void);
|
||||||
Result miniSocExit(void);
|
Result miniSocExit(void);
|
||||||
|
|
||||||
|
@ -180,6 +180,8 @@ static void handlePreTermNotification(u32 notificationId)
|
|||||||
(void)notificationId;
|
(void)notificationId;
|
||||||
// Might be subject to a race condition, but heh.
|
// Might be subject to a race condition, but heh.
|
||||||
|
|
||||||
|
miniSocUnlockState(true);
|
||||||
|
|
||||||
// Disable input redirection
|
// Disable input redirection
|
||||||
InputRedirection_Disable(100 * 1000 * 1000LL);
|
InputRedirection_Disable(100 * 1000 * 1000LL);
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is part of Luma3DS.
|
* This file is part of Luma3DS.
|
||||||
* Copyright (C) 2016-2020 Aurora Wright, TuxSH
|
* Copyright (C) 2016-2020 Aurora Wright, TuxSH
|
||||||
@ -54,6 +55,41 @@ static Result SOCU_Shutdown(void)
|
|||||||
return cmdbuf[1];
|
return cmdbuf[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// unsafe but what can I do?
|
||||||
|
void miniSocLockState(void)
|
||||||
|
{
|
||||||
|
Result res = 0;
|
||||||
|
__dmb();
|
||||||
|
if (!exclusiveStateEntered && isServiceUsable("ndm:u"))
|
||||||
|
{
|
||||||
|
ndmuInit();
|
||||||
|
res = NDMU_EnterExclusiveState(NDM_EXCLUSIVE_STATE_INFRASTRUCTURE);
|
||||||
|
if (R_SUCCEEDED(res))
|
||||||
|
res = NDMU_LockState(); // prevents ndm from switching to StreetPass when the lid is closed
|
||||||
|
exclusiveStateEntered = R_SUCCEEDED(res);
|
||||||
|
__dmb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void miniSocUnlockState(bool force)
|
||||||
|
{
|
||||||
|
Result res = 0;
|
||||||
|
|
||||||
|
__dmb();
|
||||||
|
if (exclusiveStateEntered)
|
||||||
|
{
|
||||||
|
if (!force)
|
||||||
|
{
|
||||||
|
res = NDMU_UnlockState();
|
||||||
|
if (R_SUCCEEDED(res))
|
||||||
|
res = NDMU_LeaveExclusiveState();
|
||||||
|
}
|
||||||
|
ndmuExit();
|
||||||
|
exclusiveStateEntered = R_FAILED(res);
|
||||||
|
__dmb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Result miniSocInit(void)
|
Result miniSocInit(void)
|
||||||
{
|
{
|
||||||
if(AtomicPostIncrement(&miniSocRefCount))
|
if(AtomicPostIncrement(&miniSocRefCount))
|
||||||
@ -87,15 +123,7 @@ Result miniSocInit(void)
|
|||||||
ret = SOCU_Initialize(miniSocMemHandle, socContextSize);
|
ret = SOCU_Initialize(miniSocMemHandle, socContextSize);
|
||||||
if(ret != 0) goto cleanup;
|
if(ret != 0) goto cleanup;
|
||||||
|
|
||||||
if (!exclusiveStateEntered && isServiceUsable("ndm:u"))
|
miniSocLockState();
|
||||||
{
|
|
||||||
ndmuInit();
|
|
||||||
ret = NDMU_EnterExclusiveState(NDM_EXCLUSIVE_STATE_INFRASTRUCTURE);
|
|
||||||
if (R_SUCCEEDED(ret))
|
|
||||||
ret = NDMU_LockState(); // prevents ndm from switching to StreetPass when the lid is closed
|
|
||||||
//ndmuExit();
|
|
||||||
exclusiveStateEntered = R_SUCCEEDED(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
svcKernelSetState(0x10000, 0x10);
|
svcKernelSetState(0x10000, 0x10);
|
||||||
miniSocEnabled = true;
|
miniSocEnabled = true;
|
||||||
@ -140,15 +168,7 @@ Result miniSocExitDirect(void)
|
|||||||
svcControlMemory(&tmp, socContextAddr, socContextAddr, socContextSize, MEMOP_FREE, MEMPERM_DONTCARE);
|
svcControlMemory(&tmp, socContextAddr, socContextAddr, socContextSize, MEMOP_FREE, MEMPERM_DONTCARE);
|
||||||
if(ret == 0)
|
if(ret == 0)
|
||||||
{
|
{
|
||||||
if (exclusiveStateEntered && isServiceUsable("ndm:u"))
|
miniSocUnlockState(false);
|
||||||
{
|
|
||||||
//ndmuInit();
|
|
||||||
ret = NDMU_UnlockState();
|
|
||||||
if (R_SUCCEEDED(ret))
|
|
||||||
ret = NDMU_LeaveExclusiveState();
|
|
||||||
ndmuExit();
|
|
||||||
exclusiveStateEntered = R_FAILED(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
miniSocEnabled = false;
|
miniSocEnabled = false;
|
||||||
svcKernelSetState(0x10000, 0x10);
|
svcKernelSetState(0x10000, 0x10);
|
||||||
|
Reference in New Issue
Block a user