Result miniSocInit() { if(AtomicPostIncrement(&miniSocRefCount)) return 0; u32 tmp = 0; Result ret = 0; bool isSocURegistered; ret = srvIsServiceRegistered(&isSocURegistered, "soc:U"); if(ret != 0) goto cleanup; if(!isSocURegistered) { ret = -1; goto cleanup; } ret = srvGetServiceHandle(&SOCU_handle, "soc:U"); if(ret != 0) goto cleanup; ret = svcControlMemory(&tmp, socContextAddr, 0, socContextSize, MEMOP_ALLOC, MEMPERM_READ | MEMPERM_WRITE); if(ret != 0) goto cleanup; socContextAddr = tmp; ret = svcCreateMemoryBlock(&socMemhandle, (u32)socContextAddr, socContextSize, 0, 3); if(ret != 0) goto cleanup; ret = SOCU_Initialize(socMemhandle, socContextSize); if(ret != 0) goto cleanup; svcKernelSetState(0x10000, 2); miniSocEnabled = true; return 0; cleanup: AtomicDecrement(&miniSocRefCount); if(socMemhandle != 0) { svcCloseHandle(socMemhandle); socMemhandle = 0; } if(SOCU_handle != 0) { SOCU_Shutdown(); svcCloseHandle(SOCU_handle); SOCU_handle = 0; } if(tmp != 0) svcControlMemory(&tmp, socContextAddr, socContextAddr, socContextSize, MEMOP_FREE, MEMPERM_DONTCARE); return ret; }
Result socExit(void) { Result ret = 0; int dev; svcCloseHandle(socMemhandle); socMemhandle = 0; ret = SOCU_Shutdown(); svcCloseHandle(SOCU_handle); SOCU_handle = 0; dev = FindDevice("soc:"); if(dev >= 0) RemoveDevice("soc:"); return ret; }
Result miniSocExit(void) { if(AtomicDecrement(&miniSocRefCount)) return 0; Result ret = 0; u32 tmp; svcCloseHandle(socMemhandle); socMemhandle = 0; ret = SOCU_Shutdown(); svcCloseHandle(SOCU_handle); SOCU_handle = 0; svcControlMemory(&tmp, socContextAddr, socContextAddr, socContextSize, MEMOP_FREE, MEMPERM_DONTCARE); if(ret == 0) { svcKernelSetState(0x10000, 2); miniSocEnabled = false; } return ret; }