From c3242abe95ec7b4b2279401ed08affb5b3e3e1da Mon Sep 17 00:00:00 2001 From: Sergi Granell Date: Tue, 8 Feb 2022 19:46:45 +0100 Subject: kernel: svc: Add OutputDebugString32, CreateCodeMemory32, ControlCodeMemory32 Very straightforward, they are just wrappers to the 64-bit version of the SVC. --- src/core/hle/kernel/svc.cpp | 22 ++++++++++++++++++---- src/core/hle/kernel/svc_wrap.h | 22 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) (limited to 'src/core/hle/kernel') diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 3a2c9d18d..9836809f2 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -645,6 +645,10 @@ static void OutputDebugString(Core::System& system, VAddr address, u64 len) { LOG_DEBUG(Debug_Emulated, "{}", str); } +static void OutputDebugString32(Core::System& system, u32 address, u32 len) { + OutputDebugString(system, address, len); +} + /// Gets system/memory information for the current process static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, Handle handle, u64 info_sub_id) { @@ -1404,7 +1408,7 @@ static ResultCode UnmapProcessMemory(Core::System& system, VAddr dst_address, Ha } static ResultCode CreateCodeMemory(Core::System& system, Handle* out, VAddr address, size_t size) { - LOG_TRACE(Kernel_SVC, "called, handle_out=0x{:X}, address=0x{:X}, size=0x{:X}", + LOG_TRACE(Kernel_SVC, "called, handle_out={}, address=0x{:X}, size=0x{:X}", static_cast(out), address, size); // Get kernel instance. auto& kernel = system.Kernel(); @@ -1438,6 +1442,10 @@ static ResultCode CreateCodeMemory(Core::System& system, Handle* out, VAddr addr return ResultSuccess; } +static ResultCode CreateCodeMemory32(Core::System& system, Handle* out, u32 address, u32 size) { + return CreateCodeMemory(system, out, address, size); +} + static ResultCode ControlCodeMemory(Core::System& system, Handle code_memory_handle, u32 operation, VAddr address, size_t size, Svc::MemoryPermission perm) { @@ -1517,6 +1525,12 @@ static ResultCode ControlCodeMemory(Core::System& system, Handle code_memory_han return ResultSuccess; } +static ResultCode ControlCodeMemory32(Core::System& system, Handle code_memory_handle, + u32 operation, u64 address, u64 size, + Svc::MemoryPermission perm) { + return ControlCodeMemory(system, code_memory_handle, operation, address, size, perm); +} + static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_address, VAddr page_info_address, Handle process_handle, VAddr address) { @@ -2598,7 +2612,7 @@ static const FunctionDef SVC_Table_32[] = { {0x24, SvcWrap32, "GetProcessId32"}, {0x25, SvcWrap32, "GetThreadId32"}, {0x26, SvcWrap32, "Break32"}, - {0x27, nullptr, "OutputDebugString32"}, + {0x27, SvcWrap32, "OutputDebugString32"}, {0x28, nullptr, "ReturnFromException32"}, {0x29, SvcWrap32, "GetInfo32"}, {0x2a, nullptr, "FlushEntireDataCache32"}, @@ -2634,8 +2648,8 @@ static const FunctionDef SVC_Table_32[] = { {0x48, nullptr, "MapPhysicalMemoryUnsafe32"}, {0x49, nullptr, "UnmapPhysicalMemoryUnsafe32"}, {0x4a, nullptr, "SetUnsafeLimit32"}, - {0x4b, nullptr, "CreateCodeMemory32"}, - {0x4c, nullptr, "ControlCodeMemory32"}, + {0x4b, SvcWrap32, "CreateCodeMemory32"}, + {0x4c, SvcWrap32, "ControlCodeMemory32"}, {0x4d, nullptr, "SleepSystem32"}, {0x4e, nullptr, "ReadWriteRegister32"}, {0x4f, nullptr, "SetProcessActivity32"}, diff --git a/src/core/hle/kernel/svc_wrap.h b/src/core/hle/kernel/svc_wrap.h index a60adfcab..d309f166c 100644 --- a/src/core/hle/kernel/svc_wrap.h +++ b/src/core/hle/kernel/svc_wrap.h @@ -669,4 +669,26 @@ void SvcWrap32(Core::System& system) { FuncReturn(system, retval); } +// Used by CreateCodeMemory32 +template +void SvcWrap32(Core::System& system) { + Handle handle = 0; + + const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2)).raw; + + system.CurrentArmInterface().SetReg(1, handle); + FuncReturn(system, retval); +} + +// Used by ControlCodeMemory32 +template +void SvcWrap32(Core::System& system) { + const u32 retval = + func(system, Param32(system, 0), Param32(system, 1), Param(system, 2), Param(system, 4), + static_cast(Param32(system, 6))) + .raw; + + FuncReturn(system, retval); +} + } // namespace Kernel -- cgit v1.2.3