| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- // Copyright 2018 yuzu emulator team
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include "common/common_types.h"
- #include "core/arm/arm_interface.h"
- #include "core/core.h"
- #include "core/hle/kernel/svc.h"
- #include "core/hle/result.h"
- #include "core/memory.h"
- namespace Kernel {
- static inline u64 Param(int n) {
- return Core::CurrentArmInterface().GetReg(n);
- }
- /**
- * HLE a function return from the current ARM userland process
- * @param res Result to return
- */
- static inline void FuncReturn(u64 res) {
- Core::CurrentArmInterface().SetReg(0, res);
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // Function wrappers that return type ResultCode
- template <ResultCode func(u64)>
- void SvcWrap() {
- FuncReturn(func(Param(0)).raw);
- }
- template <ResultCode func(u32)>
- void SvcWrap() {
- FuncReturn(func(static_cast<u32>(Param(0))).raw);
- }
- template <ResultCode func(u32, u32)>
- void SvcWrap() {
- FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1))).raw);
- }
- template <ResultCode func(u32*)>
- void SvcWrap() {
- u32 param = 0;
- const u32 retval = func(¶m).raw;
- Core::CurrentArmInterface().SetReg(1, param);
- FuncReturn(retval);
- }
- template <ResultCode func(u32*, u32)>
- void SvcWrap() {
- u32 param_1 = 0;
- u32 retval = func(¶m_1, static_cast<u32>(Param(1))).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(u32*, u32*)>
- void SvcWrap() {
- u32 param_1 = 0;
- u32 param_2 = 0;
- const u32 retval = func(¶m_1, ¶m_2).raw;
- auto& arm_interface = Core::CurrentArmInterface();
- arm_interface.SetReg(1, param_1);
- arm_interface.SetReg(2, param_2);
- FuncReturn(retval);
- }
- template <ResultCode func(u32*, u64)>
- void SvcWrap() {
- u32 param_1 = 0;
- u32 retval = func(¶m_1, Param(1)).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(u64, s32)>
- void SvcWrap() {
- FuncReturn(func(Param(0), static_cast<s32>(Param(1))).raw);
- }
- template <ResultCode func(u64, u32)>
- void SvcWrap() {
- FuncReturn(func(Param(0), static_cast<u32>(Param(1))).raw);
- }
- template <ResultCode func(u64*, u64)>
- void SvcWrap() {
- u64 param_1 = 0;
- u32 retval = func(¶m_1, Param(1)).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(u64*, u32, u32)>
- void SvcWrap() {
- u64 param_1 = 0;
- u32 retval = func(¶m_1, static_cast<u32>(Param(1)), static_cast<u32>(Param(2))).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(u32, u64)>
- void SvcWrap() {
- FuncReturn(func(static_cast<u32>(Param(0)), Param(1)).raw);
- }
- template <ResultCode func(u32, u32, u64)>
- void SvcWrap() {
- FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1)), Param(2)).raw);
- }
- template <ResultCode func(u32, u32*, u64*)>
- void SvcWrap() {
- u32 param_1 = 0;
- u64 param_2 = 0;
- ResultCode retval = func(static_cast<u32>(Param(2)), ¶m_1, ¶m_2);
- Core::CurrentArmInterface().SetReg(1, param_1);
- Core::CurrentArmInterface().SetReg(2, param_2);
- FuncReturn(retval.raw);
- }
- template <ResultCode func(u64, u64, u32, u32)>
- void SvcWrap() {
- FuncReturn(
- func(Param(0), Param(1), static_cast<u32>(Param(2)), static_cast<u32>(Param(3))).raw);
- }
- template <ResultCode func(u32, u64, u32)>
- void SvcWrap() {
- FuncReturn(func(static_cast<u32>(Param(0)), Param(1), static_cast<u32>(Param(2))).raw);
- }
- template <ResultCode func(u64, u64, u64)>
- void SvcWrap() {
- FuncReturn(func(Param(0), Param(1), Param(2)).raw);
- }
- template <ResultCode func(u64, u64, u32)>
- void SvcWrap() {
- FuncReturn(func(Param(0), Param(1), static_cast<u32>(Param(2))).raw);
- }
- template <ResultCode func(u32, u64, u64, u32)>
- void SvcWrap() {
- FuncReturn(
- func(static_cast<u32>(Param(0)), Param(1), Param(2), static_cast<u32>(Param(3))).raw);
- }
- template <ResultCode func(u32, u64, u64)>
- void SvcWrap() {
- FuncReturn(func(static_cast<u32>(Param(0)), Param(1), Param(2)).raw);
- }
- template <ResultCode func(u32*, u64, u64, s64)>
- void SvcWrap() {
- u32 param_1 = 0;
- ResultCode retval =
- func(¶m_1, Param(1), static_cast<u32>(Param(2)), static_cast<s64>(Param(3)));
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval.raw);
- }
- template <ResultCode func(u64, u64, u32, s64)>
- void SvcWrap() {
- FuncReturn(
- func(Param(0), Param(1), static_cast<u32>(Param(2)), static_cast<s64>(Param(3))).raw);
- }
- template <ResultCode func(u64*, u64, u64, u64)>
- void SvcWrap() {
- u64 param_1 = 0;
- u32 retval = func(¶m_1, Param(1), Param(2), Param(3)).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(u32*, u64, u64, u64, u32, s32)>
- void SvcWrap() {
- u32 param_1 = 0;
- u32 retval = func(¶m_1, Param(1), Param(2), Param(3), static_cast<u32>(Param(4)),
- static_cast<s32>(Param(5)))
- .raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
- void SvcWrap() {
- MemoryInfo memory_info = {};
- PageInfo page_info = {};
- u32 retval = func(&memory_info, &page_info, Param(2)).raw;
- Memory::Write64(Param(0), memory_info.base_address);
- Memory::Write64(Param(0) + 8, memory_info.size);
- Memory::Write32(Param(0) + 16, memory_info.type);
- Memory::Write32(Param(0) + 20, memory_info.attributes);
- Memory::Write32(Param(0) + 24, memory_info.permission);
- FuncReturn(retval);
- }
- template <ResultCode func(u32*, u64, u64, u32)>
- void SvcWrap() {
- u32 param_1 = 0;
- u32 retval = func(¶m_1, Param(1), Param(2), static_cast<u32>(Param(3))).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(Handle*, u64, u32, u32)>
- void SvcWrap() {
- u32 param_1 = 0;
- u32 retval =
- func(¶m_1, Param(1), static_cast<u32>(Param(2)), static_cast<u32>(Param(3))).raw;
- Core::CurrentArmInterface().SetReg(1, param_1);
- FuncReturn(retval);
- }
- template <ResultCode func(u64, u32, s32, s64)>
- void SvcWrap() {
- FuncReturn(func(Param(0), static_cast<u32>(Param(1)), static_cast<s32>(Param(2)),
- static_cast<s64>(Param(3)))
- .raw);
- }
- template <ResultCode func(u64, u32, s32, s32)>
- void SvcWrap() {
- FuncReturn(func(Param(0), static_cast<u32>(Param(1)), static_cast<s32>(Param(2)),
- static_cast<s32>(Param(3)))
- .raw);
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // Function wrappers that return type u32
- template <u32 func()>
- void SvcWrap() {
- FuncReturn(func());
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // Function wrappers that return type u64
- template <u64 func()>
- void SvcWrap() {
- FuncReturn(func());
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- /// Function wrappers that return type void
- template <void func()>
- void SvcWrap() {
- func();
- }
- template <void func(s64)>
- void SvcWrap() {
- func(static_cast<s64>(Param(0)));
- }
- template <void func(u64, u64 len)>
- void SvcWrap() {
- func(Param(0), Param(1));
- }
- template <void func(u64, u64, u64)>
- void SvcWrap() {
- func(Param(0), Param(1), Param(2));
- }
- template <void func(u32, u64, u64)>
- void SvcWrap() {
- func(static_cast<u32>(Param(0)), Param(1), Param(2));
- }
- } // namespace Kernel
|