Пример #1
0
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;
}
Пример #2
0
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;
}