1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "partition_alloc/page_allocator.h" 6 #include "partition_alloc/partition_alloc_base/cpu.h" 7 #include "partition_alloc/partition_alloc_base/notreached.h" 8 9 #include <sys/mman.h> 10 11 // PA_PROT_BTI requests a page that supports BTI landing pads. 12 #define PA_PROT_BTI 0x10 13 14 // PA_PROT_MTE requests a page that's suitable for memory tagging. 15 #if defined(ARCH_CPU_ARM64) 16 #define PA_PROT_MTE 0x20 17 #endif // defined(ARCH_CPU_ARM64) 18 19 namespace partition_alloc::internal { 20 GetAccessFlags(PageAccessibilityConfiguration accessibility)21int GetAccessFlags(PageAccessibilityConfiguration accessibility) { 22 switch (accessibility.permissions) { 23 case PageAccessibilityConfiguration::kRead: 24 return PROT_READ; 25 case PageAccessibilityConfiguration::kReadWriteTagged: 26 #if defined(ARCH_CPU_ARM64) 27 return PROT_READ | PROT_WRITE | 28 (base::CPU::GetInstanceNoAllocation().has_mte() ? PA_PROT_MTE : 0); 29 #else 30 [[fallthrough]]; 31 #endif 32 case PageAccessibilityConfiguration::kReadWrite: 33 return PROT_READ | PROT_WRITE; 34 case PageAccessibilityConfiguration::kReadExecuteProtected: 35 return PROT_READ | PROT_EXEC | 36 (base::CPU::GetInstanceNoAllocation().has_bti() ? PA_PROT_BTI : 0); 37 case PageAccessibilityConfiguration::kReadExecute: 38 return PROT_READ | PROT_EXEC; 39 case PageAccessibilityConfiguration::kReadWriteExecute: 40 return PROT_READ | PROT_WRITE | PROT_EXEC; 41 case PageAccessibilityConfiguration::kInaccessible: 42 case PageAccessibilityConfiguration::kInaccessibleWillJitLater: 43 return PROT_NONE; 44 } 45 } 46 47 } // namespace partition_alloc::internal 48