From cb9216d73fbfbc079079dc8e9f5e055a1d0e33cd Mon Sep 17 00:00:00 2001 From: raziel1000 Date: Wed, 24 Jul 2024 03:03:35 -0600 Subject: [PATCH] Added (Partial) sceKernelBatchMap/sceKernelBatchMap2 --- src/core/libraries/kernel/libkernel.cpp | 3 ++ .../libraries/kernel/memory_management.cpp | 38 +++++++++++++++++++ src/core/libraries/kernel/memory_management.h | 15 ++++++++ 3 files changed, 56 insertions(+) diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index f44d928b..a7f619f1 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -405,6 +405,9 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("VOx8NGmHXTs", "libkernel", 1, "libkernel", 1, 1, sceKernelGetCpumode); LIB_FUNCTION("Xjoosiw+XPI", "libkernel", 1, "libkernel", 1, 1, sceKernelUuidCreate); + LIB_FUNCTION("2SKEx6bSq-4", "libkernel", 1, "libkernel", 1, 1, sceKernelBatchMap); + LIB_FUNCTION("kBJzF8x4SyE", "libkernel", 1, "libkernel", 1, 1, sceKernelBatchMap2); + // equeue LIB_FUNCTION("D0OdFMjp46I", "libkernel", 1, "libkernel", 1, 1, sceKernelCreateEqueue); LIB_FUNCTION("jpFjmgAC5AE", "libkernel", 1, "libkernel", 1, 1, sceKernelDeleteEqueue); diff --git a/src/core/libraries/kernel/memory_management.cpp b/src/core/libraries/kernel/memory_management.cpp index cdee3f46..09b5b005 100644 --- a/src/core/libraries/kernel/memory_management.cpp +++ b/src/core/libraries/kernel/memory_management.cpp @@ -225,4 +225,42 @@ int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut directMemoryEndOut); } +s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, int numEntries, + int* numEntriesOut) { + return sceKernelBatchMap2(entries, numEntries, numEntriesOut, 0x10); // 0x10 : Fixed / 0x410 +} + +s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEntries, + int* numEntriesOut, int flags) { + int processed = 0; + int result = 0; + for (int i = 0; i < numEntries; i++) { + if (entries == nullptr || entries[i].length == 0 || entries[i].operation > 4) { + result = ORBIS_KERNEL_ERROR_EINVAL; + break; // break and assign a value to numEntriesOut. + } + + if (entries[i].operation == 0) { // MAP_DIRECT + result = sceKernelMapNamedDirectMemory(&entries[i].start, entries[i].length, + entries[i].protection, flags, + static_cast(entries[i].offset), 0, ""); + LOG_INFO( + Kernel_Vmm, + "BatchMap: entry = {}, operation = {}, len = {:#x}, offset = {:#x}, type = {}, " + "result = {}", + i, entries[i].operation, entries[i].length, entries[i].offset, (u8)entries[i].type, + result); + + if (result == 0) + processed++; + } else { + LOG_ERROR(Kernel_Vmm, "called: Unimplemented Operation = {}", entries[i].operation); + } + } + if (numEntriesOut != NULL) { // can be zero. do not return an error code. + *numEntriesOut = processed; + } + return result; +} + } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/memory_management.h b/src/core/libraries/kernel/memory_management.h index 2a17f6ed..cab877f4 100644 --- a/src/core/libraries/kernel/memory_management.h +++ b/src/core/libraries/kernel/memory_management.h @@ -53,6 +53,16 @@ struct OrbisVirtualQueryInfo { std::array name; }; +struct OrbisKernelBatchMapEntry { + void* start; + off_t offset; + size_t length; + char protection; + char type; + short reserved; + int operation; +}; + u64 PS4_SYSV_ABI sceKernelGetDirectMemorySize(); int PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u64 len, u64 alignment, int memoryType, s64* physAddrOut); @@ -85,4 +95,9 @@ int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut void** directMemoryStartOut, void** directMemoryEndOut); +s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, int numEntries, + int* numEntriesOut); +s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEntries, + int* numEntriesOut, int flags); + } // namespace Libraries::Kernel