From fd535bae6bb0416a279d8e5aa401dee6a6c4a3ec Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 31 Oct 2023 18:12:05 +0200 Subject: [PATCH] libc separate stdlib functions to libc_stdlib --- CMakeLists.txt | 2 ++ src/core/PS4/HLE/LibC.cpp | 9 +++---- src/core/hle/libraries/libc/libc.cpp | 25 -------------------- src/core/hle/libraries/libc/libc.h | 4 ---- src/core/hle/libraries/libc/libc_stdlib.cpp | 26 +++++++++++++++++++++ src/core/hle/libraries/libc/libc_stdlib.h | 12 ++++++++++ 6 files changed, 45 insertions(+), 33 deletions(-) create mode 100644 src/core/hle/libraries/libc/libc_stdlib.cpp create mode 100644 src/core/hle/libraries/libc/libc_stdlib.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cdc296f9..6cb066ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,8 @@ set(LIBC_SOURCES src/core/hle/libraries/Libc/Libc.cpp src/core/hle/libraries/libc/libc_math.h src/core/hle/libraries/libc/libc_string.cpp src/core/hle/libraries/libc/libc_string.h + src/core/hle/libraries/libc/libc_stdlib.cpp + src/core/hle/libraries/libc/libc_stdlib.h ) set(USERSERVICE_SOURCES src/core/hle/libraries/libuserservice/user_service.cpp src/core/hle/libraries/libuserservice/user_service.h diff --git a/src/core/PS4/HLE/LibC.cpp b/src/core/PS4/HLE/LibC.cpp index e67b95ae..8f67e5d7 100644 --- a/src/core/PS4/HLE/LibC.cpp +++ b/src/core/PS4/HLE/LibC.cpp @@ -9,6 +9,7 @@ #include "core/hle/libraries/libc/libc_math.h" #include "core/hle/libraries/libc/libc_stdio.h" #include "core/hle/libraries/libc/libc_string.h" +#include "core/hle/libraries/libc/libc_stdlib.h" #include "ErrorCodes.h" #include "Libs.h" @@ -66,8 +67,8 @@ void LibC_Register(SymbolsResolver* sym) { LIB_FUNCTION("Q3VBxCXhUHs", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::string::memcpy); LIB_FUNCTION("8zTFvBIAIN8", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::memset); LIB_FUNCTION("XKRegsFpEpk", "libc", 1, "libc", 1, 1, catchReturnFromMain); - LIB_FUNCTION("uMei1W9uyNo", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::exit); - LIB_FUNCTION("8G2LB+A3rzg", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::atexit); + LIB_FUNCTION("uMei1W9uyNo", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::stdlib::exit); + LIB_FUNCTION("8G2LB+A3rzg", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::stdlib::atexit); LIB_FUNCTION("-QgqOT5u2Vk", "libc", 1, "libc", 1, 1, _Assert); LIB_FUNCTION("hcuQgD53UxM", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::stdio::printf); LIB_FUNCTION("Q2V+iqvjgC0", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::stdio::vsnprintf); @@ -76,8 +77,8 @@ void LibC_Register(SymbolsResolver* sym) { LIB_FUNCTION("ZtjspkJQ+vw", "libc", 1, "libc", 1, 1, _Fsin); LIB_FUNCTION("AEJdIVZTEmo", "libc", 1, "libc", 1, 1, qsort); LIB_FUNCTION("Ovb2dSJOAuE", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::strcmp); - LIB_FUNCTION("gQX+4GDQjpM", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::malloc); - LIB_FUNCTION("tIhsqj0qsFE", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::free); + LIB_FUNCTION("gQX+4GDQjpM", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::stdlib::malloc); + LIB_FUNCTION("tIhsqj0qsFE", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::stdlib::free); LIB_FUNCTION("j4ViWNHEgww", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::strlen); LIB_FUNCTION("6sJWiWSRuqk", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::strncpy); LIB_FUNCTION("+P6FRGH4LfA", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::memmove); diff --git a/src/core/hle/libraries/libc/libc.cpp b/src/core/hle/libraries/libc/libc.cpp index 9e6865ac..6ffac8af 100644 --- a/src/core/hle/libraries/libc/libc.cpp +++ b/src/core/hle/libraries/libc/libc.cpp @@ -2,33 +2,8 @@ #include -#include - namespace Core::Libraries::LibC { -void PS4_SYSV_ABI exit(int code) { std::exit(code); } - -int PS4_SYSV_ABI atexit(void (*func)()) { - int rt = std::atexit(func); - if (rt != 0) { - BREAKPOINT(); - } - return rt; -} - - - -void* PS4_SYSV_ABI malloc(size_t size) { return std::malloc(size); } - -void PS4_SYSV_ABI free(void* ptr) { std::free(ptr); } - - - - - - - -// math }; // namespace Core::Libraries::LibC \ No newline at end of file diff --git a/src/core/hle/libraries/libc/libc.h b/src/core/hle/libraries/libc/libc.h index 6492fb58..14eb0d26 100644 --- a/src/core/hle/libraries/libc/libc.h +++ b/src/core/hle/libraries/libc/libc.h @@ -7,11 +7,7 @@ namespace Core::Libraries::LibC { // HLE functions -void PS4_SYSV_ABI exit(int code); -int PS4_SYSV_ABI atexit(void (*func)()); -void* PS4_SYSV_ABI malloc(size_t size); -void PS4_SYSV_ABI free(void* ptr); diff --git a/src/core/hle/libraries/libc/libc_stdlib.cpp b/src/core/hle/libraries/libc/libc_stdlib.cpp new file mode 100644 index 00000000..e5a90d0d --- /dev/null +++ b/src/core/hle/libraries/libc/libc_stdlib.cpp @@ -0,0 +1,26 @@ +#include "libc_stdlib.h" + +#include +#include + +#include + +namespace Core::Libraries::LibC::stdlib { +constexpr bool log_file_libc = true; // disable it to disable logging + +void PS4_SYSV_ABI exit(int code) { std::exit(code); } + +int PS4_SYSV_ABI atexit(void (*func)()) { + int rt = std::atexit(func); + if (rt != 0) { + LOG_ERROR_IF(log_file_libc, "atexit returned {}\n", rt); + BREAKPOINT(); + } + return rt; +} + +void* PS4_SYSV_ABI malloc(size_t size) { return std::malloc(size); } + +void PS4_SYSV_ABI free(void* ptr) { std::free(ptr); } + +} // namespace Core::Libraries::LibC::stdlib diff --git a/src/core/hle/libraries/libc/libc_stdlib.h b/src/core/hle/libraries/libc/libc_stdlib.h new file mode 100644 index 00000000..b21f69be --- /dev/null +++ b/src/core/hle/libraries/libc/libc_stdlib.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +#include + +namespace Core::Libraries::LibC::stdlib { +void PS4_SYSV_ABI exit(int code); +int PS4_SYSV_ABI atexit(void (*func)()); +void* PS4_SYSV_ABI malloc(size_t size); +void PS4_SYSV_ABI free(void* ptr); +} // namespace Core::Libraries::LibC::stdlib