diff options
Diffstat (limited to 'src/core/hle/function_wrappers.h')
-rw-r--r-- | src/core/hle/function_wrappers.h | 108 |
1 files changed, 61 insertions, 47 deletions
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h index bc81c06b4..31fda6db3 100644 --- a/src/core/hle/function_wrappers.h +++ b/src/core/hle/function_wrappers.h @@ -24,19 +24,37 @@ static inline void FuncReturn(u64 res) { Core::CPU().SetReg(0, res); } -/** - * HLE a function return (64-bit) from the current ARM11 userland process - * @param res Result to return (64-bit) - * @todo Verify that this function is correct - */ -static inline void FuncReturn64(u64 res) { - Core::CPU().SetReg(0, (u32)(res & 0xFFFFFFFF)); - Core::CPU().SetReg(1, (u32)((res >> 32) & 0xFFFFFFFF)); -} - //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type ResultCode +template <ResultCode func(u64)> +void Wrap() { + FuncReturn(func(PARAM(0)).raw); +} + +template <ResultCode func(u32, u64, u32)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + +template <ResultCode func(u64, u32)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1)).raw); +} + +template <ResultCode func(u64, u64, u64)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + +template <ResultCode func(u64*, u64, u64, u64)> +void Wrap() { + u64 param_1 = 0; + u32 retval = func(¶m_1, PARAM(1), PARAM(2), PARAM(3)).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + template <ResultCode func(u32, u32, u32, u32)> void Wrap() { FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw); @@ -58,22 +76,21 @@ void Wrap() { FuncReturn(retval); } -template <ResultCode func(s32*, u32*, s32, bool, s64)> +template <ResultCode func(s32*, VAddr, s32, bool, s64)> void Wrap() { s32 param_1 = 0; - s32 retval = func(¶m_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), - (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0))) - .raw; + s32 retval = + func(¶m_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0))) + .raw; Core::CPU().SetReg(1, (u32)param_1); FuncReturn(retval); } -template <ResultCode func(s32*, u32*, s32, u32)> +template <ResultCode func(s32*, VAddr, s32, u32)> void Wrap() { s32 param_1 = 0; - u32 retval = - func(¶m_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw; + u32 retval = func(¶m_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw; Core::CPU().SetReg(1, (u32)param_1); FuncReturn(retval); @@ -85,6 +102,14 @@ void Wrap() { func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw); } +template <ResultCode func(u32, u64*)> +void Wrap() { + u64 param_1 = 0; + u32 retval = func(PARAM(0), ¶m_1).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + template <ResultCode func(u32*)> void Wrap() { u32 param_1 = 0; @@ -100,16 +125,17 @@ void Wrap() { FuncReturn(retval); } -template <ResultCode func(MemoryInfo*, PageInfo*, u32)> +template <ResultCode func(MemoryInfo*, PageInfo*, u64)> void Wrap() { MemoryInfo memory_info = {}; PageInfo page_info = {}; u32 retval = func(&memory_info, &page_info, PARAM(2)).raw; - Core::CPU().SetReg(1, memory_info.base_address); - Core::CPU().SetReg(2, memory_info.size); - Core::CPU().SetReg(3, memory_info.permission); - Core::CPU().SetReg(4, memory_info.state); - Core::CPU().SetReg(5, page_info.flags); + + Memory::Write64(PARAM(0), memory_info.base_address); + Memory::Write64(PARAM(0) + 8, memory_info.size); + Memory::Write64(PARAM(0) + 16, memory_info.permission); + Memory::Write64(PARAM(0) + 24, memory_info.state); + FuncReturn(retval); } @@ -139,7 +165,7 @@ void Wrap() { FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw); } -template <ResultCode func(u32*, u32)> +template <ResultCode func(u32*, u64)> void Wrap() { u32 param_1 = 0; u32 retval = func(¶m_1, PARAM(1)).raw; @@ -152,21 +178,6 @@ void Wrap() { FuncReturn(func(PARAM(0)).raw); } -template <ResultCode func(s64*, u32, u32*, u32)> -void Wrap() { - FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1), - (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3)) - .raw); -} - -template <ResultCode func(u32*, const char*)> -void Wrap() { - u32 param_1 = 0; - u32 retval = func(¶m_1, (char*)Memory::GetPointer(PARAM(1))).raw; - Core::CPU().SetReg(1, param_1); - FuncReturn(retval); -} - template <ResultCode func(u32*, s32, s32)> void Wrap() { u32 param_1 = 0; @@ -222,13 +233,11 @@ void Wrap() { FuncReturn(func(PARAM(0), PARAM(1)).raw); } -template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)> +template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)> void Wrap() { Kernel::Handle param_1 = 0; Kernel::Handle param_2 = 0; - u32 retval = func(¶m_1, ¶m_2, - reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3)) - .raw; + u32 retval = func(¶m_1, ¶m_2, PARAM(2), PARAM(3)).raw; Core::CPU().SetReg(1, param_1); Core::CPU().SetReg(2, param_2); FuncReturn(retval); @@ -244,6 +253,11 @@ void Wrap() { FuncReturn(retval); } +template <ResultCode func(u32, u32, u32)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type u32 @@ -268,14 +282,14 @@ void Wrap() { func(((s64)PARAM(1) << 32) | PARAM(0)); } -template <void func(const char*, int len)> +template <void func(VAddr, int len)> void Wrap() { - func((char*)Memory::GetPointer(PARAM(0)), PARAM(1)); + func(PARAM(0), PARAM(1)); } -template <void func(u8)> +template <void func(u64, u64, u64)> void Wrap() { - func((u8)PARAM(0)); + func(PARAM(0), PARAM(1), PARAM(2)); } #undef PARAM |