summaryrefslogtreecommitdiff
path: root/src/core/mem_map_funcs.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-05-12 22:38:29 -0300
committerGravatar Yuri Kunde Schlesner2015-05-15 00:04:38 -0300
commit7ada357b2d12cf616672425a8961804b865354d6 (patch)
tree983003c1efc0950605eca3aa7d135b7c8fe9edcf /src/core/mem_map_funcs.cpp
parentMemmap: Remove unused declarations (diff)
downloadyuzu-7ada357b2d12cf616672425a8961804b865354d6.tar.gz
yuzu-7ada357b2d12cf616672425a8961804b865354d6.tar.xz
yuzu-7ada357b2d12cf616672425a8961804b865354d6.zip
Memmap: Re-organize memory function in two files
memory.cpp/h contains definitions related to acessing memory and configuring the address space mem_map.cpp/h contains higher-level definitions related to configuring the address space accoording to the kernel and allocating memory.
Diffstat (limited to 'src/core/mem_map_funcs.cpp')
-rw-r--r--src/core/mem_map_funcs.cpp275
1 files changed, 0 insertions, 275 deletions
diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp
deleted file mode 100644
index f2da60cc6..000000000
--- a/src/core/mem_map_funcs.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
1// Copyright 2014 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <map>
6
7#include "common/common_types.h"
8#include "common/logging/log.h"
9#include "common/swap.h"
10
11#include "core/mem_map.h"
12#include "core/hw/hw.h"
13#include "hle/config_mem.h"
14#include "hle/shared_page.h"
15
16namespace Memory {
17
18static std::map<u32, MemoryBlock> heap_map;
19static std::map<u32, MemoryBlock> heap_linear_map;
20
21PAddr VirtualToPhysicalAddress(const VAddr addr) {
22 if (addr == 0) {
23 return 0;
24 } else if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) {
25 return addr - VRAM_VADDR + VRAM_PADDR;
26 } else if (addr >= LINEAR_HEAP_VADDR && addr < LINEAR_HEAP_VADDR_END) {
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;
32 }
33
34 LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08x", addr);
35 // To help with debugging, set bit on address so that it's obviously invalid.
36 return addr | 0x80000000;
37}
38
39VAddr PhysicalToVirtualAddress(const PAddr addr) {
40 if (addr == 0) {
41 return 0;
42 } else if (addr >= VRAM_PADDR && addr < VRAM_PADDR_END) {
43 return addr - VRAM_PADDR + VRAM_VADDR;
44 } else if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) {
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;
50 }
51
52 LOG_ERROR(HW_Memory, "Unknown physical address @ 0x%08x", addr);
53 // To help with debugging, set bit on address so that it's obviously invalid.
54 return addr | 0x80000000;
55}
56
57template <typename T>
58inline void Read(T &var, const VAddr vaddr) {
59 // TODO: Figure out the fastest order of tests for both read and write (they are probably different).
60 // TODO: Make sure this represents the mirrors in a correct way.
61 // Could just do a base-relative read, too.... TODO
62
63 // Kernel memory command buffer
64 if (vaddr >= TLS_AREA_VADDR && vaddr < TLS_AREA_VADDR_END) {
65 var = *((const T*)&g_tls_mem[vaddr - TLS_AREA_VADDR]);
66
67 // ExeFS:/.code is loaded here
68 } else if ((vaddr >= PROCESS_IMAGE_VADDR) && (vaddr < PROCESS_IMAGE_VADDR_END)) {
69 var = *((const T*)&g_exefs_code[vaddr - PROCESS_IMAGE_VADDR]);
70
71 // FCRAM - linear heap
72 } else if ((vaddr >= LINEAR_HEAP_VADDR) && (vaddr < LINEAR_HEAP_VADDR_END)) {
73 var = *((const T*)&g_heap_linear[vaddr - LINEAR_HEAP_VADDR]);
74
75 // FCRAM - application heap
76 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) {
77 var = *((const T*)&g_heap[vaddr - HEAP_VADDR]);
78
79 // Shared memory
80 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
81 var = *((const T*)&g_shared_mem[vaddr - SHARED_MEMORY_VADDR]);
82
83 // Config memory
84 } else if ((vaddr >= CONFIG_MEMORY_VADDR) && (vaddr < CONFIG_MEMORY_VADDR_END)) {
85 ConfigMem::Read<T>(var, vaddr);
86
87 // Shared page
88 } else if ((vaddr >= SHARED_PAGE_VADDR) && (vaddr < SHARED_PAGE_VADDR_END)) {
89 SharedPage::Read<T>(var, vaddr);
90
91 // DSP memory
92 } else if ((vaddr >= DSP_RAM_VADDR) && (vaddr < DSP_RAM_VADDR_END)) {
93 var = *((const T*)&g_dsp_mem[vaddr - DSP_RAM_VADDR]);
94
95 // VRAM
96 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
97 var = *((const T*)&g_vram[vaddr - VRAM_VADDR]);
98
99 } else {
100 LOG_ERROR(HW_Memory, "unknown Read%lu @ 0x%08X", sizeof(var) * 8, vaddr);
101 }
102}
103
104template <typename T>
105inline void Write(const VAddr vaddr, const T data) {
106
107 // Kernel memory command buffer
108 if (vaddr >= TLS_AREA_VADDR && vaddr < TLS_AREA_VADDR_END) {
109 *(T*)&g_tls_mem[vaddr - TLS_AREA_VADDR] = data;
110
111 // ExeFS:/.code is loaded here
112 } else if ((vaddr >= PROCESS_IMAGE_VADDR) && (vaddr < PROCESS_IMAGE_VADDR_END)) {
113 *(T*)&g_exefs_code[vaddr - PROCESS_IMAGE_VADDR] = data;
114
115 // FCRAM - linear heap
116 } else if ((vaddr >= LINEAR_HEAP_VADDR) && (vaddr < LINEAR_HEAP_VADDR_END)) {
117 *(T*)&g_heap_linear[vaddr - LINEAR_HEAP_VADDR] = data;
118
119 // FCRAM - application heap
120 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) {
121 *(T*)&g_heap[vaddr - HEAP_VADDR] = data;
122
123 // Shared memory
124 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
125 *(T*)&g_shared_mem[vaddr - SHARED_MEMORY_VADDR] = data;
126
127 // VRAM
128 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
129 *(T*)&g_vram[vaddr - VRAM_VADDR] = data;
130
131 // DSP memory
132 } else if ((vaddr >= DSP_RAM_VADDR) && (vaddr < DSP_RAM_VADDR_END)) {
133 *(T*)&g_dsp_mem[vaddr - DSP_RAM_VADDR] = data;
134
135 //} else if ((vaddr & 0xFFFF0000) == 0x1FF80000) {
136 // ASSERT_MSG(MEMMAP, false, "umimplemented write to Configuration Memory");
137 //} else if ((vaddr & 0xFFFFF000) == 0x1FF81000) {
138 // ASSERT_MSG(MEMMAP, false, "umimplemented write to shared page");
139
140 // Error out...
141 } else {
142 LOG_ERROR(HW_Memory, "unknown Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data, vaddr);
143 }
144}
145
146u8 *GetPointer(const VAddr vaddr) {
147 // Kernel memory command buffer
148 if (vaddr >= TLS_AREA_VADDR && vaddr < TLS_AREA_VADDR_END) {
149 return g_tls_mem + (vaddr - TLS_AREA_VADDR);
150
151 // ExeFS:/.code is loaded here
152 } else if ((vaddr >= PROCESS_IMAGE_VADDR) && (vaddr < PROCESS_IMAGE_VADDR_END)) {
153 return g_exefs_code + (vaddr - PROCESS_IMAGE_VADDR);
154
155 // FCRAM - linear heap
156 } else if ((vaddr >= LINEAR_HEAP_VADDR) && (vaddr < LINEAR_HEAP_VADDR_END)) {
157 return g_heap_linear + (vaddr - LINEAR_HEAP_VADDR);
158
159 // FCRAM - application heap
160 } else if ((vaddr >= HEAP_VADDR) && (vaddr < HEAP_VADDR_END)) {
161 return g_heap + (vaddr - HEAP_VADDR);
162
163 // Shared memory
164 } else if ((vaddr >= SHARED_MEMORY_VADDR) && (vaddr < SHARED_MEMORY_VADDR_END)) {
165 return g_shared_mem + (vaddr - SHARED_MEMORY_VADDR);
166
167 // VRAM
168 } else if ((vaddr >= VRAM_VADDR) && (vaddr < VRAM_VADDR_END)) {
169 return g_vram + (vaddr - VRAM_VADDR);
170
171 } else {
172 LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%08x", vaddr);
173 return 0;
174 }
175}
176
177u32 MapBlock_Heap(u32 size, u32 operation, u32 permissions) {
178 MemoryBlock block;
179
180 block.base_address = HEAP_VADDR;
181 block.size = size;
182 block.operation = operation;
183 block.permissions = permissions;
184
185 if (heap_map.size() > 0) {
186 const MemoryBlock last_block = heap_map.rbegin()->second;
187 block.address = last_block.address + last_block.size;
188 }
189 heap_map[block.GetVirtualAddress()] = block;
190
191 return block.GetVirtualAddress();
192}
193
194u32 MapBlock_HeapLinear(u32 size, u32 operation, u32 permissions) {
195 MemoryBlock block;
196
197 block.base_address = LINEAR_HEAP_VADDR;
198 block.size = size;
199 block.operation = operation;
200 block.permissions = permissions;
201
202 if (heap_linear_map.size() > 0) {
203 const MemoryBlock last_block = heap_linear_map.rbegin()->second;
204 block.address = last_block.address + last_block.size;
205 }
206 heap_linear_map[block.GetVirtualAddress()] = block;
207
208 return block.GetVirtualAddress();
209}
210
211void MemBlock_Init() {
212}
213
214void MemBlock_Shutdown() {
215 heap_map.clear();
216 heap_linear_map.clear();
217}
218
219u8 Read8(const VAddr addr) {
220 u8 data = 0;
221 Read<u8>(data, addr);
222 return data;
223}
224
225u16 Read16(const VAddr addr) {
226 u16_le data = 0;
227 Read<u16_le>(data, addr);
228 return data;
229}
230
231u32 Read32(const VAddr addr) {
232 u32_le data = 0;
233 Read<u32_le>(data, addr);
234 return data;
235}
236
237u64 Read64(const VAddr addr) {
238 u64_le data = 0;
239 Read<u64_le>(data, addr);
240 return data;
241}
242
243void Write8(const VAddr addr, const u8 data) {
244 Write<u8>(addr, data);
245}
246
247void Write16(const VAddr addr, const u16 data) {
248 Write<u16_le>(addr, data);
249}
250
251void Write32(const VAddr addr, const u32 data) {
252 Write<u32_le>(addr, data);
253}
254
255void Write64(const VAddr addr, const u64 data) {
256 Write<u64_le>(addr, data);
257}
258
259void WriteBlock(const VAddr addr, const u8* data, const size_t size) {
260 u32 offset = 0;
261 while (offset < (size & ~3)) {
262 Write32(addr + offset, *(u32*)&data[offset]);
263 offset += 4;
264 }
265
266 if (size & 2) {
267 Write16(addr + offset, *(u16*)&data[offset]);
268 offset += 2;
269 }
270
271 if (size & 1)
272 Write8(addr + offset, data[offset]);
273}
274
275} // namespace