|
|
|
@ -73,7 +73,7 @@ struct Memory::Impl {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return system.DeviceMemory().GetPointer<u8>(paddr) + vaddr;
|
|
|
|
|
return system.DeviceMemory().GetPointer<u8>(paddr + vaddr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const {
|
|
|
|
@ -84,7 +84,7 @@ struct Memory::Impl {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return system.DeviceMemory().GetPointer<u8>(paddr) + vaddr;
|
|
|
|
|
return system.DeviceMemory().GetPointer<u8>(paddr + vaddr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u8 Read8(const Common::ProcessAddress addr) {
|
|
|
|
@ -205,7 +205,8 @@ struct Memory::Impl {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Common::PageType::Memory: {
|
|
|
|
|
u8* mem_ptr = pointer + page_offset + (page_index << YUZU_PAGEBITS);
|
|
|
|
|
u8* mem_ptr =
|
|
|
|
|
reinterpret_cast<u8*>(pointer + page_offset + (page_index << YUZU_PAGEBITS));
|
|
|
|
|
on_memory(copy_amount, mem_ptr);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -447,7 +448,7 @@ struct Memory::Impl {
|
|
|
|
|
break;
|
|
|
|
|
case Common::PageType::Memory:
|
|
|
|
|
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
|
|
|
|
nullptr, Common::PageType::DebugMemory);
|
|
|
|
|
0, Common::PageType::DebugMemory);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
UNREACHABLE();
|
|
|
|
@ -465,7 +466,8 @@ struct Memory::Impl {
|
|
|
|
|
case Common::PageType::DebugMemory: {
|
|
|
|
|
u8* const pointer{GetPointerFromDebugMemory(vaddr & ~YUZU_PAGEMASK)};
|
|
|
|
|
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
|
|
|
|
pointer - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory);
|
|
|
|
|
reinterpret_cast<uintptr_t>(pointer) - (vaddr & ~YUZU_PAGEMASK),
|
|
|
|
|
Common::PageType::Memory);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
@ -505,7 +507,7 @@ struct Memory::Impl {
|
|
|
|
|
case Common::PageType::DebugMemory:
|
|
|
|
|
case Common::PageType::Memory:
|
|
|
|
|
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
|
|
|
|
nullptr, Common::PageType::RasterizerCachedMemory);
|
|
|
|
|
0, Common::PageType::RasterizerCachedMemory);
|
|
|
|
|
break;
|
|
|
|
|
case Common::PageType::RasterizerCachedMemory:
|
|
|
|
|
// There can be more than one GPU region mapped per CPU region, so it's common
|
|
|
|
@ -533,10 +535,11 @@ struct Memory::Impl {
|
|
|
|
|
// pagetable after unmapping a VMA. In that case the underlying VMA will no
|
|
|
|
|
// longer exist, and we should just leave the pagetable entry blank.
|
|
|
|
|
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
|
|
|
|
nullptr, Common::PageType::Unmapped);
|
|
|
|
|
0, Common::PageType::Unmapped);
|
|
|
|
|
} else {
|
|
|
|
|
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
|
|
|
|
pointer - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory);
|
|
|
|
|
reinterpret_cast<uintptr_t>(pointer) - (vaddr & ~YUZU_PAGEMASK),
|
|
|
|
|
Common::PageType::Memory);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -583,7 +586,7 @@ struct Memory::Impl {
|
|
|
|
|
"Mapping memory page without a pointer @ {:016x}", base * YUZU_PAGESIZE);
|
|
|
|
|
|
|
|
|
|
while (base != end) {
|
|
|
|
|
page_table.pointers[base].Store(nullptr, type);
|
|
|
|
|
page_table.pointers[base].Store(0, type);
|
|
|
|
|
page_table.backing_addr[base] = 0;
|
|
|
|
|
page_table.blocks[base] = 0;
|
|
|
|
|
base += 1;
|
|
|
|
@ -592,7 +595,8 @@ struct Memory::Impl {
|
|
|
|
|
auto orig_base = base;
|
|
|
|
|
while (base != end) {
|
|
|
|
|
auto host_ptr =
|
|
|
|
|
system.DeviceMemory().GetPointer<u8>(target) - (base << YUZU_PAGEBITS);
|
|
|
|
|
reinterpret_cast<uintptr_t>(system.DeviceMemory().GetPointer<u8>(target)) -
|
|
|
|
|
(base << YUZU_PAGEBITS);
|
|
|
|
|
auto backing = GetInteger(target) - (base << YUZU_PAGEBITS);
|
|
|
|
|
page_table.pointers[base].Store(host_ptr, type);
|
|
|
|
|
page_table.backing_addr[base] = backing;
|
|
|
|
@ -618,8 +622,8 @@ struct Memory::Impl {
|
|
|
|
|
|
|
|
|
|
// Avoid adding any extra logic to this fast-path block
|
|
|
|
|
const uintptr_t raw_pointer = current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Raw();
|
|
|
|
|
if (u8* const pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) {
|
|
|
|
|
return &pointer[vaddr];
|
|
|
|
|
if (const uintptr_t pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) {
|
|
|
|
|
return reinterpret_cast<u8*>(pointer + vaddr);
|
|
|
|
|
}
|
|
|
|
|
switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) {
|
|
|
|
|
case Common::PageType::Unmapped:
|
|
|
|
@ -813,7 +817,7 @@ bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
const auto [pointer, type] = page_table.pointers[page].PointerType();
|
|
|
|
|
return pointer != nullptr || type == Common::PageType::RasterizerCachedMemory ||
|
|
|
|
|
return pointer != 0 || type == Common::PageType::RasterizerCachedMemory ||
|
|
|
|
|
type == Common::PageType::DebugMemory;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|