diff --git a/CMakeLists.txt b/CMakeLists.txt index 58962614..cdc296f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,8 @@ set(LIBC_SOURCES src/core/hle/libraries/Libc/Libc.cpp src/core/hle/libraries/libc/libc_stdio.h src/core/hle/libraries/libc/libc_math.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 ) 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 ee263eb1..e67b95ae 100644 --- a/src/core/PS4/HLE/LibC.cpp +++ b/src/core/PS4/HLE/LibC.cpp @@ -8,6 +8,7 @@ #include "core/hle/libraries/libc/libc_cxa.h" #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 "ErrorCodes.h" #include "Libs.h" @@ -58,12 +59,12 @@ void PS4_SYSV_ABI qsort(void* ptr, size_t count,size_t size, int(PS4_SYSV_ABI* c void LibC_Register(SymbolsResolver* sym) { LIB_FUNCTION("bzQExy189ZI", "libc", 1, "libc", 1, 1, init_env); - LIB_FUNCTION("3GPpjQdAMTw", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::Cxa::__cxa_guard_acquire); - LIB_FUNCTION("9rAeANT2tyE", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::Cxa::__cxa_guard_release); - LIB_FUNCTION("2emaaluWzUw", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::Cxa::__cxa_guard_abort); - LIB_FUNCTION("DfivPArhucg", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::memcmp); - LIB_FUNCTION("Q3VBxCXhUHs", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::memcpy); - LIB_FUNCTION("8zTFvBIAIN8", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::memset); + LIB_FUNCTION("3GPpjQdAMTw", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::cxa::__cxa_guard_acquire); + LIB_FUNCTION("9rAeANT2tyE", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::cxa::__cxa_guard_release); + LIB_FUNCTION("2emaaluWzUw", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::cxa::__cxa_guard_abort); + LIB_FUNCTION("DfivPArhucg", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::string::memcmp); + 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); @@ -74,14 +75,14 @@ void LibC_Register(SymbolsResolver* sym) { LIB_FUNCTION("cpCOXWMgha0", "libc", 1, "libc", 1, 1, rand); 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::strcmp); + 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("j4ViWNHEgww", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::strlen); - LIB_FUNCTION("6sJWiWSRuqk", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::strncpy); - LIB_FUNCTION("+P6FRGH4LfA", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::memmove); - LIB_FUNCTION("kiZSXIWd9vg", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::strcpy); - LIB_FUNCTION("Ls4tzzhimqQ", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::strcat); + 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); + LIB_FUNCTION("kiZSXIWd9vg", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::strcpy); + LIB_FUNCTION("Ls4tzzhimqQ", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::string::strcat); LIB_FUNCTION("EH-x713A99c", "libc", 1, "libc", 1, 1,Core::Libraries::LibC::math::atan2f); LIB_FUNCTION("QI-x0SL8jhw", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::math::acosf); LIB_FUNCTION("ZE6RNL+eLbk", "libc", 1, "libc", 1, 1, Core::Libraries::LibC::math::tanf); diff --git a/src/core/hle/libraries/libc/libc.cpp b/src/core/hle/libraries/libc/libc.cpp index 291f6821..9e6865ac 100644 --- a/src/core/hle/libraries/libc/libc.cpp +++ b/src/core/hle/libraries/libc/libc.cpp @@ -3,7 +3,7 @@ #include #include -#include + namespace Core::Libraries::LibC { @@ -17,27 +17,17 @@ int PS4_SYSV_ABI atexit(void (*func)()) { return rt; } -int PS4_SYSV_ABI memcmp(const void* s1, const void* s2, size_t n) { return std::memcmp(s1, s2, n); } -void* PS4_SYSV_ABI memcpy(void* dest, const void* src, size_t n) { return std::memcpy(dest, src, n); } - -void* PS4_SYSV_ABI memset(void* s, int c, size_t n) { return std::memset(s, c, n); } void* PS4_SYSV_ABI malloc(size_t size) { return std::malloc(size); } void PS4_SYSV_ABI free(void* ptr) { std::free(ptr); } -int PS4_SYSV_ABI strcmp(const char* str1, const char* str2) { return std::strcmp(str1, str2); } -size_t PS4_SYSV_ABI strlen(const char* str) { return std::strlen(str); } -char* PS4_SYSV_ABI strncpy(char* dest, const char* src, size_t count) { return std::strncpy(dest, src, count); } -void* PS4_SYSV_ABI memmove(void* dest, const void* src, std::size_t count) { return std::memmove(dest, src, count); } -char* PS4_SYSV_ABI strcpy(char* dest, const char* src) { return std::strcpy(dest, src); } -char* PS4_SYSV_ABI strcat(char* dest, const char* src) { return std::strcat(dest, src); } // math diff --git a/src/core/hle/libraries/libc/libc.h b/src/core/hle/libraries/libc/libc.h index fe848de3..6492fb58 100644 --- a/src/core/hle/libraries/libc/libc.h +++ b/src/core/hle/libraries/libc/libc.h @@ -9,16 +9,11 @@ namespace Core::Libraries::LibC { void PS4_SYSV_ABI exit(int code); int PS4_SYSV_ABI atexit(void (*func)()); -int PS4_SYSV_ABI memcmp(const void* s1, const void* s2, size_t n); -void* PS4_SYSV_ABI memcpy(void* dest, const void* src, size_t n); -void* PS4_SYSV_ABI memset(void* s, int c, size_t n); + void* PS4_SYSV_ABI malloc(size_t size); void PS4_SYSV_ABI free(void* ptr); -int PS4_SYSV_ABI strcmp(const char* str1, const char* str2); -size_t PS4_SYSV_ABI strlen(const char* str); -char* PS4_SYSV_ABI strncpy(char* dest, const char* src, size_t count); -void* PS4_SYSV_ABI memmove(void* dest, const void* src, std::size_t count); -char* PS4_SYSV_ABI strcpy(char* destination, const char* source); -char* PS4_SYSV_ABI strcat(char* dest, const char* src); + + + } // namespace Core::Libraries::LibC \ No newline at end of file diff --git a/src/core/hle/libraries/libc/libc_cxa.cpp b/src/core/hle/libraries/libc/libc_cxa.cpp index adcb0a42..d8d4c337 100644 --- a/src/core/hle/libraries/libc/libc_cxa.cpp +++ b/src/core/hle/libraries/libc/libc_cxa.cpp @@ -5,7 +5,7 @@ // adapted from https://opensource.apple.com/source/libcppabi/libcppabi-14/src/cxa_guard.cxx.auto.html -namespace Core::Libraries::LibC::Cxa { +namespace Core::Libraries::LibC::cxa { constexpr bool log_file_cxa = true; // disable it to disable logging // This file implements the __cxa_guard_* functions as defined at: diff --git a/src/core/hle/libraries/libc/libc_cxa.h b/src/core/hle/libraries/libc/libc_cxa.h index 11e8873c..6353d73c 100644 --- a/src/core/hle/libraries/libc/libc_cxa.h +++ b/src/core/hle/libraries/libc/libc_cxa.h @@ -4,7 +4,7 @@ #include #include -namespace Core::Libraries::LibC::Cxa { +namespace Core::Libraries::LibC::cxa { int PS4_SYSV_ABI __cxa_guard_acquire(u64* guard_object); void PS4_SYSV_ABI __cxa_guard_release(u64* guard_object); void PS4_SYSV_ABI __cxa_guard_abort(u64* guard_object); diff --git a/src/core/hle/libraries/libc/libc_string.cpp b/src/core/hle/libraries/libc/libc_string.cpp new file mode 100644 index 00000000..b9c16695 --- /dev/null +++ b/src/core/hle/libraries/libc/libc_string.cpp @@ -0,0 +1,25 @@ +#include "libc_string.h" + +#include + +namespace Core::Libraries::LibC::string { + +int PS4_SYSV_ABI memcmp(const void* s1, const void* s2, size_t n) { return std::memcmp(s1, s2, n); } + +void* PS4_SYSV_ABI memcpy(void* dest, const void* src, size_t n) { return std::memcpy(dest, src, n); } + +void* PS4_SYSV_ABI memset(void* s, int c, size_t n) { return std::memset(s, c, n); } + +int PS4_SYSV_ABI strcmp(const char* str1, const char* str2) { return std::strcmp(str1, str2); } + +char* PS4_SYSV_ABI strncpy(char* dest, const char* src, size_t count) { return std::strncpy(dest, src, count); } + +void* PS4_SYSV_ABI memmove(void* dest, const void* src, std::size_t count) { return std::memmove(dest, src, count); } + +char* PS4_SYSV_ABI strcpy(char* dest, const char* src) { return std::strcpy(dest, src); } + +char* PS4_SYSV_ABI strcat(char* dest, const char* src) { return std::strcat(dest, src); } + +size_t PS4_SYSV_ABI strlen(const char* str) { return std::strlen(str); } + +} // namespace Core::Libraries::LibC::string diff --git a/src/core/hle/libraries/libc/libc_string.h b/src/core/hle/libraries/libc/libc_string.h new file mode 100644 index 00000000..4ed676d0 --- /dev/null +++ b/src/core/hle/libraries/libc/libc_string.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +namespace Core::Libraries::LibC::string { +int PS4_SYSV_ABI memcmp(const void* s1, const void* s2, size_t n); +void* PS4_SYSV_ABI memcpy(void* dest, const void* src, size_t n); +void* PS4_SYSV_ABI memset(void* s, int c, size_t n); +int PS4_SYSV_ABI strcmp(const char* str1, const char* str2); +char* PS4_SYSV_ABI strncpy(char* dest, const char* src, size_t count); +void* PS4_SYSV_ABI memmove(void* dest, const void* src, std::size_t count); +char* PS4_SYSV_ABI strcpy(char* destination, const char* source); +char* PS4_SYSV_ABI strcat(char* dest, const char* src); +size_t PS4_SYSV_ABI strlen(const char* str); +} // namespace Core::Libraries::LibC::string \ No newline at end of file