From b117ca5fce0344997a09260d835b27dbd2602507 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 6 Apr 2019 18:46:18 -0400 Subject: kernel/svc: Deglobalize the supervisor call handlers Adjusts the interface of the wrappers to take a system reference, which allows accessing a system instance without using the global accessors. This also allows getting rid of all global accessors within the supervisor call handling code. While this does make the wrappers themselves slightly more noisy, this will be further cleaned up in a follow-up. This eliminates the global system accessors in the current code while preserving the existing interface. --- src/core/hle/kernel/svc_wrap.h | 352 ++++++++++++++++++++++------------------- 1 file changed, 193 insertions(+), 159 deletions(-) (limited to 'src/core/hle/kernel/svc_wrap.h') diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h index b3733680f..b3690b5f3 100644 --- a/src/core/hle/kernel/svc_wrap.h +++ b/src/core/hle/kernel/svc_wrap.h @@ -11,278 +11,312 @@ namespace Kernel { -static inline u64 Param(int n) { - return Core::CurrentArmInterface().GetReg(n); +static inline u64 Param(const Core::System& system, int n) { + return system.CurrentArmInterface().GetReg(n); } /** * HLE a function return from the current ARM userland process - * @param res Result to return + * @param system System context + * @param result Result to return */ -static inline void FuncReturn(u64 res) { - Core::CurrentArmInterface().SetReg(0, res); +static inline void FuncReturn(Core::System& system, u64 result) { + system.CurrentArmInterface().SetReg(0, result); } //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type ResultCode -template -void SvcWrap() { - FuncReturn(func(Param(0)).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0)).raw); } -template -void SvcWrap() { - FuncReturn(func(static_cast(Param(0))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, static_cast(Param(system, 0))).raw); } -template -void SvcWrap() { - FuncReturn(func(static_cast(Param(0)), static_cast(Param(1))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn( + system, + func(system, static_cast(Param(system, 0)), static_cast(Param(system, 1))).raw); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param = 0; - const u32 retval = func(¶m).raw; - Core::CurrentArmInterface().SetReg(1, param); - FuncReturn(retval); + const u32 retval = func(system, ¶m).raw; + system.CurrentArmInterface().SetReg(1, param); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - u32 retval = func(¶m_1, static_cast(Param(1))).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, static_cast(Param(system, 1))).raw; + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; u32 param_2 = 0; - const u32 retval = func(¶m_1, ¶m_2).raw; + const u32 retval = func(system, ¶m_1, ¶m_2).raw; - auto& arm_interface = Core::CurrentArmInterface(); + auto& arm_interface = system.CurrentArmInterface(); arm_interface.SetReg(1, param_1); arm_interface.SetReg(2, param_2); - FuncReturn(retval); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - const u32 retval = func(¶m_1, Param(1)).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, Param(system, 1)).raw; + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - const u32 retval = func(¶m_1, Param(1), static_cast(Param(2))).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = + func(system, ¶m_1, Param(system, 1), static_cast(Param(system, 2))).raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u64 param_1 = 0; - const u32 retval = func(¶m_1, static_cast(Param(1))).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, static_cast(Param(system, 1))).raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { - FuncReturn(func(Param(0), static_cast(Param(1))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), static_cast(Param(system, 1))).raw); } -template -void SvcWrap() { - FuncReturn(func(Param(0), static_cast(Param(1))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), static_cast(Param(system, 1))).raw); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u64 param_1 = 0; - u32 retval = func(¶m_1, Param(1)).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, Param(system, 1)).raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u64 param_1 = 0; - u32 retval = func(¶m_1, static_cast(Param(1)), static_cast(Param(2))).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, static_cast(Param(system, 1)), + static_cast(Param(system, 2))) + .raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { - FuncReturn(func(static_cast(Param(0)), Param(1)).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, static_cast(Param(system, 0)), Param(system, 1)).raw); } -template -void SvcWrap() { - FuncReturn(func(static_cast(Param(0)), static_cast(Param(1)), Param(2)).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, static_cast(Param(system, 0)), + static_cast(Param(system, 1)), Param(system, 2)) + .raw); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; u64 param_2 = 0; - ResultCode retval = func(static_cast(Param(2)), ¶m_1, ¶m_2); - Core::CurrentArmInterface().SetReg(1, param_1); - Core::CurrentArmInterface().SetReg(2, param_2); - FuncReturn(retval.raw); -} + const ResultCode retval = func(system, static_cast(Param(system, 2)), ¶m_1, ¶m_2); -template -void SvcWrap() { - FuncReturn( - func(Param(0), Param(1), static_cast(Param(2)), static_cast(Param(3))).raw); + system.CurrentArmInterface().SetReg(1, param_1); + system.CurrentArmInterface().SetReg(2, param_2); + FuncReturn(system, retval.raw); } -template -void SvcWrap() { - FuncReturn(func(Param(0), Param(1), static_cast(Param(2)), Param(3)).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), Param(system, 1), + static_cast(Param(system, 2)), static_cast(Param(system, 3))) + .raw); } -template -void SvcWrap() { - FuncReturn(func(static_cast(Param(0)), Param(1), static_cast(Param(2))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), Param(system, 1), + static_cast(Param(system, 2)), Param(system, 3)) + .raw); } -template -void SvcWrap() { - FuncReturn(func(Param(0), Param(1), Param(2)).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, static_cast(Param(system, 0)), Param(system, 1), + static_cast(Param(system, 2))) + .raw); } -template -void SvcWrap() { - FuncReturn(func(Param(0), Param(1), static_cast(Param(2))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), Param(system, 1), Param(system, 2)).raw); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { FuncReturn( - func(static_cast(Param(0)), Param(1), Param(2), static_cast(Param(3))).raw); + system, + func(system, Param(system, 0), Param(system, 1), static_cast(Param(system, 2))).raw); +} + +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, static_cast(Param(system, 0)), Param(system, 1), + Param(system, 2), static_cast(Param(system, 3))) + .raw); } -template -void SvcWrap() { - FuncReturn(func(static_cast(Param(0)), Param(1), Param(2)).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn( + system, + func(system, static_cast(Param(system, 0)), Param(system, 1), Param(system, 2)).raw); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - ResultCode retval = - func(¶m_1, Param(1), static_cast(Param(2)), static_cast(Param(3))); - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval.raw); + const u32 retval = func(system, ¶m_1, Param(system, 1), static_cast(Param(system, 2)), + static_cast(Param(system, 3))) + .raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { - FuncReturn( - func(Param(0), Param(1), static_cast(Param(2)), static_cast(Param(3))).raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), Param(system, 1), + static_cast(Param(system, 2)), static_cast(Param(system, 3))) + .raw); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u64 param_1 = 0; - u32 retval = func(¶m_1, Param(1), Param(2), Param(3)).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = + func(system, ¶m_1, Param(system, 1), Param(system, 2), Param(system, 3)).raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - u32 retval = func(¶m_1, Param(1), Param(2), Param(3), static_cast(Param(4)), - static_cast(Param(5))) - .raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, Param(system, 1), Param(system, 2), Param(system, 3), + static_cast(Param(system, 4)), static_cast(Param(system, 5))) + .raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - u32 retval = func(¶m_1, Param(1), Param(2), static_cast(Param(3))).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, Param(system, 1), Param(system, 2), + static_cast(Param(system, 3))) + .raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { +template +void SvcWrap(Core::System& system) { u32 param_1 = 0; - u32 retval = - func(¶m_1, Param(1), static_cast(Param(2)), static_cast(Param(3))).raw; - Core::CurrentArmInterface().SetReg(1, param_1); - FuncReturn(retval); + const u32 retval = func(system, ¶m_1, Param(system, 1), static_cast(Param(system, 2)), + static_cast(Param(system, 3))) + .raw; + + system.CurrentArmInterface().SetReg(1, param_1); + FuncReturn(system, retval); } -template -void SvcWrap() { - FuncReturn(func(Param(0), static_cast(Param(1)), static_cast(Param(2)), - static_cast(Param(3))) - .raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), static_cast(Param(system, 1)), + static_cast(Param(system, 2)), static_cast(Param(system, 3))) + .raw); } -template -void SvcWrap() { - FuncReturn(func(Param(0), static_cast(Param(1)), static_cast(Param(2)), - static_cast(Param(3))) - .raw); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system, Param(system, 0), static_cast(Param(system, 1)), + static_cast(Param(system, 2)), static_cast(Param(system, 3))) + .raw); } //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type u32 -template -void SvcWrap() { - FuncReturn(func()); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system)); } //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type u64 -template -void SvcWrap() { - FuncReturn(func()); +template +void SvcWrap(Core::System& system) { + FuncReturn(system, func(system)); } //////////////////////////////////////////////////////////////////////////////////////////////////// /// Function wrappers that return type void -template -void SvcWrap() { - func(); +template +void SvcWrap(Core::System& system) { + func(system); } -template -void SvcWrap() { - func(static_cast(Param(0))); +template +void SvcWrap(Core::System& system) { + func(system, static_cast(Param(system, 0))); } -template -void SvcWrap() { - func(Param(0), Param(1)); +template +void SvcWrap(Core::System& system) { + func(system, Param(system, 0), Param(system, 1)); } -template -void SvcWrap() { - func(Param(0), Param(1), Param(2)); +template +void SvcWrap(Core::System& system) { + func(system, Param(system, 0), Param(system, 1), Param(system, 2)); } -template -void SvcWrap() { - func(static_cast(Param(0)), Param(1), Param(2)); +template +void SvcWrap(Core::System& system) { + func(system, static_cast(Param(system, 0)), Param(system, 1), Param(system, 2)); } } // namespace Kernel -- cgit v1.2.3