From 49dc52634789a0382589984ebf1004d2e6455b7b Mon Sep 17 00:00:00 2001
From: wheremyfoodat <gponiris2004@gmail.com>
Date: Sat, 15 Oct 2022 14:17:10 +0300
Subject: [PATCH] Add empty PTM service for CubicNinja

---
 CMakeLists.txt                        |  3 ++-
 include/kernel/handles.hpp            | 20 +++++++++++---------
 include/logger.hpp                    |  1 +
 include/services/ptm.hpp              | 18 ++++++++++++++++++
 include/services/service_manager.hpp  |  2 ++
 src/core/services/ptm.cpp             | 21 +++++++++++++++++++++
 src/core/services/service_manager.cpp |  8 ++++++--
 7 files changed, 61 insertions(+), 12 deletions(-)
 create mode 100644 include/services/ptm.hpp
 create mode 100644 src/core/services/ptm.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 95b06e2d..996773ef 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -56,6 +56,7 @@ set(KERNEL_SOURCE_FILES src/core/kernel/kernel.cpp src/core/kernel/resource_limi
 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/gsp_gpu.cpp src/core/services/gsp_lcd.cpp
                          src/core/services/ndm.cpp src/core/services/dsp.cpp src/core/services/cfg.cpp
+                         src/core/services/ptm.cpp
 )
 set(PICA_SOURCE_FILES src/core/PICA/gpu.cpp src/core/PICA/regs.cpp src/core/PICA/shader_unit.cpp
                       src/core/PICA/shader_interpreter.cpp src/core/PICA/renderer_opengl.cpp
@@ -74,7 +75,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/opengl.hpp inc
                  include/logger.hpp include/loader/ncch.hpp include/loader/ncsd.hpp include/io_file.hpp
                  include/loader/lz77.hpp include/fs/archive_base.hpp include/fs/archive_ncch.hpp
                  include/services/dsp.hpp include/services/cfg.hpp include/services/region_codes.hpp
-                 include/fs/archive_save_data.hpp include/fs/archive_sdmc.hpp
+                 include/fs/archive_save_data.hpp include/fs/archive_sdmc.hpp include/services/ptm.hpp
 )
 
 set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp
diff --git a/include/kernel/handles.hpp b/include/kernel/handles.hpp
index ce30e99e..f027cbcb 100644
--- a/include/kernel/handles.hpp
+++ b/include/kernel/handles.hpp
@@ -10,17 +10,18 @@ namespace KernelHandles {
 		// Hardcoded handles
 		CurrentThread = 0xFFFF8000,  // Used by the original kernel
 		CurrentProcess = 0xFFFF8001, // Used by the original kernel
-		APT = 0xFFFF8002,            // App Title something service?
-		CFG = 0xFFFF8003,            // Console & region info
-		HID = 0xFFFF8004,            // Handles everything input-related including gyro
-		FS  = 0xFFFF8005,            // Filesystem service
-		GPU = 0xFFFF8006,            // GPU service
-		DSP = 0xFFFF8007,            // DSP service (Used for audio decoding and output)
-		LCD = 0xFFFF8008,            // LCD service (Used for configuring the displays)
-		NDM = 0xFFFF8009,            // ?????
+		APT,  // App Title something service?
+		CFG,  // CFG service (Console & region info)
+		HID,  // HID service (Handles everything input-related including gyro)
+		FS,   // Filesystem service
+		GPU,  // GPU service
+		DSP,  // DSP service (Used for audio decoding and output)
+		LCD,  // LCD service (Used for configuring the displays)
+		NDM,  // ?????
+		PTM,  // PTM service (Used for accessing various console info, such as battery, shell and pedometer state)
 
 		MinServiceHandle = APT,
-		MaxServiceHandle = NDM,
+		MaxServiceHandle = PTM,
 
 		GSPSharedMemHandle = MaxServiceHandle + 1, // Handle for the GSP shared memory
 		HIDSharedMemHandle,
@@ -56,6 +57,7 @@ namespace KernelHandles {
 			case GPU: return "GPU";
 			case LCD: return "LCD";
 			case NDM: return "NDM";
+			case PTM: return "PTM";
 			default: return "Unknown";
 		}
 	}
