summaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorGravatar liamwhite2023-07-26 10:33:28 -0400
committerGravatar GitHub2023-07-26 10:33:28 -0400
commitd3da1e6517fe27670b6c2d713d144872d55057d8 (patch)
treeab5c72b17b15185ec40945c5ba29400569b50630 /src/core/memory.cpp
parentMerge pull request #11142 from german77/avoid_crash (diff)
parentFixes and workarounds to make UBSan happier on macOS (diff)
downloadyuzu-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.cpp30
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