summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2019-07-05 21:49:11 -0400
committerGravatar Lioncash2019-07-05 21:57:31 -0400
commit313cc36fecbcc0fd55ee9c81776071b62326b7e2 (patch)
tree10c17025be76e5413519a3f757bcee80fb41c737 /src
parentMerge pull request #2601 from FernandoS27/texture_cache (diff)
downloadyuzu-313cc36fecbcc0fd55ee9c81776071b62326b7e2.tar.gz
yuzu-313cc36fecbcc0fd55ee9c81776071b62326b7e2.tar.xz
yuzu-313cc36fecbcc0fd55ee9c81776071b62326b7e2.zip
kernel/vm_manager: Handle stack/TLS IO region placement better
Handles the placement of the stack a little nicer compared to the previous code, which was off in a few ways. e.g. The stack (new map) region, shouldn't be the width of the entire address space if the size of the region calculation ends up being zero. It should be placed at the same location as the TLS IO region and also have the same size. In the event the TLS IO region contains a size of zero, we should also be doing the same thing. This fixes our memory layout a little bit and also resolves some cases where assertions can trigger due to the memory layout being incorrect.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/vm_manager.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index 3df5ccb7f..568f49c3f 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -628,6 +628,8 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty
628 u64 new_map_region_size = 0; 628 u64 new_map_region_size = 0;
629 u64 tls_io_region_size = 0; 629 u64 tls_io_region_size = 0;
630 630
631 u64 stack_and_tls_io_end = 0;
632
631 switch (type) { 633 switch (type) {
632 case FileSys::ProgramAddressSpaceType::Is32Bit: 634 case FileSys::ProgramAddressSpaceType::Is32Bit:
633 case FileSys::ProgramAddressSpaceType::Is32BitNoMap: 635 case FileSys::ProgramAddressSpaceType::Is32BitNoMap:
@@ -643,6 +645,7 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty
643 map_region_size = 0; 645 map_region_size = 0;
644 heap_region_size = 0x80000000; 646 heap_region_size = 0x80000000;
645 } 647 }
648 stack_and_tls_io_end = 0x40000000;
646 break; 649 break;
647 case FileSys::ProgramAddressSpaceType::Is36Bit: 650 case FileSys::ProgramAddressSpaceType::Is36Bit:
648 address_space_width = 36; 651 address_space_width = 36;
@@ -652,6 +655,7 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty
652 aslr_region_end = aslr_region_base + 0xFF8000000; 655 aslr_region_end = aslr_region_base + 0xFF8000000;
653 map_region_size = 0x180000000; 656 map_region_size = 0x180000000;
654 heap_region_size = 0x180000000; 657 heap_region_size = 0x180000000;
658 stack_and_tls_io_end = 0x80000000;
655 break; 659 break;
656 case FileSys::ProgramAddressSpaceType::Is39Bit: 660 case FileSys::ProgramAddressSpaceType::Is39Bit:
657 address_space_width = 39; 661 address_space_width = 39;
@@ -669,6 +673,8 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty
669 return; 673 return;
670 } 674 }
671 675
676 const u64 stack_and_tls_io_begin = aslr_region_base;
677
672 address_space_base = 0; 678 address_space_base = 0;
673 address_space_end = 1ULL << address_space_width; 679 address_space_end = 1ULL << address_space_width;
674 680
@@ -686,8 +692,13 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty
686 tls_io_region_end = tls_io_region_base + tls_io_region_size; 692 tls_io_region_end = tls_io_region_base + tls_io_region_size;
687 693
688 if (new_map_region_size == 0) { 694 if (new_map_region_size == 0) {
689 new_map_region_base = address_space_base; 695 new_map_region_base = stack_and_tls_io_begin;
690 new_map_region_end = address_space_end; 696 new_map_region_end = stack_and_tls_io_end;
697 }
698
699 if (tls_io_region_size == 0) {
700 tls_io_region_base = stack_and_tls_io_begin;
701 tls_io_region_end = stack_and_tls_io_end;
691 } 702 }
692} 703}
693 704