diff options
Diffstat (limited to 'src/core/mem_map.cpp')
| -rw-r--r-- | src/core/mem_map.cpp | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/core/mem_map.cpp b/src/core/mem_map.cpp index 5ecec9566..66d95ed27 100644 --- a/src/core/mem_map.cpp +++ b/src/core/mem_map.cpp | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | 9 | ||
| 10 | #include "core/hle/config_mem.h" | 10 | #include "core/hle/config_mem.h" |
| 11 | #include "core/hle/kernel/kernel.h" | ||
| 12 | #include "core/hle/kernel/shared_memory.h" | ||
| 13 | #include "core/hle/kernel/vm_manager.h" | ||
| 14 | #include "core/hle/result.h" | ||
| 11 | #include "core/hle/shared_page.h" | 15 | #include "core/hle/shared_page.h" |
| 12 | #include "core/mem_map.h" | 16 | #include "core/mem_map.h" |
| 13 | #include "core/memory.h" | 17 | #include "core/memory.h" |
| @@ -31,17 +35,18 @@ struct MemoryArea { | |||
| 31 | u8** ptr; | 35 | u8** ptr; |
| 32 | u32 base; | 36 | u32 base; |
| 33 | u32 size; | 37 | u32 size; |
| 38 | const char* name; | ||
| 34 | }; | 39 | }; |
| 35 | 40 | ||
| 36 | // We don't declare the IO regions in here since its handled by other means. | 41 | // We don't declare the IO regions in here since its handled by other means. |
| 37 | static MemoryArea memory_areas[] = { | 42 | static MemoryArea memory_areas[] = { |
| 38 | {&g_exefs_code, PROCESS_IMAGE_VADDR, PROCESS_IMAGE_MAX_SIZE}, | 43 | {&g_exefs_code, PROCESS_IMAGE_VADDR, PROCESS_IMAGE_MAX_SIZE, "Process Image"}, |
| 39 | {&g_heap, HEAP_VADDR, HEAP_SIZE }, | 44 | {&g_heap, HEAP_VADDR, HEAP_SIZE, "Heap"}, |
| 40 | {&g_shared_mem, SHARED_MEMORY_VADDR, SHARED_MEMORY_SIZE }, | 45 | {&g_shared_mem, SHARED_MEMORY_VADDR, SHARED_MEMORY_SIZE, "Shared Memory"}, |
| 41 | {&g_heap_linear, LINEAR_HEAP_VADDR, LINEAR_HEAP_SIZE }, | 46 | {&g_heap_linear, LINEAR_HEAP_VADDR, LINEAR_HEAP_SIZE, "Linear Heap"}, |
| 42 | {&g_vram, VRAM_VADDR, VRAM_SIZE }, | 47 | {&g_vram, VRAM_VADDR, VRAM_SIZE, "VRAM"}, |
| 43 | {&g_dsp_mem, DSP_RAM_VADDR, DSP_RAM_SIZE }, | 48 | {&g_dsp_mem, DSP_RAM_VADDR, DSP_RAM_SIZE, "DSP RAM"}, |
| 44 | {&g_tls_mem, TLS_AREA_VADDR, TLS_AREA_SIZE }, | 49 | {&g_tls_mem, TLS_AREA_VADDR, TLS_AREA_SIZE, "TLS Area"}, |
| 45 | }; | 50 | }; |
| 46 | 51 | ||
| 47 | /// Represents a block of memory mapped by ControlMemory/MapMemoryBlock | 52 | /// Represents a block of memory mapped by ControlMemory/MapMemoryBlock |
| @@ -135,15 +140,27 @@ VAddr PhysicalToVirtualAddress(const PAddr addr) { | |||
| 135 | return addr | 0x80000000; | 140 | return addr | 0x80000000; |
| 136 | } | 141 | } |
| 137 | 142 | ||
| 143 | // TODO(yuriks): Move this into Process | ||
| 144 | static Kernel::VMManager address_space; | ||
| 145 | |||
| 138 | void Init() { | 146 | void Init() { |
| 147 | using namespace Kernel; | ||
| 148 | |||
| 139 | InitMemoryMap(); | 149 | InitMemoryMap(); |
| 140 | 150 | ||
| 141 | for (MemoryArea& area : memory_areas) { | 151 | for (MemoryArea& area : memory_areas) { |
| 142 | *area.ptr = new u8[area.size]; | 152 | auto block = std::make_shared<std::vector<u8>>(area.size); |
| 143 | MapMemoryRegion(area.base, area.size, *area.ptr); | 153 | *area.ptr = block->data(); // TODO(yuriks): Remove |
| 154 | address_space.MapMemoryBlock(area.base, std::move(block), 0, area.size, MemoryState::Private).Unwrap(); | ||
| 144 | } | 155 | } |
| 145 | MapMemoryRegion(CONFIG_MEMORY_VADDR, CONFIG_MEMORY_SIZE, (u8*)&ConfigMem::config_mem); | 156 | |
| 146 | MapMemoryRegion(SHARED_PAGE_VADDR, SHARED_PAGE_SIZE, (u8*)&SharedPage::shared_page); | 157 | auto cfg_mem_vma = address_space.MapBackingMemory(CONFIG_MEMORY_VADDR, |
| 158 | (u8*)&ConfigMem::config_mem, CONFIG_MEMORY_SIZE, MemoryState::Shared).MoveFrom(); | ||
| 159 | address_space.Reprotect(cfg_mem_vma, VMAPermission::Read); | ||
| 160 | |||
| 161 | auto shared_page_vma = address_space.MapBackingMemory(SHARED_PAGE_VADDR, | ||
| 162 | (u8*)&SharedPage::shared_page, SHARED_PAGE_SIZE, MemoryState::Shared).MoveFrom(); | ||
| 163 | address_space.Reprotect(shared_page_vma, VMAPermission::Read); | ||
| 147 | 164 | ||
| 148 | LOG_DEBUG(HW_Memory, "initialized OK, RAM at %p", g_heap); | 165 | LOG_DEBUG(HW_Memory, "initialized OK, RAM at %p", g_heap); |
| 149 | } | 166 | } |
| @@ -152,8 +169,9 @@ void Shutdown() { | |||
| 152 | heap_map.clear(); | 169 | heap_map.clear(); |
| 153 | heap_linear_map.clear(); | 170 | heap_linear_map.clear(); |
| 154 | 171 | ||
| 172 | address_space.Reset(); | ||
| 173 | |||
| 155 | for (MemoryArea& area : memory_areas) { | 174 | for (MemoryArea& area : memory_areas) { |
| 156 | delete[] *area.ptr; | ||
| 157 | *area.ptr = nullptr; | 175 | *area.ptr = nullptr; |
| 158 | } | 176 | } |
| 159 | 177 | ||