[Kernel & APT] Mutexes v0.1

This commit is contained in:
wheremyfoodat 2022-11-17 00:29:02 +02:00
commit 3c55d88fab
7 changed files with 51 additions and 8 deletions

View file

@ -1,4 +1,5 @@
#include "services/apt.hpp"
#include "kernel.hpp"
namespace APTCommands {
enum : u32 {
@ -32,6 +33,8 @@ namespace Result {
void APTService::reset() {
// Set the default CPU time limit to 30%. Seems safe, as this is what Metroid 2 uses by default
cpuTimeLimit = 30;
lockHandle = std::nullopt;
}
void APTService::handleSyncRequest(u32 messagePointer) {
@ -80,12 +83,18 @@ void APTService::enable(u32 messagePointer) {
}
void APTService::getLockHandle(u32 messagePointer) {
log("APT::GetLockHandle");
log("APT::GetLockHandle\n");
// Create a lock handle if none exists
if (!lockHandle.has_value() || kernel.getObject(lockHandle.value(), KernelObjectType::Mutex) == nullptr) {
lockHandle = kernel.makeMutex();
}
mem.write32(messagePointer + 4, Result::Success); // Result code
mem.write32(messagePointer + 8, 0); // AppletAttr
mem.write32(messagePointer + 12, 0); // APT State (bit0 = Power Button State, bit1 = Order To Close State)
mem.write32(messagePointer + 16, 0); // Translation descriptor
mem.write32(messagePointer + 20, 0x34563456); // Lock handle
mem.write32(messagePointer + 20, lockHandle.value()); // Lock handle
}
// This apparently does nothing on the original kernel either?

View file

@ -1,7 +1,7 @@
#include "services/service_manager.hpp"
ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel)
: regs(regs), mem(mem), apt(mem), cecd(mem), cfg(mem), dsp(mem), hid(mem), fs(mem, kernel), gsp_gpu(mem, gpu, currentPID),
: regs(regs), mem(mem), apt(mem, kernel), cecd(mem), cfg(mem), dsp(mem), hid(mem), fs(mem, kernel), gsp_gpu(mem, gpu, currentPID),
gsp_lcd(mem), mic(mem), ndm(mem), ptm(mem) {}
void ServiceManager::reset() {