summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2017-09-29 19:38:54 -0500
committerGravatar Subv2017-10-01 14:18:36 -0500
commit811c01e5fec3a1cc7a6faf5eaed11d1aaef31768 (patch)
tree870664eab7fc616bbb674f7d9a70570aabdd43a3 /src
parentKernel/Thread: Added a helper function to get a thread's command buffer VAddr. (diff)
downloadyuzu-811c01e5fec3a1cc7a6faf5eaed11d1aaef31768.tar.gz
yuzu-811c01e5fec3a1cc7a6faf5eaed11d1aaef31768.tar.xz
yuzu-811c01e5fec3a1cc7a6faf5eaed11d1aaef31768.zip
Memory: Make ReadBlock take a Process parameter on which to operate
Diffstat (limited to 'src')
-rw-r--r--src/core/memory.cpp40
-rw-r--r--src/core/memory.h2
2 files changed, 30 insertions, 12 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 847e69710..da97038c6 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -82,10 +82,10 @@ void UnmapRegion(PageTable& page_table, VAddr base, u32 size) {
82 * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned) 82 * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
83 * using a VMA from the current process 83 * using a VMA from the current process
84 */ 84 */
85static u8* GetPointerFromVMA(VAddr vaddr) { 85static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) {
86 u8* direct_pointer = nullptr; 86 u8* direct_pointer = nullptr;
87 87
88 auto& vm_manager = Kernel::g_current_process->vm_manager; 88 auto& vm_manager = process.vm_manager;
89 89
90 auto it = vm_manager.FindVMA(vaddr); 90 auto it = vm_manager.FindVMA(vaddr);
91 ASSERT(it != vm_manager.vma_map.end()); 91 ASSERT(it != vm_manager.vma_map.end());
@@ -108,6 +108,14 @@ static u8* GetPointerFromVMA(VAddr vaddr) {
108} 108}
109 109
110/** 110/**
111 * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned)
112 * using a VMA from the current process.
113 */
114static u8* GetPointerFromVMA(VAddr vaddr) {
115 return GetPointerFromVMA(*Kernel::g_current_process, vaddr);
116}
117
118/**
111 * This function should only be called for virtual addreses with attribute `PageType::Special`. 119 * This function should only be called for virtual addreses with attribute `PageType::Special`.
112 */ 120 */
113static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) { 121static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) {
@@ -470,7 +478,10 @@ u64 Read64(const VAddr addr) {
470 return Read<u64_le>(addr); 478 return Read<u64_le>(addr);
471} 479}
472 480
473void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) { 481void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
482 const size_t size) {
483 auto& page_table = process.vm_manager.page_table;
484
474 size_t remaining_size = size; 485 size_t remaining_size = size;
475 size_t page_index = src_addr >> PAGE_BITS; 486 size_t page_index = src_addr >> PAGE_BITS;
476 size_t page_offset = src_addr & PAGE_MASK; 487 size_t page_offset = src_addr & PAGE_MASK;
@@ -479,7 +490,7 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
479 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); 490 const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size);
480 const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset); 491 const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset);
481 492
482 switch (current_page_table->attributes[page_index]) { 493 switch (page_table.attributes[page_index]) {
483 case PageType::Unmapped: { 494 case PageType::Unmapped: {
484 LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)", 495 LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
485 current_vaddr, src_addr, size); 496 current_vaddr, src_addr, size);
@@ -487,29 +498,30 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
487 break; 498 break;
488 } 499 }
489 case PageType::Memory: { 500 case PageType::Memory: {
490 DEBUG_ASSERT(current_page_table->pointers[page_index]); 501 DEBUG_ASSERT(page_table.pointers[page_index]);
491 502
492 const u8* src_ptr = current_page_table->pointers[page_index] + page_offset; 503 const u8* src_ptr = page_table.pointers[page_index] + page_offset;
493 std::memcpy(dest_buffer, src_ptr, copy_amount); 504 std::memcpy(dest_buffer, src_ptr, copy_amount);
494 break; 505 break;
495 } 506 }
496 case PageType::Special: { 507 case PageType::Special: {
497 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 508 MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
498 509 DEBUG_ASSERT(handler);
499 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); 510 handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
500 break; 511 break;
501 } 512 }
502 case PageType::RasterizerCachedMemory: { 513 case PageType::RasterizerCachedMemory: {
503 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), 514 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
504 FlushMode::Flush); 515 FlushMode::Flush);
505 std::memcpy(dest_buffer, GetPointerFromVMA(current_vaddr), copy_amount); 516 std::memcpy(dest_buffer, GetPointerFromVMA(process, current_vaddr), copy_amount);
506 break; 517 break;
507 } 518 }
508 case PageType::RasterizerCachedSpecial: { 519 case PageType::RasterizerCachedSpecial: {
509 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 520 MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr);
521 DEBUG_ASSERT(handler);
510 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), 522 RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount),
511 FlushMode::Flush); 523 FlushMode::Flush);
512 GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); 524 handler->ReadBlock(current_vaddr, dest_buffer, copy_amount);
513 break; 525 break;
514 } 526 }
515 default: 527 default:
@@ -523,6 +535,10 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
523 } 535 }
524} 536}
525 537
538void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
539 ReadBlock(*Kernel::g_current_process, src_addr, dest_buffer, size);
540}
541
526void Write8(const VAddr addr, const u8 data) { 542void Write8(const VAddr addr, const u8 data) {
527 Write<u8>(addr, data); 543 Write<u8>(addr, data);
528} 544}
diff --git a/src/core/memory.h b/src/core/memory.h
index 347c08c78..5d4eb56a9 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -205,6 +205,8 @@ void Write16(VAddr addr, u16 data);
205void Write32(VAddr addr, u32 data); 205void Write32(VAddr addr, u32 data);
206void Write64(VAddr addr, u64 data); 206void Write64(VAddr addr, u64 data);
207 207
208void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer,
209 size_t size);
208void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size); 210void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size);
209void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size); 211void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size);
210void ZeroBlock(const VAddr dest_addr, const size_t size); 212void ZeroBlock(const VAddr dest_addr, const size_t size);