mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #459 from greggameplayer/patch-5
Add ioctl commands with their params and size check
This commit is contained in:
		
						commit
						a55f112cb1
					
				@ -26,12 +26,64 @@ private:
 | 
				
			|||||||
        IocSyncptIncrCommand = 0x40040015,
 | 
					        IocSyncptIncrCommand = 0x40040015,
 | 
				
			||||||
        IocSyncptWaitCommand = 0xC00C0016,
 | 
					        IocSyncptWaitCommand = 0xC00C0016,
 | 
				
			||||||
        IocModuleMutexCommand = 0x40080017,
 | 
					        IocModuleMutexCommand = 0x40080017,
 | 
				
			||||||
        IocModuleRegRDWRCommand = 0xC008010E,
 | 
					        IocModuleRegRDWRCommand = 0xC0180018,
 | 
				
			||||||
        IocSyncptWaitexCommand = 0xC0100019,
 | 
					        IocSyncptWaitexCommand = 0xC0100019,
 | 
				
			||||||
        IocSyncptReadMaxCommand = 0xC008001A,
 | 
					        IocSyncptReadMaxCommand = 0xC008001A,
 | 
				
			||||||
        IocCtrlEventWaitCommand = 0xC010001D,
 | 
					 | 
				
			||||||
        IocGetConfigCommand = 0xC183001B,
 | 
					        IocGetConfigCommand = 0xC183001B,
 | 
				
			||||||
 | 
					        IocCtrlEventSignalCommand = 0xC004001C,
 | 
				
			||||||
 | 
					        IocCtrlEventWaitCommand = 0xC010001D,
 | 
				
			||||||
 | 
					        IocCtrlEventWaitAsyncCommand = 0xC010001E,
 | 
				
			||||||
 | 
					        IocCtrlEventRegisterCommand = 0xC004001F,
 | 
				
			||||||
 | 
					        IocCtrlEventUnregisterCommand = 0xC0040020,
 | 
				
			||||||
 | 
					        IocCtrlEventKillCommand = 0x40080021,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    struct IocSyncptReadParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        u32_le value;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocSyncptReadParams) == 8, "IocSyncptReadParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocSyncptIncrParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocSyncptIncrParams) == 4, "IocSyncptIncrParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocSyncptWaitParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        u32_le thresh;
 | 
				
			||||||
 | 
					        s32_le timeout;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocSyncptWaitParams) == 12, "IocSyncptWaitParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocModuleMutexParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        u32_le lock; // (0 = unlock and 1 = lock)
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocModuleMutexParams) == 8, "IocModuleMutexParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocModuleRegRDWRParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        u32_le num_offsets;
 | 
				
			||||||
 | 
					        u32_le block_size;
 | 
				
			||||||
 | 
					        u32_le offsets;
 | 
				
			||||||
 | 
					        u32_le values;
 | 
				
			||||||
 | 
					        u32_le write;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocModuleRegRDWRParams) == 24, "IocModuleRegRDWRParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocSyncptWaitexParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        u32_le thresh;
 | 
				
			||||||
 | 
					        s32_le timeout;
 | 
				
			||||||
 | 
					        u32_le value;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocSyncptWaitexParams) == 16, "IocSyncptWaitexParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocSyncptReadMaxParams {
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        u32_le value;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocSyncptReadMaxParams) == 8, "IocSyncptReadMaxParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct IocGetConfigParams {
 | 
					    struct IocGetConfigParams {
 | 
				
			||||||
        std::array<char, 0x41> domain_str;
 | 
					        std::array<char, 0x41> domain_str;
 | 
				
			||||||
@ -40,6 +92,12 @@ private:
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(IocGetConfigParams) == 387, "IocGetConfigParams is incorrect size");
 | 
					    static_assert(sizeof(IocGetConfigParams) == 387, "IocGetConfigParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocCtrlEventSignalParams {
 | 
				
			||||||
 | 
					        u32_le user_event_id;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocCtrlEventSignalParams) == 4,
 | 
				
			||||||
 | 
					                  "IocCtrlEventSignalParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct IocCtrlEventWaitParams {
 | 
					    struct IocCtrlEventWaitParams {
 | 
				
			||||||
        u32_le syncpt_id;
 | 
					        u32_le syncpt_id;
 | 
				
			||||||
        u32_le threshold;
 | 
					        u32_le threshold;
 | 
				
			||||||
@ -48,6 +106,32 @@ private:
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(IocCtrlEventWaitParams) == 16, "IocCtrlEventWaitParams is incorrect size");
 | 
					    static_assert(sizeof(IocCtrlEventWaitParams) == 16, "IocCtrlEventWaitParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocCtrlEventWaitAsyncParams {
 | 
				
			||||||
 | 
					        u32_le syncpt_id;
 | 
				
			||||||
 | 
					        u32_le threshold;
 | 
				
			||||||
 | 
					        u32_le timeout;
 | 
				
			||||||
 | 
					        u32_le value;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocCtrlEventWaitAsyncParams) == 16,
 | 
				
			||||||
 | 
					                  "IocCtrlEventWaitAsyncParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocCtrlEventRegisterParams {
 | 
				
			||||||
 | 
					        u32_le user_event_id;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocCtrlEventRegisterParams) == 4,
 | 
				
			||||||
 | 
					                  "IocCtrlEventRegisterParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocCtrlEventUnregisterParams {
 | 
				
			||||||
 | 
					        u32_le user_event_id;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocCtrlEventUnregisterParams) == 4,
 | 
				
			||||||
 | 
					                  "IocCtrlEventUnregisterParams is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocCtrlEventKill {
 | 
				
			||||||
 | 
					        u64_le user_events;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocCtrlEventKill) == 8, "IocCtrlEventKill is incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output);
 | 
					    u32 NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output);
 | 
					    u32 IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
 | 
				
			|||||||
