Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions core/libs/prx/libSceLibcInternal/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,19 @@ if(BUILD_TESTING)
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
endif()
endif()
target_sources(libSceLibcInternal PRIVATE Codecvt.cpp)
if(BUILD_TESTING)
add_test_executable(guest_libc_internal_codecvt_tests ${LIBS_INCLUDE_DIR}/tests/GuestLibcInternalCodecvt.cpp)
target_include_directories(guest_libc_internal_codecvt_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_libc_internal_codecvt_tests PRIVATE libSceLibcInternal libkernel libc)
configure_windows_unwind(guest_libc_internal_codecvt_tests)
add_test(NAME guest_libc_internal_codecvt COMMAND guest_libc_internal_codecvt_tests)
set_tests_properties(guest_libc_internal_codecvt PROPERTIES TIMEOUT 20)
if(WIN32)
set_tests_properties(guest_libc_internal_codecvt PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
endif()
endif()
if(BUILD_TESTING)
add_test_executable(guest_init_once_tests ${LIBS_INCLUDE_DIR}/tests/GuestInitOnce.cpp)
target_include_directories(guest_init_once_tests PRIVATE ${LIBS_INCLUDE_DIR})
Expand Down
66 changes: 66 additions & 0 deletions core/libs/prx/libSceLibcInternal/Codecvt.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include "prx/libSceLibcInternal/include/Api.hpp"
#include "prx/libc/include/General.hpp"
#include "prx/libc/include/GuestLocale.hpp"
#include "SceTypes.hpp"
#include <cstddef>
#include <cstdint>
#include <stdexcept>
#include <string>

namespace {

const GuestLocale::CodecvtVtable& Conversion(const GuestLocale::Facet* self, const char* function) {
if (self == nullptr || self->vtable == nullptr) throw std::invalid_argument(std::string(function) + ": null facet");
return *reinterpret_cast<const GuestLocale::CodecvtVtable*>(self->vtable);
}

}

extern "C" {

bool APS5_VABI sceLibcInternalCodecvtDoAlwaysNoconv_nid_no_patch(const GuestLocale::Facet* self) {
return LibcCodecvtMethods_nid_no_patch()->alwaysNoconv(self);
}
APS5_EXPORT("7tIwDZyyKHo", sceLibcInternalCodecvtDoAlwaysNoconv_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtDoIn_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3) {
return LibcCodecvtMethods_nid_no_patch()->in(self, state, first1, last1, next1, first3, last3, next3);
}
APS5_EXPORT("P+q1OLiErP0", sceLibcInternalCodecvtDoIn_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtDoOut_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3) {
return LibcCodecvtMethods_nid_no_patch()->out(self, state, first1, last1, next1, first3, last3, next3);
}
APS5_EXPORT("Uc+-Sx0UZ3U", sceLibcInternalCodecvtDoOut_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtDoUnshift_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, char* first3, char* last3, char** next3) {
return LibcCodecvtMethods_nid_no_patch()->unshift(self, state, first3, last3, next3);
}
APS5_EXPORT("iCWgjeqMHvg", sceLibcInternalCodecvtDoUnshift_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtDoLength_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, std::size_t count) {
return static_cast<int>(LibcCodecvtMethods_nid_no_patch()->length(self, state, first1, last1, count));
}
APS5_EXPORT("Xk7IZcfHDD8", sceLibcInternalCodecvtDoLength_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtIn_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3) {
return Conversion(self, "codecvt::in").in(self, state, first1, last1, next1, first3, last3, next3);
}
APS5_EXPORT("TNexGlwiVEQ", sceLibcInternalCodecvtIn_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtOut_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3) {
return Conversion(self, "codecvt::out").out(self, state, first1, last1, next1, first3, last3, next3);
}
APS5_EXPORT("14xKj+SV72o", sceLibcInternalCodecvtOut_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtUnshift_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, char* first3, char* last3, char** next3) {
return Conversion(self, "codecvt::unshift").unshift(self, state, first3, last3, next3);
}
APS5_EXPORT("N7z+Dnk1cS0", sceLibcInternalCodecvtUnshift_nid_no_patch);

int APS5_VABI sceLibcInternalCodecvtLength_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, std::size_t count) {
return static_cast<int>(Conversion(self, "codecvt::length").length(self, state, first1, last1, count));
}
APS5_EXPORT("ikBt0lqkxPc", sceLibcInternalCodecvtLength_nid_no_patch);

}
54 changes: 0 additions & 54 deletions core/libs/prx/libSceLibcInternal/Err.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,60 +315,6 @@ int APS5_VABI sceLibcInternalPending3_026_nid_no_patch() {
}
APS5_EXPORT("lynApfiP6Lw", sceLibcInternalPending3_026_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_027_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("iCWgjeqMHvg", sceLibcInternalPending3_027_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_028_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("7tIwDZyyKHo", sceLibcInternalPending3_028_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_029_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("TNexGlwiVEQ", sceLibcInternalPending3_029_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_030_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("14xKj+SV72o", sceLibcInternalPending3_030_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_031_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("P+q1OLiErP0", sceLibcInternalPending3_031_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_032_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("Uc+-Sx0UZ3U", sceLibcInternalPending3_032_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_033_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("ikBt0lqkxPc", sceLibcInternalPending3_033_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_034_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("N7z+Dnk1cS0", sceLibcInternalPending3_034_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_035_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("Xk7IZcfHDD8", sceLibcInternalPending3_035_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_036_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
Expand Down
10 changes: 10 additions & 0 deletions core/libs/prx/libSceLibcInternal/include/Api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "prx/libSceLibcInternal/include/Spawn.hpp"
#include "prx/libkernel/System/include/UserContext.hpp"
#include "prx/libc/include/FileStream.hpp"
#include "prx/libc/include/GuestLocale.hpp"
#include "prx/libc/include/LegacySignals.hpp"
#include "SceTypes.hpp"
#include <cstddef>
Expand Down Expand Up @@ -44,6 +45,15 @@ void APS5_VABI sceLibcHeapGetTraceInfo_nid_postfix(Info* info);
int APS5_VABI _sceLibcInternalThreadAtexit_nid_postfix(ThreadDestructorFunction destructor, void* object, void* dsoSymbol);
void APS5_VABI _sceLibcInternalThreadDtors_nid_postfix();
int APS5_VABI _sceLibcInternalForceTlsDestructor_nid_postfix(KernelModule handle);
bool APS5_VABI sceLibcInternalCodecvtDoAlwaysNoconv_nid_no_patch(const GuestLocale::Facet* self);
int APS5_VABI sceLibcInternalCodecvtDoIn_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3);
int APS5_VABI sceLibcInternalCodecvtDoOut_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3);
int APS5_VABI sceLibcInternalCodecvtDoUnshift_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, char* first3, char* last3, char** next3);
int APS5_VABI sceLibcInternalCodecvtDoLength_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, std::size_t count);
int APS5_VABI sceLibcInternalCodecvtIn_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3);
int APS5_VABI sceLibcInternalCodecvtOut_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, const char** next1, char* first3, char* last3, char** next3);
int APS5_VABI sceLibcInternalCodecvtUnshift_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, char* first3, char* last3, char** next3);
int APS5_VABI sceLibcInternalCodecvtLength_nid_no_patch(GuestLocale::Facet* self, std::uint64_t* state, const char* first1, const char* last1, std::size_t count);
unsigned int APS5_VABI alarm_nid_postfix(unsigned int seconds);
int APS5_VABI fstatvfs_nid_postfix(int descriptor, LibcStatvfs* output);
int APS5_VABI utime_nid_postfix(const char* path, const LibcUtimbuf* times);
Expand Down
2 changes: 2 additions & 0 deletions core/libs/prx/libc/include/GuestLocale.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,8 @@ static_assert(offsetof(SceV2Locinfo, classicName) == 0x10);

}

extern "C" const GuestLocale::CodecvtVtable* LibcCodecvtMethods_nid_no_patch();

inline constexpr std::size_t kNumPutCharVtableSlots = 14;
static_assert(kNumPutCharVtableSlots * sizeof(std::uintptr_t) == 112);
extern "C" std::uintptr_t _ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE_nid_postfix[kNumPutCharVtableSlots];
Expand Down
6 changes: 5 additions & 1 deletion core/libs/prx/libc/src/LocaleSupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ int APS5_VABI CodecvtNoConversion(GuestLocale::Facet*, std::uint64_t*, const cha

int APS5_VABI CodecvtUnshift(GuestLocale::Facet*, std::uint64_t*, char* first3, char*, char** next3) {
*next3 = first3;
return 0;
return 3;
}

std::size_t APS5_VABI CodecvtLength(GuestLocale::Facet*, std::uint64_t*, const char* first1, const char* last1, std::size_t count) {
Expand Down Expand Up @@ -914,6 +914,10 @@ std::size_t APS5_VABI _ZNSt7codecvtIcc9_MbstatetE7_GetcatEPPKNSt6locale5facetEPK
return 2;
}

const GuestLocale::CodecvtVtable* LibcCodecvtMethods_nid_no_patch() {
return &g_codecvtVtable;
}

std::size_t APS5_VABI _ZNSt8numpunctIcE7_GetcatEPPKNSt6locale5facetEPKS1__nid_postfix(GuestLocale::Facet** facet, const GuestLocale::Implementation* const*) {
if (facet != nullptr && *facet == nullptr) {
auto* punct = static_cast<GuestLocale::NumpunctFacet*>(_Znwm_nid_postfix(sizeof(GuestLocale::NumpunctFacet)));
Expand Down
Loading
Loading