diff options
Diffstat (limited to 'src/core/hle/function_wrappers.h')
| -rw-r--r-- | src/core/hle/function_wrappers.h | 72 |
1 files changed, 52 insertions, 20 deletions
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h index f93439f21..31fda6db3 100644 --- a/src/core/hle/function_wrappers.h +++ b/src/core/hle/function_wrappers.h @@ -20,23 +20,41 @@ namespace HLE { * HLE a function return from the current ARM11 userland process * @param res Result to return */ -static inline void FuncReturn(u32 res) { +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); @@ -84,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; @@ -99,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); } @@ -138,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; @@ -226,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 @@ -255,9 +287,9 @@ void Wrap() { 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 |
