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 socInit(u32* context_addr, u32 context_size) { Result ret = 0; /* check that the "soc" device doesn't already exist */ int dev = FindDevice("soc:"); if(dev >= 0) return -1; ret = svcCreateMemoryBlock(&socMemhandle, (u32)context_addr, context_size, 0, 3); if(ret != 0) return ret; ret = srvGetServiceHandle(&SOCU_handle, "soc:U"); if(ret != 0) { svcCloseHandle(socMemhandle); socMemhandle = 0; return ret; } ret = SOCU_Initialize(socMemhandle, context_size); if(ret != 0) { svcCloseHandle(socMemhandle); svcCloseHandle(SOCU_handle); socMemhandle = 0; SOCU_handle = 0; return ret; } /* add the "soc" device */ dev = AddDevice(&soc_devoptab); if(dev < 0) { svcCloseHandle(socMemhandle); svcCloseHandle(SOCU_handle); socMemhandle = 0; SOCU_handle = 0; return dev; } return 0; }