Message ID | 20250407091430.2342709-8-luca.fancellu@arm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | First chunk for Arm R82 and MPU support | expand |
Hi Luca, On 07/04/2025 10:14, Luca Fancellu wrote: > CAUTION: This message has originated from an External Source. Please use proper judgment and caution when opening attachments, clicking links, or responding to this email. > > > Implement the function setup_mpu that will logically track the MPU > regions defined by hardware registers, start introducing data > structures and functions to track the status from the C world. > > The xen_mpumap_mask bitmap is used to track which MPU region are > enabled at runtime. > > This function is called from setup_mm() which full implementation > will be provided in a later stage. > > Signed-off-by: Luca Fancellu <luca.fancellu@arm.com> > --- > xen/arch/arm/include/asm/arm64/mpu.h | 2 ++ > xen/arch/arm/mpu/mm.c | 49 +++++++++++++++++++++++++++- > 2 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/include/asm/arm64/mpu.h b/xen/arch/arm/include/asm/arm64/mpu.h > index 7cf8d355a1af..ff5a957bf085 100644 > --- a/xen/arch/arm/include/asm/arm64/mpu.h > +++ b/xen/arch/arm/include/asm/arm64/mpu.h > @@ -6,6 +6,8 @@ > #ifndef __ARM_ARM64_MPU_H__ > #define __ARM_ARM64_MPU_H__ > > +#define PRENR_MASK GENMASK(31, 0) This can be moved to xen/arch/arm/include/asm/mpu.h > + > /* > * Excute never. > * Stage 1 EL2 translation regime. > diff --git a/xen/arch/arm/mpu/mm.c b/xen/arch/arm/mpu/mm.c > index 2c5820a44f13..fe05c8097155 100644 > --- a/xen/arch/arm/mpu/mm.c > +++ b/xen/arch/arm/mpu/mm.c > @@ -14,6 +14,17 @@ > > struct page_info *frame_table; > > +/* Maximum number of supported MPU memory regions by the EL2 MPU. */ > +uint8_t __ro_after_init max_xen_mpumap; > + > +/* > + * Bitmap xen_mpumap_mask is to record the usage of EL2 MPU memory regions. > + * Bit 0 represents MPU memory region 0, bit 1 represents MPU memory > + * region 1, ..., and so on. > + * If a MPU memory region gets enabled, set the according bit to 1. > + */ > +DECLARE_BITMAP(xen_mpumap_mask, MAX_MPU_REGIONS); > + > /* EL2 Xen MPU memory region mapping table. */ > pr_t xen_mpumap[MAX_MPU_REGIONS]; > > @@ -224,9 +235,45 @@ pr_t pr_of_xenaddr(paddr_t base, paddr_t limit, unsigned attr) > return region; > } > > +/* > + * The code in this function needs to track the regions programmed in > + * arm64/mpu/head.S > + */ > +static void __init setup_mpu(void) > +{ > + register_t prenr; > + unsigned int i = 0; > + > + /* > + * MPUIR_EL2.Region[0:7] identifies the number of regions supported by > + * the EL2 MPU. > + */ > + max_xen_mpumap = (uint8_t)(READ_SYSREG(MPUIR_EL2) & NUM_MPU_REGIONS_MASK); > + > + /* PRENR_EL2 has the N bit set if the N region is enabled, N < 32 */ > + prenr = (READ_SYSREG(PRENR_EL2) & PRENR_MASK); > + > + /* > + * Set the bitfield for regions enabled in assembly boot-time. > + * This code works under the assumption that the code in head.S has > + * allocated and enabled regions below 32 (N < 32). > + */ > + while ( prenr > 0 ) > + { > + if (prenr & 0x1) > + { > + set_bit(i, xen_mpumap_mask); > + read_protection_region(&xen_mpumap[i], i); > + } > + > + prenr >>= 1; > + i++; > + } > +} > + > void __init setup_mm(void) > { > - BUG_ON("unimplemented"); > + setup_mpu(); > } > > int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf) > -- > 2.34.1 - Ayan >
Hi Ayan, > On 8 Apr 2025, at 14:32, Ayan Kumar Halder <ayankuma@amd.com> wrote: > > Hi Luca, > > On 07/04/2025 10:14, Luca Fancellu wrote: >> CAUTION: This message has originated from an External Source. Please use proper judgment and caution when opening attachments, clicking links, or responding to this email. >> >> >> Implement the function setup_mpu that will logically track the MPU >> regions defined by hardware registers, start introducing data >> structures and functions to track the status from the C world. >> >> The xen_mpumap_mask bitmap is used to track which MPU region are >> enabled at runtime. >> >> This function is called from setup_mm() which full implementation >> will be provided in a later stage. >> >> Signed-off-by: Luca Fancellu <luca.fancellu@arm.com> >> --- >> xen/arch/arm/include/asm/arm64/mpu.h | 2 ++ >> xen/arch/arm/mpu/mm.c | 49 +++++++++++++++++++++++++++- >> 2 files changed, 50 insertions(+), 1 deletion(-) >> >> diff --git a/xen/arch/arm/include/asm/arm64/mpu.h b/xen/arch/arm/include/asm/arm64/mpu.h >> index 7cf8d355a1af..ff5a957bf085 100644 >> --- a/xen/arch/arm/include/asm/arm64/mpu.h >> +++ b/xen/arch/arm/include/asm/arm64/mpu.h >> @@ -6,6 +6,8 @@ >> #ifndef __ARM_ARM64_MPU_H__ >> #define __ARM_ARM64_MPU_H__ >> >> +#define PRENR_MASK GENMASK(31, 0) > This can be moved to xen/arch/arm/include/asm/mpu.h I can see from the Arm® Cortex®-R52 Processor TRM, r1p1, 3.3.46 Hyp MPU Region Enable Register, that HPRENR can have 16/20/24 enabled bits, the rest is RAZ. Because of that I’ve put that here, maybe you should implement it in the arm32 part since you have this difference from Arm64. Cheers, Luca
On 08/04/2025 14:51, Luca Fancellu wrote: > Hi Ayan, Hi Luca, > >> On 8 Apr 2025, at 14:32, Ayan Kumar Halder <ayankuma@amd.com> wrote: >> >> Hi Luca, >> >> On 07/04/2025 10:14, Luca Fancellu wrote: >>> CAUTION: This message has originated from an External Source. Please use proper judgment and caution when opening attachments, clicking links, or responding to this email. >>> >>> >>> Implement the function setup_mpu that will logically track the MPU >>> regions defined by hardware registers, start introducing data >>> structures and functions to track the status from the C world. >>> >>> The xen_mpumap_mask bitmap is used to track which MPU region are >>> enabled at runtime. >>> >>> This function is called from setup_mm() which full implementation >>> will be provided in a later stage. >>> >>> Signed-off-by: Luca Fancellu <luca.fancellu@arm.com> >>> --- >>> xen/arch/arm/include/asm/arm64/mpu.h | 2 ++ >>> xen/arch/arm/mpu/mm.c | 49 +++++++++++++++++++++++++++- >>> 2 files changed, 50 insertions(+), 1 deletion(-) >>> >>> diff --git a/xen/arch/arm/include/asm/arm64/mpu.h b/xen/arch/arm/include/asm/arm64/mpu.h >>> index 7cf8d355a1af..ff5a957bf085 100644 >>> --- a/xen/arch/arm/include/asm/arm64/mpu.h >>> +++ b/xen/arch/arm/include/asm/arm64/mpu.h >>> @@ -6,6 +6,8 @@ >>> #ifndef __ARM_ARM64_MPU_H__ >>> #define __ARM_ARM64_MPU_H__ >>> >>> +#define PRENR_MASK GENMASK(31, 0) >> This can be moved to xen/arch/arm/include/asm/mpu.h > I can see from the Arm® Cortex®-R52 Processor TRM, r1p1, 3.3.46 Hyp MPU Region Enable Register, > that HPRENR can have 16/20/24 enabled bits, the rest is RAZ. Yes, I see that. However, if you see ARM DDI 0568A.c ID110520 ArmV8-R32 supplement E2.2.4 HPRENR Provides direct access to the HPRLAR.EN bits for EL2 MPU regions 0 to 31. AFAIU, the maximum number of EL2 MPU regions will always be 32. This doesnot seem to be configurable. The R52 TRM isn't clear when it says "{no,16,20,24} EL2-controlled MPU regions implemented" as there is no register to set/check how many EL2 MPU regions are implemented. So, I suggest we can keep this in the common file for now. - Ayan > > Because of that I’ve put that here, maybe you should implement it in the arm32 part since you have this > difference from Arm64. > > Cheers, > Luca >
diff --git a/xen/arch/arm/include/asm/arm64/mpu.h b/xen/arch/arm/include/asm/arm64/mpu.h index 7cf8d355a1af..ff5a957bf085 100644 --- a/xen/arch/arm/include/asm/arm64/mpu.h +++ b/xen/arch/arm/include/asm/arm64/mpu.h @@ -6,6 +6,8 @@ #ifndef __ARM_ARM64_MPU_H__ #define __ARM_ARM64_MPU_H__ +#define PRENR_MASK GENMASK(31, 0) + /* * Excute never. * Stage 1 EL2 translation regime. diff --git a/xen/arch/arm/mpu/mm.c b/xen/arch/arm/mpu/mm.c index 2c5820a44f13..fe05c8097155 100644 --- a/xen/arch/arm/mpu/mm.c +++ b/xen/arch/arm/mpu/mm.c @@ -14,6 +14,17 @@ struct page_info *frame_table; +/* Maximum number of supported MPU memory regions by the EL2 MPU. */ +uint8_t __ro_after_init max_xen_mpumap; + +/* + * Bitmap xen_mpumap_mask is to record the usage of EL2 MPU memory regions. + * Bit 0 represents MPU memory region 0, bit 1 represents MPU memory + * region 1, ..., and so on. + * If a MPU memory region gets enabled, set the according bit to 1. + */ +DECLARE_BITMAP(xen_mpumap_mask, MAX_MPU_REGIONS); + /* EL2 Xen MPU memory region mapping table. */ pr_t xen_mpumap[MAX_MPU_REGIONS]; @@ -224,9 +235,45 @@ pr_t pr_of_xenaddr(paddr_t base, paddr_t limit, unsigned attr) return region; } +/* + * The code in this function needs to track the regions programmed in + * arm64/mpu/head.S + */ +static void __init setup_mpu(void) +{ + register_t prenr; + unsigned int i = 0; + + /* + * MPUIR_EL2.Region[0:7] identifies the number of regions supported by + * the EL2 MPU. + */ + max_xen_mpumap = (uint8_t)(READ_SYSREG(MPUIR_EL2) & NUM_MPU_REGIONS_MASK); + + /* PRENR_EL2 has the N bit set if the N region is enabled, N < 32 */ + prenr = (READ_SYSREG(PRENR_EL2) & PRENR_MASK); + + /* + * Set the bitfield for regions enabled in assembly boot-time. + * This code works under the assumption that the code in head.S has + * allocated and enabled regions below 32 (N < 32). + */ + while ( prenr > 0 ) + { + if (prenr & 0x1) + { + set_bit(i, xen_mpumap_mask); + read_protection_region(&xen_mpumap[i], i); + } + + prenr >>= 1; + i++; + } +} + void __init setup_mm(void) { - BUG_ON("unimplemented"); + setup_mpu(); } int modify_xen_mappings(unsigned long s, unsigned long e, unsigned int nf)
Implement the function setup_mpu that will logically track the MPU regions defined by hardware registers, start introducing data structures and functions to track the status from the C world. The xen_mpumap_mask bitmap is used to track which MPU region are enabled at runtime. This function is called from setup_mm() which full implementation will be provided in a later stage. Signed-off-by: Luca Fancellu <luca.fancellu@arm.com> --- xen/arch/arm/include/asm/arm64/mpu.h | 2 ++ xen/arch/arm/mpu/mm.c | 49 +++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-)