linux/arch/arm64/include/asm/pgtable-prot.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2016 ARM Ltd.
   4 */
   5#ifndef __ASM_PGTABLE_PROT_H
   6#define __ASM_PGTABLE_PROT_H
   7
   8#include <asm/memory.h>
   9#include <asm/pgtable-hwdef.h>
  10
  11#include <linux/const.h>
  12
  13/*
  14 * Software defined PTE bits definition.
  15 */
  16#define PTE_WRITE               (PTE_DBM)                /* same as DBM (51) */
  17#define PTE_DIRTY               (_AT(pteval_t, 1) << 55)
  18#define PTE_SPECIAL             (_AT(pteval_t, 1) << 56)
  19#define PTE_DEVMAP              (_AT(pteval_t, 1) << 57)
  20#define PTE_PROT_NONE           (_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */
  21
  22/*
  23 * This bit indicates that the entry is present i.e. pmd_page()
  24 * still points to a valid huge page in memory even if the pmd
  25 * has been invalidated.
  26 */
  27#define PMD_PRESENT_INVALID     (_AT(pteval_t, 1) << 59) /* only when !PMD_SECT_VALID */
  28
  29#ifndef __ASSEMBLY__
  30
  31#include <asm/cpufeature.h>
  32#include <asm/pgtable-types.h>
  33
  34extern bool arm64_use_ng_mappings;
  35
  36#define _PROT_DEFAULT           (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED)
  37#define _PROT_SECT_DEFAULT      (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S)
  38
  39#define PTE_MAYBE_NG            (arm64_use_ng_mappings ? PTE_NG : 0)
  40#define PMD_MAYBE_NG            (arm64_use_ng_mappings ? PMD_SECT_NG : 0)
  41
  42/*
  43 * If we have userspace only BTI we don't want to mark kernel pages
  44 * guarded even if the system does support BTI.
  45 */
  46#ifdef CONFIG_ARM64_BTI_KERNEL
  47#define PTE_MAYBE_GP            (system_supports_bti() ? PTE_GP : 0)
  48#else
  49#define PTE_MAYBE_GP            0
  50#endif
  51
  52#define PROT_DEFAULT            (_PROT_DEFAULT | PTE_MAYBE_NG)
  53#define PROT_SECT_DEFAULT       (_PROT_SECT_DEFAULT | PMD_MAYBE_NG)
  54
  55#define PROT_DEVICE_nGnRnE      (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRnE))
  56#define PROT_DEVICE_nGnRE       (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRE))
  57#define PROT_NORMAL_NC          (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_NC))
  58#define PROT_NORMAL             (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL))
  59#define PROT_NORMAL_TAGGED      (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_TAGGED))
  60
  61#define PROT_SECT_DEVICE_nGnRE  (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE))
  62#define PROT_SECT_NORMAL        (PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
  63#define PROT_SECT_NORMAL_EXEC   (PROT_SECT_DEFAULT | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
  64
  65#define _PAGE_DEFAULT           (_PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL))
  66
  67#define PAGE_KERNEL             __pgprot(PROT_NORMAL)
  68#define PAGE_KERNEL_RO          __pgprot((PROT_NORMAL & ~PTE_WRITE) | PTE_RDONLY)
  69#define PAGE_KERNEL_ROX         __pgprot((PROT_NORMAL & ~(PTE_WRITE | PTE_PXN)) | PTE_RDONLY)
  70#define PAGE_KERNEL_EXEC        __pgprot(PROT_NORMAL & ~PTE_PXN)
  71#define PAGE_KERNEL_EXEC_CONT   __pgprot((PROT_NORMAL & ~PTE_PXN) | PTE_CONT)
  72
  73#define PAGE_S2_MEMATTR(attr, has_fwb)                                  \
  74        ({                                                              \
  75                u64 __val;                                              \
  76                if (has_fwb)                                            \
  77                        __val = PTE_S2_MEMATTR(MT_S2_FWB_ ## attr);     \
  78                else                                                    \
  79                        __val = PTE_S2_MEMATTR(MT_S2_ ## attr);         \
  80                __val;                                                  \
  81         })
  82
  83#define PAGE_NONE               __pgprot(((_PAGE_DEFAULT) & ~PTE_VALID) | PTE_PROT_NONE | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
  84/* shared+writable pages are clean by default, hence PTE_RDONLY|PTE_WRITE */
  85#define PAGE_SHARED             __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
  86#define PAGE_SHARED_EXEC        __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_WRITE)
  87#define PAGE_READONLY           __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
  88#define PAGE_READONLY_EXEC      __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN)
  89#define PAGE_EXECONLY           __pgprot(_PAGE_DEFAULT | PTE_RDONLY | PTE_NG | PTE_PXN)
  90
  91#define __P000  PAGE_NONE
  92#define __P001  PAGE_READONLY
  93#define __P010  PAGE_READONLY
  94#define __P011  PAGE_READONLY
  95#define __P100  PAGE_EXECONLY
  96#define __P101  PAGE_READONLY_EXEC
  97#define __P110  PAGE_READONLY_EXEC
  98#define __P111  PAGE_READONLY_EXEC
  99
 100#define __S000  PAGE_NONE
 101#define __S001  PAGE_READONLY
 102#define __S010  PAGE_SHARED
 103#define __S011  PAGE_SHARED
 104#define __S100  PAGE_EXECONLY
 105#define __S101  PAGE_READONLY_EXEC
 106#define __S110  PAGE_SHARED_EXEC
 107#define __S111  PAGE_SHARED_EXEC
 108
 109#endif /* __ASSEMBLY__ */
 110
 111#endif /* __ASM_PGTABLE_PROT_H */
 112