• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)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::kInaccessible:
42     case PageAccessibilityConfiguration::kInaccessibleWillJitLater:
43       return PROT_NONE;
44   }
45 }
46 
47 }  // namespace partition_alloc::internal
48