diff --git a/include/kernel/kernel.hpp b/include/kernel/kernel.hpp index c7aa4e86..2384c769 100644 --- a/include/kernel/kernel.hpp +++ b/include/kernel/kernel.hpp @@ -92,6 +92,7 @@ private: void clearEvent(); void createAddressArbiter(); void createEvent(); + void createMemoryBlock(); void createMutex(); void createThread(); void controlMemory(); diff --git a/include/services/cecd.hpp b/include/services/cecd.hpp index 3a592a32..0cbd900c 100644 --- a/include/services/cecd.hpp +++ b/include/services/cecd.hpp @@ -10,6 +10,7 @@ class CECDService { MAKE_LOG_FUNCTION(log, cecdLogger) // Service commands + void getEventHandle(u32 messagePointer); public: CECDService(Memory& mem) : mem(mem) {} diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index 7afb5f9d..82a59fbe 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -38,6 +38,7 @@ void Kernel::serviceSVC(u32 svc) { case 0x17: createEvent(); break; case 0x18: signalEvent(); break; case 0x19: clearEvent(); break; + case 0x1E: createMemoryBlock(); break; case 0x1F: mapMemoryBlock(); break; case 0x21: createAddressArbiter(); break; case 0x22: arbitrateAddress(); break; diff --git a/src/core/kernel/memory_management.cpp b/src/core/kernel/memory_management.cpp index da7fae81..a6e22c54 100644 --- a/src/core/kernel/memory_management.cpp +++ b/src/core/kernel/memory_management.cpp @@ -120,8 +120,19 @@ void Kernel::mapMemoryBlock() { default: Helpers::panic("Mapping unknown shared memory block: %X", block); } } else { - Helpers::panic("MapMemoryBlock where the handle does not refer to GSP memory"); + Helpers::panic("MapMemoryBlock where the handle does not refer to a known piece of kernel shared mem"); } regs[0] = SVCResult::Success; +} + +void Kernel::createMemoryBlock() { + const u32 addr = regs[1]; + const u32 size = regs[2]; + const u32 myPermission = regs[3]; + const u32 otherPermission = regs[4]; + logSVC("CreateMemoryBlock (addr = %08X, size = %08X, myPermission = %d, otherPermission = %d)\n", addr, size, myPermission, otherPermission); + + regs[0] = SVCResult::Success; regs[1] = 0x66666666; + //Helpers::panic("Kernel::CreateMemoryBlock"); } \ No newline at end of file diff --git a/src/core/services/cecd.cpp b/src/core/services/cecd.cpp index fbacb6d1..8fa39d60 100644 --- a/src/core/services/cecd.cpp +++ b/src/core/services/cecd.cpp @@ -2,6 +2,7 @@ namespace CECDCommands { enum : u32 { + GetEventHandle = 0x000F0000 }; } @@ -16,6 +17,15 @@ void CECDService::reset() {} void CECDService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { + case CECDCommands::GetEventHandle: getEventHandle(messagePointer); break; default: Helpers::panic("CECD service requested. Command: %08X\n", command); } +} + +void CECDService::getEventHandle(u32 messagePointer) { + log("CECD::GetEventHandle (stubbed)\n"); + Helpers::panic("TODO: Actually implement CECD::GetEventHandle"); + + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 12, 0x66666666); } \ No newline at end of file