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)21 int 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