diff --git a/include/logger.hpp b/include/logger.hpp
index e746118b..cc961b32 100644
--- a/include/logger.hpp
+++ b/include/logger.hpp
@@ -34,6 +34,7 @@ namespace Log {
     static Logger<true> gspGPULogger;
     static Logger<true> gspLCDLogger;
     static Logger<true> ndmLogger;
+    static Logger<true> ptmLogger;
     static Logger<true> srvLogger;
 
     #define MAKE_LOG_FUNCTION(functionName, logger)      \
diff --git a/include/services/ptm.hpp b/include/services/ptm.hpp
new file mode 100644
index 00000000..783c3754
--- /dev/null
+++ b/include/services/ptm.hpp
@@ -0,0 +1,18 @@
+#pragma once
+#include "helpers.hpp"
+#include "kernel_types.hpp"
+#include "logger.hpp"
+#include "memory.hpp"
+
+class PTMService {
+	Handle handle = KernelHandles::PTM;
+	Memory& mem;
+	MAKE_LOG_FUNCTION(log, ptmLogger)
+
+	// Service commands
+
+public:
+	PTMService(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 ddbe5fd7..8d4423df 100644
--- a/include/services/service_manager.hpp
+++ b/include/services/service_manager.hpp
@@ -11,6 +11,7 @@
 #include "services/gsp_gpu.hpp"
 #include "services/gsp_lcd.hpp"
 #include "services/ndm.hpp"
+#include "services/ptm.hpp"
 
 class Kernel;
 
@@ -27,6 +28,7 @@ class ServiceManager {
 	GPUService gsp_gpu;
 	LCDService gsp_lcd;
 	NDMService ndm;
+	PTMService ptm;
 
 	// "srv:" commands
 	void enableNotification(u32 messagePointer);
diff --git a/src/core/services/ptm.cpp b/src/core/services/ptm.cpp
new file mode 100644
index 00000000..0fdbb47a
--- /dev/null
+++ b/src/core/services/ptm.cpp
@@ -0,0 +1,21 @@
+#include "services/ptm.hpp"
+
+namespace PTMCommands {
+	enum : u32 {
+	};
+}
+
+namespace Result {
+	enum : u32 {
+		Success = 0,
+	};
+}
+
+void PTMService::reset() {}
+
+void PTMService::handleSyncRequest(u32 messagePointer) {
+	const u32 command = mem.read32(messagePointer);
+	switch (command) {
+		default: Helpers::panic("PTM 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 598598fc..99945090 100644
--- a/src/core/services/service_manager.cpp
+++ b/src/core/services/service_manager.cpp
@@ -2,7 +2,7 @@
 
 ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel)
 	: regs(regs), mem(mem), apt(mem), cfg(mem), dsp(mem), hid(mem), fs(mem, kernel), gsp_gpu(mem, gpu, currentPID),
-	gsp_lcd(mem), ndm(mem) {}
+	gsp_lcd(mem), ndm(mem), ptm(mem) {}
 
 void ServiceManager::reset() {
 	apt.reset();
@@ -13,6 +13,7 @@ void ServiceManager::reset() {
 	gsp_gpu.reset();
 	gsp_lcd.reset();
 	ndm.reset();
+	ptm.reset();
 }
 
 // Match IPC messages to a "srv:" command based on their header
@@ -91,7 +92,9 @@ void ServiceManager::getServiceHandle(u32 messagePointer) {
 		handle = KernelHandles::LCD;
 	} else if (service == "ndm:u") {
 		handle = KernelHandles::NDM;
-	}else {
+	} else if (service == "ptm:u") {
+		handle = KernelHandles::PTM;
+	} else {
 		Helpers::panic("srv: GetServiceHandle with unknown service %s", service.c_str());
 	}
 
@@ -125,6 +128,7 @@ void ServiceManager::sendCommandToService(u32 messagePointer, Handle handle) {
 		case KernelHandles::GPU: [[likely]] gsp_gpu.handleSyncRequest(messagePointer); break;
 		case KernelHandles::LCD: gsp_lcd.handleSyncRequest(messagePointer); break;
 		case KernelHandles::NDM: ndm.handleSyncRequest(messagePointer); break;
+		case KernelHandles::PTM: ptm.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