[DSP] Add UnloadComponent

This commit is contained in:
wheremyfoodat 2023-05-17 01:33:39 +03:00
parent fdeb45d188
commit 433fcc9b69
2 changed files with 16 additions and 3 deletions

View file

@ -94,6 +94,7 @@ class DSPService {
void registerInterruptEvents(u32 messagePointer);
void setSemaphore(u32 messagePointer);
void setSemaphoreMask(u32 messagePointer);
void unloadComponent(u32 messagePointer);
void writeProcessPipe(u32 messagePointer);
public:

View file

@ -11,6 +11,7 @@ namespace DSPCommands {
WriteProcessPipe = 0x000D0082,
ReadPipeIfPossible = 0x001000C0,
LoadComponent = 0x001100C2,
UnloadComponent = 0x00120000,
FlushDataCache = 0x00130082,
InvalidateDataCache = 0x00140082,
RegisterInterruptEvents = 0x00150082,
@ -52,11 +53,12 @@ void DSPService::handleSyncRequest(u32 messagePointer) {
case DSPCommands::GetSemaphoreEventHandle: getSemaphoreEventHandle(messagePointer); break;
case DSPCommands::LoadComponent: loadComponent(messagePointer); break;
case DSPCommands::ReadPipeIfPossible: readPipeIfPossible(messagePointer); break;
case DSPCommands::RecvData: recvData(messagePointer); break;
case DSPCommands::RecvDataIsReady: recvDataIsReady(messagePointer); break;
case DSPCommands::RecvData: [[likely]] recvData(messagePointer); break;
case DSPCommands::RecvDataIsReady: [[likely]] recvDataIsReady(messagePointer); break;
case DSPCommands::RegisterInterruptEvents: registerInterruptEvents(messagePointer); break;
case DSPCommands::SetSemaphore: setSemaphore(messagePointer); break;
case DSPCommands::SetSemaphoreMask: setSemaphoreMask(messagePointer); break;
case DSPCommands::UnloadComponent: unloadComponent(messagePointer); break;
case DSPCommands::WriteProcessPipe: [[likely]] writeProcessPipe(messagePointer); break;
default: Helpers::panic("DSP service requested. Command: %08X\n", command);
}
@ -85,6 +87,12 @@ void DSPService::loadComponent(u32 messagePointer) {
mem.write32(messagePointer + 16, mem.read32(messagePointer + 20)); // Component buffer
}
void DSPService::unloadComponent(u32 messagePointer) {
log("DSP::UnloadComponent\n");
mem.write32(messagePointer, IPC::responseHeader(0x12, 1, 0));
mem.write32(messagePointer + 4, Result::Success);
}
void DSPService::readPipeIfPossible(u32 messagePointer) {
u32 channel = mem.read32(messagePointer + 4);
u32 peer = mem.read32(messagePointer + 8);
@ -158,7 +166,11 @@ void DSPService::registerInterruptEvents(u32 messagePointer) {
// The event handle being 0 means we're removing an event
if (eventHandle == 0) {
Helpers::panic("DSP::DSP::RegisterinterruptEvents Trying to remove a registered interrupt");
DSPEvent& e = getEventRef(interrupt, channel); // Get event
if (e.has_value()) { // Remove if it exists
totalEventCount--;
e = std::nullopt;
}
} else {
const KernelObject* object = kernel.getObject(eventHandle, KernelObjectType::Event);
if (!object) {