From a56b67f3ba7a957bfe04d0f5fe422936ef9c8b05 Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Sun, 18 Sep 2022 16:38:10 +0300 Subject: [PATCH] Added GSP services --- CMakeLists.txt | 4 ++-- include/kernel/handles.hpp | 6 +++++- include/services/gsp_gpu.hpp | 16 ++++++++++++++++ include/services/gsp_lcd.hpp | 16 ++++++++++++++++ include/services/service_manager.hpp | 4 ++++ src/core/services/gsp_gpu.cpp | 21 +++++++++++++++++++++ src/core/services/gsp_lcd.cpp | 21 +++++++++++++++++++++ src/core/services/service_manager.cpp | 11 ++++++++++- src/main.cpp | 2 +- 9 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 include/services/gsp_gpu.hpp create mode 100644 include/services/gsp_lcd.hpp create mode 100644 src/core/services/gsp_gpu.cpp create mode 100644 src/core/services/gsp_lcd.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c6ba70f..e32c2ca1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,15 +49,15 @@ set(KERNEL_SOURCE_FILES src/core/kernel/kernel.cpp src/core/kernel/resource_limi src/core/kernel/memory_management.cpp src/core/kernel/ports.cpp ) set(SERVICE_SOURCE_FILES src/core/services/service_manager.cpp src/core/services/apt.cpp src/core/services/hid.cpp - src/core/services/fs.cpp + src/core/services/fs.cpp src/core/services/gsp_gpu.cpp src/core/services/gsp_lcd.cpp ) - set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/opengl.hpp include/termcolor.hpp include/cpu.hpp include/cpu_dynarmic.hpp include/memory.hpp include/kernel/kernel.hpp include/dynarmic_cp15.hpp include/kernel/resource_limits.hpp include/kernel/kernel_types.hpp include/kernel/config_mem.hpp include/services/service_manager.hpp include/services/apt.hpp include/kernel/handles.hpp include/services/hid.hpp include/services/fs.hpp + include/services/gsp_gpu.hpp include/services/gsp_lcd.hpp ) set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp diff --git a/include/kernel/handles.hpp b/include/kernel/handles.hpp index a1112672..aa3dd95b 100644 --- a/include/kernel/handles.hpp +++ b/include/kernel/handles.hpp @@ -13,9 +13,11 @@ namespace KernelHandles { APT = 0xFFFF8002, // App Title something service? HID = 0xFFFF8003, // Handles everything input-related including gyro FS = 0xFFFF8004, // Filesystem service + GPU = 0xFFFF8005, // GPU service + LCD = 0xFFFF8006, // LCD service MinServiceHandle = APT, - MaxServiceHandle = FS + MaxServiceHandle = LCD }; // Returns whether "handle" belongs to one of the OS services @@ -29,6 +31,8 @@ namespace KernelHandles { case APT: return "APT"; case HID: return "HID"; case FS: return "FS"; + case GPU: return "GPU"; + case LCD: return "LCD"; default: return "Unknown"; } } diff --git a/include/services/gsp_gpu.hpp b/include/services/gsp_gpu.hpp new file mode 100644 index 00000000..86109a76 --- /dev/null +++ b/include/services/gsp_gpu.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "helpers.hpp" +#include "kernel_types.hpp" +#include "memory.hpp" + +class GPUService { + Handle handle = KernelHandles::GPU; + Memory& mem; + + // Service commands + +public: + GPUService(Memory& mem) : mem(mem) {} + void reset(); + void handleSyncRequest(u32 messagePointer); +}; \ No newline at end of file diff --git a/include/services/gsp_lcd.hpp b/include/services/gsp_lcd.hpp new file mode 100644 index 00000000..18a56c7e --- /dev/null +++ b/include/services/gsp_lcd.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "helpers.hpp" +#include "kernel_types.hpp" +#include "memory.hpp" + +class LCDService { + Handle handle = KernelHandles::LCD; + Memory& mem; + + // Service commands + +public: + LCDService(Memory& mem) : mem(mem) {} + void reset(); + void handleSyncRequest(u32 messagePointer); +}; \ No newline at end of file diff --git a/include/services/service_manager.hpp b/include/services/service_manager.hpp index 28e31b29..9d5ce610 100644 --- a/include/services/service_manager.hpp +++ b/include/services/service_manager.hpp @@ -5,6 +5,8 @@ #include "services/apt.hpp" #include "services/hid.hpp" #include "services/fs.hpp" +#include "services/gsp_gpu.hpp" +#include "services/gsp_lcd.hpp" class ServiceManager { std::array& regs; @@ -13,6 +15,8 @@ class ServiceManager { APTService apt; HIDService hid; FSService fs; + GPUService gsp_gpu; + LCDService gsp_lcd; // "srv:" commands void getServiceHandle(u32 messagePointer); diff --git a/src/core/services/gsp_gpu.cpp b/src/core/services/gsp_gpu.cpp new file mode 100644 index 00000000..8daf0280 --- /dev/null +++ b/src/core/services/gsp_gpu.cpp @@ -0,0 +1,21 @@ +#include "services/gsp_gpu.hpp" + +namespace GPUCommands { + enum : u32 { + }; +} + +namespace Result { + enum : u32 { + Success = 0, + }; +} + +void GPUService::reset() {} + +void GPUService::handleSyncRequest(u32 messagePointer) { + const u32 command = mem.read32(messagePointer); + switch (command) { + default: Helpers::panic("GPU service requested. Command: %08X\n", command); + } +} \ No newline at end of file diff --git a/src/core/services/gsp_lcd.cpp b/src/core/services/gsp_lcd.cpp new file mode 100644 index 00000000..21764b31 --- /dev/null +++ b/src/core/services/gsp_lcd.cpp @@ -0,0 +1,21 @@ +#include "services/gsp_lcd.hpp" + +namespace LCDCommands { + enum : u32 { + }; +} + +namespace Result { + enum : u32 { + Success = 0, + }; +} + +void LCDService::reset() {} + +void LCDService::handleSyncRequest(u32 messagePointer) { + const u32 command = mem.read32(messagePointer); + switch (command) { + default: Helpers::panic("LCD service requested. Command: %08X\n", command); + } +} \ No newline at end of file diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 421a61ff..7bf6f895 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -1,12 +1,15 @@ #include "services/service_manager.hpp" ServiceManager::ServiceManager(std::array& regs, Memory& mem) : regs(regs), mem(mem), - apt(mem), hid(mem), fs(mem) {} + apt(mem), hid(mem), fs(mem), + gsp_gpu(mem), gsp_lcd(mem) {} void ServiceManager::reset() { apt.reset(); hid.reset(); fs.reset(); + gsp_gpu.reset(); + gsp_lcd.reset(); } // Match IPC messages to a "srv:" command based on their header @@ -69,6 +72,10 @@ void ServiceManager::getServiceHandle(u32 messagePointer) { handle = KernelHandles::HID; } else if (service == "fs:USER") { handle = KernelHandles::FS; + } else if (service == "gsp::Gpu") { + handle = KernelHandles::GPU; + } else if (service == "gsp::Lcd") { + handle = KernelHandles::LCD; } else { Helpers::panic("srv: GetServiceHandle with unknown service %s", service.c_str()); } @@ -82,6 +89,8 @@ void ServiceManager::sendCommandToService(u32 messagePointer, Handle handle) { case KernelHandles::APT: apt.handleSyncRequest(messagePointer); break; case KernelHandles::HID: hid.handleSyncRequest(messagePointer); break; case KernelHandles::FS: fs.handleSyncRequest(messagePointer); break; + case KernelHandles::GPU: [[likely]] gsp_gpu.handleSyncRequest(messagePointer); break; + case KernelHandles::LCD: gsp_lcd.handleSyncRequest(messagePointer); break; default: Helpers::panic("Sent IPC message to unknown service %08X\n Command: %08X", handle, mem.read32(messagePointer)); } } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b95e43b7..a188db06 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,7 @@ int main (int argc, char *argv[]) { Helpers::panic("Failed to initialize OpenGL"); } - auto elfPath = std::filesystem::current_path() / (argc > 1 ? argv[1] : "SimplerTri.elf"); + auto elfPath = std::filesystem::current_path() / (argc > 1 ? argv[1] : "sm64.elf"); if (!emu.loadELF(elfPath)) { Helpers::panic("Failed to load ELF file: %s", elfPath.c_str()); }