Merge pull request #459 from greggameplayer/patch-5
Add ioctl commands with their params and size check
This commit is contained in:
commit
a55f112cb1
3 changed files with 120 additions and 32 deletions
|
@ -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 a new issue