diff options
| author | 2017-09-26 17:27:44 -0500 | |
|---|---|---|
| committer | 2017-09-26 17:27:44 -0500 | |
| commit | 35da7f57efd5153be37a05ffcbb57412da74265a (patch) | |
| tree | 94e5c1b2719be32d6a6768ba472025335d6235b2 /src | |
| parent | Merge pull request #2958 from Subv/audio_buffer_datatype (diff) | |
| download | yuzu-35da7f57efd5153be37a05ffcbb57412da74265a.tar.gz yuzu-35da7f57efd5153be37a05ffcbb57412da74265a.tar.xz yuzu-35da7f57efd5153be37a05ffcbb57412da74265a.zip | |
Memory: Allow IsValidVirtualAddress to be called with a specific process parameter.
There is still an overload of IsValidVirtualAddress that only takes the VAddr and will default to the current process.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/memory.cpp | 25 | ||||
| -rw-r--r-- | src/core/memory.h | 7 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index a6b5f6c99..c42f4326b 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -110,8 +110,8 @@ static u8* GetPointerFromVMA(VAddr vaddr) { | |||
| 110 | /** | 110 | /** |
| 111 | * This function should only be called for virtual addreses with attribute `PageType::Special`. | 111 | * This function should only be called for virtual addreses with attribute `PageType::Special`. |
| 112 | */ | 112 | */ |
| 113 | static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { | 113 | static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) { |
| 114 | for (const auto& region : current_page_table->special_regions) { | 114 | for (const auto& region : page_table.special_regions) { |
| 115 | if (vaddr >= region.base && vaddr < (region.base + region.size)) { | 115 | if (vaddr >= region.base && vaddr < (region.base + region.size)) { |
| 116 | return region.handler; | 116 | return region.handler; |
| 117 | } | 117 | } |
| @@ -120,6 +120,11 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { | |||
| 120 | return nullptr; // Should never happen | 120 | return nullptr; // Should never happen |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { | ||
| 124 | const PageTable& page_table = Kernel::g_current_process->vm_manager.page_table; | ||
| 125 | return GetMMIOHandler(page_table, vaddr); | ||
| 126 | } | ||
| 127 | |||
| 123 | template <typename T> | 128 | template <typename T> |
| 124 | T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); | 129 | T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); |
| 125 | 130 | ||
| @@ -204,18 +209,20 @@ void Write(const VAddr vaddr, const T data) { | |||
| 204 | } | 209 | } |
| 205 | } | 210 | } |
| 206 | 211 | ||
| 207 | bool IsValidVirtualAddress(const VAddr vaddr) { | 212 | bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) { |
| 208 | const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | 213 | auto& page_table = process.vm_manager.page_table; |
| 214 | |||
| 215 | const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS]; | ||
| 209 | if (page_pointer) | 216 | if (page_pointer) |
| 210 | return true; | 217 | return true; |
| 211 | 218 | ||
| 212 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory) | 219 | if (page_table.attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory) |
| 213 | return true; | 220 | return true; |
| 214 | 221 | ||
| 215 | if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special) | 222 | if (page_table.attributes[vaddr >> PAGE_BITS] != PageType::Special) |
| 216 | return false; | 223 | return false; |
| 217 | 224 | ||
| 218 | MMIORegionPointer mmio_region = GetMMIOHandler(vaddr); | 225 | MMIORegionPointer mmio_region = GetMMIOHandler(page_table, vaddr); |
| 219 | if (mmio_region) { | 226 | if (mmio_region) { |
| 220 | return mmio_region->IsValidAddress(vaddr); | 227 | return mmio_region->IsValidAddress(vaddr); |
| 221 | } | 228 | } |
| @@ -223,6 +230,10 @@ bool IsValidVirtualAddress(const VAddr vaddr) { | |||
| 223 | return false; | 230 | return false; |
| 224 | } | 231 | } |
| 225 | 232 | ||
| 233 | bool IsValidVirtualAddress(const VAddr vaddr) { | ||
| 234 | return IsValidVirtualAddress(*Kernel::g_current_process, vaddr); | ||
| 235 | } | ||
| 236 | |||
| 226 | bool IsValidPhysicalAddress(const PAddr paddr) { | 237 | bool IsValidPhysicalAddress(const PAddr paddr) { |
| 227 | return GetPhysicalPointer(paddr) != nullptr; | 238 | return GetPhysicalPointer(paddr) != nullptr; |
| 228 | } | 239 | } |
diff --git a/src/core/memory.h b/src/core/memory.h index 1865bfea0..347c08c78 100644 --- a/src/core/memory.h +++ b/src/core/memory.h | |||
| @@ -12,6 +12,10 @@ | |||
| 12 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | #include "core/mmio.h" | 13 | #include "core/mmio.h" |
| 14 | 14 | ||
| 15 | namespace Kernel { | ||
| 16 | class Process; | ||
| 17 | } | ||
| 18 | |||
| 15 | namespace Memory { | 19 | namespace Memory { |
| 16 | 20 | ||
| 17 | /** | 21 | /** |
| @@ -185,7 +189,10 @@ enum : VAddr { | |||
| 185 | void SetCurrentPageTable(PageTable* page_table); | 189 | void SetCurrentPageTable(PageTable* page_table); |
| 186 | PageTable* GetCurrentPageTable(); | 190 | PageTable* GetCurrentPageTable(); |
| 187 | 191 | ||
| 192 | /// Determines if the given VAddr is valid for the specified process. | ||
| 193 | bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr); | ||
| 188 | bool IsValidVirtualAddress(const VAddr addr); | 194 | bool IsValidVirtualAddress(const VAddr addr); |
| 195 | |||
| 189 | bool IsValidPhysicalAddress(const PAddr addr); | 196 | bool IsValidPhysicalAddress(const PAddr addr); |
| 190 | 197 | ||
| 191 | u8 Read8(VAddr addr); | 198 | u8 Read8(VAddr addr); |