summaryrefslogtreecommitdiff
path: root/src/core/mem_map_funcs.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2014-05-08 17:16:35 -0400
committerGravatar bunnei2014-05-08 17:16:35 -0400
commitbdc54d0d4897841a4d24aee80311bfb1f0eba884 (patch)
tree558d87c83fe8f7e8e3e57644407c872244ee5a3a /src/core/mem_map_funcs.cpp
parentMerge pull request #16 from Sethpaien/master (diff)
parentremoved unknown fields from GX_CmdBufferHeader (diff)
downloadyuzu-bdc54d0d4897841a4d24aee80311bfb1f0eba884.tar.gz
yuzu-bdc54d0d4897841a4d24aee80311bfb1f0eba884.tar.xz
yuzu-bdc54d0d4897841a4d24aee80311bfb1f0eba884.zip
Merge pull request #15 from bunnei/hle-services
Various fixes/improvements to HLE of 3DS services, mostly cleans up GSP call decoding
Diffstat (limited to 'src/core/mem_map_funcs.cpp')
-rw-r--r--src/core/mem_map_funcs.cpp41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp
index 2284b535c..8ab647714 100644
--- a/src/core/mem_map_funcs.cpp
+++ b/src/core/mem_map_funcs.cpp
@@ -9,6 +9,7 @@
9#include "core/mem_map.h" 9#include "core/mem_map.h"
10#include "core/hw/hw.h" 10#include "core/hw/hw.h"
11#include "hle/hle.h" 11#include "hle/hle.h"
12#include "hle/config_mem.h"
12 13
13namespace Memory { 14namespace Memory {
14 15
@@ -46,12 +47,10 @@ inline void _Read(T &var, const u32 addr) {
46 // Could just do a base-relative read, too.... TODO 47 // Could just do a base-relative read, too.... TODO
47 48
48 const u32 vaddr = _VirtualAddress(addr); 49 const u32 vaddr = _VirtualAddress(addr);
49 50
50 // Memory allocated for HLE use that can be addressed from the emulated application 51 // Kernel memory command buffer
51 // The primary use of this is sharing a commandbuffer between the HLE OS (syscore) and the LLE 52 if (vaddr >= KERNEL_MEMORY_VADDR && vaddr < KERNEL_MEMORY_VADDR_END) {
52 // core running the user application (appcore) 53 var = *((const T*)&g_kernel_mem[vaddr & KERNEL_MEMORY_MASK]);
53 if (vaddr >= HLE::CMD_BUFFER_ADDR && vaddr < HLE::CMD_BUFFER_ADDR_END) {
54 HLE::Read<T>(var, vaddr);
55 54
56 // Hardware I/O register reads 55 // Hardware I/O register reads
57 // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space 56 // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space
@@ -74,6 +73,10 @@ inline void _Read(T &var, const u32 addr) {
74 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { 73 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
75 var = *((const T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK]); 74 var = *((const T*)&g_shared_mem[vaddr & SHARED_MEMORY_MASK]);
76 75
76 // Config memory
77 } else if ((vaddr >= CONFIG_MEMORY_VADDR) && (vaddr < CONFIG_MEMORY_VADDR_END)) {
78 ConfigMem::Read<T>(var, vaddr);
79
77 // VRAM 80 // VRAM
78 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { 81 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
79 var = *((const T*)&g_vram[vaddr & VRAM_MASK]); 82 var = *((const T*)&g_vram[vaddr & VRAM_MASK]);
@@ -87,11 +90,9 @@ template <typename T>
87inline void _Write(u32 addr, const T data) { 90inline void _Write(u32 addr, const T data) {
88 u32 vaddr = _VirtualAddress(addr); 91 u32 vaddr = _VirtualAddress(addr);
89 92
90 // Memory allocated for HLE use that can be addressed from the emulated application 93 // Kernel memory command buffer
91 // The primary use of this is sharing a commandbuffer between the HLE OS (syscore) and the LLE 94 if (vaddr >= KERNEL_MEMORY_VADDR && vaddr < KERNEL_MEMORY_VADDR_END) {
92 // core running the user application (appcore) 95 *(T*)&g_kernel_mem[vaddr & KERNEL_MEMORY_MASK] = data;
93 if (vaddr >= HLE::CMD_BUFFER_ADDR && vaddr < HLE::CMD_BUFFER_ADDR_END) {
94 HLE::Write<T>(vaddr, data);
95 96
96 // Hardware I/O register writes 97 // Hardware I/O register writes
97 // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space 98 // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space
@@ -118,12 +119,12 @@ inline void _Write(u32 addr, const T data) {
118 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { 119 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
119 *(T*)&g_vram[vaddr & VRAM_MASK] = data; 120 *(T*)&g_vram[vaddr & VRAM_MASK] = data;
120 121
121 } else if ((vaddr & 0xFFF00000) == 0x1FF00000) { 122 //} else if ((vaddr & 0xFFF00000) == 0x1FF00000) {
122 _assert_msg_(MEMMAP, false, "umimplemented write to DSP memory"); 123 // _assert_msg_(MEMMAP, false, "umimplemented write to DSP memory");
123 } else if ((vaddr & 0xFFFF0000) == 0x1FF80000) { 124 //} else if ((vaddr & 0xFFFF0000) == 0x1FF80000) {
124 _assert_msg_(MEMMAP, false, "umimplemented write to Configuration Memory"); 125 // _assert_msg_(MEMMAP, false, "umimplemented write to Configuration Memory");
125 } else if ((vaddr & 0xFFFFF000) == 0x1FF81000) { 126 //} else if ((vaddr & 0xFFFFF000) == 0x1FF81000) {
126 _assert_msg_(MEMMAP, false, "umimplemented write to shared page"); 127 // _assert_msg_(MEMMAP, false, "umimplemented write to shared page");
127 128
128 // Error out... 129 // Error out...
129 } else { 130 } else {
@@ -135,8 +136,12 @@ inline void _Write(u32 addr, const T data) {
135u8 *GetPointer(const u32 addr) { 136u8 *GetPointer(const u32 addr) {
136 const u32 vaddr = _VirtualAddress(addr); 137 const u32 vaddr = _VirtualAddress(addr);
137 138
139 // Kernel memory command buffer
140 if (vaddr >= KERNEL_MEMORY_VADDR && vaddr < KERNEL_MEMORY_VADDR_END) {
141 return g_kernel_mem + (vaddr & KERNEL_MEMORY_MASK);
142
138 // ExeFS:/.code is loaded here 143 // ExeFS:/.code is loaded here
139 if ((vaddr >= EXEFS_CODE_VADDR) && (vaddr < EXEFS_CODE_VADDR_END)) { 144 } else if ((vaddr >= EXEFS_CODE_VADDR) && (vaddr < EXEFS_CODE_VADDR_END)) {
140 return g_exefs_code + (vaddr & EXEFS_CODE_MASK); 145 return g_exefs_code + (vaddr & EXEFS_CODE_MASK);
141 146
142 // FCRAM - GSP heap 147 // FCRAM - GSP heap