@ -119,25 +119,25 @@ u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) {
 | 
				
			|||||||
    IocParamParams params;
 | 
					    IocParamParams params;
 | 
				
			||||||
    std::memcpy(¶ms, input.data(), sizeof(params));
 | 
					    std::memcpy(¶ms, input.data(), sizeof(params));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    NGLOG_WARNING(Service_NVDRV, "(STUBBED) called type={}", params.type);
 | 
					    NGLOG_WARNING(Service_NVDRV, "(STUBBED) called type={}", params.param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    auto object = GetObject(params.handle);
 | 
					    auto object = GetObject(params.handle);
 | 
				
			||||||
    ASSERT(object);
 | 
					    ASSERT(object);
 | 
				
			||||||
    ASSERT(object->status == Object::Status::Allocated);
 | 
					    ASSERT(object->status == Object::Status::Allocated);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (static_cast<ParamTypes>(params.type)) {
 | 
					    switch (static_cast<ParamTypes>(params.param)) {
 | 
				
			||||||
    case ParamTypes::Size:
 | 
					    case ParamTypes::Size:
 | 
				
			||||||
        params.value = object->size;
 | 
					        params.result = object->size;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case ParamTypes::Alignment:
 | 
					    case ParamTypes::Alignment:
 | 
				
			||||||
        params.value = object->align;
 | 
					        params.result = object->align;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case ParamTypes::Heap:
 | 
					    case ParamTypes::Heap:
 | 
				
			||||||
        // TODO(Subv): Seems to be a hardcoded value?
 | 
					        // TODO(Subv): Seems to be a hardcoded value?
 | 
				
			||||||
        params.value = 0x40000000;
 | 
					        params.result = 0x40000000;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case ParamTypes::Kind:
 | 
					    case ParamTypes::Kind:
 | 
				
			||||||
        params.value = object->kind;
 | 
					        params.result = object->kind;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        UNIMPLEMENTED();
 | 
					        UNIMPLEMENTED();
 | 
				
			||||||
 | 
				
			|||||||
@ -59,17 +59,25 @@ private:
 | 
				
			|||||||
        Create = 0xC0080101,
 | 
					        Create = 0xC0080101,
 | 
				
			||||||
        FromId = 0xC0080103,
 | 
					        FromId = 0xC0080103,
 | 
				
			||||||
        Alloc = 0xC0200104,
 | 
					        Alloc = 0xC0200104,
 | 
				
			||||||
 | 
					        Free = 0xC0180105,
 | 
				
			||||||
        Param = 0xC00C0109,
 | 
					        Param = 0xC00C0109,
 | 
				
			||||||
        GetId = 0xC008010E,
 | 
					        GetId = 0xC008010E,
 | 
				
			||||||
        Free = 0xC0180105,
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct IocCreateParams {
 | 
					    struct IocCreateParams {
 | 
				
			||||||
        // Input
 | 
					        // Input
 | 
				
			||||||
        u32_le size;
 | 
					        u32_le size;
 | 
				
			||||||
        // Output
 | 
					        // Output
 | 
				
			||||||
        u32_le handle;
 | 
					        u32_le handle;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocCreateParams) == 8, "IocCreateParams has wrong size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocFromIdParams {
 | 
				
			||||||
 | 
					        // Input
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        // Output
 | 
				
			||||||
 | 
					        u32_le handle;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocFromIdParams) == 8, "IocFromIdParams has wrong size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct IocAllocParams {
 | 
					    struct IocAllocParams {
 | 
				
			||||||
        // Input
 | 
					        // Input
 | 
				
			||||||
@ -81,28 +89,7 @@ private:
 | 
				
			|||||||
        INSERT_PADDING_BYTES(7);
 | 
					        INSERT_PADDING_BYTES(7);
 | 
				
			||||||
        u64_le addr;
 | 
					        u64_le addr;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocAllocParams) == 32, "IocAllocParams has wrong size");
 | 
				
			||||||
    struct IocGetIdParams {
 | 
					 | 
				
			||||||
        // Output
 | 
					 | 
				
			||||||
        u32_le id;
 | 
					 | 
				
			||||||
        // Input
 | 
					 | 
				
			||||||
        u32_le handle;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct IocFromIdParams {
 | 
					 | 
				
			||||||
        // Input
 | 
					 | 
				
			||||||
        u32_le id;
 | 
					 | 
				
			||||||
        // Output
 | 
					 | 
				
			||||||
        u32_le handle;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct IocParamParams {
 | 
					 | 
				
			||||||
        // Input
 | 
					 | 
				
			||||||
        u32_le handle;
 | 
					 | 
				
			||||||
        u32_le type;
 | 
					 | 
				
			||||||
        // Output
 | 
					 | 
				
			||||||
        u32_le value;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct IocFreeParams {
 | 
					    struct IocFreeParams {
 | 
				
			||||||
        u32_le handle;
 | 
					        u32_le handle;
 | 
				
			||||||
@ -113,6 +100,23 @@ private:
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(IocFreeParams) == 24, "IocFreeParams has wrong size");
 | 
					    static_assert(sizeof(IocFreeParams) == 24, "IocFreeParams has wrong size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocParamParams {
 | 
				
			||||||
 | 
					        // Input
 | 
				
			||||||
 | 
					        u32_le handle;
 | 
				
			||||||
 | 
					        u32_le param;
 | 
				
			||||||
 | 
					        // Output
 | 
				
			||||||
 | 
					        u32_le result;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocParamParams) == 12, "IocParamParams has wrong size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct IocGetIdParams {
 | 
				
			||||||
 | 
					        // Output
 | 
				
			||||||
 | 
					        u32_le id;
 | 
				
			||||||
 | 
					        // Input
 | 
				
			||||||
 | 
					        u32_le handle;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static_assert(sizeof(IocGetIdParams) == 8, "IocGetIdParams has wrong size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 IocCreate(const std::vector<u8>& input, std::vector<u8>& output);
 | 
					    u32 IocCreate(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
    u32 IocAlloc(const std::vector<u8>& input, std::vector<u8>& output);
 | 
					    u32 IocAlloc(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
    u32 IocGetId(const std::vector<u8>& input, std::vector<u8>& output);
 | 
					    u32 IocGetId(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user