mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-06-08 12:01:39 +12:00
[FS] Add directory stuff, clean up
This commit is contained in:
parent
3ca324350b
commit
4bef096f04
10 changed files with 70 additions and 9 deletions
46
src/core/kernel/directory_operations.cpp
Normal file
46
src/core/kernel/directory_operations.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include "kernel.hpp"
|
||||
|
||||
namespace DirectoryOps {
|
||||
enum : u32 {
|
||||
Read = 0x08010042,
|
||||
Close = 0x08020000
|
||||
};
|
||||
}
|
||||
|
||||
namespace Result {
|
||||
enum : u32 {
|
||||
Success = 0
|
||||
};
|
||||
}
|
||||
|
||||
void Kernel::handleDirectoryOperation(u32 messagePointer, Handle directory) {
|
||||
const u32 cmd = mem.read32(messagePointer);
|
||||
switch (cmd) {
|
||||
case DirectoryOps::Close: closeDirectory(messagePointer, directory); break;
|
||||
case DirectoryOps::Read: readDirectory(messagePointer, directory); break;
|
||||
default: Helpers::panic("Unknown directory operation: %08X", cmd);
|
||||
}
|
||||
}
|
||||
|
||||
void Kernel::closeDirectory(u32 messagePointer, Handle directory) {
|
||||
logFileIO("Closed directory %X\n", directory);
|
||||
|
||||
const auto p = getObject(directory, KernelObjectType::Directory);
|
||||
if (p == nullptr) [[unlikely]] {
|
||||
Helpers::panic("Called CloseFile on non-existent file");
|
||||
}
|
||||
|
||||
p->getData<DirectorySession>()->isOpen = false;
|
||||
mem.write32(messagePointer + 4, Result::Success);
|
||||
}
|
||||
|
||||
|
||||
void Kernel::readDirectory(u32 messagePointer, Handle directory) {
|
||||
const u32 entryCount = mem.read32(messagePointer + 4);
|
||||
const u32 outPointer = mem.read32(messagePointer + 12);
|
||||
logFileIO("Directory::Read (handle = %X, entry count = %d, out pointer = %08X)\n", directory, entryCount, outPointer);
|
||||
Helpers::panic("Unimplemented FsDir::Read");
|
||||
|
||||
mem.write32(messagePointer + 4, Result::Success);
|
||||
mem.write32(messagePointer + 8, 0);
|
||||
}
|
|
@ -91,6 +91,14 @@ void Kernel::sendSyncRequest() {
|
|||
return;
|
||||
}
|
||||
|
||||
// Check if our sync request is targetting a directory instead of a service
|
||||
bool isDirectoryOperation = getObject(handle, KernelObjectType::Directory) != nullptr;
|
||||
if (isDirectoryOperation) {
|
||||
handleDirectoryOperation(messagePointer, handle);
|
||||
regs[0] = SVCResult::Success;
|
||||
return;
|
||||
}
|
||||
|
||||
// If we're actually communicating with a port
|
||||
const auto session = getObject(handle, KernelObjectType::Session);
|
||||
if (session == nullptr) [[unlikely]] {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue