diff options
| author | 2018-08-03 14:07:49 -0400 | |
|---|---|---|
| committer | 2018-08-03 14:07:49 -0400 | |
| commit | 40e63ede6d2fcb9c4a3f7a65b2bdd25a77835d94 (patch) | |
| tree | 1d81b94e3bdcce384aaa892c1d92a48d725680cf /src/core/memory.cpp | |
| parent | Merge pull request #909 from lioncash/const (diff) | |
| parent | core/memory: Get rid of 3DS leftovers (diff) | |
| download | yuzu-40e63ede6d2fcb9c4a3f7a65b2bdd25a77835d94.tar.gz yuzu-40e63ede6d2fcb9c4a3f7a65b2bdd25a77835d94.tar.xz yuzu-40e63ede6d2fcb9c4a3f7a65b2bdd25a77835d94.zip | |
Merge pull request #908 from lioncash/memory
core/memory: Get rid of 3DS leftovers
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 106 |
1 files changed, 0 insertions, 106 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index e753e3436..0d41b2527 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #include "common/swap.h" | 14 | #include "common/swap.h" |
| 15 | #include "core/arm/arm_interface.h" | 15 | #include "core/arm/arm_interface.h" |
| 16 | #include "core/core.h" | 16 | #include "core/core.h" |
| 17 | #include "core/hle/kernel/memory.h" | ||
| 18 | #include "core/hle/kernel/process.h" | 17 | #include "core/hle/kernel/process.h" |
| 19 | #include "core/hle/lock.h" | 18 | #include "core/hle/lock.h" |
| 20 | #include "core/memory.h" | 19 | #include "core/memory.h" |
| @@ -24,8 +23,6 @@ | |||
| 24 | 23 | ||
| 25 | namespace Memory { | 24 | namespace Memory { |
| 26 | 25 | ||
| 27 | static std::array<u8, Memory::VRAM_SIZE> vram; | ||
| 28 | |||
| 29 | static PageTable* current_page_table = nullptr; | 26 | static PageTable* current_page_table = nullptr; |
| 30 | 27 | ||
| 31 | void SetCurrentPageTable(PageTable* page_table) { | 28 | void SetCurrentPageTable(PageTable* page_table) { |
| @@ -242,10 +239,6 @@ bool IsKernelVirtualAddress(const VAddr vaddr) { | |||
| 242 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; | 239 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; |
| 243 | } | 240 | } |
| 244 | 241 | ||
| 245 | bool IsValidPhysicalAddress(const PAddr paddr) { | ||
| 246 | return GetPhysicalPointer(paddr) != nullptr; | ||
| 247 | } | ||
| 248 | |||
| 249 | u8* GetPointer(const VAddr vaddr) { | 242 | u8* GetPointer(const VAddr vaddr) { |
| 250 | u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | 243 | u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; |
| 251 | if (page_pointer) { | 244 | if (page_pointer) { |
| @@ -274,61 +267,6 @@ std::string ReadCString(VAddr vaddr, std::size_t max_length) { | |||
| 274 | return string; | 267 | return string; |
| 275 | } | 268 | } |
| 276 | 269 | ||
| 277 | u8* GetPhysicalPointer(PAddr address) { | ||
| 278 | struct MemoryArea { | ||
| 279 | PAddr paddr_base; | ||
| 280 | u32 size; | ||
| 281 | }; | ||
| 282 | |||
| 283 | static constexpr MemoryArea memory_areas[] = { | ||
| 284 | {VRAM_PADDR, VRAM_SIZE}, | ||
| 285 | {IO_AREA_PADDR, IO_AREA_SIZE}, | ||
| 286 | {DSP_RAM_PADDR, DSP_RAM_SIZE}, | ||
| 287 | {FCRAM_PADDR, FCRAM_N3DS_SIZE}, | ||
| 288 | }; | ||
| 289 | |||
| 290 | const auto area = | ||
| 291 | std::find_if(std::begin(memory_areas), std::end(memory_areas), [&](const auto& area) { | ||
| 292 | return address >= area.paddr_base && address < area.paddr_base + area.size; | ||
| 293 | }); | ||
| 294 | |||
| 295 | if (area == std::end(memory_areas)) { | ||
| 296 | LOG_ERROR(HW_Memory, "Unknown GetPhysicalPointer @ 0x{:016X}", address); | ||
| 297 | return nullptr; | ||
| 298 | } | ||
| 299 | |||
| 300 | if (area->paddr_base == IO_AREA_PADDR) { | ||
| 301 | LOG_ERROR(HW_Memory, "MMIO mappings are not supported yet. phys_addr={:016X}", address); | ||
| 302 | return nullptr; | ||
| 303 | } | ||
| 304 | |||
| 305 | u64 offset_into_region = address - area->paddr_base; | ||
| 306 | |||
| 307 | u8* target_pointer = nullptr; | ||
| 308 | switch (area->paddr_base) { | ||
| 309 | case VRAM_PADDR: | ||
| 310 | target_pointer = vram.data() + offset_into_region; | ||
| 311 | break; | ||
| 312 | case DSP_RAM_PADDR: | ||
| 313 | break; | ||
| 314 | case FCRAM_PADDR: | ||
| 315 | for (const auto& region : Kernel::memory_regions) { | ||
| 316 | if (offset_into_region >= region.base && | ||
| 317 | offset_into_region < region.base + region.size) { | ||
| 318 | target_pointer = | ||
| 319 | region.linear_heap_memory->data() + offset_into_region - region.base; | ||
| 320 | break; | ||
| 321 | } | ||
| 322 | } | ||
| 323 | ASSERT_MSG(target_pointer != nullptr, "Invalid FCRAM address"); | ||
| 324 | break; | ||
| 325 | default: | ||
| 326 | UNREACHABLE(); | ||
| 327 | } | ||
| 328 | |||
| 329 | return target_pointer; | ||
| 330 | } | ||
| 331 | |||
| 332 | void RasterizerMarkRegionCached(Tegra::GPUVAddr gpu_addr, u64 size, bool cached) { | 270 | void RasterizerMarkRegionCached(Tegra::GPUVAddr gpu_addr, u64 size, bool cached) { |
| 333 | if (gpu_addr == 0) { | 271 | if (gpu_addr == 0) { |
| 334 | return; | 272 | return; |
| @@ -666,48 +604,4 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, size_t size) { | |||
| 666 | CopyBlock(*Core::CurrentProcess(), dest_addr, src_addr, size); | 604 | CopyBlock(*Core::CurrentProcess(), dest_addr, src_addr, size); |
| 667 | } | 605 | } |
| 668 | 606 | ||
| 669 | boost::optional<PAddr> TryVirtualToPhysicalAddress(const VAddr addr) { | ||
| 670 | if (addr == 0) { | ||
| 671 | return 0; | ||
| 672 | } else if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) { | ||
| 673 | return addr - VRAM_VADDR + VRAM_PADDR; | ||
| 674 | } else if (addr >= LINEAR_HEAP_VADDR && addr < LINEAR_HEAP_VADDR_END) { | ||
| 675 | return addr - LINEAR_HEAP_VADDR + FCRAM_PADDR; | ||
| 676 | } else if (addr >= NEW_LINEAR_HEAP_VADDR && addr < NEW_LINEAR_HEAP_VADDR_END) { | ||
| 677 | return addr - NEW_LINEAR_HEAP_VADDR + FCRAM_PADDR; | ||
| 678 | } else if (addr >= DSP_RAM_VADDR && addr < DSP_RAM_VADDR_END) { | ||
| 679 | return addr - DSP_RAM_VADDR + DSP_RAM_PADDR; | ||
| 680 | } else if (addr >= IO_AREA_VADDR && addr < IO_AREA_VADDR_END) { | ||
| 681 | return addr - IO_AREA_VADDR + IO_AREA_PADDR; | ||
| 682 | } | ||
| 683 | |||
| 684 | return boost::none; | ||
| 685 | } | ||
| 686 | |||
| 687 | PAddr VirtualToPhysicalAddress(const VAddr addr) { | ||
| 688 | auto paddr = TryVirtualToPhysicalAddress(addr); | ||
| 689 | if (!paddr) { | ||
| 690 | LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x{:016X}", addr); | ||
| 691 | // To help with debugging, set bit on address so that it's obviously invalid. | ||
| 692 | return addr | 0x80000000; | ||
| 693 | } | ||
| 694 | return *paddr; | ||
| 695 | } | ||
| 696 | |||
| 697 | boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) { | ||
| 698 | if (addr == 0) { | ||
| 699 | return 0; | ||
| 700 | } else if (addr >= VRAM_PADDR && addr < VRAM_PADDR_END) { | ||
| 701 | return addr - VRAM_PADDR + VRAM_VADDR; | ||
| 702 | } else if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) { | ||
| 703 | return addr - FCRAM_PADDR + Core::CurrentProcess()->GetLinearHeapAreaAddress(); | ||
| 704 | } else if (addr >= DSP_RAM_PADDR && addr < DSP_RAM_PADDR_END) { | ||
| 705 | return addr - DSP_RAM_PADDR + DSP_RAM_VADDR; | ||
| 706 | } else if (addr >= IO_AREA_PADDR && addr < IO_AREA_PADDR_END) { | ||
| 707 | return addr - IO_AREA_PADDR + IO_AREA_VADDR; | ||
| 708 | } | ||
| 709 | |||
| 710 | return boost::none; | ||
| 711 | } | ||
| 712 | |||
| 713 | } // namespace Memory | 607 | } // namespace Memory |