2024-02-23 22:32:32 +01:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
2024-02-27 23:10:34 +01:00
|
|
|
#include "common/assert.h"
|
|
|
|
#include "common/logging/log.h"
|
2024-02-23 22:32:32 +01:00
|
|
|
#include "common/singleton.h"
|
|
|
|
#include "core/file_sys/fs.h"
|
2024-04-13 23:35:48 +02:00
|
|
|
#include "core/libraries/error_codes.h"
|
|
|
|
#include "core/libraries/kernel/file_system.h"
|
|
|
|
#include "core/libraries/libs.h"
|
2023-10-30 22:04:57 +01:00
|
|
|
|
2024-04-13 23:35:48 +02:00
|
|
|
namespace Libraries::Kernel {
|
2023-11-06 00:11:54 +01:00
|
|
|
|
2023-10-30 22:04:57 +01:00
|
|
|
int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) {
|
2024-02-27 23:10:34 +01:00
|
|
|
LOG_INFO(Kernel_Fs, "path = {} flags = {:#x} mode = {:#x}", path, flags, mode);
|
2024-03-31 17:04:47 +02:00
|
|
|
ASSERT_MSG(flags == 0, "flags!=0 not supported yet");
|
|
|
|
ASSERT_MSG(mode == 0, "mode!=0 not supported yet");
|
2024-01-26 17:01:27 +01:00
|
|
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
|
|
|
auto* mnt = Common::Singleton<Core::FileSys::MntPoints>::Instance();
|
|
|
|
|
|
|
|
// only open files support!
|
2024-02-27 23:10:34 +01:00
|
|
|
u32 handle = h->CreateHandle();
|
|
|
|
auto* file = h->GetFile(handle);
|
2024-01-26 17:01:27 +01:00
|
|
|
file->m_guest_name = path;
|
2024-02-27 23:10:34 +01:00
|
|
|
file->m_host_name = mnt->GetHostFile(file->m_guest_name);
|
2024-01-26 17:01:27 +01:00
|
|
|
|
2024-02-27 23:10:34 +01:00
|
|
|
file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read);
|
|
|
|
if (!file->f.IsOpen()) {
|
|
|
|
h->DeleteHandle(handle);
|
2024-01-26 17:01:27 +01:00
|
|
|
return SCE_KERNEL_ERROR_EACCES;
|
|
|
|
}
|
2024-02-27 23:10:34 +01:00
|
|
|
file->is_opened = true;
|
2024-01-26 17:01:27 +01:00
|
|
|
return handle;
|
2023-10-30 22:04:57 +01:00
|
|
|
}
|
|
|
|
|
2024-01-26 17:01:27 +01:00
|
|
|
int PS4_SYSV_ABI posix_open(const char* path, int flags, /* SceKernelMode*/ u16 mode) {
|
2024-02-27 23:10:34 +01:00
|
|
|
LOG_INFO(Kernel_Fs, "posix open redirect to sceKernelOpen\n");
|
2023-10-30 22:04:57 +01:00
|
|
|
int result = sceKernelOpen(path, flags, mode);
|
2024-02-27 23:10:34 +01:00
|
|
|
// Posix calls different only for their return values
|
|
|
|
ASSERT(result >= 0);
|
2023-10-30 22:04:57 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2024-03-31 17:04:47 +02:00
|
|
|
int PS4_SYSV_ABI sceKernelClose(int d) {
|
|
|
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
|
|
|
auto* file = h->GetFile(d);
|
|
|
|
if (file == nullptr) {
|
|
|
|
return SCE_KERNEL_ERROR_EBADF;
|
|
|
|
}
|
|
|
|
if (!file->is_directory) {
|
|
|
|
file->f.Close();
|
|
|
|
}
|
|
|
|
file->is_opened = false;
|
|
|
|
LOG_INFO(Kernel_Fs, "Closing {}", file->m_guest_name);
|
|
|
|
h->DeleteHandle(d);
|
|
|
|
return SCE_OK;
|
|
|
|
}
|
|
|
|
|
2024-01-26 17:01:27 +01:00
|
|
|
size_t PS4_SYSV_ABI _readv(int d, const SceKernelIovec* iov, int iovcnt) {
|
|
|
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
2024-02-27 23:10:34 +01:00
|
|
|
auto* file = h->GetFile(d);
|
2024-01-26 17:01:27 +01:00
|
|
|
size_t total_read = 0;
|
|
|
|
file->m_mutex.lock();
|
|
|
|
for (int i = 0; i < iovcnt; i++) {
|
2024-02-27 23:10:34 +01:00
|
|
|
total_read += file->f.ReadRaw<u8>(iov[i].iov_base, iov[i].iov_len);
|
2024-01-26 17:01:27 +01:00
|
|
|
}
|
|
|
|
file->m_mutex.unlock();
|
|
|
|
return total_read;
|
|
|
|
}
|
|
|
|
|
2024-03-31 17:04:47 +02:00
|
|
|
s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) {
|
2024-03-22 17:12:37 +01:00
|
|
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
|
|
|
auto* file = h->GetFile(d);
|
|
|
|
|
|
|
|
file->m_mutex.lock();
|
|
|
|
|
|
|
|
if (whence == 1) {
|
|
|
|
offset = static_cast<int64_t>(file->f.Tell()) + offset;
|
|
|
|
whence = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (whence == 2) {
|
|
|
|
offset = static_cast<int64_t>(file->f.GetSize()) + offset;
|
|
|
|
whence = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
file->f.Seek(offset);
|
|
|
|
auto pos = static_cast<int64_t>(file->f.Tell());
|
|
|
|
|
|
|
|
file->m_mutex.unlock();
|
|
|
|
return pos;
|
|
|
|
}
|
|
|
|
|
2024-03-31 17:04:47 +02:00
|
|
|
s64 PS4_SYSV_ABI lseek(int d, s64 offset, int whence) {
|
|
|
|
return sceKernelLseek(d, offset, whence);
|
|
|
|
}
|
|
|
|
|
|
|
|
s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes) {
|
|
|
|
if (buf == nullptr) {
|
|
|
|
return SCE_KERNEL_ERROR_EFAULT;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
|
|
|
auto* file = h->GetFile(d);
|
|
|
|
if (file == nullptr) {
|
|
|
|
return SCE_KERNEL_ERROR_EBADF;
|
|
|
|
}
|
|
|
|
file->m_mutex.lock();
|
|
|
|
u32 bytes_read = file->f.ReadRaw<u8>(buf, static_cast<u32>(nbytes));
|
|
|
|
file->m_mutex.unlock();
|
|
|
|
return bytes_read;
|
|
|
|
}
|
|
|
|
|
2024-04-13 23:35:48 +02:00
|
|
|
void fileSystemSymbolsRegister(Core::Loader::SymbolsResolver* sym) {
|
2023-10-30 22:04:57 +01:00
|
|
|
LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen);
|
2024-01-26 17:01:27 +01:00
|
|
|
LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open);
|
2024-03-31 17:04:47 +02:00
|
|
|
LIB_FUNCTION("UK2Tl2DWUns", "libkernel", 1, "libkernel", 1, 1, sceKernelClose);
|
|
|
|
|
2024-01-26 17:01:27 +01:00
|
|
|
LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, _readv);
|
2024-03-22 17:12:37 +01:00
|
|
|
LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, lseek);
|
2024-03-31 17:04:47 +02:00
|
|
|
LIB_FUNCTION("oib76F-12fk", "libkernel", 1, "libkernel", 1, 1, sceKernelLseek);
|
|
|
|
LIB_FUNCTION("Cg4srZ6TKbU", "libkernel", 1, "libkernel", 1, 1, sceKernelRead);
|
2024-01-26 17:01:27 +01:00
|
|
|
|
|
|
|
// openOrbis (to check if it is valid out of OpenOrbis
|
2024-02-23 21:57:57 +01:00
|
|
|
LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1,
|
|
|
|
posix_open); // _open shoudld be equal to open function
|
2023-10-30 22:04:57 +01:00
|
|
|
}
|
|
|
|
|
2024-04-13 23:35:48 +02:00
|
|
|
} // namespace Libraries::Kernel
|