summaryrefslogtreecommitdiff
path: root/src/core/mem_map_funcs.cpp
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2015-05-09 15:57:29 +0200
committerGravatar Tony Wasserka2015-05-09 15:57:29 +0200
commite35e72d0a5c90c37d22328115fa0f29dd17aeaee (patch)
tree4053db2c53a1ac77294c03782de75c91c0cf4b27 /src/core/mem_map_funcs.cpp
parentLoader: Add missing include (diff)
parentMemory: Add GetPhysicalPointer helper function (diff)
downloadyuzu-e35e72d0a5c90c37d22328115fa0f29dd17aeaee.tar.gz
yuzu-e35e72d0a5c90c37d22328115fa0f29dd17aeaee.tar.xz
yuzu-e35e72d0a5c90c37d22328115fa0f29dd17aeaee.zip
Merge pull request #734 from yuriks/memmap
Small memory map definitions cleanup
Diffstat (limited to 'src/core/mem_map_funcs.cpp')
-rw-r--r--src/core/mem_map_funcs.cpp106
1 files changed, 47 insertions, 59 deletions
diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp
index 9a19c9bf8..a8e0fed07 100644
--- a/src/core/mem_map_funcs.cpp
+++ b/src/core/mem_map_funcs.cpp
@@ -18,40 +18,40 @@ namespace Memory {
18static std::map<u32, MemoryBlock> heap_map; 18static std::map<u32, MemoryBlock> heap_map;
19static std::map<u32, MemoryBlock> heap_linear_map; 19static std::map<u32, MemoryBlock> heap_linear_map;
20 20
21/// Convert a physical address to virtual address 21PAddr VirtualToPhysicalAddress(const VAddr addr) {
22VAddr PhysicalToVirtualAddress(const PAddr addr) {
23 // Our memory interface read/write functions assume virtual addresses. Put any physical address
24 // to virtual address translations here. This is quite hacky, but necessary until we implement
25 // proper MMU emulation.
26 // TODO: Screw it, I'll let bunnei figure out how to do this properly.
27 if (addr == 0) { 22 if (addr == 0) {
28 return 0; 23 return 0;
29 } else if ((addr >= VRAM_PADDR) && (addr < VRAM_PADDR_END)) { 24 } else if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) {
30 return addr - VRAM_PADDR + VRAM_VADDR; 25 return addr - VRAM_VADDR + VRAM_PADDR;
31 } else if ((addr >= FCRAM_PADDR) && (addr < FCRAM_PADDR_END)) { 26 } else if (addr >= LINEAR_HEAP_VADDR && addr < LINEAR_HEAP_VADDR_END) {
32 return addr - FCRAM_PADDR + HEAP_LINEAR_VADDR; 27 return addr - LINEAR_HEAP_VADDR + FCRAM_PADDR;
28 } else if (addr >= DSP_RAM_VADDR && addr < DSP_RAM_VADDR_END) {
29 return addr - DSP_RAM_VADDR + DSP_RAM_PADDR;
30 } else if (addr >= IO_AREA_VADDR && addr < IO_AREA_VADDR_END) {
31 return addr - IO_AREA_VADDR + IO_AREA_PADDR;
33 } 32 }
34 33
35 LOG_ERROR(HW_Memory, "Unknown physical address @ 0x%08x", addr); 34 LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08x", addr);
36 return addr; 35 // To help with debugging, set bit on address so that it's obviously invalid.
36 return addr | 0x80000000;
37} 37}
38 38
39/// Convert a physical address to virtual address 39VAddr PhysicalToVirtualAddress(const PAddr addr) {
40PAddr VirtualToPhysicalAddress(const VAddr addr) {
41 // Our memory interface read/write functions assume virtual addresses. Put any physical address
42 // to virtual address translations here. This is quite hacky, but necessary until we implement
43 // proper MMU emulation.
44 // TODO: Screw it, I'll let bunnei figure out how to do this properly.
45 if (addr == 0) { 40 if (addr == 0) {
46 return 0; 41 return 0;
47 } else if ((addr >= VRAM_VADDR) && (addr < VRAM_VADDR_END)) { 42 } else if (addr >= VRAM_PADDR && addr < VRAM_PADDR_END) {
48 return addr - VRAM_VADDR + VRAM_PADDR; 43 return addr - VRAM_PADDR + VRAM_VADDR;
49 } else if ((addr >= HEAP_LINEAR_VADDR) && (addr < HEAP_LINEAR_VADDR_END)) { 44 } else if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) {
50 return addr - HEAP_LINEAR_VADDR + FCRAM_PADDR; 45 return addr - FCRAM_PADDR + LINEAR_HEAP_VADDR;
46 } else if (addr >= DSP_RAM_PADDR && addr < DSP_RAM_PADDR_END) {
47 return addr - DSP_RAM_PADDR + DSP_RAM_VADDR;
48 } else if (addr >= IO_AREA_PADDR && addr < IO_AREA_PADDR_END) {
49 return addr - IO_AREA_PADDR + IO_AREA_VADDR;
51 } 50 }
52 51
53 LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08x", addr); 52 LOG_ERROR(HW_Memory, "Unknown physical address @ 0x%08x", addr);
54 return addr; 53 // To help with debugging, set bit on address so that it's obviously invalid.
54 return addr | 0x80000000;
55} 55}
56 56
57template <typename T> 57template <typename T>
@@ -61,16 +61,16 @@ inline void Read(T &var, const VAddr vaddr) {
61 // Could just do a base-relative read, too.... TODO 61 // Could just do a base-relative read, too.... TODO
62 62
63 // Kernel memory command buffer 63 // Kernel memory command buffer
64 if (vaddr >= KERNEL_MEMORY_VADDR && vaddr < KERNEL_MEMORY_VADDR_END) { 64 if (vaddr >= TLS_AREA_VADDR && vaddr < TLS_AREA_VADDR_END) {
65 var = *((const T*)&g_kernel_mem[vaddr - KERNEL_MEMORY_VADDR]); 65 var = *((const T*)&g_tls_mem[vaddr - TLS_AREA_VADDR]);
66 66
67 // ExeFS:/.code is loaded here 67 // ExeFS:/.code is loaded here
68 } else if ((vaddr >= EXEFS_CODE_VADDR) && (vaddr < EXEFS_CODE_VADDR_END)) { 68 } else if ((vaddr >= PROCESS_IMAGE_VADDR) && (vaddr < PROCESS_IMAGE_VADDR_END)) {
69 var = *((const T*)&g_exefs_code[vaddr - EXEFS_CODE_VADDR]); 69 var = *((const T*)&g_exefs_code[vaddr - PROCESS_IMAGE_VADDR]);
70 70
71 // FCRAM - linear heap 71 // FCRAM - linear heap
72 } else if ((vaddr >= HEAP_LINEAR_VADDR) && (vaddr < HEAP_LINEAR_VADDR_END)) { 72 } else if ((vaddr >= LINEAR_HEAP_VADDR) && (vaddr < LINEAR_HEAP_VADDR_END)) {
73 var = *((const T*)&g_heap_linear[vaddr - HEAP_LINEAR_VADDR]); 73 var = *((const T*)&g_heap_linear[vaddr - LINEAR_HEAP_VADDR]);
74 74
75 // FCRAM - application heap 75 // FCRAM - application heap
76 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { 76 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) {
@@ -80,10 +80,6 @@ inline void Read(T &var, const VAddr vaddr) {
80 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { 80 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
81 var = *((const T*)&g_shared_mem[vaddr - SHARED_MEMORY_VADDR]); 81 var = *((const T*)&g_shared_mem[vaddr - SHARED_MEMORY_VADDR]);
82 82
83 // System memory
84 } else if ((vaddr >= SYSTEM_MEMORY_VADDR) && (vaddr < SYSTEM_MEMORY_VADDR_END)) {
85 var = *((const T*)&g_system_mem[vaddr - SYSTEM_MEMORY_VADDR]);
86
87 // Config memory 83 // Config memory
88 } else if ((vaddr >= CONFIG_MEMORY_VADDR) && (vaddr < CONFIG_MEMORY_VADDR_END)) { 84 } else if ((vaddr >= CONFIG_MEMORY_VADDR) && (vaddr < CONFIG_MEMORY_VADDR_END)) {
89 ConfigMem::Read<T>(var, vaddr); 85 ConfigMem::Read<T>(var, vaddr);
@@ -93,8 +89,8 @@ inline void Read(T &var, const VAddr vaddr) {
93 SharedPage::Read<T>(var, vaddr); 89 SharedPage::Read<T>(var, vaddr);
94 90
95 // DSP memory 91 // DSP memory
96 } else if ((vaddr >= DSP_MEMORY_VADDR) && (vaddr < DSP_MEMORY_VADDR_END)) { 92 } else if ((vaddr >= DSP_RAM_VADDR) && (vaddr < DSP_RAM_VADDR_END)) {
97 var = *((const T*)&g_dsp_mem[vaddr - DSP_MEMORY_VADDR]); 93 var = *((const T*)&g_dsp_mem[vaddr - DSP_RAM_VADDR]);
98 94
99 // VRAM 95 // VRAM
100 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { 96 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
@@ -109,16 +105,16 @@ template <typename T>
109inline void Write(const VAddr vaddr, const T data) { 105inline void Write(const VAddr vaddr, const T data) {
110 106
111 // Kernel memory command buffer 107 // Kernel memory command buffer
112 if (vaddr >= KERNEL_MEMORY_VADDR && vaddr < KERNEL_MEMORY_VADDR_END) { 108 if (vaddr >= TLS_AREA_VADDR && vaddr < TLS_AREA_VADDR_END) {
113 *(T*)&g_kernel_mem[vaddr - KERNEL_MEMORY_VADDR] = data; 109 *(T*)&g_tls_mem[vaddr - TLS_AREA_VADDR] = data;
114 110
115 // ExeFS:/.code is loaded here 111 // ExeFS:/.code is loaded here
116 } else if ((vaddr >= EXEFS_CODE_VADDR) && (vaddr < EXEFS_CODE_VADDR_END)) { 112 } else if ((vaddr >= PROCESS_IMAGE_VADDR) && (vaddr < PROCESS_IMAGE_VADDR_END)) {
117 *(T*)&g_exefs_code[vaddr - EXEFS_CODE_VADDR] = data; 113 *(T*)&g_exefs_code[vaddr - PROCESS_IMAGE_VADDR] = data;
118 114
119 // FCRAM - linear heap 115 // FCRAM - linear heap
120 } else if ((vaddr >= HEAP_LINEAR_VADDR) && (vaddr < HEAP_LINEAR_VADDR_END)) { 116 } else if ((vaddr >= LINEAR_HEAP_VADDR) && (vaddr < LINEAR_HEAP_VADDR_END)) {
121 *(T*)&g_heap_linear[vaddr - HEAP_LINEAR_VADDR] = data; 117 *(T*)&g_heap_linear[vaddr - LINEAR_HEAP_VADDR] = data;
122 118
123 // FCRAM - application heap 119 // FCRAM - application heap
124 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { 120 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) {
@@ -128,17 +124,13 @@ inline void Write(const VAddr vaddr, const T data) {
128 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { 124 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
129 *(T*)&g_shared_mem[vaddr - SHARED_MEMORY_VADDR] = data; 125 *(T*)&g_shared_mem[vaddr - SHARED_MEMORY_VADDR] = data;
130 126
131 // System memory
132 } else if ((vaddr >= SYSTEM_MEMORY_VADDR) && (vaddr < SYSTEM_MEMORY_VADDR_END)) {
133 *(T*)&g_system_mem[vaddr - SYSTEM_MEMORY_VADDR] = data;
134
135 // VRAM 127 // VRAM
136 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { 128 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
137 *(T*)&g_vram[vaddr - VRAM_VADDR] = data; 129 *(T*)&g_vram[vaddr - VRAM_VADDR] = data;
138 130
139 // DSP memory 131 // DSP memory
140 } else if ((vaddr >= DSP_MEMORY_VADDR) && (vaddr < DSP_MEMORY_VADDR_END)) { 132 } else if ((vaddr >= DSP_RAM_VADDR) && (vaddr < DSP_RAM_VADDR_END)) {
141 *(T*)&g_dsp_mem[vaddr - DSP_MEMORY_VADDR] = data; 133 *(T*)&g_dsp_mem[vaddr - DSP_RAM_VADDR] = data;
142 134
143 //} else if ((vaddr & 0xFFFF0000) == 0x1FF80000) { 135 //} else if ((vaddr & 0xFFFF0000) == 0x1FF80000) {
144 // ASSERT_MSG(MEMMAP, false, "umimplemented write to Configuration Memory"); 136 // ASSERT_MSG(MEMMAP, false, "umimplemented write to Configuration Memory");
@@ -153,16 +145,16 @@ inline void Write(const VAddr vaddr, const T data) {
153 145
154u8 *GetPointer(const VAddr vaddr) { 146u8 *GetPointer(const VAddr vaddr) {
155 // Kernel memory command buffer 147 // Kernel memory command buffer
156 if (vaddr >= KERNEL_MEMORY_VADDR && vaddr < KERNEL_MEMORY_VADDR_END) { 148 if (vaddr >= TLS_AREA_VADDR && vaddr < TLS_AREA_VADDR_END) {
157 return g_kernel_mem + (vaddr - KERNEL_MEMORY_VADDR); 149 return g_tls_mem + (vaddr - TLS_AREA_VADDR);
158 150
159 // ExeFS:/.code is loaded here 151 // ExeFS:/.code is loaded here
160 } else if ((vaddr >= EXEFS_CODE_VADDR) && (vaddr < EXEFS_CODE_VADDR_END)) { 152 } else if ((vaddr >= PROCESS_IMAGE_VADDR) && (vaddr < PROCESS_IMAGE_VADDR_END)) {
161 return g_exefs_code + (vaddr - EXEFS_CODE_VADDR); 153 return g_exefs_code + (vaddr - PROCESS_IMAGE_VADDR);
162 154
163 // FCRAM - linear heap 155 // FCRAM - linear heap
164 } else if ((vaddr >= HEAP_LINEAR_VADDR) && (vaddr < HEAP_LINEAR_VADDR_END)) { 156 } else if ((vaddr >= LINEAR_HEAP_VADDR) && (vaddr < LINEAR_HEAP_VADDR_END)) {
165 return g_heap_linear + (vaddr - HEAP_LINEAR_VADDR); 157 return g_heap_linear + (vaddr - LINEAR_HEAP_VADDR);
166 158
167 // FCRAM - application heap 159 // FCRAM - application heap
168 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) { 160 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) {
@@ -172,10 +164,6 @@ u8 *GetPointer(const VAddr vaddr) {
172 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) { 164 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
173 return g_shared_mem + (vaddr - SHARED_MEMORY_VADDR); 165 return g_shared_mem + (vaddr - SHARED_MEMORY_VADDR);
174 166
175 // System memory
176 } else if ((vaddr >= SYSTEM_MEMORY_VADDR) && (vaddr < SYSTEM_MEMORY_VADDR_END)) {
177 return g_system_mem + (vaddr - SYSTEM_MEMORY_VADDR);
178
179 // VRAM 167 // VRAM
180 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) { 168 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
181 return g_vram + (vaddr - VRAM_VADDR); 169 return g_vram + (vaddr - VRAM_VADDR);
@@ -206,7 +194,7 @@ u32 MapBlock_Heap(u32 size, u32 operation, u32 permissions) {
206u32 MapBlock_HeapLinear(u32 size, u32 operation, u32 permissions) { 194u32 MapBlock_HeapLinear(u32 size, u32 operation, u32 permissions) {
207 MemoryBlock block; 195 MemoryBlock block;
208 196
209 block.base_address = HEAP_LINEAR_VADDR; 197 block.base_address = LINEAR_HEAP_VADDR;
210 block.size = size; 198 block.size = size;
211 block.operation = operation; 199 block.operation = operation;
212 block.permissions = permissions; 200 block.permissions = permissions;