--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h +++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h @@ -100,21 +100,21 @@ // other constant values, we pack _all_ `PartitionRoot::Alloc` sizes perfectly // up against the end of a system page. -#if defined(_MIPS_ARCH_LOONGSON) || defined(ARCH_CPU_LOONGARCH64) +#if (BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)) || \ + defined(PARTITION_ALLOCATOR_CONSTANTS_POSIX_NONCONST_PAGE_SIZE) PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t PartitionPageShift() { - return 16; // 64 KiB + return PageAllocationGranularityShift() + 2; } -#elif defined(ARCH_CPU_PPC64) +#elif defined(_MIPS_ARCH_LOONGSON) || defined(ARCH_CPU_LOONGARCH64) PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t PartitionPageShift() { - return 18; // 256 KiB + return 16; // 64 KiB } -#elif (BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS)) || \ - defined(PARTITION_ALLOCATOR_CONSTANTS_POSIX_NONCONST_PAGE_SIZE) +#elif defined(ARCH_CPU_PPC64) PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t PartitionPageShift() { - return PageAllocationGranularityShift() + 2; + return 18; // 256 KiB } #else PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t --- a/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h +++ b/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h @@ -26,7 +26,8 @@ #define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const)) #elif (BUILDFLAG(IS_ANDROID) && defined(ARCH_CPU_64_BITS)) || \ - (BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)) + (BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)) || \ + (BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_PPC64)) // This should work for all POSIX (if needed), but currently all other // supported OS/architecture combinations use either hard-coded values // (such as x86) or have means to determine these values without needing @@ -86,17 +87,7 @@ PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t PageAllocationGranularityShift() { -#if BUILDFLAG(IS_WIN) || defined(ARCH_CPU_PPC64) - // Modern ppc64 systems support 4kB (shift = 12) and 64kB (shift = 16) page - // sizes. Since 64kB is the de facto standard on the platform and binaries - // compiled for 64kB are likely to work on 4kB systems, 64kB is a good choice - // here. - return 16; // 64kB -#elif defined(_MIPS_ARCH_LOONGSON) || defined(ARCH_CPU_LOONGARCH64) - return 14; // 16kB -#elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS) - return static_cast(vm_page_shift); -#elif defined(PARTITION_ALLOCATOR_CONSTANTS_POSIX_NONCONST_PAGE_SIZE) +#if defined(PARTITION_ALLOCATOR_CONSTANTS_POSIX_NONCONST_PAGE_SIZE) // arm64 supports 4kb (shift = 12), 16kb (shift = 14), and 64kb (shift = 16) // page sizes. Retrieve from or initialize cache. size_t shift = page_characteristics.shift.load(std::memory_order_relaxed); @@ -106,6 +97,16 @@ page_characteristics.shift.store(shift, std::memory_order_relaxed); } return shift; +#elif BUILDFLAG(IS_WIN) || defined(ARCH_CPU_PPC64) + // Modern ppc64 systems support 4kB (shift = 12) and 64kB (shift = 16) page + // sizes. Since 64kB is the de facto standard on the platform and binaries + // compiled for 64kB are likely to work on 4kB systems, 64kB is a good choice + // here. + return 16; // 64kB +#elif defined(_MIPS_ARCH_LOONGSON) || defined(ARCH_CPU_LOONGARCH64) + return 14; // 16kB +#elif BUILDFLAG(IS_APPLE) && defined(ARCH_CPU_64_BITS) + return static_cast(vm_page_shift); #else return 12; // 4kB #endif --- a/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h +++ b/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h @@ -180,10 +180,10 @@ #else // !BUILDFLAG(IS_AIX) && !defined(ARCH_CPU_BIG_ENDIAN) // Little-endian Linux PPC has 48 bits of virtual addressing. Use 46. - PA_ALWAYS_INLINE constexpr uintptr_t ASLRMask() { + PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR uintptr_t ASLRMask() { return AslrMask(46); } - PA_ALWAYS_INLINE constexpr uintptr_t ASLROffset() { + PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR uintptr_t ASLROffset() { return AslrAddress(0); } --- a/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h +++ b/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h @@ -17,10 +17,15 @@ // PartitionPageSize() is 4 times the OS page size. static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 14) / kSmallestBucket; #elif defined(PARTITION_ALLOCATOR_CONSTANTS_POSIX_NONCONST_PAGE_SIZE) +#if defined(ARCH_CPU_PPC64) +// System page size can be 4 or 64 kiB on Linux on ppc64. Use 64 kiB maximum. +static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 16) / kSmallestBucket; +#else // System page size can be 4, 16, or 64 kiB on Linux on arm64. 64 kiB is // currently (kMaxSlotsPerSlotSpanBits == 13) not supported by the code, // so we use the 16 kiB maximum (64 kiB will crash). static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 14) / kSmallestBucket; +#endif #elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_PPC64) // System page size is not a constant on OpenPOWER systems, but is either 4kiB // or 64kiB (1 << 12 or 1 << 16)