diff options
| author | 2023-07-26 10:33:28 -0400 | |
|---|---|---|
| committer | 2023-07-26 10:33:28 -0400 | |
| commit | d3da1e6517fe27670b6c2d713d144872d55057d8 (patch) | |
| tree | ab5c72b17b15185ec40945c5ba29400569b50630 /src/core/memory.cpp | |
| parent | Merge pull request #11142 from german77/avoid_crash (diff) | |
| parent | Fixes and workarounds to make UBSan happier on macOS (diff) | |
| download | yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.gz yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.xz yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.zip | |
Merge pull request #10990 from comex/ubsan
Fixes and workarounds to make UBSan happier on macOS
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 179685b72..513bc4edb 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -73,7 +73,7 @@ struct Memory::Impl { | |||
| 73 | return {}; | 73 | return {}; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | return system.DeviceMemory().GetPointer<u8>(paddr) + vaddr; | 76 | return system.DeviceMemory().GetPointer<u8>(paddr + vaddr); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { | 79 | [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { |
| @@ -84,7 +84,7 @@ struct Memory::Impl { | |||
| 84 | return {}; | 84 | return {}; |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | return system.DeviceMemory().GetPointer<u8>(paddr) + vaddr; | 87 | return system.DeviceMemory().GetPointer<u8>(paddr + vaddr); |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | u8 Read8(const Common::ProcessAddress addr) { | 90 | u8 Read8(const Common::ProcessAddress addr) { |
| @@ -205,7 +205,8 @@ struct Memory::Impl { | |||
| 205 | break; | 205 | break; |
| 206 | } | 206 | } |
| 207 | case Common::PageType::Memory: { | 207 | case Common::PageType::Memory: { |
| 208 | u8* mem_ptr = pointer + page_offset + (page_index << YUZU_PAGEBITS); | 208 | u8* mem_ptr = |
| 209 | reinterpret_cast<u8*>(pointer + page_offset + (page_index << YUZU_PAGEBITS)); | ||
| 209 | on_memory(copy_amount, mem_ptr); | 210 | on_memory(copy_amount, mem_ptr); |
| 210 | break; | 211 | break; |
| 211 | } | 212 | } |
| @@ -447,7 +448,7 @@ struct Memory::Impl { | |||
| 447 | break; | 448 | break; |
| 448 | case Common::PageType::Memory: | 449 | case Common::PageType::Memory: |
| 449 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( | 450 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( |
| 450 | nullptr, Common::PageType::DebugMemory); | 451 | 0, Common::PageType::DebugMemory); |
| 451 | break; | 452 | break; |
| 452 | default: | 453 | default: |
| 453 | UNREACHABLE(); | 454 | UNREACHABLE(); |
| @@ -465,7 +466,8 @@ struct Memory::Impl { | |||
| 465 | case Common::PageType::DebugMemory: { | 466 | case Common::PageType::DebugMemory: { |
| 466 | u8* const pointer{GetPointerFromDebugMemory(vaddr & ~YUZU_PAGEMASK)}; | 467 | u8* const pointer{GetPointerFromDebugMemory(vaddr & ~YUZU_PAGEMASK)}; |
| 467 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( | 468 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( |
| 468 | pointer - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory); | 469 | reinterpret_cast<uintptr_t>(pointer) - (vaddr & ~YUZU_PAGEMASK), |
| 470 | Common::PageType::Memory); | ||
| 469 | break; | 471 | break; |
| 470 | } | 472 | } |
| 471 | default: | 473 | default: |
| @@ -505,7 +507,7 @@ struct Memory::Impl { | |||
| 505 | case Common::PageType::DebugMemory: | 507 | case Common::PageType::DebugMemory: |
| 506 | case Common::PageType::Memory: | 508 | case Common::PageType::Memory: |
| 507 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( | 509 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( |
| 508 | nullptr, Common::PageType::RasterizerCachedMemory); | 510 | 0, Common::PageType::RasterizerCachedMemory); |
| 509 | break; | 511 | break; |
| 510 | case Common::PageType::RasterizerCachedMemory: | 512 | case Common::PageType::RasterizerCachedMemory: |
| 511 | // There can be more than one GPU region mapped per CPU region, so it's common | 513 | // There can be more than one GPU region mapped per CPU region, so it's common |
| @@ -533,10 +535,11 @@ struct Memory::Impl { | |||
| 533 | // pagetable after unmapping a VMA. In that case the underlying VMA will no | 535 | // pagetable after unmapping a VMA. In that case the underlying VMA will no |
| 534 | // longer exist, and we should just leave the pagetable entry blank. | 536 | // longer exist, and we should just leave the pagetable entry blank. |
| 535 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( | 537 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( |
| 536 | nullptr, Common::PageType::Unmapped); | 538 | 0, Common::PageType::Unmapped); |
| 537 | } else { | 539 | } else { |
| 538 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( | 540 | current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store( |
| 539 | pointer - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory); | 541 | reinterpret_cast<uintptr_t>(pointer) - (vaddr & ~YUZU_PAGEMASK), |
| 542 | Common::PageType::Memory); | ||
| 540 | } | 543 | } |
| 541 | break; | 544 | break; |
| 542 | } | 545 | } |
| @@ -583,7 +586,7 @@ struct Memory::Impl { | |||
| 583 | "Mapping memory page without a pointer @ {:016x}", base * YUZU_PAGESIZE); | 586 | "Mapping memory page without a pointer @ {:016x}", base * YUZU_PAGESIZE); |
| 584 | 587 | ||
| 585 | while (base != end) { | 588 | while (base != end) { |
| 586 | page_table.pointers[base].Store(nullptr, type); | 589 | page_table.pointers[base].Store(0, type); |
| 587 | page_table.backing_addr[base] = 0; | 590 | page_table.backing_addr[base] = 0; |
| 588 | page_table.blocks[base] = 0; | 591 | page_table.blocks[base] = 0; |
| 589 | base += 1; | 592 | base += 1; |
| @@ -592,7 +595,8 @@ struct Memory::Impl { | |||
| 592 | auto orig_base = base; | 595 | auto orig_base = base; |
| 593 | while (base != end) { | 596 | while (base != end) { |
| 594 | auto host_ptr = | 597 | auto host_ptr = |
| 595 | system.DeviceMemory().GetPointer<u8>(target) - (base << YUZU_PAGEBITS); | 598 | reinterpret_cast<uintptr_t>(system.DeviceMemory().GetPointer<u8>(target)) - |
| 599 | (base << YUZU_PAGEBITS); | ||
| 596 | auto backing = GetInteger(target) - (base << YUZU_PAGEBITS); | 600 | auto backing = GetInteger(target) - (base << YUZU_PAGEBITS); |
| 597 | page_table.pointers[base].Store(host_ptr, type); | 601 | page_table.pointers[base].Store(host_ptr, type); |
| 598 | page_table.backing_addr[base] = backing; | 602 | page_table.backing_addr[base] = backing; |
| @@ -618,8 +622,8 @@ struct Memory::Impl { | |||
| 618 | 622 | ||
| 619 | // Avoid adding any extra logic to this fast-path block | 623 | // Avoid adding any extra logic to this fast-path block |
| 620 | const uintptr_t raw_pointer = current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Raw(); | 624 | const uintptr_t raw_pointer = current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Raw(); |
| 621 | if (u8* const pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) { | 625 | if (const uintptr_t pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) { |
| 622 | return &pointer[vaddr]; | 626 | return reinterpret_cast<u8*>(pointer + vaddr); |
| 623 | } | 627 | } |
| 624 | switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) { | 628 | switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) { |
| 625 | case Common::PageType::Unmapped: | 629 | case Common::PageType::Unmapped: |
| @@ -813,7 +817,7 @@ bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const { | |||
| 813 | return false; | 817 | return false; |
| 814 | } | 818 | } |
| 815 | const auto [pointer, type] = page_table.pointers[page].PointerType(); | 819 | const auto [pointer, type] = page_table.pointers[page].PointerType(); |
| 816 | return pointer != nullptr || type == Common::PageType::RasterizerCachedMemory || | 820 | return pointer != 0 || type == Common::PageType::RasterizerCachedMemory || |
| 817 | type == Common::PageType::DebugMemory; | 821 | type == Common::PageType::DebugMemory; |
| 818 | } | 822 | } |
| 819 | 823 | ||