diff --git a/CMakeLists.txt b/CMakeLists.txt index bee87c82..49cb3612 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -559,7 +559,7 @@ target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAlloca if (APPLE) # Reserve system-managed memory space. - target_link_options(shadps4 PRIVATE -Wl,-no_pie,-no_fixup_chains,-no_huge,-pagezero_size,0x400000,-segaddr,SYSTEM_MANAGED,0x400000,-image_base,0x10000000000) + target_link_options(shadps4 PRIVATE -Wl,-no_pie,-no_fixup_chains,-no_huge,-pagezero_size,0x400000,-segaddr,GUEST_SYSTEM,0x400000,-image_base,0x10000000000) # Link MoltenVK for Vulkan support find_library(MOLTENVK MoltenVK REQUIRED) diff --git a/src/core/address_space.cpp b/src/core/address_space.cpp index 0cccd8c5..e492f665 100644 --- a/src/core/address_space.cpp +++ b/src/core/address_space.cpp @@ -16,8 +16,8 @@ #endif #ifdef __APPLE__ -// Reserve space for the system-managed address space using a zerofill section. -asm(".zerofill SYSTEM_MANAGED,SYSTEM_MANAGED,__system_managed,0x800000000"); +// Reserve space for the system address space using a zerofill section. +asm(".zerofill GUEST_SYSTEM,GUEST_SYSTEM,__guest_system,0xEFFC00000"); #endif namespace Core { @@ -295,7 +295,7 @@ struct AddressSpace::Impl { // Cannot guarantee enough space for these areas at the desired addresses, so not MAP_FIXED. system_reserved_base = reinterpret_cast( mmap(reinterpret_cast(SYSTEM_RESERVED_MIN), system_reserved_size, - protection_flags, base_map_flags, -1, 0)); + protection_flags, base_map_flags | MAP_FIXED, -1, 0)); user_base = reinterpret_cast(mmap(reinterpret_cast(USER_MIN), user_size, protection_flags, base_map_flags, -1, 0)); #else diff --git a/src/core/address_space.h b/src/core/address_space.h index ff48f51e..ea73e2ed 100644 --- a/src/core/address_space.h +++ b/src/core/address_space.h @@ -23,7 +23,12 @@ constexpr VAddr CODE_BASE_OFFSET = 0x100000000ULL; constexpr VAddr SYSTEM_MANAGED_MIN = 0x00000400000ULL; constexpr VAddr SYSTEM_MANAGED_MAX = 0x07FFFFBFFFULL; constexpr VAddr SYSTEM_RESERVED_MIN = 0x800000000ULL; +#ifdef __APPLE__ +// Can only comfortably reserve the first 0x700000000 of reserved space. +constexpr VAddr SYSTEM_RESERVED_MAX = 0xEFFFFFFFFULL; +#else constexpr VAddr SYSTEM_RESERVED_MAX = 0xFFFFFFFFFULL; +#endif constexpr VAddr USER_MIN = 0x1000000000ULL; constexpr VAddr USER_MAX = 0xFBFFFFFFFFULL;