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 @@ -20,6 +20,19 @@ if(BUILD_TESTING)
endif()
target_sources(libSceLibcInternal PRIVATE InitOnce.cpp)
target_sources(libSceLibcInternal PRIVATE Mutex.cpp)
target_sources(libSceLibcInternal PRIVATE NumGet.cpp)
if(BUILD_TESTING)
add_test_executable(guest_libc_internal_num_get_tests ${LIBS_INCLUDE_DIR}/tests/GuestLibcInternalNumGet.cpp)
target_include_directories(guest_libc_internal_num_get_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_libc_internal_num_get_tests PRIVATE libSceLibcInternal libkernel libc ${CMAKE_DL_LIBS})
configure_windows_unwind(guest_libc_internal_num_get_tests)
add_test(NAME guest_libc_internal_num_get COMMAND guest_libc_internal_num_get_tests $<TARGET_FILE:libSceLibcInternal>)
set_tests_properties(guest_libc_internal_num_get PROPERTIES TIMEOUT 20)
if(WIN32)
set_tests_properties(guest_libc_internal_num_get PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
endif()
endif()
target_sources(libSceLibcInternal PRIVATE AlignedNew.cpp)
if(BUILD_TESTING)
add_test_executable(guest_libc_internal_aligned_new_tests ${LIBS_INCLUDE_DIR}/tests/GuestLibcInternalAlignedNew.cpp)
Expand Down
132 changes: 0 additions & 132 deletions core/libs/prx/libSceLibcInternal/Err.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -477,72 +477,6 @@ int APS5_VABI sceLibcInternalPending3_054_nid_no_patch() {
}
APS5_EXPORT("81uX7PzrtG8", sceLibcInternalPending3_054_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_055_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("my9ujasm6-0", sceLibcInternalPending3_055_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_056_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("OWO5cpNw3NA", sceLibcInternalPending3_056_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_057_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("mAwXCpkWaYc", sceLibcInternalPending3_057_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_058_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("wUCRGap1j0U", sceLibcInternalPending3_058_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_059_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("6RGkooTERsE", sceLibcInternalPending3_059_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_060_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("N1VqUWz2OEI", sceLibcInternalPending3_060_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_061_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("I2UzwkwwEPs", sceLibcInternalPending3_061_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_062_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("2bfL3yIBi5k", sceLibcInternalPending3_062_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_063_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("gozsp4urvq8", sceLibcInternalPending3_063_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_064_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("4hiQK82QuLc", sceLibcInternalPending3_064_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_065_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("eZfFLyWCkvg", sceLibcInternalPending3_065_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_066_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
Expand Down Expand Up @@ -627,72 +561,6 @@ int APS5_VABI sceLibcInternalPending3_079_nid_no_patch() {
}
APS5_EXPORT("J-0I2PtiZc4", sceLibcInternalPending3_079_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_080_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("zomvAQ5RFdA", sceLibcInternalPending3_080_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_081_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("vW-nnV62ea4", sceLibcInternalPending3_081_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_082_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("+hjXHfvy1Mg", sceLibcInternalPending3_082_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_083_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("xLZr4GJRMLo", sceLibcInternalPending3_083_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_084_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("2mb8FYgER+E", sceLibcInternalPending3_084_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_085_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("Y3hBU5FYmhM", sceLibcInternalPending3_085_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_086_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("-m2YPwVCwJQ", sceLibcInternalPending3_086_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_087_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("94ZLp2+AOq0", sceLibcInternalPending3_087_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_088_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("bZ+lKHGvOr8", sceLibcInternalPending3_088_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_089_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("cG5hQhjFGog", sceLibcInternalPending3_089_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_090_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
APS5_EXPORT("banNSumaAZ0", sceLibcInternalPending3_090_nid_no_patch);

int APS5_VABI sceLibcInternalPending3_091_nid_no_patch() {
NotImplemented_nid_no_patch(__func__);
return 0;
Expand Down
126 changes: 126 additions & 0 deletions core/libs/prx/libSceLibcInternal/NumGet.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
#include "prx/libc/include/GuestLocale.hpp"
#include "prx/libc/include/General.hpp"
#include "SceTypes.hpp"
#include <cstdint>

namespace {

const GuestLocale::NumGetVtable& NumGet(const GuestLocale::Facet* self) {
return *reinterpret_cast<const GuestLocale::NumGetVtable*>(self->vtable);
}

}

extern "C" {

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetBool_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, bool* value) {
return NumGet(self).getBool(self, first, last, stream, state, value);
}
APS5_EXPORT("OWO5cpNw3NA", sceLibcInternalNumGetBool_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetUnsignedShort_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint16_t* value) {
return NumGet(self).getUnsignedShort(self, first, last, stream, state, value);
}
APS5_EXPORT("gozsp4urvq8", sceLibcInternalNumGetUnsignedShort_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetUnsignedInt_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint32_t* value) {
return NumGet(self).getUnsignedInt(self, first, last, stream, state, value);
}
APS5_EXPORT("N1VqUWz2OEI", sceLibcInternalNumGetUnsignedInt_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::int64_t* value) {
return NumGet(self).getLong(self, first, last, stream, state, value);
}
APS5_EXPORT("I2UzwkwwEPs", sceLibcInternalNumGetLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetUnsignedLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint64_t* value) {
return NumGet(self).getUnsignedLong(self, first, last, stream, state, value);
}
APS5_EXPORT("2bfL3yIBi5k", sceLibcInternalNumGetUnsignedLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetLongLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::int64_t* value) {
return NumGet(self).getLongLong(self, first, last, stream, state, value);
}
APS5_EXPORT("4hiQK82QuLc", sceLibcInternalNumGetLongLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetUnsignedLongLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint64_t* value) {
return NumGet(self).getUnsignedLongLong(self, first, last, stream, state, value);
}
APS5_EXPORT("eZfFLyWCkvg", sceLibcInternalNumGetUnsignedLongLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetFloat_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, float* value) {
return NumGet(self).getFloat(self, first, last, stream, state, value);
}
APS5_EXPORT("6RGkooTERsE", sceLibcInternalNumGetFloat_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetDouble_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, double* value) {
return NumGet(self).getDouble(self, first, last, stream, state, value);
}
APS5_EXPORT("mAwXCpkWaYc", sceLibcInternalNumGetDouble_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetLongDouble_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, long double* value) {
return NumGet(self).getLongDouble(self, first, last, stream, state, value);
}
APS5_EXPORT("wUCRGap1j0U", sceLibcInternalNumGetLongDouble_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalNumGetPointer_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, void** value) {
return NumGet(self).getPointer(self, first, last, stream, state, value);
}
APS5_EXPORT("my9ujasm6-0", sceLibcInternalNumGetPointer_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetBool_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, bool* value) {
return NumGet(self).getBool(self, first, last, stream, state, value);
}
APS5_EXPORT("vW-nnV62ea4", sceLibcInternalWideNumGetBool_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetUnsignedShort_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint16_t* value) {
return NumGet(self).getUnsignedShort(self, first, last, stream, state, value);
}
APS5_EXPORT("bZ+lKHGvOr8", sceLibcInternalWideNumGetUnsignedShort_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetUnsignedInt_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint32_t* value) {
return NumGet(self).getUnsignedInt(self, first, last, stream, state, value);
}
APS5_EXPORT("Y3hBU5FYmhM", sceLibcInternalWideNumGetUnsignedInt_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::int64_t* value) {
return NumGet(self).getLong(self, first, last, stream, state, value);
}
APS5_EXPORT("-m2YPwVCwJQ", sceLibcInternalWideNumGetLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetUnsignedLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint64_t* value) {
return NumGet(self).getUnsignedLong(self, first, last, stream, state, value);
}
APS5_EXPORT("94ZLp2+AOq0", sceLibcInternalWideNumGetUnsignedLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetLongLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::int64_t* value) {
return NumGet(self).getLongLong(self, first, last, stream, state, value);
}
APS5_EXPORT("cG5hQhjFGog", sceLibcInternalWideNumGetLongLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetUnsignedLongLong_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, std::uint64_t* value) {
return NumGet(self).getUnsignedLongLong(self, first, last, stream, state, value);
}
APS5_EXPORT("banNSumaAZ0", sceLibcInternalWideNumGetUnsignedLongLong_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetFloat_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, float* value) {
return NumGet(self).getFloat(self, first, last, stream, state, value);
}
APS5_EXPORT("2mb8FYgER+E", sceLibcInternalWideNumGetFloat_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetDouble_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, double* value) {
return NumGet(self).getDouble(self, first, last, stream, state, value);
}
APS5_EXPORT("+hjXHfvy1Mg", sceLibcInternalWideNumGetDouble_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetLongDouble_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, long double* value) {
return NumGet(self).getLongDouble(self, first, last, stream, state, value);
}
APS5_EXPORT("xLZr4GJRMLo", sceLibcInternalWideNumGetLongDouble_nid_no_patch);

GuestLocale::InputIterator APS5_VABI sceLibcInternalWideNumGetPointer_nid_no_patch(const GuestLocale::Facet* self, GuestLocale::InputIterator first, GuestLocale::InputIterator last, GuestLocale::IosBase* stream, std::int32_t* state, void** value) {
return NumGet(self).getPointer(self, first, last, stream, state, value);
}
APS5_EXPORT("zomvAQ5RFdA", sceLibcInternalWideNumGetPointer_nid_no_patch);

}
36 changes: 36 additions & 0 deletions core/libs/prx/libc/include/GuestLocale.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <cstddef>
#include <cstdint>
#include <type_traits>
#include "general/VabiMacros.hpp"

struct GuestTm;
Expand Down Expand Up @@ -188,6 +189,13 @@ struct OutputIterator {
Streambuf* buffer;
};

struct InputIterator {
std::uint64_t words[2];
};

static_assert(sizeof(InputIterator) == 0x10);
static_assert(std::is_trivially_copyable_v<InputIterator>);

struct TimePutVtable {
FacetVtable facet;
OutputIterator (APS5_VABI *put)(const Facet* self, OutputIterator out, IosBase* stream, char fill, const GuestTm* time, char format, char modifier);
Expand All @@ -205,6 +213,34 @@ struct NumPutVtable {
OutputIterator (APS5_VABI *putPointer)(const Facet* self, OutputIterator out, IosBase* stream, char fill, const void* value);
};

struct NumGetVtable {
FacetVtable facet;
InputIterator (APS5_VABI *getBool)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, bool* value);
InputIterator (APS5_VABI *getUnsignedShort)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, std::uint16_t* value);
InputIterator (APS5_VABI *getUnsignedInt)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, std::uint32_t* value);
InputIterator (APS5_VABI *getLong)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, std::int64_t* value);
InputIterator (APS5_VABI *getUnsignedLong)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, std::uint64_t* value);
InputIterator (APS5_VABI *getLongLong)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, std::int64_t* value);
InputIterator (APS5_VABI *getUnsignedLongLong)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, std::uint64_t* value);
InputIterator (APS5_VABI *getFloat)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, float* value);
InputIterator (APS5_VABI *getDouble)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, double* value);
InputIterator (APS5_VABI *getLongDouble)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, long double* value);
InputIterator (APS5_VABI *getPointer)(const Facet* self, InputIterator first, InputIterator last, IosBase* stream, std::int32_t* state, void** value);
};

static_assert(offsetof(NumGetVtable, getBool) == 0x20);
static_assert(offsetof(NumGetVtable, getUnsignedShort) == 0x28);
static_assert(offsetof(NumGetVtable, getUnsignedInt) == 0x30);
static_assert(offsetof(NumGetVtable, getLong) == 0x38);
static_assert(offsetof(NumGetVtable, getUnsignedLong) == 0x40);
static_assert(offsetof(NumGetVtable, getLongLong) == 0x48);
static_assert(offsetof(NumGetVtable, getUnsignedLongLong) == 0x50);
static_assert(offsetof(NumGetVtable, getFloat) == 0x58);
static_assert(offsetof(NumGetVtable, getDouble) == 0x60);
static_assert(offsetof(NumGetVtable, getLongDouble) == 0x68);
static_assert(offsetof(NumGetVtable, getPointer) == 0x70);
static_assert(sizeof(NumGetVtable) == 0x78);

struct CtypeVtable {
FacetVtable facet;
const void* caseMethods[4];
Expand Down
Loading
Loading