diff options
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 35 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 12 |
4 files changed, 44 insertions, 28 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 7a053da1e..3fd082550 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -448,25 +448,12 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 448 | case GetInfoType::RandomEntropy: | 448 | case GetInfoType::RandomEntropy: |
| 449 | *result = 0; | 449 | *result = 0; |
| 450 | break; | 450 | break; |
| 451 | case GetInfoType::AddressSpaceBaseAddr: | 451 | case GetInfoType::ASLRRegionBaseAddr: |
| 452 | *result = vm_manager.GetCodeRegionBaseAddress(); | 452 | *result = vm_manager.GetASLRRegionBaseAddress(); |
| 453 | break; | 453 | break; |
| 454 | case GetInfoType::AddressSpaceSize: { | 454 | case GetInfoType::ASLRRegionSize: |
| 455 | const u64 width = vm_manager.GetAddressSpaceWidth(); | 455 | *result = vm_manager.GetASLRRegionSize(); |
| 456 | |||
| 457 | switch (width) { | ||
| 458 | case 32: | ||
| 459 | *result = 0xFFE00000; | ||
| 460 | break; | ||
| 461 | case 36: | ||
| 462 | *result = 0xFF8000000; | ||
| 463 | break; | ||
| 464 | case 39: | ||
| 465 | *result = 0x7FF8000000; | ||
| 466 | break; | ||
| 467 | } | ||
| 468 | break; | 456 | break; |
| 469 | } | ||
| 470 | case GetInfoType::NewMapRegionBaseAddr: | 457 | case GetInfoType::NewMapRegionBaseAddr: |
| 471 | *result = vm_manager.GetNewMapRegionBaseAddress(); | 458 | *result = vm_manager.GetNewMapRegionBaseAddress(); |
| 472 | break; | 459 | break; |
diff --git a/src/core/hle/kernel/svc.h b/src/core/hle/kernel/svc.h index 70148c4fe..554a5e328 100644 --- a/src/core/hle/kernel/svc.h +++ b/src/core/hle/kernel/svc.h | |||
| @@ -41,8 +41,8 @@ enum class GetInfoType : u64 { | |||
| 41 | RandomEntropy = 11, | 41 | RandomEntropy = 11, |
| 42 | PerformanceCounter = 0xF0000002, | 42 | PerformanceCounter = 0xF0000002, |
| 43 | // 2.0.0+ | 43 | // 2.0.0+ |
| 44 | AddressSpaceBaseAddr = 12, | 44 | ASLRRegionBaseAddr = 12, |
| 45 | AddressSpaceSize = 13, | 45 | ASLRRegionSize = 13, |
| 46 | NewMapRegionBaseAddr = 14, | 46 | NewMapRegionBaseAddr = 14, |
| 47 | NewMapRegionSize = 15, | 47 | NewMapRegionSize = 15, |
| 48 | // 3.0.0+ | 48 | // 3.0.0+ |
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index e412309fd..1e28ccbda 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp | |||
| @@ -393,30 +393,35 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty | |||
| 393 | 393 | ||
| 394 | switch (type) { | 394 | switch (type) { |
| 395 | case FileSys::ProgramAddressSpaceType::Is32Bit: | 395 | case FileSys::ProgramAddressSpaceType::Is32Bit: |
| 396 | case FileSys::ProgramAddressSpaceType::Is32BitNoMap: | ||
| 396 | address_space_width = 32; | 397 | address_space_width = 32; |
| 397 | code_region_base = 0x200000; | 398 | code_region_base = 0x200000; |
| 398 | code_region_end = code_region_base + 0x3FE00000; | 399 | code_region_end = code_region_base + 0x3FE00000; |
| 399 | map_region_size = 0x40000000; | 400 | aslr_region_base = 0x200000; |
| 400 | heap_region_size = 0x40000000; | 401 | aslr_region_end = aslr_region_base + 0xFFE00000; |
| 402 | if (type == FileSys::ProgramAddressSpaceType::Is32Bit) { | ||
| 403 | map_region_size = 0x40000000; | ||
| 404 | heap_region_size = 0x40000000; | ||
| 405 | } else { | ||
| 406 | map_region_size = 0; | ||
| 407 | heap_region_size = 0x80000000; | ||
| 408 | } | ||
| 401 | break; | 409 | break; |
| 402 | case FileSys::ProgramAddressSpaceType::Is36Bit: | 410 | case FileSys::ProgramAddressSpaceType::Is36Bit: |
| 403 | address_space_width = 36; | 411 | address_space_width = 36; |
| 404 | code_region_base = 0x8000000; | 412 | code_region_base = 0x8000000; |
| 405 | code_region_end = code_region_base + 0x78000000; | 413 | code_region_end = code_region_base + 0x78000000; |
| 414 | aslr_region_base = 0x8000000; | ||
| 415 | aslr_region_end = aslr_region_base + 0xFF8000000; | ||
| 406 | map_region_size = 0x180000000; | 416 | map_region_size = 0x180000000; |
| 407 | heap_region_size = 0x180000000; | 417 | heap_region_size = 0x180000000; |
| 408 | break; | 418 | break; |
| 409 | case FileSys::ProgramAddressSpaceType::Is32BitNoMap: | ||
| 410 | address_space_width = 32; | ||
| 411 | code_region_base = 0x200000; | ||
| 412 | code_region_end = code_region_base + 0x3FE00000; | ||
| 413 | map_region_size = 0; | ||
| 414 | heap_region_size = 0x80000000; | ||
| 415 | break; | ||
| 416 | case FileSys::ProgramAddressSpaceType::Is39Bit: | 419 | case FileSys::ProgramAddressSpaceType::Is39Bit: |
| 417 | address_space_width = 39; | 420 | address_space_width = 39; |
| 418 | code_region_base = 0x8000000; | 421 | code_region_base = 0x8000000; |
| 419 | code_region_end = code_region_base + 0x80000000; | 422 | code_region_end = code_region_base + 0x80000000; |
| 423 | aslr_region_base = 0x8000000; | ||
| 424 | aslr_region_end = aslr_region_base + 0x7FF8000000; | ||
| 420 | map_region_size = 0x1000000000; | 425 | map_region_size = 0x1000000000; |
| 421 | heap_region_size = 0x180000000; | 426 | heap_region_size = 0x180000000; |
| 422 | new_map_region_size = 0x80000000; | 427 | new_map_region_size = 0x80000000; |
| @@ -490,6 +495,18 @@ u64 VMManager::GetAddressSpaceWidth() const { | |||
| 490 | return address_space_width; | 495 | return address_space_width; |
| 491 | } | 496 | } |
| 492 | 497 | ||
| 498 | VAddr VMManager::GetASLRRegionBaseAddress() const { | ||
| 499 | return aslr_region_base; | ||
| 500 | } | ||
| 501 | |||
| 502 | VAddr VMManager::GetASLRRegionEndAddress() const { | ||
| 503 | return aslr_region_end; | ||
| 504 | } | ||
| 505 | |||
| 506 | u64 VMManager::GetASLRRegionSize() const { | ||
| 507 | return aslr_region_end - aslr_region_base; | ||
| 508 | } | ||
| 509 | |||
| 493 | VAddr VMManager::GetCodeRegionBaseAddress() const { | 510 | VAddr VMManager::GetCodeRegionBaseAddress() const { |
| 494 | return code_region_base; | 511 | return code_region_base; |
| 495 | } | 512 | } |
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 015559a64..4accde6b3 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h | |||
| @@ -205,6 +205,15 @@ public: | |||
| 205 | /// Gets the address space width in bits. | 205 | /// Gets the address space width in bits. |
| 206 | u64 GetAddressSpaceWidth() const; | 206 | u64 GetAddressSpaceWidth() const; |
| 207 | 207 | ||
| 208 | /// Gets the base address of the ASLR region. | ||
| 209 | VAddr GetASLRRegionBaseAddress() const; | ||
| 210 | |||
| 211 | /// Gets the end address of the ASLR region. | ||
| 212 | VAddr GetASLRRegionEndAddress() const; | ||
| 213 | |||
| 214 | /// Gets the size of the ASLR region | ||
| 215 | u64 GetASLRRegionSize() const; | ||
| 216 | |||
| 208 | /// Gets the base address of the code region. | 217 | /// Gets the base address of the code region. |
| 209 | VAddr GetCodeRegionBaseAddress() const; | 218 | VAddr GetCodeRegionBaseAddress() const; |
| 210 | 219 | ||
| @@ -306,6 +315,9 @@ private: | |||
| 306 | VAddr address_space_base = 0; | 315 | VAddr address_space_base = 0; |
| 307 | VAddr address_space_end = 0; | 316 | VAddr address_space_end = 0; |
| 308 | 317 | ||
| 318 | VAddr aslr_region_base = 0; | ||
| 319 | VAddr aslr_region_end = 0; | ||
| 320 | |||
| 309 | VAddr code_region_base = 0; | 321 | VAddr code_region_base = 0; |
| 310 | VAddr code_region_end = 0; | 322 | VAddr code_region_end = 0; |
| 311 | 323 | ||