diff --git a/src/core/hle/shared_page.cpp b/src/core/hle/shared_page.cpp
index 9de832158..4014eee98 100644
--- a/src/core/hle/shared_page.cpp
+++ b/src/core/hle/shared_page.cpp
@@ -16,63 +16,12 @@
 
 namespace SharedPage {
 
-// see http://3dbrew.org/wiki/Configuration_Memory#Shared_Memory_Page_For_ARM11_Processes
-
-#pragma pack(1)
-struct DateTime {
-    u64     date_time;      // 0x0
-    u64     update_tick;    // 0x8
-    INSERT_PADDING_BYTES(0x20 - 0x10); // 0x10
-};
-
-struct SharedPageDef {
-    // most of these names are taken from the 3dbrew page linked above.
-    u32    date_time_selector;  // 0x0
-    u8     running_hw;          // 0x4
-    u8     mcu_hw_info;         // 0x5: don't know what the acronyms mean
-    INSERT_PADDING_BYTES(0x20 - 0x6); // 0x6
-    DateTime date_time_0;       // 0x20
-    DateTime date_time_1;       // 0x40
-    u8      wifi_macaddr[6];    // 0x60
-    u8      wifi_unknown1;      // 0x66: 3dbrew says these are "Likely wifi hardware related"
-    u8      wifi_unknown2;      // 0x67
-    INSERT_PADDING_BYTES(0x80 - 0x68); // 0x68
-    float   sliderstate_3d;     // 0x80
-    u8      ledstate_3d;        // 0x84
-    INSERT_PADDING_BYTES(0xA0 - 0x85); // 0x85
-    u64     menu_title_id;      // 0xA0
-    u64     active_menu_title_id; // 0xA8
-    INSERT_PADDING_BYTES(0x1000 - 0xB0); // 0xB0
-};
-#pragma pack()
-
-static_assert(sizeof(DateTime) == 0x20, "Datetime size is wrong");
-static_assert(sizeof(SharedPageDef) == Memory::SHARED_PAGE_SIZE, "Shared page structure size is wrong");
-
-static SharedPageDef shared_page;
-
-template <typename T>
-inline void Read(T &var, const u32 addr) {
-    u32 offset = addr - Memory::SHARED_PAGE_VADDR;
-    var = *(reinterpret_cast<T*>(((uintptr_t)&shared_page) + 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);
-
-void Set3DSlider(float amount) {
-    std::memset(&shared_page, 0, sizeof(shared_page));
-
-    shared_page.sliderstate_3d = amount;
-    shared_page.ledstate_3d = (amount == 0.0f); // off when non-zero
-}
+SharedPageDef shared_page;
 
 void Init() {
+    std::memset(&shared_page, 0, sizeof(shared_page));
+
     shared_page.running_hw = 0x1; // product
-    Set3DSlider(0.0f);
 }
 
 void Shutdown() {
diff --git a/src/core/hle/shared_page.h b/src/core/hle/shared_page.h
index 1b6e4e581..fd2ab66a2 100644
--- a/src/core/hle/shared_page.h
+++ b/src/core/hle/shared_page.h
@@ -11,18 +11,46 @@
  */
 
 #include "common/common_types.h"
+#include "common/swap.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 namespace SharedPage {
 
-template <typename T>
-void Read(T &var, const u32 addr);
+// See http://3dbrew.org/wiki/Configuration_Memory#Shared_Memory_Page_For_ARM11_Processes
 
-void Set3DSlider(float amount);
+struct DateTime {
+    u64_le date_time;                  // 0
+    u64_le update_tick;                // 8
+    INSERT_PADDING_BYTES(0x20 - 0x10); // 10
+};
+static_assert(sizeof(DateTime) == 0x20, "Datetime size is wrong");
+
+struct SharedPageDef {
+    // Most of these names are taken from the 3dbrew page linked above.
+    u32_le   date_time_selector;         // 0
+    u8       running_hw;                 // 4
+    /// "Microcontroller hardware info"
+    u8       mcu_hw_info;                // 5
+    INSERT_PADDING_BYTES(0x20 - 0x6);    // 6
+    DateTime date_time_0;                // 20
+    DateTime date_time_1;                // 40
+    u8       wifi_macaddr[6];            // 60
+    u8       wifi_unknown1;              // 66
+    u8       wifi_unknown2;              // 67
+    INSERT_PADDING_BYTES(0x80 - 0x68);   // 68
+    float_le sliderstate_3d;             // 80
+    u8       ledstate_3d;                // 84
+    INSERT_PADDING_BYTES(0xA0 - 0x85);   // 85
+    u64_le   menu_title_id;              // A0
+    u64_le   active_menu_title_id;       // A8
+    INSERT_PADDING_BYTES(0x1000 - 0xB0); // B0
+};
+static_assert(sizeof(SharedPageDef) == Memory::SHARED_PAGE_SIZE, "Shared page structure size is wrong");
+
+extern SharedPageDef shared_page;
 
 void Init();
-
 void Shutdown();
 
 } // namespace
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index aee1674b6..8570689dd 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -47,7 +47,8 @@ inline void Read(T &var, const VAddr vaddr) {
 
     // Shared page
     } else if ((vaddr >= SHARED_PAGE_VADDR)  && (vaddr < SHARED_PAGE_VADDR_END)) {
-        SharedPage::Read<T>(var, vaddr);
+        const u8* raw_memory = (const u8*)&SharedPage::shared_page;
+        var = *((const T*)&raw_memory[vaddr - SHARED_PAGE_VADDR]);
 
     // DSP memory
     } else if ((vaddr >= DSP_RAM_VADDR)  && (vaddr < DSP_RAM_VADDR_END)) {