fixup! core: hle: kernel: KPageTable: Improve Un/MapPhysicalMemory.
This commit is contained in:
		| @@ -10,12 +10,12 @@ PageTable::PageTable() = default; | ||||
|  | ||||
| PageTable::~PageTable() noexcept = default; | ||||
|  | ||||
| bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context, | ||||
| bool PageTable::BeginTraversal(TraversalEntry& out_entry, TraversalContext& out_context, | ||||
|                                u64 address) const { | ||||
|     // Setup invalid defaults. | ||||
|     out_entry->phys_addr = 0; | ||||
|     out_entry->block_size = page_size; | ||||
|     out_context->next_page = 0; | ||||
|     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; | ||||
| @@ -30,20 +30,20 @@ bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_ | ||||
|     } | ||||
|  | ||||
|     // Populate the results. | ||||
|     out_entry->phys_addr = phys_addr + address; | ||||
|     out_context->next_page = page + 1; | ||||
|     out_context->next_offset = address + page_size; | ||||
|     out_entry.phys_addr = phys_addr + address; | ||||
|     out_context.next_page = page + 1; | ||||
|     out_context.next_offset = address + page_size; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const { | ||||
| bool PageTable::ContinueTraversal(TraversalEntry& out_entry, TraversalContext& context) const { | ||||
|     // Setup invalid defaults. | ||||
|     out_entry->phys_addr = 0; | ||||
|     out_entry->block_size = page_size; | ||||
|     out_entry.phys_addr = 0; | ||||
|     out_entry.block_size = page_size; | ||||
|  | ||||
|     // Validate that we can read the actual entry. | ||||
|     const auto page = context->next_page; | ||||
|     const auto page = context.next_page; | ||||
|     if (page >= backing_addr.size()) { | ||||
|         return false; | ||||
|     } | ||||
| @@ -55,9 +55,9 @@ 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; | ||||
|     out_entry.phys_addr = phys_addr + context.next_offset; | ||||
|     context.next_page = page + 1; | ||||
|     context.next_offset += page_size; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|   | ||||
| @@ -99,9 +99,9 @@ struct PageTable { | ||||
|     PageTable(PageTable&&) noexcept = default; | ||||
|     PageTable& operator=(PageTable&&) noexcept = default; | ||||
|  | ||||
|     bool BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context, | ||||
|     bool BeginTraversal(TraversalEntry& out_entry, TraversalContext& out_context, | ||||
|                         u64 address) const; | ||||
|     bool ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const; | ||||
|     bool ContinueTraversal(TraversalEntry& out_entry, TraversalContext& context) const; | ||||
|  | ||||
|     /** | ||||
|      * Resizes the page table to be able to accommodate enough pages within | ||||
|   | ||||
| @@ -41,24 +41,6 @@ constexpr std::size_t GetAddressSpaceWidthFromType(FileSys::ProgramAddressSpaceT | ||||
|     } | ||||
| } | ||||
|  | ||||
| constexpr u64 GetAddressInRange(const KMemoryInfo& info, VAddr addr) { | ||||
|     if (info.GetAddress() < addr) { | ||||
|         return addr; | ||||
|     } | ||||
|     return info.GetAddress(); | ||||
| } | ||||
|  | ||||
| constexpr std::size_t GetSizeInRange(const KMemoryInfo& info, VAddr start, VAddr end) { | ||||
|     std::size_t size{info.GetSize()}; | ||||
|     if (info.GetAddress() < start) { | ||||
|         size -= start - info.GetAddress(); | ||||
|     } | ||||
|     if (info.GetEndAddress() > end) { | ||||
|         size -= info.GetEndAddress() - end; | ||||
|     } | ||||
|     return size; | ||||
| } | ||||
|  | ||||
| } // namespace | ||||
|  | ||||
| KPageTable::KPageTable(Core::System& system_) | ||||
| @@ -724,8 +706,7 @@ ResultCode KPageTable::UnmapPhysicalMemory(VAddr address, std::size_t size) { | ||||
|         size_t tot_size = 0; | ||||
|  | ||||
|         cur_address = address; | ||||
|         next_valid = | ||||
|             impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), cur_address); | ||||
|         next_valid = impl.BeginTraversal(next_entry, context, cur_address); | ||||
|         next_entry.block_size = | ||||
|             (next_entry.block_size - (next_entry.phys_addr & (next_entry.block_size - 1))); | ||||
|  | ||||
| @@ -751,8 +732,7 @@ ResultCode KPageTable::UnmapPhysicalMemory(VAddr address, std::size_t size) { | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|             next_valid = | ||||
|                 impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); | ||||
|             next_valid = impl.ContinueTraversal(next_entry, context); | ||||
|         } | ||||
|  | ||||
|         // Add the last block. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user