From 82b986bbc0ef8339cddc97f4c9f85a2f3bb90fdf Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Mon, 10 Apr 2023 21:55:14 +0300 Subject: [PATCH] [Y2R] Add transfer event --- include/services/y2r.hpp | 9 ++++++++- src/core/services/service_manager.cpp | 2 +- src/core/services/y2r.cpp | 13 +++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/services/y2r.hpp b/include/services/y2r.hpp index 4f15f592..6bd7e6f2 100644 --- a/include/services/y2r.hpp +++ b/include/services/y2r.hpp @@ -1,23 +1,30 @@ #pragma once +#include #include "helpers.hpp" #include "kernel_types.hpp" #include "logger.hpp" #include "memory.hpp" +// Circular dependencies go br +class Kernel; + class Y2RService { Handle handle = KernelHandles::Y2R; Memory& mem; + Kernel& kernel; MAKE_LOG_FUNCTION(log, y2rLogger) + std::optional transferEndEvent; bool transferEndInterruptEnabled; // Service commands void driverInitialize(u32 messagePointer); void pingProcess(u32 messagePointer); void setTransferEndInterrupt(u32 messagePointer); + void getTransferEndEvent(u32 messagePointer); public: - Y2RService(Memory& mem) : mem(mem) {} + Y2RService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 839ff82d..3efdd473 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -5,7 +5,7 @@ ServiceManager::ServiceManager(std::array& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel) : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), apt(mem, kernel), cam(mem), cecd(mem), cfg(mem), dsp(mem), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, currentPID), gsp_lcd(mem), ldr(mem), mic(mem), - nim(mem), ndm(mem), ptm(mem), y2r(mem) {} + nim(mem), ndm(mem), ptm(mem), y2r(mem, kernel) {} static constexpr int MAX_NOTIFICATION_COUNT = 16; diff --git a/src/core/services/y2r.cpp b/src/core/services/y2r.cpp index 1c932f03..04f93f2d 100644 --- a/src/core/services/y2r.cpp +++ b/src/core/services/y2r.cpp @@ -1,8 +1,10 @@ #include "services/y2r.hpp" +#include "kernel.hpp" namespace Y2RCommands { enum : u32 { SetTransferEndInterrupt = 0x000D0040, + GetTransferEndEvent = 0x000F0000, PingProcess = 0x002A0000, DriverInitialize = 0x002B0000 }; @@ -16,12 +18,14 @@ namespace Result { void Y2RService::reset() { transferEndInterruptEnabled = false; + transferEndEvent = std::nullopt; } void Y2RService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { case Y2RCommands::DriverInitialize: driverInitialize(messagePointer); break; + case Y2RCommands::GetTransferEndEvent: getTransferEndEvent(messagePointer); break; case Y2RCommands::PingProcess: pingProcess(messagePointer); break; case Y2RCommands::SetTransferEndInterrupt: setTransferEndInterrupt(messagePointer); break; default: Helpers::panic("Y2R service requested. Command: %08X\n", command); @@ -39,6 +43,15 @@ void Y2RService::driverInitialize(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void Y2RService::getTransferEndEvent(u32 messagePointer) { + log("Y2R::GetTransferEndEvent\n"); + if (!transferEndEvent.has_value()) + transferEndEvent = kernel.makeEvent(ResetType::OneShot); + + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 12, transferEndEvent.value()); +} + void Y2RService::setTransferEndInterrupt(u32 messagePointer) { const bool enable = mem.read32(messagePointer + 4) != 0; log("Y2R::SetTransferEndInterrupt (enabled: %s)\n", enable ? "yes" : "no");