diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -3968,6 +3968,10 @@ mask |= ATTR_S1_XN; nbits |= ATTR_S1_XN; } + if ((flags & PMAP_ENTER_BTI) != 0) { + mask |= ATTR_S1_GP; + nbits |= ATTR_S1_GP; + } if (mask == 0) return; @@ -4369,6 +4373,8 @@ if ((flags & PMAP_ENTER_WIRED) != 0) new_l3 |= ATTR_SW_WIRED; + if ((flags & PMAP_ENTER_BTI) != 0) + new_l3 |= ATTR_S1_GP; if (pmap->pm_stage == PM_STAGE1) { if (!ADDR_IS_KERNEL(va)) new_l3 |= ATTR_S1_AP(ATTR_S1_AP_USER) | ATTR_S1_PXN; @@ -4687,6 +4693,8 @@ if ((prot & VM_PROT_EXECUTE) == 0 || m->md.pv_memattr == VM_MEMATTR_DEVICE) new_l2 |= ATTR_S1_XN; + if ((flags & PMAP_ENTER_BTI) != 0) + new_l2 |= ATTR_S1_GP; if (!ADDR_IS_KERNEL(va)) new_l2 |= ATTR_S1_AP(ATTR_S1_AP_USER) | ATTR_S1_PXN; else @@ -5025,6 +5033,8 @@ if ((prot & VM_PROT_EXECUTE) == 0 || m->md.pv_memattr == VM_MEMATTR_DEVICE) l3_val |= ATTR_S1_XN; + if ((flags & PMAP_ENTER_BTI) != 0) + l3_val |= ATTR_S1_GP; if (!ADDR_IS_KERNEL(va)) l3_val |= ATTR_S1_AP(ATTR_S1_AP_USER) | ATTR_S1_PXN; else diff --git a/sys/arm64/include/pte.h b/sys/arm64/include/pte.h --- a/sys/arm64/include/pte.h +++ b/sys/arm64/include/pte.h @@ -70,6 +70,7 @@ #define ATTR_CONTIGUOUS (1UL << 52) #define ATTR_DBM (1UL << 51) +#define ATTR_S1_GP (1UL << 50) #define ATTR_S1_nG (1 << 11) #define ATTR_AF (1 << 10) #define ATTR_SH(x) ((x) << 8) diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -107,6 +107,7 @@ #define PMAP_ENTER_NOSLEEP 0x00000100 #define PMAP_ENTER_WIRED 0x00000200 #define PMAP_ENTER_LARGEPAGE 0x00000400 +#define PMAP_ENTER_BTI 0x00800000 #define PMAP_ENTER_RESERVED 0xFF000000 /*