[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2] xen/arm: AArch32-V8R: Add MPU register definitions
Add the definitions for HPRBAR<0..31>, HPRLAR<0..31> and HPRENR. The definitions are taken from ARM DDI 0568A.c ID110520, E2.2.3 HPRBAR<n>, E2.2.4 HPRENR and E2.2.6 HPRLAR<n>. Introduce pr_t typedef which is a structure having the prbar and prlar members, each being structured as the registers of the AArch32-V8R architecture. This is the arm32 equivalent of "arm/mpu: Introduce MPU memory region map structure". Few differences worth noting:- 1. The XN in HPRBAR is 1 bit in Arm32 (unlike 2 bits in Arm64). 2. PRSELR_EL2 is not used to access HPRBAR<0..31> and HPRLAR<0..31>. Introduce macros PR{B,L}AR_EL2_(num) to generate alias for the sysregs. Also, took the opportunity to fix the register definition of HPRLAR. Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx> --- Changes from :- v1 - 1. Introduce macros for PR{B,L}AR_EL2_(num). Similar macros need to be defined for arm64 as well. 2. Some style fixes Comments not addressed 1. Renaming of PRBAR_EL2_XN if needed. 2. Using res0 for ns. This patch should be applied after "[PATCH v3 0/7] First chunk for Arm R82 and MPU support" in order to enable compilation for AArch32 and macros need to be defined for Arm64 as well. xen/arch/arm/include/asm/arm32/mpu.h | 59 +++++++++++++++++++++ xen/arch/arm/include/asm/mpu.h | 4 ++ xen/arch/arm/include/asm/mpu/cpregs.h | 75 ++++++++++++++++++++++++++- xen/arch/arm/include/asm/page.h | 7 ++- xen/arch/arm/mpu/mm.c | 14 +++-- 5 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 xen/arch/arm/include/asm/arm32/mpu.h diff --git a/xen/arch/arm/include/asm/arm32/mpu.h b/xen/arch/arm/include/asm/arm32/mpu.h new file mode 100644 index 0000000000..dc5ef9b3e9 --- /dev/null +++ b/xen/arch/arm/include/asm/arm32/mpu.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * mpu.h: Arm Memory Protection Unit definitions for aarch64. + */ + +#ifndef __ARM_ARM32_MPU_H +#define __ARM_ARM32_MPU_H + +#define XN_EL2_ENABLED 0x1 + +#ifndef __ASSEMBLY__ + +/* Hypervisor Protection Region Base Address Register */ +typedef union { + struct { + unsigned int xn:1; /* Execute-Never */ + unsigned int ap:2; /* Acess Permission */ + unsigned int sh:2; /* Sharebility */ + unsigned int res0:1; /* Reserved as 0 */ + unsigned int base:26; /* Base Address */ + } reg; + uint32_t bits; +} prbar_t; + +/* Hypervisor Protection Region Limit Address Register */ +typedef union { + struct { + unsigned int en:1; /* Region enable */ + unsigned int ai:3; /* Memory Attribute Index */ + /* + * There is no actual ns bit in hardware. It is used here for + * compatibility with Arm64 code. Thus, we are reusing a res0 bit for ns. + */ + unsigned int ns:1; /* Reserved 0 by hardware */ + unsigned int res0:1; /* Reserved 0 by hardware */ + unsigned int limit:26; /* Limit Address */ + } reg; + uint32_t bits; +} prlar_t; + +/* Protection Region */ +typedef struct { + prbar_t prbar; + prlar_t prlar; + uint64_t p2m_type; /* Used to store p2m types. */ +} pr_t; + +#endif /* __ASSEMBLY__ */ + +#endif /* __ARM_ARM32_MPU_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/include/asm/mpu.h b/xen/arch/arm/include/asm/mpu.h index 77d0566f97..67127149c0 100644 --- a/xen/arch/arm/include/asm/mpu.h +++ b/xen/arch/arm/include/asm/mpu.h @@ -8,8 +8,12 @@ #if defined(CONFIG_ARM_64) # include <asm/arm64/mpu.h> +#elif defined(CONFIG_ARM_32) +# include <asm/arm32/mpu.h> #endif +#define PRENR_MASK GENMASK(31, 0) + #define MPU_REGION_SHIFT 6 #define MPU_REGION_ALIGN (_AC(1, UL) << MPU_REGION_SHIFT) #define MPU_REGION_MASK (~(MPU_REGION_ALIGN - 1)) diff --git a/xen/arch/arm/include/asm/mpu/cpregs.h b/xen/arch/arm/include/asm/mpu/cpregs.h index d5cd0e04d5..d051598477 100644 --- a/xen/arch/arm/include/asm/mpu/cpregs.h +++ b/xen/arch/arm/include/asm/mpu/cpregs.h @@ -6,18 +6,91 @@ /* CP15 CR0: MPU Type Register */ #define HMPUIR p15,4,c0,c0,4 +/* CP15 CR6: Protection Region Enable Register */ +#define HPRENR p15,4,c6,c1,1 + /* CP15 CR6: MPU Protection Region Base/Limit/Select Address Register */ #define HPRSELR p15,4,c6,c2,1 #define HPRBAR p15,4,c6,c3,0 -#define HPRLAR p15,4,c6,c8,1 +#define HPRLAR p15,4,c6,c3,1 + +/* CP15 CR6: MPU Protection Region Base/Limit Address Register */ +#define HPRBAR0 p15,4,c6,c8,0 +#define HPRLAR0 p15,4,c6,c8,1 +#define HPRBAR1 p15,4,c6,c8,4 +#define HPRLAR1 p15,4,c6,c8,5 +#define HPRBAR2 p15,4,c6,c9,0 +#define HPRLAR2 p15,4,c6,c9,1 +#define HPRBAR3 p15,4,c6,c9,4 +#define HPRLAR3 p15,4,c6,c9,5 +#define HPRBAR4 p15,4,c6,c10,0 +#define HPRLAR4 p15,4,c6,c10,1 +#define HPRBAR5 p15,4,c6,c10,4 +#define HPRLAR5 p15,4,c6,c10,5 +#define HPRBAR6 p15,4,c6,c11,0 +#define HPRLAR6 p15,4,c6,c11,1 +#define HPRBAR7 p15,4,c6,c11,4 +#define HPRLAR7 p15,4,c6,c11,5 +#define HPRBAR8 p15,4,c6,c12,0 +#define HPRLAR8 p15,4,c6,c12,1 +#define HPRBAR9 p15,4,c6,c12,4 +#define HPRLAR9 p15,4,c6,c12,5 +#define HPRBAR10 p15,4,c6,c13,0 +#define HPRLAR10 p15,4,c6,c13,1 +#define HPRBAR11 p15,4,c6,c13,4 +#define HPRLAR11 p15,4,c6,c13,5 +#define HPRBAR12 p15,4,c6,c14,0 +#define HPRLAR12 p15,4,c6,c14,1 +#define HPRBAR13 p15,4,c6,c14,4 +#define HPRLAR13 p15,4,c6,c14,5 +#define HPRBAR14 p15,4,c6,c15,0 +#define HPRLAR14 p15,4,c6,c15,1 +#define HPRBAR15 p15,4,c6,c15,4 +#define HPRLAR15 p15,4,c6,c15,5 +#define HPRBAR16 p15,5,c6,c8,0 +#define HPRLAR16 p15,5,c6,c8,1 +#define HPRBAR17 p15,5,c6,c8,4 +#define HPRLAR17 p15,5,c6,c8,5 +#define HPRBAR18 p15,5,c6,c9,0 +#define HPRLAR18 p15,5,c6,c9,1 +#define HPRBAR19 p15,5,c6,c9,4 +#define HPRLAR19 p15,5,c6,c9,5 +#define HPRBAR20 p15,5,c6,c10,0 +#define HPRLAR20 p15,5,c6,c10,1 +#define HPRBAR21 p15,5,c6,c10,4 +#define HPRLAR21 p15,5,c6,c10,5 +#define HPRBAR22 p15,5,c6,c11,0 +#define HPRLAR22 p15,5,c6,c11,1 +#define HPRBAR23 p15,5,c6,c11,4 +#define HPRLAR23 p15,5,c6,c11,5 +#define HPRBAR24 p15,5,c6,c12,0 +#define HPRLAR24 p15,5,c6,c12,1 +#define HPRBAR25 p15,5,c6,c12,4 +#define HPRLAR25 p15,5,c6,c12,5 +#define HPRBAR26 p15,5,c6,c13,0 +#define HPRLAR26 p15,5,c6,c13,1 +#define HPRBAR27 p15,5,c6,c13,4 +#define HPRLAR27 p15,5,c6,c13,5 +#define HPRBAR28 p15,5,c6,c14,0 +#define HPRLAR28 p15,5,c6,c14,1 +#define HPRBAR29 p15,5,c6,c14,4 +#define HPRLAR29 p15,5,c6,c14,5 +#define HPRBAR30 p15,5,c6,c15,0 +#define HPRLAR30 p15,5,c6,c15,1 +#define HPRBAR31 p15,5,c6,c15,4 +#define HPRLAR31 p15,5,c6,c15,5 /* Aliases of AArch64 names for use in common code */ #ifdef CONFIG_ARM_32 /* Alphabetically... */ #define MPUIR_EL2 HMPUIR #define PRBAR_EL2 HPRBAR +#define PRBAR_EL2_(N) HPRBAR##N +#define PRENR_EL2 HPRENR #define PRLAR_EL2 HPRLAR +#define PRLAR_EL2_(N) HPRLAR##N #define PRSELR_EL2 HPRSELR + #endif /* CONFIG_ARM_32 */ #endif /* __ARM_MPU_CPREGS_H */ diff --git a/xen/arch/arm/include/asm/page.h b/xen/arch/arm/include/asm/page.h index 22f7d2c6cb..f4ae8ba6d7 100644 --- a/xen/arch/arm/include/asm/page.h +++ b/xen/arch/arm/include/asm/page.h @@ -96,7 +96,8 @@ /* * Layout of the flags used for updating MPU memory region attributes * [0:2] Memory attribute Index - * [3:4] Execute Never + * [3:4] Execute Never // For ARM_64 + * [3] Execute Never // For ARM_32 * [5:6] Access Permission * [7] Region Present */ @@ -105,7 +106,11 @@ #define _PAGE_AP_BIT 5 #define _PAGE_PRESENT_BIT 7 #define _PAGE_AI (7U << _PAGE_AI_BIT) +#ifdef CONFIG_ARM_32 +#define _PAGE_XN (1U << _PAGE_XN_BIT) +#else #define _PAGE_XN (2U << _PAGE_XN_BIT) +#endif #define _PAGE_RO (2U << _PAGE_AP_BIT) #define _PAGE_PRESENT (1U << _PAGE_PRESENT_BIT) #define PAGE_AI_MASK(x) (((x) >> _PAGE_AI_BIT) & 0x7U) diff --git a/xen/arch/arm/mpu/mm.c b/xen/arch/arm/mpu/mm.c index e0a40489a7..c177724c45 100644 --- a/xen/arch/arm/mpu/mm.c +++ b/xen/arch/arm/mpu/mm.c @@ -31,16 +31,16 @@ pr_t xen_mpumap[MAX_MPU_REGIONS]; #define GENERATE_WRITE_PR_REG_CASE(num, pr) \ case num: \ { \ - WRITE_SYSREG(pr->prbar.bits & ~MPU_REGION_RES0, PRBAR##num##_EL2); \ - WRITE_SYSREG(pr->prlar.bits & ~MPU_REGION_RES0, PRLAR##num##_EL2); \ + WRITE_SYSREG(pr->prbar.bits & ~MPU_REGION_RES0, PRBAR_EL2_(num)); \ + WRITE_SYSREG(pr->prlar.bits & ~MPU_REGION_RES0, PRLAR_EL2_(num)); \ break; \ } #define GENERATE_READ_PR_REG_CASE(num, pr) \ case num: \ { \ - pr->prbar.bits = READ_SYSREG(PRBAR##num##_EL2); \ - pr->prlar.bits = READ_SYSREG(PRLAR##num##_EL2); \ + pr->prbar.bits = READ_SYSREG(PRBAR_EL2_(num)); \ + pr->prlar.bits = READ_SYSREG(PRLAR_EL2_(num)); \ break; \ } @@ -56,6 +56,11 @@ static void __init __maybe_unused build_assertions(void) static void prepare_selector(uint8_t *sel) { + /* + * In Arm32, one can access PRBAR<0..31>_EL2 and PRLAR<0..31>_EL2 without + * the need to configure PRSELR_EL2. + */ +#ifdef CONFIG_ARM_64 uint8_t cur_sel = *sel; /* * {read,write}_protection_region works using the direct access to the 0..15 @@ -69,6 +74,7 @@ static void prepare_selector(uint8_t *sel) isb(); } *sel = *sel & 0xFU; +#endif } /* -- 2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |