[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] arm/mpu: Provide and populate MPU C data structures
commit 3c63d6b3304f4c01fc2e98009e1ef45cd7155453 Author: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx> AuthorDate: Wed Jun 11 15:35:40 2025 +0100 Commit: Michal Orzel <michal.orzel@xxxxxxx> CommitDate: Tue Jun 17 08:31:52 2025 +0200 arm/mpu: Provide and populate MPU C data structures Modify Arm32 assembly boot code to reset any unused MPU region, initialise 'max_mpu_regions' with the number of supported MPU regions and set/clear the bitmap 'xen_mpumap_mask' used to track the enabled regions. Introduce cache.S to hold arm32 cache related functions. Use the macro definition for "dcache_line_size" from linux. Change the order of registers in prepare_xen_region() as 'strd' instruction is used to store {prbar, prlar} in arm32. Thus, 'prbar' has to be a even numbered register and 'prlar' is the consecutively ordered register. Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx> Acked-by: Julien Grall <jgrall@xxxxxxxxxx> Reviewed-by: Luca Fancellu <luca.fancellu@xxxxxxx> --- xen/arch/arm/arm32/Makefile | 1 + xen/arch/arm/arm32/asm-offsets.c | 6 +++++ xen/arch/arm/arm32/cache.S | 43 ++++++++++++++++++++++++++++++++ xen/arch/arm/arm32/mpu/head.S | 41 ++++++++++++++++++++++++------ xen/arch/arm/include/asm/mpu/regions.inc | 2 +- 5 files changed, 84 insertions(+), 9 deletions(-) diff --git a/xen/arch/arm/arm32/Makefile b/xen/arch/arm/arm32/Makefile index 537969d753..531168f58a 100644 --- a/xen/arch/arm/arm32/Makefile +++ b/xen/arch/arm/arm32/Makefile @@ -2,6 +2,7 @@ obj-y += lib/ obj-$(CONFIG_MMU) += mmu/ obj-$(CONFIG_MPU) += mpu/ +obj-y += cache.o obj-$(CONFIG_EARLY_PRINTK) += debug.o obj-y += domctl.o obj-y += domain.o diff --git a/xen/arch/arm/arm32/asm-offsets.c b/xen/arch/arm/arm32/asm-offsets.c index 8bbb0f938e..c203ce269d 100644 --- a/xen/arch/arm/arm32/asm-offsets.c +++ b/xen/arch/arm/arm32/asm-offsets.c @@ -75,6 +75,12 @@ void __dummy__(void) OFFSET(INITINFO_stack, struct init_info, stack); BLANK(); + +#ifdef CONFIG_MPU + DEFINE(XEN_MPUMAP_MASK_sizeof, sizeof(xen_mpumap_mask)); + DEFINE(XEN_MPUMAP_sizeof, sizeof(xen_mpumap)); + BLANK(); +#endif } /* diff --git a/xen/arch/arm/arm32/cache.S b/xen/arch/arm/arm32/cache.S new file mode 100644 index 0000000000..b21bc66793 --- /dev/null +++ b/xen/arch/arm/arm32/cache.S @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Cache maintenance */ + +#include <asm/arm32/sysregs.h> + +/* dcache_line_size - get the minimum D-cache line size from the CTR register */ + .macro dcache_line_size, reg, tmp + mrc CP32(\tmp, CTR) /* read ctr */ + lsr \tmp, \tmp, #16 + and \tmp, \tmp, #0xf /* cache line size encoding */ + mov \reg, #4 /* bytes per word */ + mov \reg, \reg, lsl \tmp /* actual cache line size */ + .endm + +/* + * __invalidate_dcache_area(addr, size) + * + * Ensure that the data held in the cache for the buffer is invalidated. + * + * - addr - start address of the buffer + * - size - size of the buffer + * + * Clobbers r0 - r3 + */ +FUNC(__invalidate_dcache_area) + dcache_line_size r2, r3 + add r1, r0, r1 + sub r3, r2, #1 + bic r0, r0, r3 +1: mcr CP32(r0, DCIMVAC) /* invalidate D line / unified line */ + add r0, r0, r2 + cmp r0, r1 + blo 1b + dsb sy + ret +END(__invalidate_dcache_area) + +/* + * Local variables: + * mode: ASM + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/arm32/mpu/head.S b/xen/arch/arm/arm32/mpu/head.S index b2c5245e51..6a631626a7 100644 --- a/xen/arch/arm/arm32/mpu/head.S +++ b/xen/arch/arm/arm32/mpu/head.S @@ -46,43 +46,68 @@ END(enable_mpu) */ FUNC(enable_boot_cpu_mm) /* Get the number of regions specified in MPUIR_EL2 */ - mrc CP32(r5, MPUIR_EL2) - and r5, r5, #NUM_MPU_REGIONS_MASK + mrc CP32(r3, MPUIR_EL2) + and r3, r3, #NUM_MPU_REGIONS_MASK + + mov_w r0, max_mpu_regions + str r3, [r0] + mcr CP32(r0, DCIMVAC) /* Invalidate cache for max_mpu_regions addr */ /* x0: region sel */ mov r0, #0 /* Xen text section. */ mov_w r1, _stext mov_w r2, _etext - prepare_xen_region r0, r1, r2, r3, r4, r5, attr_prbar=REGION_TEXT_PRBAR + prepare_xen_region r0, r1, r2, r4, r5, r3, attr_prbar=REGION_TEXT_PRBAR /* Xen read-only data section. */ mov_w r1, _srodata mov_w r2, _erodata - prepare_xen_region r0, r1, r2, r3, r4, r5, attr_prbar=REGION_RO_PRBAR + prepare_xen_region r0, r1, r2, r4, r5, r3, attr_prbar=REGION_RO_PRBAR /* Xen read-only after init and data section. (RW data) */ mov_w r1, __ro_after_init_start mov_w r2, __init_begin - prepare_xen_region r0, r1, r2, r3, r4, r5 + prepare_xen_region r0, r1, r2, r4, r5, r3 /* Xen code section. */ mov_w r1, __init_begin mov_w r2, __init_data_begin - prepare_xen_region r0, r1, r2, r3, r4, r5, attr_prbar=REGION_TEXT_PRBAR + prepare_xen_region r0, r1, r2, r4, r5, r3, attr_prbar=REGION_TEXT_PRBAR /* Xen data and BSS section. */ mov_w r1, __init_data_begin mov_w r2, __bss_end - prepare_xen_region r0, r1, r2, r3, r4, r5 + prepare_xen_region r0, r1, r2, r4, r5, r3 #ifdef CONFIG_EARLY_PRINTK /* Xen early UART section. */ mov_w r1, CONFIG_EARLY_UART_BASE_ADDRESS mov_w r2, (CONFIG_EARLY_UART_BASE_ADDRESS + CONFIG_EARLY_UART_SIZE) - prepare_xen_region r0, r1, r2, r3, r4, r5, attr_prbar=REGION_DEVICE_PRBAR, attr_prlar=REGION_DEVICE_PRLAR + prepare_xen_region r0, r1, r2, r4, r5, r3, attr_prbar=REGION_DEVICE_PRBAR, attr_prlar=REGION_DEVICE_PRLAR #endif +zero_mpu: + /* Reset remaining MPU regions */ + cmp r0, r3 + beq out_zero_mpu + mov r1, #0 + mov r2, #1 + prepare_xen_region r0, r1, r2, r4, r5, r3, attr_prlar=REGION_DISABLED_PRLAR + b zero_mpu + +out_zero_mpu: + /* Invalidate data cache for MPU data structures */ + mov r4, lr + mov_w r0, xen_mpumap_mask + mov r1, #XEN_MPUMAP_MASK_sizeof + bl __invalidate_dcache_area + + ldr r0, =xen_mpumap + mov r1, #XEN_MPUMAP_sizeof + bl __invalidate_dcache_area + mov lr, r4 + b enable_mpu END(enable_boot_cpu_mm) diff --git a/xen/arch/arm/include/asm/mpu/regions.inc b/xen/arch/arm/include/asm/mpu/regions.inc index 6b8c233e6c..23fead3b21 100644 --- a/xen/arch/arm/include/asm/mpu/regions.inc +++ b/xen/arch/arm/include/asm/mpu/regions.inc @@ -24,7 +24,7 @@ #define XEN_MPUMAP_ENTRY_SHIFT 0x3 /* 8 byte structure */ .macro store_pair reg1, reg2, dst - .word 0xe7f000f0 /* unimplemented */ + strd \reg1, \reg2, [\dst] .endm #endif -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |