summaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2016-09-21 11:29:48 -0700
committerGravatar GitHub2016-09-21 11:29:48 -0700
commitd5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a (patch)
tree8a22ca73ff838f3f0090b29a548ae81087fc90ed /src/core/memory.cpp
parentREADME: Specify master branch for Travis CI badge (diff)
parentFix Travis clang-format check (diff)
downloadyuzu-d5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a.tar.gz
yuzu-d5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a.tar.xz
yuzu-d5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a.zip
Merge pull request #2086 from linkmauve/clang-format
Add clang-format as part of our {commit,travis}-time checks
Diffstat (limited to 'src/core/memory.cpp')
-rw-r--r--src/core/memory.cpp87
1 files changed, 49 insertions, 38 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 9aa8c4e5a..df029d655 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -4,17 +4,14 @@
4 4
5#include <array> 5#include <array>
6#include <cstring> 6#include <cstring>
7
8#include "common/assert.h" 7#include "common/assert.h"
9#include "common/common_types.h" 8#include "common/common_types.h"
10#include "common/logging/log.h" 9#include "common/logging/log.h"
11#include "common/swap.h" 10#include "common/swap.h"
12
13#include "core/hle/kernel/process.h" 11#include "core/hle/kernel/process.h"
14#include "core/memory.h" 12#include "core/memory.h"
15#include "core/memory_setup.h" 13#include "core/memory_setup.h"
16#include "core/mmio.h" 14#include "core/mmio.h"
17
18#include "video_core/renderer_base.h" 15#include "video_core/renderer_base.h"
19#include "video_core/video_core.h" 16#include "video_core/video_core.h"
20 17
@@ -25,11 +22,13 @@ enum class PageType {
25 Unmapped, 22 Unmapped,
26 /// Page is mapped to regular memory. This is the only type you can get pointers to. 23 /// Page is mapped to regular memory. This is the only type you can get pointers to.
27 Memory, 24 Memory,
28 /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and invalidation 25 /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
26 /// invalidation
29 RasterizerCachedMemory, 27 RasterizerCachedMemory,
30 /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions. 28 /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions.
31 Special, 29 Special,
32 /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and invalidation 30 /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and
31 /// invalidation
33 RasterizerCachedSpecial, 32 RasterizerCachedSpecial,
34}; 33};
35 34
@@ -55,7 +54,8 @@ struct PageTable {
55 std::array<u8*, NUM_ENTRIES> pointers; 54 std::array<u8*, NUM_ENTRIES> pointers;
56 55
57 /** 56 /**
58 * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of type `Special`. 57 * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of
58 * type `Special`.
59 */ 59 */
60 std::vector<SpecialRegion> special_regions; 60 std::vector<SpecialRegion> special_regions;
61 61
@@ -78,17 +78,20 @@ static PageTable main_page_table;
78static PageTable* current_page_table = &main_page_table; 78static PageTable* current_page_table = &main_page_table;
79 79
80static void MapPages(u32 base, u32 size, u8* memory, PageType type) { 80static void MapPages(u32 base, u32 size, u8* memory, PageType type) {
81 LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE, (base + size) * PAGE_SIZE); 81 LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE,
82 (base + size) * PAGE_SIZE);
82 83
83 u32 end = base + size; 84 u32 end = base + size;
84 85
85 while (base != end) { 86 while (base != end) {
86 ASSERT_MSG(base < PageTable::NUM_ENTRIES, "out of range mapping at %08X", base); 87 ASSERT_MSG(base < PageTable::NUM_ENTRIES, "out of range mapping at %08X", base);
87 88
88 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be null here 89 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
90 // null here
89 if (current_page_table->attributes[base] == PageType::RasterizerCachedMemory || 91 if (current_page_table->attributes[base] == PageType::RasterizerCachedMemory ||
90 current_page_table->attributes[base] == PageType::RasterizerCachedSpecial) { 92 current_page_table->attributes[base] == PageType::RasterizerCachedSpecial) {
91 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(base << PAGE_BITS), PAGE_SIZE); 93 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(base << PAGE_BITS),
94 PAGE_SIZE);
92 } 95 }
93 96
94 current_page_table->attributes[base] = type; 97 current_page_table->attributes[base] = type;
@@ -162,7 +165,7 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
162 return nullptr; // Should never happen 165 return nullptr; // Should never happen
163} 166}
164 167
165template<typename T> 168template <typename T>
166T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); 169T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr);
167 170
168template <typename T> 171template <typename T>
@@ -183,8 +186,7 @@ T Read(const VAddr vaddr) {
183 case PageType::Memory: 186 case PageType::Memory:
184 ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr); 187 ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr);
185 break; 188 break;
186 case PageType::RasterizerCachedMemory: 189 case PageType::RasterizerCachedMemory: {
187 {
188 RasterizerFlushRegion(VirtualToPhysicalAddress(vaddr), sizeof(T)); 190 RasterizerFlushRegion(VirtualToPhysicalAddress(vaddr), sizeof(T));
189 191
190 T value; 192 T value;
@@ -193,8 +195,7 @@ T Read(const VAddr vaddr) {
193 } 195 }
194 case PageType::Special: 196 case PageType::Special:
195 return ReadMMIO<T>(GetMMIOHandler(vaddr), vaddr); 197 return ReadMMIO<T>(GetMMIOHandler(vaddr), vaddr);
196 case PageType::RasterizerCachedSpecial: 198 case PageType::RasterizerCachedSpecial: {
197 {
198 RasterizerFlushRegion(VirtualToPhysicalAddress(vaddr), sizeof(T)); 199 RasterizerFlushRegion(VirtualToPhysicalAddress(vaddr), sizeof(T));
199 200
200 return ReadMMIO<T>(GetMMIOHandler(vaddr), vaddr); 201 return ReadMMIO<T>(GetMMIOHandler(vaddr), vaddr);
@@ -204,7 +205,7 @@ T Read(const VAddr vaddr) {
204 } 205 }
205} 206}
206 207
207template<typename T> 208template <typename T>
208void WriteMMIO(MMIORegionPointer mmio_handler, VAddr addr, const T data); 209void WriteMMIO(MMIORegionPointer mmio_handler, VAddr addr, const T data);
209 210
210template <typename T> 211template <typename T>
@@ -219,13 +220,13 @@ void Write(const VAddr vaddr, const T data) {
219 PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; 220 PageType type = current_page_table->attributes[vaddr >> PAGE_BITS];
220 switch (type) { 221 switch (type) {
221 case PageType::Unmapped: 222 case PageType::Unmapped:
222 LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32) data, vaddr); 223 LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data,
224 vaddr);
223 return; 225 return;
224 case PageType::Memory: 226 case PageType::Memory:
225 ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr); 227 ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr);
226 break; 228 break;
227 case PageType::RasterizerCachedMemory: 229 case PageType::RasterizerCachedMemory: {
228 {
229 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(vaddr), sizeof(T)); 230 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(vaddr), sizeof(T));
230 231
231 std::memcpy(GetPointerFromVMA(vaddr), &data, sizeof(T)); 232 std::memcpy(GetPointerFromVMA(vaddr), &data, sizeof(T));
@@ -234,8 +235,7 @@ void Write(const VAddr vaddr, const T data) {
234 case PageType::Special: 235 case PageType::Special:
235 WriteMMIO<T>(GetMMIOHandler(vaddr), vaddr, data); 236 WriteMMIO<T>(GetMMIOHandler(vaddr), vaddr, data);
236 break; 237 break;
237 case PageType::RasterizerCachedSpecial: 238 case PageType::RasterizerCachedSpecial: {
238 {
239 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(vaddr), sizeof(T)); 239 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(vaddr), sizeof(T));
240 240
241 WriteMMIO<T>(GetMMIOHandler(vaddr), vaddr, data); 241 WriteMMIO<T>(GetMMIOHandler(vaddr), vaddr, data);
@@ -310,7 +310,8 @@ void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) {
310 for (unsigned i = 0; i < num_pages; ++i) { 310 for (unsigned i = 0; i < num_pages; ++i) {
311 VAddr vaddr = PhysicalToVirtualAddress(paddr); 311 VAddr vaddr = PhysicalToVirtualAddress(paddr);
312 u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS]; 312 u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS];
313 ASSERT_MSG(count_delta <= UINT8_MAX - res_count, "Rasterizer resource cache counter overflow!"); 313 ASSERT_MSG(count_delta <= UINT8_MAX - res_count,
314 "Rasterizer resource cache counter overflow!");
314 ASSERT_MSG(count_delta >= -res_count, "Rasterizer resource cache counter underflow!"); 315 ASSERT_MSG(count_delta >= -res_count, "Rasterizer resource cache counter underflow!");
315 316
316 // Switch page type to cached if now cached 317 // Switch page type to cached if now cached
@@ -337,7 +338,8 @@ void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) {
337 switch (page_type) { 338 switch (page_type) {
338 case PageType::RasterizerCachedMemory: 339 case PageType::RasterizerCachedMemory:
339 page_type = PageType::Memory; 340 page_type = PageType::Memory;
340 current_page_table->pointers[vaddr >> PAGE_BITS] = GetPointerFromVMA(vaddr & ~PAGE_MASK); 341 current_page_table->pointers[vaddr >> PAGE_BITS] =
342 GetPointerFromVMA(vaddr & ~PAGE_MASK);
341 break; 343 break;
342 case PageType::RasterizerCachedSpecial: 344 case PageType::RasterizerCachedSpecial:
343 page_type = PageType::Special; 345 page_type = PageType::Special;
@@ -389,7 +391,8 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) {
389 391
390 switch (current_page_table->attributes[page_index]) { 392 switch (current_page_table->attributes[page_index]) {
391 case PageType::Unmapped: { 393 case PageType::Unmapped: {
392 LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, src_addr, size); 394 LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
395 current_vaddr, src_addr, size);
393 std::memset(dest_buffer, 0, copy_amount); 396 std::memset(dest_buffer, 0, copy_amount);
394 break; 397 break;
395 } 398 }
@@ -458,7 +461,9 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
458 461
459 switch (current_page_table->attributes[page_index]) { 462 switch (current_page_table->attributes[page_index]) {
460 case PageType::Unmapped: { 463 case PageType::Unmapped: {
461 LOG_ERROR(HW_Memory, "unmapped WriteBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, dest_addr, size); 464 LOG_ERROR(HW_Memory,
465 "unmapped WriteBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
466 current_vaddr, dest_addr, size);
462 break; 467 break;
463 } 468 }
464 case PageType::Memory: { 469 case PageType::Memory: {
@@ -475,7 +480,8 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
475 break; 480 break;
476 } 481 }
477 case PageType::RasterizerCachedMemory: { 482 case PageType::RasterizerCachedMemory: {
478 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount); 483 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr),
484 copy_amount);
479 485
480 std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount); 486 std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount);
481 break; 487 break;
@@ -483,7 +489,8 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size
483 case PageType::RasterizerCachedSpecial: { 489 case PageType::RasterizerCachedSpecial: {
484 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 490 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
485 491
486 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount); 492 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr),
493 copy_amount);
487 494
488 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount); 495 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount);
489 break; 496 break;
@@ -512,7 +519,8 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
512 519
513 switch (current_page_table->attributes[page_index]) { 520 switch (current_page_table->attributes[page_index]) {
514 case PageType::Unmapped: { 521 case PageType::Unmapped: {
515 LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, dest_addr, size); 522 LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
523 current_vaddr, dest_addr, size);
516 break; 524 break;
517 } 525 }
518 case PageType::Memory: { 526 case PageType::Memory: {
@@ -529,7 +537,8 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
529 break; 537 break;
530 } 538 }
531 case PageType::RasterizerCachedMemory: { 539 case PageType::RasterizerCachedMemory: {
532 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount); 540 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr),
541 copy_amount);
533 542
534 std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount); 543 std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount);
535 break; 544 break;
@@ -537,7 +546,8 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) {
537 case PageType::RasterizerCachedSpecial: { 546 case PageType::RasterizerCachedSpecial: {
538 DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); 547 DEBUG_ASSERT(GetMMIOHandler(current_vaddr));
539 548
540 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr), copy_amount); 549 RasterizerFlushAndInvalidateRegion(VirtualToPhysicalAddress(current_vaddr),
550 copy_amount);
541 551
542 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount); 552 GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount);
543 break; 553 break;
@@ -563,7 +573,8 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
563 573
564 switch (current_page_table->attributes[page_index]) { 574 switch (current_page_table->attributes[page_index]) {
565 case PageType::Unmapped: { 575 case PageType::Unmapped: {
566 LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, src_addr, size); 576 LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%08X (start address = 0x%08X, size = %zu)",
577 current_vaddr, src_addr, size);
567 ZeroBlock(dest_addr, copy_amount); 578 ZeroBlock(dest_addr, copy_amount);
568 break; 579 break;
569 } 580 }
@@ -609,42 +620,42 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) {
609 } 620 }
610} 621}
611 622
612template<> 623template <>
613u8 ReadMMIO<u8>(MMIORegionPointer mmio_handler, VAddr addr) { 624u8 ReadMMIO<u8>(MMIORegionPointer mmio_handler, VAddr addr) {
614 return mmio_handler->Read8(addr); 625 return mmio_handler->Read8(addr);
615} 626}
616 627
617template<> 628template <>
618u16 ReadMMIO<u16>(MMIORegionPointer mmio_handler, VAddr addr) { 629u16 ReadMMIO<u16>(MMIORegionPointer mmio_handler, VAddr addr) {
619 return mmio_handler->Read16(addr); 630 return mmio_handler->Read16(addr);
620} 631}
621 632
622template<> 633template <>
623u32 ReadMMIO<u32>(MMIORegionPointer mmio_handler, VAddr addr) { 634u32 ReadMMIO<u32>(MMIORegionPointer mmio_handler, VAddr addr) {
624 return mmio_handler->Read32(addr); 635 return mmio_handler->Read32(addr);
625} 636}
626 637
627template<> 638template <>
628u64 ReadMMIO<u64>(MMIORegionPointer mmio_handler, VAddr addr) { 639u64 ReadMMIO<u64>(MMIORegionPointer mmio_handler, VAddr addr) {
629 return mmio_handler->Read64(addr); 640 return mmio_handler->Read64(addr);
630} 641}
631 642
632template<> 643template <>
633void WriteMMIO<u8>(MMIORegionPointer mmio_handler, VAddr addr, const u8 data) { 644void WriteMMIO<u8>(MMIORegionPointer mmio_handler, VAddr addr, const u8 data) {
634 mmio_handler->Write8(addr, data); 645 mmio_handler->Write8(addr, data);
635} 646}
636 647
637template<> 648template <>
638void WriteMMIO<u16>(MMIORegionPointer mmio_handler, VAddr addr, const u16 data) { 649void WriteMMIO<u16>(MMIORegionPointer mmio_handler, VAddr addr, const u16 data) {
639 mmio_handler->Write16(addr, data); 650 mmio_handler->Write16(addr, data);
640} 651}
641 652
642template<> 653template <>
643void WriteMMIO<u32>(MMIORegionPointer mmio_handler, VAddr addr, const u32 data) { 654void WriteMMIO<u32>(MMIORegionPointer mmio_handler, VAddr addr, const u32 data) {
644 mmio_handler->Write32(addr, data); 655 mmio_handler->Write32(addr, data);
645} 656}
646 657
647template<> 658template <>
648void WriteMMIO<u64>(MMIORegionPointer mmio_handler, VAddr addr, const u64 data) { 659void WriteMMIO<u64>(MMIORegionPointer mmio_handler, VAddr addr, const u64 data) {
649 mmio_handler->Write64(addr, data); 660 mmio_handler->Write64(addr, data);
650} 661}