From 70d8b2598a541829ba500db36c7abdb35e0b2353 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 19 Jan 2025 11:52:41 +0200 Subject: [PATCH] added urandom,srandom,random,console,deci_tty6 devices --- CMakeLists.txt | 4 +-- src/core/devices/deci_tty6.cpp | 34 ++++++++++++------ src/core/devices/deci_tty6.h | 2 ++ .../devices/{console.cpp => dev_console.cpp} | 35 ++++++++++++------ src/core/devices/{console.h => dev_console.h} | 2 ++ src/core/devices/random.cpp | 36 +++++++++++++------ src/core/devices/random.h | 2 ++ src/core/devices/srandom.cpp | 35 +++++++++++++----- src/core/devices/srandom.h | 2 ++ src/core/devices/urandom.cpp | 33 +++++++++++------ src/core/devices/urandom.h | 1 + src/core/libraries/kernel/file_system.cpp | 31 +++++----------- 12 files changed, 144 insertions(+), 73 deletions(-) rename src/core/devices/{console.cpp => dev_console.cpp} (52%) rename src/core/devices/{console.h => dev_console.h} (91%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 226c6762d..e5c16bd1b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -557,8 +557,8 @@ set(CORE src/core/aerolib/stubs.cpp src/core/devices/logger.cpp src/core/devices/logger.h src/core/devices/nop_device.h - src/core/devices/console.cpp - src/core/devices/console.h + src/core/devices/dev_console.cpp + src/core/devices/dev_console.h src/core/devices/deci_tty6.cpp src/core/devices/deci_tty6.h src/core/devices/random.cpp diff --git a/src/core/devices/deci_tty6.cpp b/src/core/devices/deci_tty6.cpp index 386bc6130..20423de61 100644 --- a/src/core/devices/deci_tty6.cpp +++ b/src/core/devices/deci_tty6.cpp @@ -2,51 +2,65 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "core/libraries/kernel/file_system.h" #include "deci_tty6.h" -#include "logger.h" namespace Core::Devices { +std::shared_ptr DeciTty6Device::Create(u32 handle, const char*, int, u16) { + return std::shared_ptr( + reinterpret_cast(new DeciTty6Device(handle))); +} int DeciTty6Device::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 DeciTty6Device::write(const void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t DeciTty6Device::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t DeciTty6Device::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 DeciTty6Device::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 DeciTty6Device::lseek(s64 offset, int whence) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 DeciTty6Device::read(void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } int DeciTty6Device::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s32 DeciTty6Device::fsync() { - return s32(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } int DeciTty6Device::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } int DeciTty6Device::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 DeciTty6Device::pwrite(const void* buf, size_t nbytes, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/deci_tty6.h b/src/core/devices/deci_tty6.h index a08726282..71cbfba6b 100644 --- a/src/core/devices/deci_tty6.h +++ b/src/core/devices/deci_tty6.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "base_device.h" namespace Core::Devices { @@ -10,6 +11,7 @@ class DeciTty6Device final : BaseDevice { u32 handle; public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); explicit DeciTty6Device(u32 handle) : handle(handle) {} ~DeciTty6Device() override = default; diff --git a/src/core/devices/console.cpp b/src/core/devices/dev_console.cpp similarity index 52% rename from src/core/devices/console.cpp rename to src/core/devices/dev_console.cpp index 459279e98..0ddcfd040 100644 --- a/src/core/devices/console.cpp +++ b/src/core/devices/dev_console.cpp @@ -2,51 +2,66 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "console.h" -#include "core/libraries/kernel/file_system.h" +#include "dev_console.h" namespace Core::Devices { +std::shared_ptr ConsoleDevice::Create(u32 handle, const char*, int, u16) { + return std::shared_ptr( + reinterpret_cast(new ConsoleDevice(handle))); +} int ConsoleDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 ConsoleDevice::write(const void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t ConsoleDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t ConsoleDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 ConsoleDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 ConsoleDevice::lseek(s64 offset, int whence) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 ConsoleDevice::read(void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } int ConsoleDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s32 ConsoleDevice::fsync() { - return s32(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } int ConsoleDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } int ConsoleDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 ConsoleDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/console.h b/src/core/devices/dev_console.h similarity index 91% rename from src/core/devices/console.h rename to src/core/devices/dev_console.h index 9f2951a34..f280200e2 100644 --- a/src/core/devices/console.h +++ b/src/core/devices/dev_console.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "base_device.h" namespace Core::Devices { @@ -10,6 +11,7 @@ class ConsoleDevice final : BaseDevice { u32 handle; public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); explicit ConsoleDevice(u32 handle) : handle(handle) {} ~ConsoleDevice() override = default; diff --git a/src/core/devices/random.cpp b/src/core/devices/random.cpp index 55f08261f..5289495c3 100644 --- a/src/core/devices/random.cpp +++ b/src/core/devices/random.cpp @@ -2,51 +2,67 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "core/libraries/kernel/file_system.h" -#include "logger.h" #include "random.h" namespace Core::Devices { +std::shared_ptr RandomDevice::Create(u32 handle, const char*, int, u16) { + std::srand(std::time(nullptr)); + return std::shared_ptr( + reinterpret_cast(new RandomDevice(handle))); +} int RandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 RandomDevice::write(const void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t RandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t RandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 RandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 RandomDevice::lseek(s64 offset, int whence) { - return s64(); + return 0; } s64 RandomDevice::read(void* buf, size_t nbytes) { - return s64(); + auto rbuf = static_cast(buf); + for (size_t i = 0; i < nbytes; i++) + rbuf[i] = std::rand() & 0xFF; + return nbytes; } int RandomDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s32 RandomDevice::fsync() { - return s32(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } int RandomDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } int RandomDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 RandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/random.h b/src/core/devices/random.h index 823e9a61e..3bbed1ca2 100644 --- a/src/core/devices/random.h +++ b/src/core/devices/random.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "base_device.h" namespace Core::Devices { @@ -10,6 +11,7 @@ class RandomDevice final : BaseDevice { u32 handle; public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); explicit RandomDevice(u32 handle) : handle(handle) {} ~RandomDevice() override = default; diff --git a/src/core/devices/srandom.cpp b/src/core/devices/srandom.cpp index 7ae2196a6..66c0bf4a9 100644 --- a/src/core/devices/srandom.cpp +++ b/src/core/devices/srandom.cpp @@ -2,51 +2,68 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "core/libraries/kernel/file_system.h" -#include "logger.h" #include "srandom.h" namespace Core::Devices { +std::shared_ptr SRandomDevice::Create(u32 handle, const char*, int, u16) { + std::srand(std::time(nullptr)); + return std::shared_ptr( + reinterpret_cast(new SRandomDevice(handle))); +} int SRandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 SRandomDevice::write(const void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t SRandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t SRandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 SRandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 SRandomDevice::lseek(s64 offset, int whence) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 SRandomDevice::read(void* buf, size_t nbytes) { - return s64(); + auto rbuf = static_cast(buf); + for (size_t i = 0; i < nbytes; i++) + rbuf[i] = std::rand(); + return nbytes; } int SRandomDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s32 SRandomDevice::fsync() { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return s32(); } int SRandomDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } int SRandomDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 SRandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/srandom.h b/src/core/devices/srandom.h index 6be3c6347..3a3b02571 100644 --- a/src/core/devices/srandom.h +++ b/src/core/devices/srandom.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "base_device.h" namespace Core::Devices { @@ -10,6 +11,7 @@ class SRandomDevice final : BaseDevice { u32 handle; public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); explicit SRandomDevice(u32 handle) : handle(handle) {} ~SRandomDevice() override = default; diff --git a/src/core/devices/urandom.cpp b/src/core/devices/urandom.cpp index 033f37444..cd85d7aaf 100644 --- a/src/core/devices/urandom.cpp +++ b/src/core/devices/urandom.cpp @@ -2,57 +2,70 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "core/libraries/kernel/file_system.h" -#include "logger.h" #include "urandom.h" namespace Core::Devices { std::shared_ptr URandomDevice::Create(u32 handle, const char*, int, u16) { + std::srand(std::time(nullptr)); return std::shared_ptr( reinterpret_cast(new URandomDevice(handle))); } int URandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 URandomDevice::write(const void* buf, size_t nbytes) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t URandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } size_t URandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { - return size_t(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 URandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 URandomDevice::lseek(s64 offset, int whence) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } s64 URandomDevice::read(void* buf, size_t nbytes) { - return s64(); + auto rbuf = static_cast(buf); + for (size_t i = 0; i < nbytes; i++) + rbuf[i] = std::rand() & 0xFF; + return nbytes; } int URandomDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s32 URandomDevice::fsync() { - return s32(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } int URandomDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } int URandomDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } s64 URandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { - return s64(); + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; } } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/urandom.h b/src/core/devices/urandom.h index fc3af2e6e..9370017d5 100644 --- a/src/core/devices/urandom.h +++ b/src/core/devices/urandom.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "base_device.h" namespace Core::Devices { diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 85d62935e..0f22352c1 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -8,8 +8,12 @@ #include "common/logging/log.h" #include "common/scope_exit.h" #include "common/singleton.h" +#include "core/devices/deci_tty6.h" +#include "core/devices/dev_console.h" #include "core/devices/logger.h" #include "core/devices/nop_device.h" +#include "core/devices/random.h" +#include "core/devices/srandom.h" #include "core/devices/urandom.h" #include "core/file_sys/fs.h" #include "core/libraries/kernel/file_system.h" @@ -43,7 +47,11 @@ static std::map available_device = { {"/dev/null", GET_DEVICE_FD(0)}, // fd0 (stdin) is a nop device - {"/dev/urandom", &D::URandomDevice::Create } + {"/dev/urandom", &D::URandomDevice::Create }, + {"/dev/random", &D::RandomDevice::Create }, + {"/dev/srandom", &D::SRandomDevice::Create }, + {"/dev/console", &D::ConsoleDevice::Create }, + {"/dev/deci_tty6",&D::DeciTty6Device::Create } // clang-format on }; @@ -70,17 +78,6 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { bool directory = (flags & ORBIS_KERNEL_O_DIRECTORY) != 0; std::string_view path{raw_path}; - - if (path == "/dev/console") { - return 2000; - } - if (path == "/dev/deci_tty6") { - return 2001; - } - if (path == "/dev/urandom") { - return 2003; - } - u32 handle = h->CreateHandle(); auto* file = h->GetFile(handle); @@ -170,9 +167,6 @@ int PS4_SYSV_ABI sceKernelClose(int d) { if (d < 3) { // d probably hold an error code return ORBIS_KERNEL_ERROR_EPERM; } - if (d == 2003) { // dev/urandom case - return ORBIS_OK; - } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(d); if (file == nullptr) { @@ -340,13 +334,6 @@ s64 PS4_SYSV_ABI posix_lseek(int d, s64 offset, int whence) { } s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes) { - if (d == 2003) // dev urandom case - { - auto rbuf = static_cast(buf); - for (size_t i = 0; i < nbytes; i++) - rbuf[i] = std::rand() & 0xFF; - return nbytes; - } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(d); if (file == nullptr) {