From ef9d91082a5696a23b7cf1f6733aefa875ceda32 Mon Sep 17 00:00:00 2001 From: Marek Ledworowski Date: Tue, 18 Nov 2025 21:25:30 +0100 Subject: [PATCH] Fixed PFS dirents returning empty on 1st entry Muted annoyances --- .../src/quasifs_inode_quasi_directory_pfs.cpp | 6 +- src/core/libraries/kernel/file_system.cpp | 60 +++---------------- src/core/libraries/kernel/memory.cpp | 20 +++---- 3 files changed, 21 insertions(+), 65 deletions(-) diff --git a/src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory_pfs.cpp b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory_pfs.cpp index 4bb3bd8fd..def2cf504 100644 --- a/src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory_pfs.cpp +++ b/src/core/file_sys/quasifs/src/quasifs_inode_quasi_directory_pfs.cpp @@ -100,9 +100,9 @@ s64 DirectoryPFS::getdents(void* buf, u32 count, s64 offset, s64* basep) { // if this dirent breaks alignment, skip // dirents are count-aligned here, excess data is simply not written - if (Common::AlignUp(buffer_position, count) != - Common::AlignUp(buffer_position + pfs_dirent->d_reclen, count)) - break; + // if (Common::AlignUp(buffer_position, count) != + // Common::AlignUp(buffer_position + pfs_dirent->d_reclen, count)) + // break; // we're transposing u32 into smaller types, so there miiight be some issues // reclen for both is the same despite difference in var sizes, extra 0s are padded after diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 892a6eb16..ceedbea82 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -44,9 +44,9 @@ namespace Libraries::Kernel { static QuasiFS::QFS* g_qfs = Common::Singleton::Instance(); s32 PS4_SYSV_ABI open(const char* raw_path, s32 flags, u16 mode) { - LOG_INFO(Kernel_Fs, "path = {} flags = {:#x} mode = {:#o}", raw_path, flags, mode); - int result = g_qfs->Operation.Open(raw_path, flags, mode); + LOG_INFO(Kernel_Fs, "path = {} flags = {:#x} mode = {:#o} result = {}", raw_path, flags, mode, + result); if (result < 0) *__Error() = -result; return result; @@ -67,7 +67,7 @@ s32 PS4_SYSV_ABI sceKernelOpen(const char* path, s32 flags, /* SceKernelMode*/ u s32 PS4_SYSV_ABI close(s32 fd) { int result = g_qfs->Operation.Close(fd); - + LOG_INFO(Kernel_Fs, "fd = {} result = {}", fd, result); if (result < 0) *__Error() = -result; return result; @@ -220,8 +220,8 @@ s64 PS4_SYSV_ABI sceKernelRead(s32 fd, void* buf, u64 nbytes) { } s32 PS4_SYSV_ABI posix_mkdir(const char* path, u16 mode) { - LOG_INFO(Kernel_Fs, "path = {} mode = {:#o}", path, mode); int result = g_qfs->Operation.MKDir(path, mode); + LOG_INFO(Kernel_Fs, "path = {} mode = {:#o} result = {}", path, mode, result); if (result < 0) *__Error() = -result; return result; @@ -260,39 +260,14 @@ s32 PS4_SYSV_ABI sceKernelRmdir(const char* path) { } s32 PS4_SYSV_ABI posix_stat(const char* path, OrbisKernelStat* sb) { - LOG_DEBUG(Kernel_Fs, "(PARTIAL) path = {}", path); - int result = g_qfs->Operation.Stat(path, sb); + LOG_INFO(Kernel_Fs, "path = {} result = {}", path, result); if (result < 0) { *__Error() = -result; return -1; } return ORBIS_OK; - - // const auto path_name = mnt->GetHostPath(path); - // std::memset(sb, 0, sizeof(OrbisKernelStat)); - // const bool is_dir = std::filesystem::is_directory(path_name); - // const bool is_file = std::filesystem::is_regular_file(path_name); - // if (!is_dir && !is_file) { - // *__Error() = POSIX_ENOENT; - // return -1; - // } - // if (std::filesystem::is_directory(path_name)) { - // sb->st_mode = 0000777u | 0040000u; - // sb->st_size = 65536; - // sb->st_blksize = 65536; - // sb->st_blocks = 128; - // // TODO incomplete - // } else { - // sb->st_mode = 0000777u | 0100000u; - // sb->st_size = static_cast(std::filesystem::file_size(path_name)); - // sb->st_blksize = 512; - // sb->st_blocks = (sb->st_size + 511) / 512; - // // TODO incomplete - // } - - return ORBIS_OK; } s32 PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { @@ -315,9 +290,8 @@ s32 PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { } s32 PS4_SYSV_ABI fstat(s32 fd, OrbisKernelStat* sb) { - LOG_DEBUG(Kernel_Fs, "(PARTIAL) fd = {}", fd); - int result = g_qfs->Operation.FStat(fd, sb); + LOG_INFO(Kernel_Fs, "fd = {} result = {}", fd, result); if (result < 0) { *__Error() = -result; return -1; @@ -362,24 +336,6 @@ s32 PS4_SYSV_ABI fstat(s32 fd, OrbisKernelStat* sb) { // UNREACHABLE_MSG("{}", u32(file->type.load())); // } - - // sb->st_dev = st.st_dev; - // sb->st_ino = st.st_ino; - // sb->st_mode = st.st_mode; - // sb->st_nlink = st.st_nlink; - // sb->st_uid = st.st_uid; - // sb->st_gid = st.st_gid; - // sb-> st_rdev=st.st_ - // sb->st_atim = st.st_atim; - // sb->st_mtim = st.st_mtim; - // sb-> st_ctim=st.st_ - // sb->st_size = st.st_size; - // sb->st_blocks = st.st_blocks; - // sb->st_blksize = st.st_blksize; - // sb->st_flags = st.st_flags; - // sb-> st_gen=st.st_ - // sb-> st_lspare=st.st_ - // OrbisKernelTimespec st_birthtim; } s32 PS4_SYSV_ABI posix_fstat(s32 fd, OrbisKernelStat* sb) { @@ -805,8 +761,8 @@ s32 PS4_SYSV_ABI posix_select(s32 nfds, fd_set_posix* readfds, fd_set_posix* wri #else s32 PS4_SYSV_ABI posix_select(s32 nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, OrbisKernelTimeval* timeout) { - LOG_DEBUG(Kernel_Fs, "nfds = {}, readfds = {}, writefds = {}, exceptfds = {}, timeout = {}", - nfds, fmt::ptr(readfds), fmt::ptr(writefds), fmt::ptr(exceptfds), fmt::ptr(timeout)); + LOG_INFO(Kernel_Fs, "nfds = {}, readfds = {}, writefds = {}, exceptfds = {}, timeout = {}", + nfds, fmt::ptr(readfds), fmt::ptr(writefds), fmt::ptr(exceptfds), fmt::ptr(timeout)); auto* h = Common::Singleton::Instance(); fd_set read_host, write_host, except_host; diff --git a/src/core/libraries/kernel/memory.cpp b/src/core/libraries/kernel/memory.cpp index 661ddea63..c7cc88d53 100644 --- a/src/core/libraries/kernel/memory.cpp +++ b/src/core/libraries/kernel/memory.cpp @@ -63,10 +63,10 @@ s32 PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u *physAddrOut = static_cast(phys_addr); - LOG_INFO(Kernel_Vmm, - "searchStart = {:#x}, searchEnd = {:#x}, len = {:#x}, " - "alignment = {:#x}, memoryType = {:#x}, physAddrOut = {:#x}", - searchStart, searchEnd, len, alignment, memoryType, phys_addr); + // LOG_INFO(Kernel_Vmm, + // "searchStart = {:#x}, searchEnd = {:#x}, len = {:#x}, " + // "alignment = {:#x}, memoryType = {:#x}, physAddrOut = {:#x}", + // searchStart, searchEnd, len, alignment, memoryType, phys_addr); return ORBIS_OK; } @@ -123,7 +123,7 @@ s32 PS4_SYSV_ABI sceKernelAvailableDirectMemorySize(u64 searchStart, u64 searchE s32 PS4_SYSV_ABI sceKernelVirtualQuery(const void* addr, s32 flags, OrbisVirtualQueryInfo* info, u64 infoSize) { - LOG_INFO(Kernel_Vmm, "called addr = {}, flags = {:#x}", fmt::ptr(addr), flags); + // LOG_INFO(Kernel_Vmm, "called addr = {}, flags = {:#x}", fmt::ptr(addr), flags); auto* memory = Core::Memory::Instance(); return memory->VirtualQuery(std::bit_cast(addr), flags, info); } @@ -160,10 +160,10 @@ s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, s32 flags, u s32 PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, s32 prot, s32 flags, s64 phys_addr, u64 alignment, const char* name) { - LOG_INFO(Kernel_Vmm, - "in_addr = {}, len = {:#x}, prot = {:#x}, flags = {:#x}, " - "phys_addr = {:#x}, alignment = {:#x}, name = '{}'", - fmt::ptr(*addr), len, prot, flags, phys_addr, alignment, name); + // LOG_INFO(Kernel_Vmm, + // "in_addr = {}, len = {:#x}, prot = {:#x}, flags = {:#x}, " + // "phys_addr = {:#x}, alignment = {:#x}, name = '{}'", + // fmt::ptr(*addr), len, prot, flags, phys_addr, alignment, name); if (len == 0 || !Common::Is16KBAligned(len)) { LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 16KB aligned!"); @@ -200,7 +200,7 @@ s32 PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, s32 prot, s const auto ret = memory->MapMemory(addr, in_addr, len, mem_prot, map_flags, Core::VMAType::Direct, name, false, phys_addr, alignment); - LOG_INFO(Kernel_Vmm, "out_addr = {}", fmt::ptr(*addr)); + // LOG_INFO(Kernel_Vmm, "out_addr = {}", fmt::ptr(*addr)); return ret; }