From 5df44e0c4f91d5d6ee3a2c6fe5f85c52e3ca1675 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 11 Nov 2023 20:51:53 +0200 Subject: [PATCH] [GSP] Add GSP::GPU::ReleaseRight --- include/services/gsp_gpu.hpp | 1 + src/core/services/gsp_gpu.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/include/services/gsp_gpu.hpp b/include/services/gsp_gpu.hpp index 92ca36e2..68e24580 100644 --- a/include/services/gsp_gpu.hpp +++ b/include/services/gsp_gpu.hpp @@ -65,6 +65,7 @@ class GPUService { void flushDataCache(u32 messagePointer); void importDisplayCaptureInfo(u32 messagePointer); void registerInterruptRelayQueue(u32 messagePointer); + void releaseRight(u32 messagePointer); void saveVramSysArea(u32 messagePointer); void setAxiConfigQoSMode(u32 messagePointer); void setBufferSwap(u32 messagePointer); diff --git a/src/core/services/gsp_gpu.cpp b/src/core/services/gsp_gpu.cpp index 0e27c0ec..861dfb0a 100644 --- a/src/core/services/gsp_gpu.cpp +++ b/src/core/services/gsp_gpu.cpp @@ -15,6 +15,7 @@ namespace ServiceCommands { FlushDataCache = 0x00080082, SetLCDForceBlack = 0x000B0040, TriggerCmdReqQueue = 0x000C0000, + ReleaseRight = 0x00170000, ImportDisplayCaptureInfo = 0x00180000, SaveVramSysArea = 0x00190000, SetInternalPriorities = 0x001E0080, @@ -49,6 +50,7 @@ void GPUService::handleSyncRequest(u32 messagePointer) { case ServiceCommands::FlushDataCache: flushDataCache(messagePointer); break; case ServiceCommands::ImportDisplayCaptureInfo: importDisplayCaptureInfo(messagePointer); break; case ServiceCommands::RegisterInterruptRelayQueue: registerInterruptRelayQueue(messagePointer); break; + case ServiceCommands::ReleaseRight: releaseRight(messagePointer); break; case ServiceCommands::SaveVramSysArea: saveVramSysArea(messagePointer); break; case ServiceCommands::SetAxiConfigQoSMode: setAxiConfigQoSMode(messagePointer); break; case ServiceCommands::SetBufferSwap: setBufferSwap(messagePointer); break; @@ -80,6 +82,16 @@ void GPUService::acquireRight(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void GPUService::releaseRight(u32 messagePointer) { + log("GSP::GPU::ReleaseRight\n"); + if (privilegedProcess == currentPID) { + privilegedProcess = 0xFFFFFFFF; + } + + mem.write32(messagePointer, IPC::responseHeader(0x17, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + // TODO: What is the flags field meant to be? // What is the "GSP module thread index" meant to be? // How does the shared memory handle thing work?