diff options
| author | 2018-09-29 10:54:39 -0400 | |
|---|---|---|
| committer | 2018-09-29 10:54:39 -0400 | |
| commit | f7b69d61f2a871e8afcd9819b014e873f6e0b80d (patch) | |
| tree | ab6fa797e0a0edd41cc84138ac56aaba0c5238fe /src/core/memory.cpp | |
| parent | Merge pull request #1360 from FearlessTobi/port-3979 (diff) | |
| parent | memory: Dehardcode the use of fixed memory range constants (diff) | |
| download | yuzu-f7b69d61f2a871e8afcd9819b014e873f6e0b80d.tar.gz yuzu-f7b69d61f2a871e8afcd9819b014e873f6e0b80d.tar.xz yuzu-f7b69d61f2a871e8afcd9819b014e873f6e0b80d.zip | |
Merge pull request #1395 from lioncash/vm
process/vm_manager: Initial modifications to load NPDM metadata
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 316b46820..6430daad4 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -3,7 +3,6 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <algorithm> | 5 | #include <algorithm> |
| 6 | #include <array> | ||
| 7 | #include <cstring> | 6 | #include <cstring> |
| 8 | #include <utility> | 7 | #include <utility> |
| 9 | 8 | ||
| @@ -15,11 +14,11 @@ | |||
| 15 | #include "core/arm/arm_interface.h" | 14 | #include "core/arm/arm_interface.h" |
| 16 | #include "core/core.h" | 15 | #include "core/core.h" |
| 17 | #include "core/hle/kernel/process.h" | 16 | #include "core/hle/kernel/process.h" |
| 17 | #include "core/hle/kernel/vm_manager.h" | ||
| 18 | #include "core/hle/lock.h" | 18 | #include "core/hle/lock.h" |
| 19 | #include "core/memory.h" | 19 | #include "core/memory.h" |
| 20 | #include "core/memory_setup.h" | 20 | #include "core/memory_setup.h" |
| 21 | #include "video_core/renderer_base.h" | 21 | #include "video_core/renderer_base.h" |
| 22 | #include "video_core/video_core.h" | ||
| 23 | 22 | ||
| 24 | namespace Memory { | 23 | namespace Memory { |
| 25 | 24 | ||
| @@ -41,6 +40,21 @@ PageTable* GetCurrentPageTable() { | |||
| 41 | return current_page_table; | 40 | return current_page_table; |
| 42 | } | 41 | } |
| 43 | 42 | ||
| 43 | PageTable::PageTable() = default; | ||
| 44 | |||
| 45 | PageTable::PageTable(std::size_t address_space_width_in_bits) { | ||
| 46 | Resize(address_space_width_in_bits); | ||
| 47 | } | ||
| 48 | |||
| 49 | PageTable::~PageTable() = default; | ||
| 50 | |||
| 51 | void PageTable::Resize(std::size_t address_space_width_in_bits) { | ||
| 52 | const std::size_t num_page_table_entries = 1ULL << (address_space_width_in_bits - PAGE_BITS); | ||
| 53 | |||
| 54 | pointers.resize(num_page_table_entries); | ||
| 55 | attributes.resize(num_page_table_entries); | ||
| 56 | } | ||
| 57 | |||
| 44 | static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, PageType type) { | 58 | static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, PageType type) { |
| 45 | LOG_DEBUG(HW_Memory, "Mapping {} onto {:016X}-{:016X}", fmt::ptr(memory), base * PAGE_SIZE, | 59 | LOG_DEBUG(HW_Memory, "Mapping {} onto {:016X}-{:016X}", fmt::ptr(memory), base * PAGE_SIZE, |
| 46 | (base + size) * PAGE_SIZE); | 60 | (base + size) * PAGE_SIZE); |
| @@ -50,7 +64,7 @@ static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, Pa | |||
| 50 | 64 | ||
| 51 | VAddr end = base + size; | 65 | VAddr end = base + size; |
| 52 | while (base != end) { | 66 | while (base != end) { |
| 53 | ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at {:016X}", base); | 67 | ASSERT_MSG(base < page_table.pointers.size(), "out of range mapping at {:016X}", base); |
| 54 | 68 | ||
| 55 | page_table.attributes[base] = type; | 69 | page_table.attributes[base] = type; |
| 56 | page_table.pointers[base] = memory; | 70 | page_table.pointers[base] = memory; |
| @@ -323,7 +337,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { | |||
| 323 | return; | 337 | return; |
| 324 | } | 338 | } |
| 325 | 339 | ||
| 326 | VAddr end = start + size; | 340 | const VAddr end = start + size; |
| 327 | 341 | ||
| 328 | const auto CheckRegion = [&](VAddr region_start, VAddr region_end) { | 342 | const auto CheckRegion = [&](VAddr region_start, VAddr region_end) { |
| 329 | if (start >= region_end || end <= region_start) { | 343 | if (start >= region_end || end <= region_start) { |
| @@ -333,7 +347,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { | |||
| 333 | 347 | ||
| 334 | const VAddr overlap_start = std::max(start, region_start); | 348 | const VAddr overlap_start = std::max(start, region_start); |
| 335 | const VAddr overlap_end = std::min(end, region_end); | 349 | const VAddr overlap_end = std::min(end, region_end); |
| 336 | const u64 overlap_size = overlap_end - overlap_start; | 350 | const VAddr overlap_size = overlap_end - overlap_start; |
| 337 | 351 | ||
| 338 | auto& rasterizer = system_instance.Renderer().Rasterizer(); | 352 | auto& rasterizer = system_instance.Renderer().Rasterizer(); |
| 339 | switch (mode) { | 353 | switch (mode) { |
| @@ -349,8 +363,10 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { | |||
| 349 | } | 363 | } |
| 350 | }; | 364 | }; |
| 351 | 365 | ||
| 352 | CheckRegion(PROCESS_IMAGE_VADDR, PROCESS_IMAGE_VADDR_END); | 366 | const auto& vm_manager = Core::CurrentProcess()->vm_manager; |
| 353 | CheckRegion(HEAP_VADDR, HEAP_VADDR_END); | 367 | |
| 368 | CheckRegion(vm_manager.GetCodeRegionBaseAddress(), vm_manager.GetCodeRegionEndAddress()); | ||
| 369 | CheckRegion(vm_manager.GetHeapRegionBaseAddress(), vm_manager.GetHeapRegionEndAddress()); | ||
| 354 | } | 370 | } |
| 355 | 371 | ||
| 356 | u8 Read8(const VAddr addr) { | 372 | u8 Read8(const VAddr addr) { |