summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-07-06 21:25:27 -0400
committerGravatar GitHub2019-07-06 21:25:27 -0400
commitfb9124b6cdc7366c1dc8c37523e7ff6aad783a23 (patch)
tree8263269934f2393f66725263b7f3a38c53955ae5
parentMerge pull request #2684 from SciresM/suspend_tick (diff)
parentmemory: Remove unused includes (diff)
downloadyuzu-fb9124b6cdc7366c1dc8c37523e7ff6aad783a23.tar.gz
yuzu-fb9124b6cdc7366c1dc8c37523e7ff6aad783a23.tar.xz
yuzu-fb9124b6cdc7366c1dc8c37523e7ff6aad783a23.zip
Merge pull request #2677 from lioncash/assert
kernel/vm_manager: Handle stack/TLS IO region placement a little better
-rw-r--r--src/core/hle/kernel/svc.cpp20
-rw-r--r--src/core/hle/kernel/vm_manager.cpp45
-rw-r--r--src/core/hle/kernel/vm_manager.h20
-rw-r--r--src/core/memory.cpp2
-rw-r--r--src/core/memory.h4
5 files changed, 48 insertions, 43 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) {
625void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType type) { 625void 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
882VAddr VMManager::GetNewMapRegionBaseAddress() const { 893VAddr VMManager::GetStackRegionBaseAddress() const {
883 return new_map_region_base; 894 return stack_region_base;
884} 895}
885 896
886VAddr VMManager::GetNewMapRegionEndAddress() const { 897VAddr VMManager::GetStackRegionEndAddress() const {
887 return new_map_region_end; 898 return stack_region_end;
888} 899}
889 900
890u64 VMManager::GetNewMapRegionSize() const { 901u64 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
894bool VMManager::IsWithinNewMapRegion(VAddr address, u64 size) const { 905bool 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
899VAddr VMManager::GetTLSIORegionBaseAddress() const { 910VAddr 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;
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index f18f6226b..8555691c0 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -16,11 +16,9 @@
16#include "core/core.h" 16#include "core/core.h"
17#include "core/hle/kernel/process.h" 17#include "core/hle/kernel/process.h"
18#include "core/hle/kernel/vm_manager.h" 18#include "core/hle/kernel/vm_manager.h"
19#include "core/hle/lock.h"
20#include "core/memory.h" 19#include "core/memory.h"
21#include "core/memory_setup.h" 20#include "core/memory_setup.h"
22#include "video_core/gpu.h" 21#include "video_core/gpu.h"
23#include "video_core/renderer_base.h"
24 22
25namespace Memory { 23namespace Memory {
26 24
diff --git a/src/core/memory.h b/src/core/memory.h
index 04e2c5f1d..09008e1dd 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -8,10 +8,6 @@
8#include <string> 8#include <string>
9#include "common/common_types.h" 9#include "common/common_types.h"
10 10
11namespace Common {
12struct PageTable;
13}
14
15namespace Kernel { 11namespace Kernel {
16class Process; 12class Process;
17} 13}