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 #include <sys/mman.h> 5 6 #include "build/build_config.h" 7 #include "partition_alloc/page_allocator.h" 8 #include "partition_alloc/partition_alloc_base/cpu.h" 9 #include "partition_alloc/partition_alloc_base/notreached.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::kReadWriteExecuteProtected: 42 return PROT_READ | PROT_WRITE | PROT_EXEC | 43 (base::CPU::GetInstanceNoAllocation().has_bti() ? PA_PROT_BTI : 0); 44 case PageAccessibilityConfiguration::kInaccessible: 45 case PageAccessibilityConfiguration::kInaccessibleWillJitLater: 46 return PROT_NONE; 47 } 48 } 49 50 } // namespace partition_alloc::internal 51