diff options
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 5d8069acd..28844a915 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -14,12 +14,10 @@ | |||
| 14 | #include "core/hw/hw.h" | 14 | #include "core/hw/hw.h" |
| 15 | #include "core/mem_map.h" | 15 | #include "core/mem_map.h" |
| 16 | #include "core/memory.h" | 16 | #include "core/memory.h" |
| 17 | #include "core/memory_setup.h" | ||
| 17 | 18 | ||
| 18 | namespace Memory { | 19 | namespace Memory { |
| 19 | 20 | ||
| 20 | const u32 PAGE_MASK = PAGE_SIZE - 1; | ||
| 21 | const int PAGE_BITS = 12; | ||
| 22 | |||
| 23 | enum class PageType { | 21 | enum class PageType { |
| 24 | /// Page is unmapped and should cause an access error. | 22 | /// Page is unmapped and should cause an access error. |
| 25 | Unmapped, | 23 | Unmapped, |
| @@ -64,7 +62,7 @@ static void MapPages(u32 base, u32 size, u8* memory, PageType type) { | |||
| 64 | while (base != end) { | 62 | while (base != end) { |
| 65 | ASSERT_MSG(base < PageTable::NUM_ENTRIES, "out of range mapping at %08X", base); | 63 | ASSERT_MSG(base < PageTable::NUM_ENTRIES, "out of range mapping at %08X", base); |
| 66 | 64 | ||
| 67 | if (current_page_table->attributes[base] != PageType::Unmapped) { | 65 | if (current_page_table->attributes[base] != PageType::Unmapped && type != PageType::Unmapped) { |
| 68 | LOG_ERROR(HW_Memory, "overlapping memory ranges at %08X", base * PAGE_SIZE); | 66 | LOG_ERROR(HW_Memory, "overlapping memory ranges at %08X", base * PAGE_SIZE); |
| 69 | } | 67 | } |
| 70 | current_page_table->attributes[base] = type; | 68 | current_page_table->attributes[base] = type; |
| @@ -92,6 +90,12 @@ void MapIoRegion(VAddr base, u32 size) { | |||
| 92 | MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special); | 90 | MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special); |
| 93 | } | 91 | } |
| 94 | 92 | ||
| 93 | void UnmapRegion(VAddr base, u32 size) { | ||
| 94 | ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); | ||
| 95 | ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); | ||
| 96 | MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped); | ||
| 97 | } | ||
| 98 | |||
| 95 | template <typename T> | 99 | template <typename T> |
| 96 | T Read(const VAddr vaddr) { | 100 | T Read(const VAddr vaddr) { |
| 97 | const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | 101 | const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; |