Sfoglia il codice sorgente

Merge pull request #1498 from lioncash/aslr

svc: Clarify enum values for AddressSpaceBaseAddr and AddressSpaceSize in svcGetInfo()
bunnei 7 anni fa
parent
commit
6e8752881c

+ 4 - 17
src/core/hle/kernel/svc.cpp

@@ -448,25 +448,12 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
     case GetInfoType::RandomEntropy:
     case GetInfoType::RandomEntropy:
         *result = 0;
         *result = 0;
         break;
         break;
-    case GetInfoType::AddressSpaceBaseAddr:
-        *result = vm_manager.GetCodeRegionBaseAddress();
+    case GetInfoType::ASLRRegionBaseAddr:
+        *result = vm_manager.GetASLRRegionBaseAddress();
         break;
         break;
-    case GetInfoType::AddressSpaceSize: {
-        const u64 width = vm_manager.GetAddressSpaceWidth();
-
-        switch (width) {
-        case 32:
-            *result = 0xFFE00000;
-            break;
-        case 36:
-            *result = 0xFF8000000;
-            break;
-        case 39:
-            *result = 0x7FF8000000;
-            break;
-        }
+    case GetInfoType::ASLRRegionSize:
+        *result = vm_manager.GetASLRRegionSize();
         break;
         break;
-    }
     case GetInfoType::NewMapRegionBaseAddr:
     case GetInfoType::NewMapRegionBaseAddr:
         *result = vm_manager.GetNewMapRegionBaseAddress();
         *result = vm_manager.GetNewMapRegionBaseAddress();
         break;
         break;

+ 2 - 2
src/core/hle/kernel/svc.h

@@ -41,8 +41,8 @@ enum class GetInfoType : u64 {
     RandomEntropy = 11,
     RandomEntropy = 11,
     PerformanceCounter = 0xF0000002,
     PerformanceCounter = 0xF0000002,
     // 2.0.0+
     // 2.0.0+
-    AddressSpaceBaseAddr = 12,
-    AddressSpaceSize = 13,
+    ASLRRegionBaseAddr = 12,
+    ASLRRegionSize = 13,
     NewMapRegionBaseAddr = 14,
     NewMapRegionBaseAddr = 14,
     NewMapRegionSize = 15,
     NewMapRegionSize = 15,
     // 3.0.0+
     // 3.0.0+

+ 26 - 9
src/core/hle/kernel/vm_manager.cpp

@@ -393,30 +393,35 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty
 
 
     switch (type) {
     switch (type) {
     case FileSys::ProgramAddressSpaceType::Is32Bit:
     case FileSys::ProgramAddressSpaceType::Is32Bit:
+    case FileSys::ProgramAddressSpaceType::Is32BitNoMap:
         address_space_width = 32;
         address_space_width = 32;
         code_region_base = 0x200000;
         code_region_base = 0x200000;
         code_region_end = code_region_base + 0x3FE00000;
         code_region_end = code_region_base + 0x3FE00000;
-        map_region_size = 0x40000000;
-        heap_region_size = 0x40000000;
+        aslr_region_base = 0x200000;
+        aslr_region_end = aslr_region_base + 0xFFE00000;
+        if (type == FileSys::ProgramAddressSpaceType::Is32Bit) {
+            map_region_size = 0x40000000;
+            heap_region_size = 0x40000000;
+        } else {
+            map_region_size = 0;
+            heap_region_size = 0x80000000;
+        }
         break;
         break;
     case FileSys::ProgramAddressSpaceType::Is36Bit:
     case FileSys::ProgramAddressSpaceType::Is36Bit:
         address_space_width = 36;
         address_space_width = 36;
         code_region_base = 0x8000000;
         code_region_base = 0x8000000;
         code_region_end = code_region_base + 0x78000000;
         code_region_end = code_region_base + 0x78000000;
+        aslr_region_base = 0x8000000;
+        aslr_region_end = aslr_region_base + 0xFF8000000;
         map_region_size = 0x180000000;
         map_region_size = 0x180000000;
         heap_region_size = 0x180000000;
         heap_region_size = 0x180000000;
         break;
         break;
-    case FileSys::ProgramAddressSpaceType::Is32BitNoMap:
-        address_space_width = 32;
-        code_region_base = 0x200000;
-        code_region_end = code_region_base + 0x3FE00000;
-        map_region_size = 0;
-        heap_region_size = 0x80000000;
-        break;
     case FileSys::ProgramAddressSpaceType::Is39Bit:
     case FileSys::ProgramAddressSpaceType::Is39Bit:
         address_space_width = 39;
         address_space_width = 39;
         code_region_base = 0x8000000;
         code_region_base = 0x8000000;
         code_region_end = code_region_base + 0x80000000;
         code_region_end = code_region_base + 0x80000000;
+        aslr_region_base = 0x8000000;
+        aslr_region_end = aslr_region_base + 0x7FF8000000;
         map_region_size = 0x1000000000;
         map_region_size = 0x1000000000;
         heap_region_size = 0x180000000;
         heap_region_size = 0x180000000;
         new_map_region_size = 0x80000000;
         new_map_region_size = 0x80000000;
@@ -490,6 +495,18 @@ u64 VMManager::GetAddressSpaceWidth() const {
     return address_space_width;
     return address_space_width;
 }
 }
 
 
+VAddr VMManager::GetASLRRegionBaseAddress() const {
+    return aslr_region_base;
+}
+
+VAddr VMManager::GetASLRRegionEndAddress() const {
+    return aslr_region_end;
+}
+
+u64 VMManager::GetASLRRegionSize() const {
+    return aslr_region_end - aslr_region_base;
+}
+
 VAddr VMManager::GetCodeRegionBaseAddress() const {
 VAddr VMManager::GetCodeRegionBaseAddress() const {
     return code_region_base;
     return code_region_base;
 }
 }

+ 12 - 0
src/core/hle/kernel/vm_manager.h

@@ -205,6 +205,15 @@ public:
     /// Gets the address space width in bits.
     /// Gets the address space width in bits.
     u64 GetAddressSpaceWidth() const;
     u64 GetAddressSpaceWidth() const;
 
 
+    /// Gets the base address of the ASLR region.
+    VAddr GetASLRRegionBaseAddress() const;
+
+    /// Gets the end address of the ASLR region.
+    VAddr GetASLRRegionEndAddress() const;
+
+    /// Gets the size of the ASLR region
+    u64 GetASLRRegionSize() const;
+
     /// Gets the base address of the code region.
     /// Gets the base address of the code region.
     VAddr GetCodeRegionBaseAddress() const;
     VAddr GetCodeRegionBaseAddress() const;
 
 
@@ -306,6 +315,9 @@ private:
     VAddr address_space_base = 0;
     VAddr address_space_base = 0;
     VAddr address_space_end = 0;
     VAddr address_space_end = 0;
 
 
+    VAddr aslr_region_base = 0;
+    VAddr aslr_region_end = 0;
+
     VAddr code_region_base = 0;
     VAddr code_region_base = 0;
     VAddr code_region_end = 0;
     VAddr code_region_end = 0;