diff options
| author | 2014-05-08 17:16:35 -0400 | |
|---|---|---|
| committer | 2014-05-08 17:16:35 -0400 | |
| commit | bdc54d0d4897841a4d24aee80311bfb1f0eba884 (patch) | |
| tree | 558d87c83fe8f7e8e3e57644407c872244ee5a3a /src/core/mem_map_funcs.cpp | |
| parent | Merge pull request #16 from Sethpaien/master (diff) | |
| parent | removed unknown fields from GX_CmdBufferHeader (diff) | |
| download | yuzu-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.cpp | 41 |
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 | ||
| 13 | namespace Memory { | 14 | namespace 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> | |||
| 87 | inline void _Write(u32 addr, const T data) { | 90 | inline 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) { | |||
| 135 | u8 *GetPointer(const u32 addr) { | 136 | u8 *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 |