diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 15 |
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 | ||