From 480906fe1b31a8830aec80fbea04ec941894003f Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 2 Jan 2018 20:40:30 -0500 Subject: hle: Move SVC code to kernel namespace. --- src/core/hle/kernel/svc_wrap.h | 155 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/core/hle/kernel/svc_wrap.h (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 new file mode 100644 index 000000000..65b64cb3c --- /dev/null +++ b/src/core/hle/kernel/svc_wrap.h @@ -0,0 +1,155 @@ +// Copyright 2018 Citra Emulator Project +// 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 { + +#define PARAM(n) Core::CPU().GetReg(n) + +/** + * HLE a function return from the current ARM userland process + * @param res Result to return + */ +static inline void FuncReturn(u64 res) { + Core::CPU().SetReg(0, res); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Function wrappers that return type ResultCode + +template +void SvcWrap() { + FuncReturn(func(PARAM(0)).raw); +} + +template +void SvcWrap() { + FuncReturn(func((u32)PARAM(0)).raw); +} + +template +void SvcWrap() { + FuncReturn(func((u32)PARAM(0), (u32)PARAM(1)).raw); +} + +template +void SvcWrap() { + u32 param_1 = 0; + u32 retval = func(¶m_1, (u32)PARAM(1)).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + +template +void SvcWrap() { + u32 param_1 = 0; + u32 retval = func(¶m_1, PARAM(1)).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + +template +void SvcWrap() { + FuncReturn(func(PARAM(0), (u32)PARAM(1)).raw); +} + +template +void SvcWrap() { + u64 param_1 = 0; + u32 retval = func(¶m_1, PARAM(1)).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + +template +void SvcWrap() { + FuncReturn(func((u32)PARAM(0), PARAM(1), (u32)PARAM(2)).raw); +} + +template +void SvcWrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + +template +void SvcWrap() { + FuncReturn(func(PARAM(1), PARAM(2), (s64)PARAM(3)).raw); +} + +template +void SvcWrap() { + 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 +void SvcWrap() { + u32 param_1 = 0; + u32 retval = + func(¶m_1, PARAM(1), PARAM(2), PARAM(3), (u32)PARAM(4), (s32)(PARAM(5) & 0xFFFFFFFF)) + .raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + +template +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); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Function wrappers that return type u32 + +template +void SvcWrap() { + FuncReturn(func()); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +/// Function wrappers that return type void + +template +void SvcWrap() { + func(); +} + +template +void SvcWrap() { + func((s64)PARAM(0)); +} + +template +void SvcWrap() { + func(PARAM(0), (s32)(PARAM(1) & 0xFFFFFFFF)); +} + +template +void SvcWrap() { + func(PARAM(0), PARAM(1), PARAM(2)); +} + +#undef PARAM +#undef FuncReturn + +} // namespace Kernel -- cgit v1.2.3