From 645e41eed87c0b788ee85e005eee5a998c70be9a Mon Sep 17 00:00:00 2001 From: DH Date: Sat, 29 Jul 2023 22:46:28 +0300 Subject: [PATCH] [rpcsx-os] implement shm --- orbis-kernel/include/orbis/KernelContext.hpp | 2 + .../include/orbis/thread/ProcessOps.hpp | 3 ++ orbis-kernel/src/sys/sys_descrip.cpp | 4 -- orbis-kernel/src/sys/sys_generic.cpp | 4 -- orbis-kernel/src/sys/sys_uipc_shm.cpp | 29 +++++++++-- rpcsx-os/CMakeLists.txt | 1 + rpcsx-os/io-device.cpp | 39 ++++++++++++-- rpcsx-os/io-device.hpp | 6 ++- rpcsx-os/io-devices.hpp | 1 + rpcsx-os/iodev/ajm.cpp | 3 +- rpcsx-os/iodev/dce.cpp | 5 +- rpcsx-os/iodev/dipsw.cpp | 3 +- rpcsx-os/iodev/dmem.cpp | 5 +- rpcsx-os/iodev/gc.cpp | 6 ++- rpcsx-os/iodev/hid.cpp | 5 +- rpcsx-os/iodev/hmd_3da.cpp | 5 +- rpcsx-os/iodev/hmd_cmd.cpp | 5 +- rpcsx-os/iodev/hmd_mmap.cpp | 6 ++- rpcsx-os/iodev/hmd_snsr.cpp | 6 ++- rpcsx-os/iodev/null.cpp | 5 +- rpcsx-os/iodev/rng.cpp | 5 +- rpcsx-os/iodev/shm.cpp | 52 +++++++++++++++++++ rpcsx-os/iodev/zero.cpp | 5 +- rpcsx-os/linker.cpp | 2 +- rpcsx-os/main.cpp | 2 + rpcsx-os/ops.cpp | 18 ++++++- rpcsx-os/vfs.cpp | 5 +- rpcsx-os/vfs.hpp | 2 +- 28 files changed, 187 insertions(+), 47 deletions(-) create mode 100644 rpcsx-os/iodev/shm.cpp diff --git a/orbis-kernel/include/orbis/KernelContext.hpp b/orbis-kernel/include/orbis/KernelContext.hpp index 1970bb98b..858f2bc2e 100644 --- a/orbis-kernel/include/orbis/KernelContext.hpp +++ b/orbis-kernel/include/orbis/KernelContext.hpp @@ -124,6 +124,8 @@ public: return getUmtxChainIndexed(1, t, flags, ptr); } + Ref shmDevice; + private: mutable pthread_mutex_t m_heap_mtx; void *m_heap_next = this + 1; diff --git a/orbis-kernel/include/orbis/thread/ProcessOps.hpp b/orbis-kernel/include/orbis/thread/ProcessOps.hpp index 1086756cd..d218ff652 100644 --- a/orbis-kernel/include/orbis/thread/ProcessOps.hpp +++ b/orbis-kernel/include/orbis/thread/ProcessOps.hpp @@ -32,8 +32,11 @@ struct ProcessOps { SysResult (*open)(Thread *thread, ptr path, sint flags, sint mode, Ref *file); + SysResult (*shm_open)(Thread *thread, const char *path, sint flags, sint mode, + Ref *file); SysResult (*socket)(Thread *thread, ptr name, sint domain, sint type, sint protocol, Ref *file); + SysResult (*shm_unlink)(Thread *thread, const char *path); SysResult (*dynlib_get_obj_member)(Thread *thread, ModuleHandle handle, uint64_t index, ptr> addrp); SysResult (*dynlib_dlsym)(Thread *thread, ModuleHandle handle, diff --git a/orbis-kernel/src/sys/sys_descrip.cpp b/orbis-kernel/src/sys/sys_descrip.cpp index 888d5d82b..e15768078 100644 --- a/orbis-kernel/src/sys/sys_descrip.cpp +++ b/orbis-kernel/src/sys/sys_descrip.cpp @@ -17,10 +17,6 @@ orbis::SysResult orbis::sys_fcntl(Thread *thread, sint fd, sint cmd, } orbis::SysResult orbis::sys_close(Thread *thread, sint fd) { ORBIS_LOG_NOTICE(__FUNCTION__, fd); - if (fd == 0) { - return {}; // FIXME: remove when shm would be implemented - } - if (thread->tproc->fileDescriptors.close(fd)) { return {}; } diff --git a/orbis-kernel/src/sys/sys_generic.cpp b/orbis-kernel/src/sys/sys_generic.cpp index 41d7a1f5c..2baa58eb8 100644 --- a/orbis-kernel/src/sys/sys_generic.cpp +++ b/orbis-kernel/src/sys/sys_generic.cpp @@ -275,10 +275,6 @@ orbis::SysResult orbis::sys_pwritev(Thread *thread, sint fd, ptr iovp, return {}; } orbis::SysResult orbis::sys_ftruncate(Thread *thread, sint fd, off_t length) { - ORBIS_LOG_WARNING(__FUNCTION__, fd, length); - if (fd == 0) { - return {}; // FIXME: remove when shm implemented - } Ref file = thread->tproc->fileDescriptors.get(fd); if (file == nullptr) { return ErrorCode::BADF; diff --git a/orbis-kernel/src/sys/sys_uipc_shm.cpp b/orbis-kernel/src/sys/sys_uipc_shm.cpp index 182c8c09f..1c44b3e6c 100644 --- a/orbis-kernel/src/sys/sys_uipc_shm.cpp +++ b/orbis-kernel/src/sys/sys_uipc_shm.cpp @@ -1,6 +1,5 @@ #include "orbis-config.hpp" #include "sys/sysproto.hpp" -#include "utils/Logs.hpp" orbis::SysResult orbis::sys_shm_open(Thread *thread, ptr path, sint flags, mode_t mode) { @@ -10,9 +9,19 @@ orbis::SysResult orbis::sys_shm_open(Thread *thread, ptr path, return result; } - ORBIS_LOG_TODO(__FUNCTION__, _name, flags, mode); - return {}; + if (auto shm_open = thread->tproc->ops->shm_open) { + Ref file; + auto result = shm_open(thread, path, flags, mode, &file); + if (result.isError()) { + return result; + } + + thread->retval[0] = thread->tproc->fileDescriptors.insert(file); + return {}; + } + return ErrorCode::NOSYS; } + orbis::SysResult orbis::sys_shm_unlink(Thread *thread, ptr path) { char _name[256]; if (auto result = ureadString(_name, sizeof(_name), path); @@ -20,6 +29,16 @@ orbis::SysResult orbis::sys_shm_unlink(Thread *thread, ptr path) { return result; } - ORBIS_LOG_TODO(__FUNCTION__, _name); - return {}; + if (auto shm_unlink = thread->tproc->ops->shm_unlink) { + Ref file; + auto result = shm_unlink(thread, path); + if (result.isError()) { + return result; + } + + thread->retval[0] = thread->tproc->fileDescriptors.insert(file); + return {}; + } + + return ErrorCode::NOSYS; } diff --git a/rpcsx-os/CMakeLists.txt b/rpcsx-os/CMakeLists.txt index d26045059..32f9b3bfc 100644 --- a/rpcsx-os/CMakeLists.txt +++ b/rpcsx-os/CMakeLists.txt @@ -15,6 +15,7 @@ add_executable(rpcsx-os iodev/hmd_snsr.cpp iodev/null.cpp iodev/rng.cpp + iodev/shm.cpp iodev/zero.cpp main.cpp diff --git a/rpcsx-os/io-device.cpp b/rpcsx-os/io-device.cpp index 01905b900..4c128f5bf 100644 --- a/rpcsx-os/io-device.cpp +++ b/rpcsx-os/io-device.cpp @@ -4,10 +4,12 @@ #include "orbis/stat.hpp" #include "orbis/uio.hpp" #include "orbis/utils/Logs.hpp" +#include "vm.hpp" #include #include #include #include +#include #include #include #include @@ -18,6 +20,8 @@ struct HostFile : orbis::File { int hostFd = -1; ~HostFile() { + std::printf("Destroying host file\n"); + if (hostFd > 0) { ::close(hostFd); } @@ -40,7 +44,8 @@ struct HostFsDevice : IoDevice { explicit HostFsDevice(orbis::kstring path) : hostPath(std::move(path)) {} orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; static orbis::ErrorCode convertErrno() { @@ -137,6 +142,32 @@ static orbis::ErrorCode host_write(orbis::File *file, orbis::Uio *uio, return {}; } +static orbis::ErrorCode host_mmap(orbis::File *file, void **address, + std::uint64_t size, std::int32_t prot, + std::int32_t flags, std::int64_t offset, + orbis::Thread *thread) { + auto hostFile = static_cast(file); + + auto result = + rx::vm::map(*address, size, prot, flags, rx::vm::kMapInternalReserveOnly); + + if (result == (void *)-1) { + return orbis::ErrorCode::NOMEM; + } + + result = ::mmap(result, size, prot & rx::vm::kMapProtCpuAll, + MAP_SHARED | MAP_FIXED, hostFile->hostFd, offset); + if (result == (void *)-1) { + auto result = convertErrno(); + return result; + } + + std::printf("shm mapped at %p-%p\n", result, (char *)result + size); + + *address = result; + return {}; +} + static orbis::ErrorCode host_stat(orbis::File *file, orbis::Stat *sb, orbis::Thread *thread) { auto hostFile = static_cast(file); @@ -198,6 +229,7 @@ static const orbis::FileOps hostOps = { .write = host_write, .truncate = host_truncate, .stat = host_stat, + .mmap = host_mmap, }; static const orbis::FileOps socketOps = { @@ -226,7 +258,7 @@ orbis::ErrorCode createSocket(orbis::Ref *file, orbis::ErrorCode HostFsDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto realPath = hostPath + "/" + path; int realFlags = flags & O_ACCMODE; @@ -304,7 +336,8 @@ struct FdWrapDevice : public IoDevice { int fd; orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override { + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override { *file = createHostFile(fd, this); return {}; } diff --git a/rpcsx-os/io-device.hpp b/rpcsx-os/io-device.hpp index acc63afc0..2b118f61b 100644 --- a/rpcsx-os/io-device.hpp +++ b/rpcsx-os/io-device.hpp @@ -25,7 +25,11 @@ enum OpenFlags { struct IoDevice : orbis::RcBase { virtual orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) = 0; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) = 0; + virtual orbis::ErrorCode unlink(const char *path, orbis::Thread *thread) { + return orbis::ErrorCode::NOTSUP; + } }; IoDevice *createHostIoDevice(orbis::kstring hostPath); diff --git a/rpcsx-os/io-devices.hpp b/rpcsx-os/io-devices.hpp index b537db6de..53e705246 100644 --- a/rpcsx-os/io-devices.hpp +++ b/rpcsx-os/io-devices.hpp @@ -15,3 +15,4 @@ IoDevice *createNullCharacterDevice(); IoDevice *createZeroCharacterDevice(); IoDevice *createRngCharacterDevice(); IoDevice *createAjmCharacterDevice(); +IoDevice *createShmDevice(); diff --git a/rpcsx-os/iodev/ajm.cpp b/rpcsx-os/iodev/ajm.cpp index af9529677..e3f41610d 100644 --- a/rpcsx-os/iodev/ajm.cpp +++ b/rpcsx-os/iodev/ajm.cpp @@ -18,7 +18,8 @@ static const orbis::FileOps fileOps = { struct AjmDevice : IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override { + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override { auto newFile = orbis::knew(); newFile->ops = &fileOps; newFile->device = this; diff --git a/rpcsx-os/iodev/dce.cpp b/rpcsx-os/iodev/dce.cpp index 9efd78a06..be0e11ae5 100644 --- a/rpcsx-os/iodev/dce.cpp +++ b/rpcsx-os/iodev/dce.cpp @@ -88,7 +88,8 @@ struct DceDevice : IoDevice { orbis::shared_mutex mtx; VideoOutBuffer bufferAttributes{}; // TODO orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; static orbis::ErrorCode dce_ioctl(orbis::File *file, std::uint64_t request, @@ -262,7 +263,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode DceDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/dipsw.cpp b/rpcsx-os/iodev/dipsw.cpp index 1b9c34c5e..eab3a6e33 100644 --- a/rpcsx-os/iodev/dipsw.cpp +++ b/rpcsx-os/iodev/dipsw.cpp @@ -48,7 +48,8 @@ static const orbis::FileOps ops = { struct DipswDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override { + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/dmem.cpp b/rpcsx-os/iodev/dmem.cpp index 429b0c00b..3023bffdd 100644 --- a/rpcsx-os/iodev/dmem.cpp +++ b/rpcsx-os/iodev/dmem.cpp @@ -13,7 +13,8 @@ struct DmemDevice : public IoDevice { std::uint64_t memBeginAddress; orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct DmemFile : public orbis::File {}; @@ -111,7 +112,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode DmemDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/gc.cpp b/rpcsx-os/iodev/gc.cpp index e1c1d7112..2e7cb213e 100644 --- a/rpcsx-os/iodev/gc.cpp +++ b/rpcsx-os/iodev/gc.cpp @@ -9,7 +9,8 @@ struct GcDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct GcFile : public orbis::File {}; static std::uint64_t g_submitDoneFlag; @@ -256,7 +257,8 @@ static const orbis::FileOps ops = { }; orbis::ErrorCode GcDevice::open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) { + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/hid.cpp b/rpcsx-os/iodev/hid.cpp index be0481032..dcdc02ccf 100644 --- a/rpcsx-os/iodev/hid.cpp +++ b/rpcsx-os/iodev/hid.cpp @@ -5,7 +5,8 @@ struct HidDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct HidFile : public orbis::File {}; @@ -23,7 +24,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode HidDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/hmd_3da.cpp b/rpcsx-os/iodev/hmd_3da.cpp index 1f7efcaf8..5136b463a 100644 --- a/rpcsx-os/iodev/hmd_3da.cpp +++ b/rpcsx-os/iodev/hmd_3da.cpp @@ -5,7 +5,8 @@ struct Hmd3daDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct Hmd3daFile : public orbis::File {}; @@ -23,7 +24,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode Hmd3daDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/hmd_cmd.cpp b/rpcsx-os/iodev/hmd_cmd.cpp index 4b3a81c71..fffc61795 100644 --- a/rpcsx-os/iodev/hmd_cmd.cpp +++ b/rpcsx-os/iodev/hmd_cmd.cpp @@ -4,7 +4,8 @@ struct HmdCmdDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct HmdCmdFile : public orbis::File {}; @@ -22,7 +23,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode HmdCmdDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/hmd_mmap.cpp b/rpcsx-os/iodev/hmd_mmap.cpp index 24b5f98f8..32cff3a29 100644 --- a/rpcsx-os/iodev/hmd_mmap.cpp +++ b/rpcsx-os/iodev/hmd_mmap.cpp @@ -5,7 +5,8 @@ struct HmdMmapDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct HmdMmapFile : public orbis::File {}; @@ -39,7 +40,8 @@ static const orbis::FileOps ops = { orbis::ErrorCode HmdMmapDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, + orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/hmd_snsr.cpp b/rpcsx-os/iodev/hmd_snsr.cpp index d68aa649c..effaa2b9d 100644 --- a/rpcsx-os/iodev/hmd_snsr.cpp +++ b/rpcsx-os/iodev/hmd_snsr.cpp @@ -5,7 +5,8 @@ struct HmdSnsrDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct HmdSnsrFile : public orbis::File {}; @@ -23,7 +24,8 @@ static const orbis::FileOps ops = { orbis::ErrorCode HmdSnsrDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, + orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/null.cpp b/rpcsx-os/iodev/null.cpp index 4564c449e..201d72a99 100644 --- a/rpcsx-os/iodev/null.cpp +++ b/rpcsx-os/iodev/null.cpp @@ -4,7 +4,8 @@ struct NullDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct NullFile : public orbis::File {}; @@ -20,7 +21,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode NullDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/rng.cpp b/rpcsx-os/iodev/rng.cpp index d302e87b3..52b2d3579 100644 --- a/rpcsx-os/iodev/rng.cpp +++ b/rpcsx-os/iodev/rng.cpp @@ -5,7 +5,8 @@ struct RngDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct RngFile : public orbis::File {}; @@ -39,7 +40,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode RngDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/iodev/shm.cpp b/rpcsx-os/iodev/shm.cpp new file mode 100644 index 000000000..d2d23121e --- /dev/null +++ b/rpcsx-os/iodev/shm.cpp @@ -0,0 +1,52 @@ +#include "io-device.hpp" +#include "orbis/KernelAllocator.hpp" +#include "orbis/error/ErrorCode.hpp" +#include "orbis/file.hpp" +#include "orbis/utils/Logs.hpp" +#include +#include + +struct ShmDevice : IoDevice { + orbis::ErrorCode open(orbis::Ref *file, const char *path, + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; +}; + +orbis::ErrorCode ShmDevice::open(orbis::Ref *file, + const char *path, std::uint32_t flags, + std::uint32_t mode, orbis::Thread *thread) { + ORBIS_LOG_WARNING("shm_open", path, flags, mode); + + std::string name = "/rpcsx-"; + if (std::string_view{path}.starts_with("/")) { + name += path + 1; + } else { + name += path; + } + + auto realFlags = O_RDWR; // TODO + + std::size_t size = 0; + if (name == "/rpcsx-SceShellCoreUtil") { + // TODO + realFlags |= O_CREAT; + size = 0x4000; + } + + realFlags |= O_CREAT; // TODO + + int fd = shm_open(name.c_str(), realFlags, S_IRUSR | S_IWUSR); + if (fd < 0) { + std::printf("shm_open: error %u\n", errno); + return orbis::ErrorCode::ACCES; + } + auto hostFile = createHostFile(fd, this); + if (size != 0) { + hostFile->ops->truncate(hostFile, size, thread); + } + + *file = hostFile; + return {}; +} + +IoDevice *createShmDevice() { return orbis::knew(); } diff --git a/rpcsx-os/iodev/zero.cpp b/rpcsx-os/iodev/zero.cpp index e7d9d7fb2..c25076c75 100644 --- a/rpcsx-os/iodev/zero.cpp +++ b/rpcsx-os/iodev/zero.cpp @@ -6,7 +6,8 @@ struct ZeroDevice : public IoDevice { orbis::ErrorCode open(orbis::Ref *file, const char *path, - std::uint32_t flags, std::uint32_t mode) override; + std::uint32_t flags, std::uint32_t mode, + orbis::Thread *thread) override; }; struct ZeroFile : public orbis::File {}; @@ -26,7 +27,7 @@ static const orbis::FileOps ops = { orbis::ErrorCode ZeroDevice::open(orbis::Ref *file, const char *path, std::uint32_t flags, - std::uint32_t mode) { + std::uint32_t mode, orbis::Thread *thread) { auto newFile = orbis::knew(); newFile->device = this; newFile->ops = &ops; diff --git a/rpcsx-os/linker.cpp b/rpcsx-os/linker.cpp index 6f399844e..4f563230e 100644 --- a/rpcsx-os/linker.cpp +++ b/rpcsx-os/linker.cpp @@ -846,7 +846,7 @@ Ref rx::linker::loadModuleFile(std::string_view path, } orbis::Ref instance; - if (vfs::open(path, kOpenFlagReadOnly, 0, &instance).isError()) { + if (vfs::open(path, kOpenFlagReadOnly, 0, &instance, thread).isError()) { return {}; } diff --git a/rpcsx-os/main.cpp b/rpcsx-os/main.cpp index d234b9cf9..bb21bdb0a 100644 --- a/rpcsx-os/main.cpp +++ b/rpcsx-os/main.cpp @@ -335,6 +335,8 @@ static int ps4Exec(orbis::Thread *mainThread, mainThread->tproc->fileDescriptors.insert(stdoutFile); mainThread->tproc->fileDescriptors.insert(stderrFile); + orbis::g_context.shmDevice = createShmDevice(); + std::vector argvOffsets; std::vector envpOffsets; diff --git a/rpcsx-os/ops.cpp b/rpcsx-os/ops.cpp index fd28661bf..2577caa35 100644 --- a/rpcsx-os/ops.cpp +++ b/rpcsx-os/ops.cpp @@ -3,6 +3,7 @@ #include "backtrace.hpp" #include "io-device.hpp" #include "linker.hpp" +#include "orbis/KernelContext.hpp" #include "orbis/module/ModuleHandle.hpp" #include "orbis/thread/Process.hpp" #include "orbis/thread/Thread.hpp" @@ -15,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -232,7 +232,14 @@ orbis::SysResult virtual_query(orbis::Thread *thread, orbis::SysResult open(orbis::Thread *thread, orbis::ptr path, orbis::sint flags, orbis::sint mode, orbis::Ref *file) { - return rx::vfs::open(path, flags, mode, file); + return rx::vfs::open(path, flags, mode, file, thread); +} + +orbis::SysResult shm_open(orbis::Thread *thread, const char *path, + orbis::sint flags, orbis::sint mode, + orbis::Ref *file) { + auto dev = static_cast(orbis::g_context.shmDevice.get()); + return dev->open(file, path, flags, mode, thread); } orbis::SysResult socket(orbis::Thread *thread, orbis::ptr name, @@ -241,6 +248,11 @@ orbis::SysResult socket(orbis::Thread *thread, orbis::ptr name, return createSocket(file, name, domain, type, protocol); } +orbis::SysResult shm_unlink(orbis::Thread *thread, const char *path) { + auto dev = static_cast(orbis::g_context.shmDevice.get()); + return dev->unlink(path, thread); +} + orbis::SysResult dynlib_get_obj_member(orbis::Thread *thread, orbis::ModuleHandle handle, orbis::uint64_t index, @@ -531,7 +543,9 @@ ProcessOps rx::procOpsTable = { .munlock = munlock, .virtual_query = virtual_query, .open = open, + .shm_open = shm_open, .socket = socket, + .shm_unlink = shm_unlink, .dynlib_get_obj_member = dynlib_get_obj_member, .dynlib_dlsym = dynlib_dlsym, .dynlib_do_copy_relocations = dynlib_do_copy_relocations, diff --git a/rpcsx-os/vfs.cpp b/rpcsx-os/vfs.cpp index c95a93f9a..5ffa33851 100644 --- a/rpcsx-os/vfs.cpp +++ b/rpcsx-os/vfs.cpp @@ -26,7 +26,8 @@ orbis::SysResult rx::vfs::mount(const std::filesystem::path &guestPath, } orbis::SysResult rx::vfs::open(std::string_view path, int flags, int mode, - orbis::Ref *file) { + orbis::Ref *file, + orbis::Thread *thread) { orbis::Ref device; bool isCharacterDevice = path.starts_with("/dev/"); @@ -51,7 +52,7 @@ orbis::SysResult rx::vfs::open(std::string_view path, int flags, int mode, if (device != nullptr) { return (orbis::ErrorCode)device->open(file, std::string(path).c_str(), - flags, mode); + flags, mode, thread); } if (isCharacterDevice) { diff --git a/rpcsx-os/vfs.hpp b/rpcsx-os/vfs.hpp index 04d4871ec..b326027f2 100644 --- a/rpcsx-os/vfs.hpp +++ b/rpcsx-os/vfs.hpp @@ -12,5 +12,5 @@ void initialize(); void deinitialize(); orbis::SysResult mount(const std::filesystem::path &guestPath, IoDevice *dev); orbis::SysResult open(std::string_view path, int flags, int mode, - orbis::Ref *file); + orbis::Ref *file, orbis::Thread *thread); } // namespace rx::vfs