diff options
| author | 2020-07-08 10:44:33 -0400 | |
|---|---|---|
| committer | 2020-07-08 10:44:33 -0400 | |
| commit | 2a87ddcce28d11f5aa58f524108caadfaefe6ae8 (patch) | |
| tree | 9a655d4e1295626da82272177be9f23ef05aba6c /src/core/memory.cpp | |
| parent | Merge pull request #4270 from MerryMage/rm-pragma-once (diff) | |
| parent | memory: Set page-table pointers before setting attribute = Memory (diff) | |
| download | yuzu-2a87ddcce28d11f5aa58f524108caadfaefe6ae8.tar.gz yuzu-2a87ddcce28d11f5aa58f524108caadfaefe6ae8.tar.xz yuzu-2a87ddcce28d11f5aa58f524108caadfaefe6ae8.zip | |
Merge pull request #4245 from MerryMage/page-table-race
memory: Race-condition in pagetables.
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 7def00768..2c5588933 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -548,9 +548,9 @@ struct Memory::Impl { | |||
| 548 | // longer exist, and we should just leave the pagetable entry blank. | 548 | // longer exist, and we should just leave the pagetable entry blank. |
| 549 | page_type = Common::PageType::Unmapped; | 549 | page_type = Common::PageType::Unmapped; |
| 550 | } else { | 550 | } else { |
| 551 | page_type = Common::PageType::Memory; | ||
| 552 | current_page_table->pointers[vaddr >> PAGE_BITS] = | 551 | current_page_table->pointers[vaddr >> PAGE_BITS] = |
| 553 | pointer - (vaddr & ~PAGE_MASK); | 552 | pointer - (vaddr & ~PAGE_MASK); |
| 553 | page_type = Common::PageType::Memory; | ||
| 554 | } | 554 | } |
| 555 | break; | 555 | break; |
| 556 | } | 556 | } |
| @@ -591,9 +591,12 @@ struct Memory::Impl { | |||
| 591 | base + page_table.pointers.size()); | 591 | base + page_table.pointers.size()); |
| 592 | 592 | ||
| 593 | if (!target) { | 593 | if (!target) { |
| 594 | ASSERT_MSG(type != Common::PageType::Memory, | ||
| 595 | "Mapping memory page without a pointer @ {:016x}", base * PAGE_SIZE); | ||
| 596 | |||
| 594 | while (base != end) { | 597 | while (base != end) { |
| 595 | page_table.pointers[base] = nullptr; | ||
| 596 | page_table.attributes[base] = type; | 598 | page_table.attributes[base] = type; |
| 599 | page_table.pointers[base] = nullptr; | ||
| 597 | page_table.backing_addr[base] = 0; | 600 | page_table.backing_addr[base] = 0; |
| 598 | 601 | ||
| 599 | base += 1; | 602 | base += 1; |