From 0fe766db6cf9b3c294a621a6cbe743cc99c47ad0 Mon Sep 17 00:00:00 2001 From: Dzmitry Dubrova Date: Wed, 31 Jul 2024 14:01:22 +0300 Subject: [PATCH] core: Implement sceRandomGetRandomNumber (#350) --- CMakeLists.txt | 5 +++++ src/common/logging/types.h | 1 + src/core/libraries/error_codes.h | 3 +++ src/core/libraries/libs.cpp | 2 ++ src/core/libraries/random/random.cpp | 27 +++++++++++++++++++++++++++ src/core/libraries/random/random.h | 17 +++++++++++++++++ 6 files changed, 55 insertions(+) create mode 100644 src/core/libraries/random/random.cpp create mode 100644 src/core/libraries/random/random.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 60dad68a..49376076 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,6 +222,10 @@ set(PLAYGO_LIB src/core/libraries/playgo/playgo.cpp src/core/libraries/playgo/playgo_types.h ) +set(RANDOM_LIB src/core/libraries/random/random.cpp + src/core/libraries/random/random.h +) + set(USBD_LIB src/core/libraries/usbd/usbd.cpp src/core/libraries/usbd/usbd.h ) @@ -334,6 +338,7 @@ set(CORE src/core/aerolib/stubs.cpp ${NP_LIBS} ${PNG_LIB} ${PLAYGO_LIB} + ${RANDOM_LIB} ${USBD_LIB} ${MISC_LIBS} ${DIALOGS_LIB} diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 33e52fd4..dccb838a 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -73,6 +73,7 @@ enum class Class : u8 { Lib_DiscMap, ///< The LibSceDiscMap implementation. Lib_Png, ///< The LibScePng implementation. Lib_PlayGo, ///< The LibScePlayGo implementation. + Lib_Random, ///< The libSceRandom implementation. Lib_Usbd, ///< The LibSceUsbd implementation. Lib_Ajm, ///< The LibSceAjm implementation. Lib_ErrorDialog, ///< The LibSceErrorDialog implementation. diff --git a/src/core/libraries/error_codes.h b/src/core/libraries/error_codes.h index 63016213..5eabaaf6 100644 --- a/src/core/libraries/error_codes.h +++ b/src/core/libraries/error_codes.h @@ -233,6 +233,9 @@ constexpr int SCE_KERNEL_ERROR_ESDKVERSION = 0x80020063; constexpr int SCE_KERNEL_ERROR_ESTART = 0x80020064; constexpr int SCE_KERNEL_ERROR_ESTOP = 0x80020065; +// libSceRandom error codes +constexpr int SCE_RANDOM_ERROR_INVALID = 0x817C0016; + // videoOut constexpr int SCE_VIDEO_OUT_ERROR_INVALID_VALUE = 0x80290001; // invalid argument constexpr int SCE_VIDEO_OUT_ERROR_INVALID_ADDRESS = 0x80290002; // invalid addresses diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 47073b2c..20efd3c0 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -20,6 +20,7 @@ #include "core/libraries/np_trophy/np_trophy.h" #include "core/libraries/pad/pad.h" #include "core/libraries/playgo/playgo.h" +#include "core/libraries/random/random.h" #include "core/libraries/rtc/rtc.h" #include "core/libraries/save_data/savedata.h" #include "core/libraries/screenshot/screenshot.h" @@ -71,6 +72,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::AppContent::RegisterlibSceAppContent(sym); Libraries::PngDec::RegisterlibScePngDec(sym); Libraries::PlayGo::RegisterlibScePlayGo(sym); + Libraries::Random::RegisterlibSceRandom(sym); Libraries::Usbd::RegisterlibSceUsbd(sym); Libraries::Pad::RegisterlibScePad(sym); Libraries::Ajm::RegisterlibSceAjm(sym); diff --git a/src/core/libraries/random/random.cpp b/src/core/libraries/random/random.cpp new file mode 100644 index 00000000..8147c518 --- /dev/null +++ b/src/core/libraries/random/random.cpp @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "random.h" + +namespace Libraries::Random { + +s32 PS4_SYSV_ABI sceRandomGetRandomNumber(u8* buf, size_t size) { + LOG_TRACE(Lib_Random, "called"); + if (size > SCE_RANDOM_MAX_SIZE) { + return SCE_RANDOM_ERROR_INVALID; + } + + for (auto i = 0; i < size; ++i) { + buf[i] = std::rand() & 0xFF; + } + return ORBIS_OK; +} + +void RegisterlibSceRandom(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("PI7jIZj4pcE", "libSceRandom", 1, "libSceRandom", 1, 1, sceRandomGetRandomNumber); +}; + +} // namespace Libraries::Random diff --git a/src/core/libraries/random/random.h b/src/core/libraries/random/random.h new file mode 100644 index 00000000..b5f87f87 --- /dev/null +++ b/src/core/libraries/random/random.h @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Random { +constexpr int32_t SCE_RANDOM_MAX_SIZE = 64; + +s32 PS4_SYSV_ABI sceRandomGetRandomNumber(u8* buf, size_t size); + +void RegisterlibSceRandom(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Random \ No newline at end of file