From 5bc8c9d6713824ce3fde3f81b1865e236080c248 Mon Sep 17 00:00:00 2001
From: wheremyfoodat <gponiris2004@gmail.com>
Date: Sun, 18 Sep 2022 02:18:40 +0300
Subject: [PATCH] Make APT::GetLockHandle fail to skip aptInit

---
 CMakeLists.txt                        |  4 ++--
 include/services/apt.hpp              |  6 ++++++
 include/services/hid.hpp              |  0
 src/core/services/apt.cpp             | 25 ++++++++++++++++++++++++-
 src/core/services/hid.cpp             |  0
 src/core/services/service_manager.cpp |  2 +-
 6 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 include/services/hid.hpp
 create mode 100644 src/core/services/hid.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ef5e03e9..ed3b75de 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,13 +48,13 @@ set(SOURCE_FILES src/main.cpp src/emulator.cpp src/core/CPU/cpu_dynarmic.cpp src
 set(KERNEL_SOURCE_FILES src/core/kernel/kernel.cpp src/core/kernel/resource_limits.cpp
                         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)
+set(SERVICE_SOURCE_FILES src/core/services/service_manager.cpp src/core/services/apt.cpp src/core/services/hid.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/kernel/handles.hpp include/services/hid.hpp
 )
 
 set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp
diff --git a/include/services/apt.hpp b/include/services/apt.hpp
index 1b570b07..b39b01f0 100644
--- a/include/services/apt.hpp
+++ b/include/services/apt.hpp
@@ -1,11 +1,17 @@
 #pragma once
 #include "helpers.hpp"
 #include "kernel_types.hpp"
+#include "memory.hpp"
 
 class APTService {
 	Handle handle = KernelHandles::APT;
+	Memory& mem;
+
+	// Service commands
+	void getLockHandle(u32 messagePointer);
 
 public:
+	APTService(Memory& mem) : mem(mem) {}
 	void reset();
 	void handleSyncRequest(u32 messagePointer);
 };
\ No newline at end of file
diff --git a/include/services/hid.hpp b/include/services/hid.hpp
new file mode 100644
index 00000000..e69de29b
diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp
index 6ecefdf0..f42ffc38 100644
--- a/src/core/services/apt.cpp
+++ b/src/core/services/apt.cpp
@@ -1,7 +1,30 @@
 #include "services/apt.hpp"
 
+namespace APTCommands {
+	enum : u32 {
+		GetLockHandle = 0x00010040
+	};
+}
+
+namespace Result {
+	enum : u32 {
+		Success = 0,
+		Failure = 0xFFFFFFFF
+	};
+}
+
 void APTService::reset() {}
 
 void APTService::handleSyncRequest(u32 messagePointer) {
-	Helpers::panic("APT service requested");
+	const u32 command = mem.read32(messagePointer);
+	switch (command) {
+		case APTCommands::GetLockHandle: getLockHandle(messagePointer); break;
+		default: Helpers::panic("APT service requested. Command: %08X\n", command);
+	}
+}
+
+void APTService::getLockHandle(u32 messagePointer) {
+	printf("APT: getLockHandle (Failure)\n");
+	mem.write32(messagePointer + 4, Result::Failure); // Result code
+	mem.write32(messagePointer + 16, 0); // Translation descriptor
 }
\ No newline at end of file
diff --git a/src/core/services/hid.cpp b/src/core/services/hid.cpp
new file mode 100644
index 00000000..e69de29b
diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp
index 0504f544..edb8828a 100644
--- a/src/core/services/service_manager.cpp
+++ b/src/core/services/service_manager.cpp
@@ -1,6 +1,6 @@
 #include "services/service_manager.hpp"
 
-ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem) : regs(regs), mem(mem) {}
+ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem) : regs(regs), mem(mem), apt(mem) {}
 
 void ServiceManager::reset() {
 	apt.reset();