summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2024-01-07 19:59:48 +0100
committerLiam <byteslice@airmail.cc>2024-01-13 00:31:33 +0100
commitf2fed21c1139c8d5c030bc5caee5c612dfe7979f (patch)
tree4051a2e4e1c34370fa259ecf36783b76ea66a56f /src/common
parentMerge pull request #12605 from german77/abstract (diff)
downloadyuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.tar
yuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.tar.gz
yuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.tar.bz2
yuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.tar.lz
yuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.tar.xz
yuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.tar.zst
yuzu-f2fed21c1139c8d5c030bc5caee5c612dfe7979f.zip
Diffstat (limited to 'src/common')
-rw-r--r--src/common/page_table.cpp34
1 files changed, 10 insertions, 24 deletions
diff --git a/src/common/page_table.cpp b/src/common/page_table.cpp
index 166dc3dce..85dc18c11 100644
--- a/src/common/page_table.cpp
+++ b/src/common/page_table.cpp
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/page_table.h"
+#include "common/scope_exit.h"
namespace Common {
@@ -11,29 +12,10 @@ PageTable::~PageTable() noexcept = default;
bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context,
Common::ProcessAddress address) const {
- // Setup invalid defaults.
- out_entry->phys_addr = 0;
- out_entry->block_size = page_size;
- out_context->next_page = 0;
-
- // Validate that we can read the actual entry.
- const auto page = address / page_size;
- if (page >= backing_addr.size()) {
- return false;
- }
-
- // Validate that the entry is mapped.
- const auto phys_addr = backing_addr[page];
- if (phys_addr == 0) {
- return false;
- }
+ out_context->next_offset = GetInteger(address);
+ out_context->next_page = address / page_size;
- // Populate the results.
- out_entry->phys_addr = phys_addr + GetInteger(address);
- out_context->next_page = page + 1;
- out_context->next_offset = GetInteger(address) + page_size;
-
- return true;
+ return this->ContinueTraversal(out_entry, out_context);
}
bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const {
@@ -41,6 +23,12 @@ bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* c
out_entry->phys_addr = 0;
out_entry->block_size = page_size;
+ // Regardless of whether the page was mapped, advance on exit.
+ SCOPE_EXIT({
+ context->next_page += 1;
+ context->next_offset += page_size;
+ });
+
// Validate that we can read the actual entry.
const auto page = context->next_page;
if (page >= backing_addr.size()) {
@@ -55,8 +43,6 @@ bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* c
// Populate the results.
out_entry->phys_addr = phys_addr + context->next_offset;
- context->next_page = page + 1;
- context->next_offset += page_size;
return true;
}