diff options
Diffstat (limited to 'src/core/mem_map_funcs.cpp')
| -rw-r--r-- | src/core/mem_map_funcs.cpp | 106 |
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 { | |||
| 18 | static std::map<u32, MemoryBlock> heap_map; | 18 | static std::map<u32, MemoryBlock> heap_map; |
| 19 | static std::map<u32, MemoryBlock> heap_linear_map; | 19 | static std::map<u32, MemoryBlock> heap_linear_map; |
| 20 | 20 | ||
| 21 | /// Convert a physical address to virtual address | 21 | PAddr VirtualToPhysicalAddress(const VAddr addr) { |
| 22 | VAddr 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 | 39 | VAddr PhysicalToVirtualAddress(const PAddr addr) { |
| 40 | PAddr 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 | ||
| 57 | template <typename T> | 57 | template <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> | |||
| 109 | inline void Write(const VAddr vaddr, const T data) { | 105 | inline 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 | ||
| 154 | u8 *GetPointer(const VAddr vaddr) { | 146 | u8 *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) { | |||
| 206 | u32 MapBlock_HeapLinear(u32 size, u32 operation, u32 permissions) { | 194 | u32 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; |