diff options
Diffstat (limited to 'src/core/hle/kernel')
| -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      u64 new_map_region_size = 0;      u64 tls_io_region_size = 0; +    u64 stack_and_tls_io_end = 0; +      switch (type) {      case FileSys::ProgramAddressSpaceType::Is32Bit:      case FileSys::ProgramAddressSpaceType::Is32BitNoMap: @@ -643,6 +645,7 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty              map_region_size = 0;              heap_region_size = 0x80000000;          } +        stack_and_tls_io_end = 0x40000000;          break;      case FileSys::ProgramAddressSpaceType::Is36Bit:          address_space_width = 36; @@ -652,6 +655,7 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty          aslr_region_end = aslr_region_base + 0xFF8000000;          map_region_size = 0x180000000;          heap_region_size = 0x180000000; +        stack_and_tls_io_end = 0x80000000;          break;      case FileSys::ProgramAddressSpaceType::Is39Bit:          address_space_width = 39; @@ -669,6 +673,8 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty          return;      } +    const u64 stack_and_tls_io_begin = aslr_region_base; +      address_space_base = 0;      address_space_end = 1ULL << address_space_width; @@ -686,8 +692,13 @@ void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType ty      tls_io_region_end = tls_io_region_base + tls_io_region_size;      if (new_map_region_size == 0) { -        new_map_region_base = address_space_base; -        new_map_region_end = address_space_end; +        new_map_region_base = stack_and_tls_io_begin; +        new_map_region_end = stack_and_tls_io_end; +    } + +    if (tls_io_region_size == 0) { +        tls_io_region_base = stack_and_tls_io_begin; +        tls_io_region_end = stack_and_tls_io_end;      }  }  | 
