From ec514b16a66c0aca19e3f641836d836eacd59e75 Mon Sep 17 00:00:00 2001
From: Yuri Kunde Schlesner <yuriks@yuriks.net>
Date: Tue, 12 May 2015 23:17:30 -0300
Subject: [PATCH] Memory: Read ConfigMem directly from Memory::Read

---
 src/core/hle/config_mem.cpp | 47 +------------------------------------
 src/core/hle/config_mem.h   | 38 +++++++++++++++++++++++++++---
 src/core/memory.cpp         |  3 ++-
 3 files changed, 38 insertions(+), 50 deletions(-)

diff --git a/src/core/hle/config_mem.cpp b/src/core/hle/config_mem.cpp
index 2f7cc7ee5..aea936d2d 100644
--- a/src/core/hle/config_mem.cpp
+++ b/src/core/hle/config_mem.cpp
@@ -16,52 +16,7 @@
 
 namespace ConfigMem {
 
-struct ConfigMemDef {
-    u8  kernel_unk;                      // 0
-    u8  kernel_version_rev;              // 1
-    u8  kernel_version_min;              // 2
-    u8  kernel_version_maj;              // 3
-    u32 update_flag;                     // 4
-    u64 ns_tid;                          // 8
-    u32 sys_core_ver;                    // 10
-    u8  unit_info;                       // 14
-    u8  boot_firm;                       // 15
-    u8  prev_firm;                       // 16
-    INSERT_PADDING_BYTES(0x1);           // 17
-    u32 ctr_sdk_ver;                     // 18
-    INSERT_PADDING_BYTES(0x30 - 0x1C);   // 1C
-    u32 app_mem_type;                    // 30
-    INSERT_PADDING_BYTES(0x40 - 0x34);   // 34
-    u32 app_mem_alloc;                   // 40
-    u32 sys_mem_alloc;                   // 44
-    u32 base_mem_alloc;                  // 48
-    INSERT_PADDING_BYTES(0x60 - 0x4C);   // 4C
-    u8  firm_unk;                        // 60
-    u8  firm_version_rev;                // 61
-    u8  firm_version_min;                // 62
-    u8  firm_version_maj;                // 63
-    u32 firm_sys_core_ver;               // 64
-    u32 firm_ctr_sdk_ver;                // 68
-    INSERT_PADDING_BYTES(0x1000 - 0x6C); // 6C
-};
-
-static_assert(sizeof(ConfigMemDef) == Memory::CONFIG_MEMORY_SIZE, "Config Memory structure size is wrong");
-
-static ConfigMemDef config_mem;
-
-template <typename T>
-inline void Read(T &var, const u32 addr) {
-    u32 offset = addr - Memory::CONFIG_MEMORY_VADDR;
-    ASSERT(offset < Memory::CONFIG_MEMORY_SIZE);
-    var = *(reinterpret_cast<T*>(((uintptr_t)&config_mem) + offset));
-}
-
-// Explicitly instantiate template functions because we aren't defining this in the header:
-
-template void Read<u64>(u64 &var, const u32 addr);
-template void Read<u32>(u32 &var, const u32 addr);
-template void Read<u16>(u16 &var, const u32 addr);
-template void Read<u8>(u8 &var, const u32 addr);
+ConfigMemDef config_mem;
 
 void Init() {
     std::memset(&config_mem, 0, sizeof(config_mem));
diff --git a/src/core/hle/config_mem.h b/src/core/hle/config_mem.h
index cbb478fb3..9825a09e8 100644
--- a/src/core/hle/config_mem.h
+++ b/src/core/hle/config_mem.h
@@ -9,17 +9,49 @@
 // bootrom. Because we're not emulating this, and essentially just "stubbing" the functionality, I'm
 // putting this as a subset of HLE for now.
 
+#include "common/common_funcs.h"
 #include "common/common_types.h"
+#include "common/swap.h"
+
+#include "core/memory.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 namespace ConfigMem {
 
-template <typename T>
-void Read(T &var, const u32 addr);
+struct ConfigMemDef {
+    u8     kernel_unk;                   // 0
+    u8     kernel_version_rev;           // 1
+    u8     kernel_version_min;           // 2
+    u8     kernel_version_maj;           // 3
+    u32_le update_flag;                  // 4
+    u64_le ns_tid;                       // 8
+    u32_le sys_core_ver;                 // 10
+    u8     unit_info;                    // 14
+    u8     boot_firm;                    // 15
+    u8     prev_firm;                    // 16
+    INSERT_PADDING_BYTES(0x1);           // 17
+    u32_le ctr_sdk_ver;                  // 18
+    INSERT_PADDING_BYTES(0x30 - 0x1C);   // 1C
+    u32_le app_mem_type;                 // 30
+    INSERT_PADDING_BYTES(0x40 - 0x34);   // 34
+    u32_le app_mem_alloc;                // 40
+    u32_le sys_mem_alloc;                // 44
+    u32_le base_mem_alloc;               // 48
+    INSERT_PADDING_BYTES(0x60 - 0x4C);   // 4C
+    u8     firm_unk;                     // 60
+    u8     firm_version_rev;             // 61
+    u8     firm_version_min;             // 62
+    u8     firm_version_maj;             // 63
+    u32_le firm_sys_core_ver;            // 64
+    u32_le firm_ctr_sdk_ver;             // 68
+    INSERT_PADDING_BYTES(0x1000 - 0x6C); // 6C
+};
+static_assert(sizeof(ConfigMemDef) == Memory::CONFIG_MEMORY_SIZE, "Config Memory structure size is wrong");
+
+extern ConfigMemDef config_mem;
 
 void Init();
-
 void Shutdown();
 
 } // namespace
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 517167b0a..aee1674b6 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -42,7 +42,8 @@ inline void Read(T &var, const VAddr vaddr) {
 
     // Config memory
     } else if ((vaddr >= CONFIG_MEMORY_VADDR)  && (vaddr < CONFIG_MEMORY_VADDR_END)) {
-        ConfigMem::Read<T>(var, vaddr);
+        const u8* raw_memory = (const u8*)&ConfigMem::config_mem;
+        var = *((const T*)&raw_memory[vaddr - CONFIG_MEMORY_VADDR]);
 
     // Shared page
     } else if ((vaddr >= SHARED_PAGE_VADDR)  && (vaddr < SHARED_PAGE_VADDR_END)) {