From 022e0c2fbb4b9dd504e29afe048c3316c8c59887 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 18 Jun 2024 18:45:14 +0300 Subject: [PATCH] misc hle functions --- src/core/libraries/kernel/file_system.cpp | 4 ++-- src/core/libraries/kernel/libkernel.cpp | 16 +++++++++++++++- src/core/libraries/kernel/memory_management.cpp | 6 ++++++ src/core/libraries/kernel/memory_management.h | 1 + src/core/memory.h | 4 ++++ src/emulator.cpp | 2 +- 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index bc9ff214..964177b7 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -32,7 +32,7 @@ int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { bool directory = (flags & ORBIS_KERNEL_O_DIRECTORY) != 0; if (std::string_view{path} == "/dev/console" || std::string_view{path} == "/dev/deci_tty6") { - return ORBIS_OK; + return 2000;//return a high handler // TODO fix me } if (directory) { @@ -68,7 +68,7 @@ int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { } int PS4_SYSV_ABI posix_open(const char* path, int flags, /* SceKernelMode*/ u16 mode) { - LOG_INFO(Kernel_Fs, "posix open redirect to sceKernelOpen\n"); + LOG_INFO(Kernel_Fs, "posix open redirect to sceKernelOpen"); int result = sceKernelOpen(path, flags, mode); // Posix calls different only for their return values ASSERT(result >= 0); diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index 9bc54a1d..df3ecb74 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -88,7 +88,7 @@ int PS4_SYSV_ABI sceKernelMmap(void* addr, u64 len, int prot, int flags, int fd, void* PS4_SYSV_ABI posix_mmap(void* addr, u64 len, int prot, int flags, int fd, u64 offset) { void* ptr; - LOG_INFO(Kernel_Vmm, "posix mmap redirect to sceKernelMmap\n"); + LOG_INFO(Kernel_Vmm, "posix mmap redirect to sceKernelMmap"); // posix call the difference is that there is a different behaviour when it doesn't return 0 or // SCE_OK const VAddr ret_addr = (VAddr)__builtin_return_address(0); @@ -288,9 +288,21 @@ int PS4_SYSV_ABI sceKernelUuidCreate(OrbisKernelUuid* orbisUuid) { return 0; } +char* PS4_SYSV_ABI sceKernelGetFsSandboxRandomWord() { + char* path = "sys"; + return path; +} + +int PS4_SYSV_ABI connect() { + return -1; +} void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { // obj LIB_OBJ("f7uOxY9mM1U", "libkernel", 1, "libkernel", 1, 1, &g_stack_chk_guard); + + LIB_FUNCTION("JGfTMBOdUJo", "libkernel", 1, "libkernel", 1, 1, sceKernelGetFsSandboxRandomWord); + LIB_FUNCTION("XVL8So3QJUk", "libkernel", 1, "libkernel", 1, 1, connect); + // memory LIB_FUNCTION("OMDRKKAZ8I4", "libkernel", 1, "libkernel", 1, 1, sceKernelDebugRaiseException); LIB_FUNCTION("rTXw65xmLIA", "libkernel", 1, "libkernel", 1, 1, sceKernelAllocateDirectMemory); @@ -308,6 +320,8 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("cQke9UuBQOk", "libkernel", 1, "libkernel", 1, 1, sceKernelMunmap); LIB_FUNCTION("mL8NDH86iQI", "libkernel", 1, "libkernel", 1, 1, sceKernelMapNamedFlexibleMemory); LIB_FUNCTION("IWIBBdTHit4", "libkernel", 1, "libkernel", 1, 1, sceKernelMapFlexibleMemory); + LIB_FUNCTION("aNz11fnnzi4", "libkernel", 1, "libkernel", 1, 1, + sceKernelAvailableFlexibleMemorySize); LIB_FUNCTION("p5EcQeEeJAE", "libkernel", 1, "libkernel", 1, 1, _sceKernelRtldSetApplicationHeapAPI); LIB_FUNCTION("wzvqT4UqKX8", "libkernel", 1, "libkernel", 1, 1, sceKernelLoadStartModule); diff --git a/src/core/libraries/kernel/memory_management.cpp b/src/core/libraries/kernel/memory_management.cpp index 4683440a..cee8e08f 100644 --- a/src/core/libraries/kernel/memory_management.cpp +++ b/src/core/libraries/kernel/memory_management.cpp @@ -173,6 +173,12 @@ int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInf return memory->DirectMemoryQuery(offset, flags == 1, query_info); } +s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* sizeOut) { + auto* memory = Core::Memory::Instance(); + *sizeOut = 448_MB - memory->GetTotalFlexibleUsage(); + return ORBIS_OK; +} + void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func) { auto* linker = Common::Singleton::Instance(); linker->SetHeapApiFunc(func); diff --git a/src/core/libraries/kernel/memory_management.h b/src/core/libraries/kernel/memory_management.h index 5fc36199..6e3a0660 100644 --- a/src/core/libraries/kernel/memory_management.h +++ b/src/core/libraries/kernel/memory_management.h @@ -78,6 +78,7 @@ int PS4_SYSV_ABI sceKernelQueryMemoryProtection(void* addr, void** start, void** int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInfo* query_info, size_t infoSize); +s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* sizeOut); void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func); } // namespace Libraries::Kernel diff --git a/src/core/memory.h b/src/core/memory.h index d7ec6fc6..eae7fcbf 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -124,6 +124,10 @@ public: instance = instance_; } + size_t GetTotalFlexibleUsage() const noexcept { + return total_flexible_usage; + } + PAddr Allocate(PAddr search_start, PAddr search_end, size_t size, u64 alignment, int memory_type); diff --git a/src/emulator.cpp b/src/emulator.cpp index 2da7513b..b92be9b6 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -139,7 +139,7 @@ void Emulator::LoadSystemModules(const std::filesystem::path& file) { const auto& sys_module_path = Common::FS::GetUserPath(Common::FS::PathType::SysModuleDir); for (const auto& entry : std::filesystem::directory_iterator(sys_module_path)) { if (entry.path().filename() == "libSceNgs2.sprx" || - entry.path().filename() == "libSceLibcInternal.sprx") { + entry.path().filename() == "libSceLibcInternal.sprx" || entry.path().filename() == "libSceDiscMap.sprx") { LOG_INFO(Loader, "Loading {}", entry.path().string().c_str()); linker->LoadModule(entry.path()); }