From 01fbf205573a84673c7fc5984db12ae9ae98a074 Mon Sep 17 00:00:00 2001 From: Exverge Date: Wed, 5 Aug 2026 14:01:14 -0400 Subject: [PATCH] [core] don't change how we store pointers --- src/common/page_table.h | 4 ++-- src/core/hle/kernel/k_page_table_base.cpp | 4 ++-- src/core/hle/kernel/k_page_table_base.h | 2 +- src/core/memory.cpp | 17 ++++++++--------- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/common/page_table.h b/src/common/page_table.h index c38f22155e..aba9d395f6 100644 --- a/src/common/page_table.h +++ b/src/common/page_table.h @@ -55,8 +55,8 @@ struct PageTable { class PageEntryData { public: struct Data { - Data(bool marked_, PageType type_, u16 block_, u64 page) - : marked(marked_), type(static_cast(type_)), block(block_), page(page >> ATTRIBUTE_BITS) {} + Data(bool marked_, PageType type_, u16 block_, u64 page_) + : marked(marked_), type(static_cast(type_)), block(block_), page(page_ >> ATTRIBUTE_BITS) {} u64 marked : 1; u64 type : 2; u64 block : 9; // TODO: is 9 bits to little? we can use the upper 8 bits if needed diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 81de78ef25..e16ca4de16 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -651,9 +651,9 @@ bool KPageTableBase::ContinueTraversal(const Common::PageTable &impl, TraversalE // Validate that we can read the actual entry. if (auto const page = context->next_page; page < impl.entries.size()) { // Validate that the entry is mapped. - if (auto const paddr = impl.entries[page].Pointer(); paddr != 0) { + if (auto const paddr = impl.entries[page].Pointer(true); paddr != 0) { // Populate the results and return true - out_entry->phys_addr = GetInteger(m_system.DeviceMemory().GetPhysicalAddr(paddr)) + context->next_offset % PageSize; + out_entry->phys_addr = GetInteger(m_system.DeviceMemory().GetPhysicalAddr(paddr)) + context->next_offset; context->next_page += 1; context->next_offset += PageSize; return true; diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 48a26aac2b..7fa0ad7886 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -482,7 +482,7 @@ private: } *out = m_system.DeviceMemory().GetPhysicalAddr( - this->GetImpl().entries[virt_addr >> PageBits].Pointer()); + this->GetImpl().entries[virt_addr >> PageBits].Pointer(true)); return true; } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index e21ba0d737..baf844a939 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -126,13 +126,13 @@ struct Memory::Impl { [[nodiscard]] u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { if (u64 paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].Pointer(true); paddr) - return reinterpret_cast(paddr) + (vaddr % YUZU_PAGESIZE); + return reinterpret_cast(paddr) + vaddr; return {}; } [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { if (u64 paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].Pointer(true); paddr) - return reinterpret_cast(paddr) + (vaddr % YUZU_PAGESIZE); + return reinterpret_cast(paddr) + vaddr; return {}; } @@ -256,7 +256,7 @@ struct Memory::Impl { break; } case Common::PageType::Memory: { - u8* mem_ptr = reinterpret_cast(pointer + page_offset); + u8* mem_ptr = reinterpret_cast(pointer + page_offset + (page_index << YUZU_PAGEBITS)); on_memory(offset, copy_amount, mem_ptr); break; } @@ -554,7 +554,7 @@ struct Memory::Impl { page_table.entries.CommitRegion(base, end); while (base != end) { - auto host_ptr = reinterpret_cast(system.DeviceMemory().GetPointer(target)); + auto host_ptr = reinterpret_cast(system.DeviceMemory().GetPointer(target)) - (base << YUZU_PAGEBITS);; auto& entry = page_table.entries.GetUnchecked(base); entry.Store(false, type, current_block, host_ptr); @@ -575,7 +575,7 @@ struct Memory::Impl { // Avoid adding any extra logic to this fast-path block const auto raw = current_page_table->entries[vaddr >> YUZU_PAGEBITS].Raw(); if (auto pointer = Common::PageTable::PageEntryData::ExtractPointer(raw); pointer) [[likely]] { - return reinterpret_cast(pointer + vaddr % YUZU_PAGESIZE); + return reinterpret_cast(pointer + vaddr); } else { switch (static_cast(raw.type)) { case Common::PageType::Memory: @@ -625,6 +625,7 @@ struct Memory::Impl { inline T Read(Common::ProcessAddress vaddr) noexcept requires(std::is_trivially_copyable_v) { const u64 addr = GetInteger(vaddr); if (auto const ptr = GetPointerImpl(addr, [addr]() { + __builtin_debugtrap(); LOG_ERROR(HW_Memory, "Unmapped Read{} @ {:#016x}", sizeof(T) * 8, addr); }, [&]() { HandleRasterizerDownload(addr, sizeof(T)); @@ -815,10 +816,8 @@ bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const { if (page >= page_table.entries.size()) { return false; } - const auto raw = page_table.entries[page].Raw(); - const auto type = static_cast(raw.type); - - return raw.page != 0 || type == Common::PageType::RasterizerCachedMemory || + const auto [pointer, type, _] = page_table.entries[page].PointerTypeBlock(); + return pointer != 0 || type == Common::PageType::RasterizerCachedMemory || type == Common::PageType::DebugMemory; }