[Kernel] Fix DuplicateHandle, fix typo, panic on FS::OpenFileDirectly

This commit is contained in:
wheremyfoodat 2022-10-03 21:05:41 +03:00
parent fca54b99a7
commit 88c93645e3
4 changed files with 21 additions and 4 deletions

View file

@ -12,6 +12,7 @@ class FSService {
// Service commands // Service commands
void initialize(u32 messagePointer); void initialize(u32 messagePointer);
void openArchive(u32 messagePointer); void openArchive(u32 messagePointer);
void openFileDirectly(u32 messagePointer);
public: public:
FSService(Memory& mem) : mem(mem) {} FSService(Memory& mem) : mem(mem) {}

View file

@ -173,10 +173,11 @@ void Kernel::duplicateHandle() {
logSVC("DuplicateHandle(handle = %X)\n", original); logSVC("DuplicateHandle(handle = %X)\n", original);
if (original == KernelHandles::CurrentThread) { if (original == KernelHandles::CurrentThread) {
printf("[Warning] Duplicated current thread. This might be horribly broken!\n");
const auto& t = threads[currentThreadIndex];
regs[0] = SVCResult::Success; regs[0] = SVCResult::Success;
regs[1] = makeThread(t.entrypoint, t.initialSP, t.priority, t.processorID, t.arg, t.status); Handle ret = makeObject(KernelObjectType::Thread);
objects[ret].data = &threads[currentThreadIndex];
regs[1] = ret;
} else { } else {
Helpers::panic("DuplicateHandle: unimplemented handle type"); Helpers::panic("DuplicateHandle: unimplemented handle type");
} }

View file

@ -281,7 +281,7 @@ std::optional<u32> Memory::findPaddr(u32 size) {
candidatePage = i + 1; candidatePage = i + 1;
counter = 0; counter = 0;
} }
else { // Our candidate page has 1 mor else { // The paddr we're testing has 1 more free page
counter++; counter++;
// Check if there's enough free memory to use this page // Check if there's enough free memory to use this page
// We use == instead of >= because some software does 0-byte allocations // We use == instead of >= because some software does 0-byte allocations

View file

@ -3,6 +3,7 @@
namespace FSCommands { namespace FSCommands {
enum : u32 { enum : u32 {
Initialize = 0x08010002, Initialize = 0x08010002,
OpenFileDirectly = 0x08030204,
OpenArchive = 0x080C00C2 OpenArchive = 0x080C00C2
}; };
} }
@ -21,6 +22,7 @@ void FSService::handleSyncRequest(u32 messagePointer) {
switch (command) { switch (command) {
case FSCommands::Initialize: initialize(messagePointer); break; case FSCommands::Initialize: initialize(messagePointer); break;
case FSCommands::OpenArchive: openArchive(messagePointer); break; case FSCommands::OpenArchive: openArchive(messagePointer); break;
case FSCommands::OpenFileDirectly: openFileDirectly(messagePointer); break;
default: Helpers::panic("FS service requested. Command: %08X\n", command); default: Helpers::panic("FS service requested. Command: %08X\n", command);
} }
} }
@ -34,3 +36,16 @@ void FSService::openArchive(u32 messagePointer) {
log("FS::OpenArchive (failure)\n"); log("FS::OpenArchive (failure)\n");
mem.write32(messagePointer + 4, Result::Failure); mem.write32(messagePointer + 4, Result::Failure);
} }
void FSService::openFileDirectly(u32 messagePointer) {
const u32 archiveID = mem.read32(messagePointer + 8);
const u32 archivePathType = mem.read32(messagePointer + 12);
const u32 filePathType = mem.read32(messagePointer + 20);
const u32 archivePathPointer = mem.read32(messagePointer + 40);
const u32 filePathPointer = mem.read32(messagePointer + 48);
log("FS::OpenFileDirectly (failure)\n");
mem.write32(messagePointer + 4, Result::Failure);
Helpers::panic("[FS::OpenFileDirectly] Tried to open file. Archive ID = %d\n", archiveID);
}