summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/page_table.cpp28
-rw-r--r--src/common/page_table.h4
-rw-r--r--src/core/hle/kernel/k_page_table.cpp24
3 files changed, 18 insertions, 38 deletions
diff --git a/src/common/page_table.cpp b/src/common/page_table.cpp
index 75897eeae..4817b09f9 100644
--- a/src/common/page_table.cpp
+++ b/src/common/page_table.cpp
@@ -10,12 +10,12 @@ PageTable::PageTable() = default;
10 10
11PageTable::~PageTable() noexcept = default; 11PageTable::~PageTable() noexcept = default;
12 12
13bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context, 13bool PageTable::BeginTraversal(TraversalEntry& out_entry, TraversalContext& out_context,
14 u64 address) const { 14 u64 address) const {
15 // Setup invalid defaults. 15 // Setup invalid defaults.
16 out_entry->phys_addr = 0; 16 out_entry.phys_addr = 0;
17 out_entry->block_size = page_size; 17 out_entry.block_size = page_size;
18 out_context->next_page = 0; 18 out_context.next_page = 0;
19 19
20 // Validate that we can read the actual entry. 20 // Validate that we can read the actual entry.
21 const auto page = address / page_size; 21 const auto page = address / page_size;
@@ -30,20 +30,20 @@ bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_
30 } 30 }
31 31
32 // Populate the results. 32 // Populate the results.
33 out_entry->phys_addr = phys_addr + address; 33 out_entry.phys_addr = phys_addr + address;
34 out_context->next_page = page + 1; 34 out_context.next_page = page + 1;
35 out_context->next_offset = address + page_size; 35 out_context.next_offset = address + page_size;
36 36
37 return true; 37 return true;
38} 38}
39 39
40bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const { 40bool PageTable::ContinueTraversal(TraversalEntry& out_entry, TraversalContext& context) const {
41 // Setup invalid defaults. 41 // Setup invalid defaults.
42 out_entry->phys_addr = 0; 42 out_entry.phys_addr = 0;
43 out_entry->block_size = page_size; 43 out_entry.block_size = page_size;
44 44
45 // Validate that we can read the actual entry. 45 // Validate that we can read the actual entry.
46 const auto page = context->next_page; 46 const auto page = context.next_page;
47 if (page >= backing_addr.size()) { 47 if (page >= backing_addr.size()) {
48 return false; 48 return false;
49 } 49 }
@@ -55,9 +55,9 @@ bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* c
55 } 55 }
56 56
57 // Populate the results. 57 // Populate the results.
58 out_entry->phys_addr = phys_addr + context->next_offset; 58 out_entry.phys_addr = phys_addr + context.next_offset;
59 context->next_page = page + 1; 59 context.next_page = page + 1;
60 context->next_offset += page_size; 60 context.next_offset += page_size;
61 61
62 return true; 62 return true;
63} 63}
diff --git a/src/common/page_table.h b/src/common/page_table.h
index fe254d7ae..82d91e9f3 100644
--- a/src/common/page_table.h
+++ b/src/common/page_table.h
@@ -99,9 +99,9 @@ struct PageTable {
99 PageTable(PageTable&&) noexcept = default; 99 PageTable(PageTable&&) noexcept = default;
100 PageTable& operator=(PageTable&&) noexcept = default; 100 PageTable& operator=(PageTable&&) noexcept = default;
101 101
102 bool BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context, 102 bool BeginTraversal(TraversalEntry& out_entry, TraversalContext& out_context,
103 u64 address) const; 103 u64 address) const;
104 bool ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const; 104 bool ContinueTraversal(TraversalEntry& out_entry, TraversalContext& context) const;
105 105
106 /** 106 /**
107 * Resizes the page table to be able to accommodate enough pages within 107 * Resizes the page table to be able to accommodate enough pages within
diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp
index 28cea9ab3..cbb0fedde 100644
--- a/src/core/hle/kernel/k_page_table.cpp
+++ b/src/core/hle/kernel/k_page_table.cpp
@@ -41,24 +41,6 @@ constexpr std::size_t GetAddressSpaceWidthFromType(FileSys::ProgramAddressSpaceT
41 } 41 }
42} 42}
43 43
44constexpr u64 GetAddressInRange(const KMemoryInfo& info, VAddr addr) {
45 if (info.GetAddress() < addr) {
46 return addr;
47 }
48 return info.GetAddress();
49}
50
51constexpr std::size_t GetSizeInRange(const KMemoryInfo& info, VAddr start, VAddr end) {
52 std::size_t size{info.GetSize()};
53 if (info.GetAddress() < start) {
54 size -= start - info.GetAddress();
55 }
56 if (info.GetEndAddress() > end) {
57 size -= info.GetEndAddress() - end;
58 }
59 return size;
60}
61
62} // namespace 44} // namespace
63 45
64KPageTable::KPageTable(Core::System& system_) 46KPageTable::KPageTable(Core::System& system_)
@@ -724,8 +706,7 @@ ResultCode KPageTable::UnmapPhysicalMemory(VAddr address, std::size_t size) {
724 size_t tot_size = 0; 706 size_t tot_size = 0;
725 707
726 cur_address = address; 708 cur_address = address;
727 next_valid = 709 next_valid = impl.BeginTraversal(next_entry, context, cur_address);
728 impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), cur_address);
729 next_entry.block_size = 710 next_entry.block_size =
730 (next_entry.block_size - (next_entry.phys_addr & (next_entry.block_size - 1))); 711 (next_entry.block_size - (next_entry.phys_addr & (next_entry.block_size - 1)));
731 712
@@ -751,8 +732,7 @@ ResultCode KPageTable::UnmapPhysicalMemory(VAddr address, std::size_t size) {
751 break; 732 break;
752 } 733 }
753 734
754 next_valid = 735 next_valid = impl.ContinueTraversal(next_entry, context);
755 impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context));
756 } 736 }
757 737
758 // Add the last block. 738 // Add the last block.