diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 20 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 45 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 20 |
3 files changed, 48 insertions, 37 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index de6363ff2..332573a95 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -98,9 +98,9 @@ ResultCode MapUnmapMemorySanityChecks(const VMManager& vm_manager, VAddr dst_add | |||
| 98 | return ERR_INVALID_ADDRESS_STATE; | 98 | return ERR_INVALID_ADDRESS_STATE; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | if (!vm_manager.IsWithinNewMapRegion(dst_addr, size)) { | 101 | if (!vm_manager.IsWithinStackRegion(dst_addr, size)) { |
| 102 | LOG_ERROR(Kernel_SVC, | 102 | LOG_ERROR(Kernel_SVC, |
| 103 | "Destination is not within the new map region, addr=0x{:016X}, size=0x{:016X}", | 103 | "Destination is not within the stack region, addr=0x{:016X}, size=0x{:016X}", |
| 104 | dst_addr, size); | 104 | dst_addr, size); |
| 105 | return ERR_INVALID_MEMORY_RANGE; | 105 | return ERR_INVALID_MEMORY_RANGE; |
| 106 | } | 106 | } |
| @@ -726,8 +726,8 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, u64 ha | |||
| 726 | // 2.0.0+ | 726 | // 2.0.0+ |
| 727 | ASLRRegionBaseAddr = 12, | 727 | ASLRRegionBaseAddr = 12, |
| 728 | ASLRRegionSize = 13, | 728 | ASLRRegionSize = 13, |
| 729 | NewMapRegionBaseAddr = 14, | 729 | StackRegionBaseAddr = 14, |
| 730 | NewMapRegionSize = 15, | 730 | StackRegionSize = 15, |
| 731 | // 3.0.0+ | 731 | // 3.0.0+ |
| 732 | IsVirtualAddressMemoryEnabled = 16, | 732 | IsVirtualAddressMemoryEnabled = 16, |
| 733 | PersonalMmHeapUsage = 17, | 733 | PersonalMmHeapUsage = 17, |
| @@ -752,8 +752,8 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, u64 ha | |||
| 752 | case GetInfoType::HeapRegionSize: | 752 | case GetInfoType::HeapRegionSize: |
| 753 | case GetInfoType::ASLRRegionBaseAddr: | 753 | case GetInfoType::ASLRRegionBaseAddr: |
| 754 | case GetInfoType::ASLRRegionSize: | 754 | case GetInfoType::ASLRRegionSize: |
| 755 | case GetInfoType::NewMapRegionBaseAddr: | 755 | case GetInfoType::StackRegionBaseAddr: |
| 756 | case GetInfoType::NewMapRegionSize: | 756 | case GetInfoType::StackRegionSize: |
| 757 | case GetInfoType::TotalPhysicalMemoryAvailable: | 757 | case GetInfoType::TotalPhysicalMemoryAvailable: |
| 758 | case GetInfoType::TotalPhysicalMemoryUsed: | 758 | case GetInfoType::TotalPhysicalMemoryUsed: |
| 759 | case GetInfoType::IsVirtualAddressMemoryEnabled: | 759 | case GetInfoType::IsVirtualAddressMemoryEnabled: |
| @@ -806,12 +806,12 @@ static ResultCode GetInfo(Core::System& system, u64* result, u64 info_id, u64 ha | |||
| 806 | *result = process->VMManager().GetASLRRegionSize(); | 806 | *result = process->VMManager().GetASLRRegionSize(); |
| 807 | return RESULT_SUCCESS; | 807 | return RESULT_SUCCESS; |
| 808 | 808 | ||
| 809 | case GetInfoType::NewMapRegionBaseAddr: | 809 | case GetInfoType::StackRegionBaseAddr: |
| 810 | *result = process->VMManager().GetNewMapRegionBaseAddress(); | 810 | *result = process->VMManager().GetStackRegionBaseAddress(); |
| 811 | return RESULT_SUCCESS; | 811 | return RESULT_SUCCESS; |
| 812 | 812 | ||
| 813 | case GetInfoType::NewMapRegionSize: | 813 | case GetInfoType::StackRegionSize: |
| 814 | *result = process->VMManager().GetNewMapRegionSize(); | 814 | *result = process->VMManager().GetStackRegionSize(); |
| 815 | return RESULT_SUCCESS; | 815 | return RESULT_SUCCESS; |
| 816 | 816 | ||
| 817 | case GetInfoType::TotalPhysicalMemoryAvailable: | 817 | case GetInfoType::TotalPhysicalMemoryAvailable: |
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index 3df5ccb7f..501544090 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp | |||
| @@ -625,9 +625,11 @@ void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) { | |||
| 625 | void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType type) { | 625 | void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType type) { |
| 626 | u64 map_region_size = 0; | 626 | u64 map_region_size = 0; |
| 627 | u64 heap_region_size = 0; | 627 | u64 heap_region_size = 0; |
| 628 | u64 new_map_region_size = 0; | 628 | u64 stack_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; |
| @@ -661,7 +665,7 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty | |||
| 661 | aslr_region_end = aslr_region_base + 0x7FF8000000; | 665 | aslr_region_end = aslr_region_base + 0x7FF8000000; |
| 662 | map_region_size = 0x1000000000; | 666 | map_region_size = 0x1000000000; |
| 663 | heap_region_size = 0x180000000; | 667 | heap_region_size = 0x180000000; |
| 664 | new_map_region_size = 0x80000000; | 668 | stack_region_size = 0x80000000; |
| 665 | tls_io_region_size = 0x1000000000; | 669 | tls_io_region_size = 0x1000000000; |
| 666 | break; | 670 | break; |
| 667 | default: | 671 | default: |
| @@ -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 | ||
| @@ -679,15 +685,20 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty | |||
| 679 | heap_region_end = heap_region_base + heap_region_size; | 685 | heap_region_end = heap_region_base + heap_region_size; |
| 680 | heap_end = heap_region_base; | 686 | heap_end = heap_region_base; |
| 681 | 687 | ||
| 682 | new_map_region_base = heap_region_end; | 688 | stack_region_base = heap_region_end; |
| 683 | new_map_region_end = new_map_region_base + new_map_region_size; | 689 | stack_region_end = stack_region_base + stack_region_size; |
| 684 | 690 | ||
| 685 | tls_io_region_base = new_map_region_end; | 691 | tls_io_region_base = stack_region_end; |
| 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 (stack_region_size == 0) { |
| 689 | new_map_region_base = address_space_base; | 695 | stack_region_base = stack_and_tls_io_begin; |
| 690 | new_map_region_end = address_space_end; | 696 | stack_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 | ||
| @@ -879,21 +890,21 @@ bool VMManager::IsWithinMapRegion(VAddr address, u64 size) const { | |||
| 879 | return IsInsideAddressRange(address, size, GetMapRegionBaseAddress(), GetMapRegionEndAddress()); | 890 | return IsInsideAddressRange(address, size, GetMapRegionBaseAddress(), GetMapRegionEndAddress()); |
| 880 | } | 891 | } |
| 881 | 892 | ||
| 882 | VAddr VMManager::GetNewMapRegionBaseAddress() const { | 893 | VAddr VMManager::GetStackRegionBaseAddress() const { |
| 883 | return new_map_region_base; | 894 | return stack_region_base; |
| 884 | } | 895 | } |
| 885 | 896 | ||
| 886 | VAddr VMManager::GetNewMapRegionEndAddress() const { | 897 | VAddr VMManager::GetStackRegionEndAddress() const { |
| 887 | return new_map_region_end; | 898 | return stack_region_end; |
| 888 | } | 899 | } |
| 889 | 900 | ||
| 890 | u64 VMManager::GetNewMapRegionSize() const { | 901 | u64 VMManager::GetStackRegionSize() const { |
| 891 | return new_map_region_end - new_map_region_base; | 902 | return stack_region_end - stack_region_base; |
| 892 | } | 903 | } |
| 893 | 904 | ||
| 894 | bool VMManager::IsWithinNewMapRegion(VAddr address, u64 size) const { | 905 | bool VMManager::IsWithinStackRegion(VAddr address, u64 size) const { |
| 895 | return IsInsideAddressRange(address, size, GetNewMapRegionBaseAddress(), | 906 | return IsInsideAddressRange(address, size, GetStackRegionBaseAddress(), |
| 896 | GetNewMapRegionEndAddress()); | 907 | GetStackRegionEndAddress()); |
| 897 | } | 908 | } |
| 898 | 909 | ||
| 899 | VAddr VMManager::GetTLSIORegionBaseAddress() const { | 910 | VAddr VMManager::GetTLSIORegionBaseAddress() const { |
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 752ae62f9..9fe6ac3f4 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h | |||
| @@ -596,17 +596,17 @@ public: | |||
| 596 | /// Determines whether or not the specified range is within the map region. | 596 | /// Determines whether or not the specified range is within the map region. |
| 597 | bool IsWithinMapRegion(VAddr address, u64 size) const; | 597 | bool IsWithinMapRegion(VAddr address, u64 size) const; |
| 598 | 598 | ||
| 599 | /// Gets the base address of the new map region. | 599 | /// Gets the base address of the stack region. |
| 600 | VAddr GetNewMapRegionBaseAddress() const; | 600 | VAddr GetStackRegionBaseAddress() const; |
| 601 | 601 | ||
| 602 | /// Gets the end address of the new map region. | 602 | /// Gets the end address of the stack region. |
| 603 | VAddr GetNewMapRegionEndAddress() const; | 603 | VAddr GetStackRegionEndAddress() const; |
| 604 | 604 | ||
| 605 | /// Gets the total size of the new map region in bytes. | 605 | /// Gets the total size of the stack region in bytes. |
| 606 | u64 GetNewMapRegionSize() const; | 606 | u64 GetStackRegionSize() const; |
| 607 | 607 | ||
| 608 | /// Determines whether or not the given address range is within the new map region | 608 | /// Determines whether or not the given address range is within the stack region |
| 609 | bool IsWithinNewMapRegion(VAddr address, u64 size) const; | 609 | bool IsWithinStackRegion(VAddr address, u64 size) const; |
| 610 | 610 | ||
| 611 | /// Gets the base address of the TLS IO region. | 611 | /// Gets the base address of the TLS IO region. |
| 612 | VAddr GetTLSIORegionBaseAddress() const; | 612 | VAddr GetTLSIORegionBaseAddress() const; |
| @@ -726,8 +726,8 @@ private: | |||
| 726 | VAddr map_region_base = 0; | 726 | VAddr map_region_base = 0; |
| 727 | VAddr map_region_end = 0; | 727 | VAddr map_region_end = 0; |
| 728 | 728 | ||
| 729 | VAddr new_map_region_base = 0; | 729 | VAddr stack_region_base = 0; |
| 730 | VAddr new_map_region_end = 0; | 730 | VAddr stack_region_end = 0; |
| 731 | 731 | ||
| 732 | VAddr tls_io_region_base = 0; | 732 | VAddr tls_io_region_base = 0; |
| 733 | VAddr tls_io_region_end = 0; | 733 | VAddr tls_io_region_end = 0; |