From 17a9070d22d21b2faa68231e7fd835748b36fc73 Mon Sep 17 00:00:00 2001 From: Stewart Hildebrand Date: Thu, 5 Feb 2026 20:01:27 +0100 Subject: [PATCH] xen/arm: fix unmapped access trapping on GICv2 hardware Since 4dbcb0653621, the vGICv2 CPU interface is mapped in a deferred manner. On domains with XEN_DOMCTL_CDF_trap_unmapped_accesses unset on GICv2 hardware, the vGICv2 CPU interface fails to be mapped. A visible symptom is that a domU gets stuck at: [ 0.177983] smp: Bringing up secondary CPUs ... Move the 2nd check_p2m earlier so it's prioritized over try_handle_mmio. Fixes: 980aff4e8fcd ("xen/arm: Add way to disable traps on accesses to unmapped addresses") Signed-off-by: Stewart Hildebrand Reviewed-by: Michal Orzel --- xen/arch/arm/traps.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 040c0f2e0d..0c01f37ad6 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1915,6 +1915,14 @@ static void do_trap_stage2_abort_guest(struct cpu_user_regs *regs, if ( info.dabt_instr.state == INSTR_ERROR ) goto inject_abt; + /* + * If the instruction syndrome was invalid, then we already checked if + * this was due to a P2M fault. So no point to check again as the result + * will be the same. + */ + if ( (info.dabt_instr.state == INSTR_VALID) && check_p2m(is_data, gpa) ) + return; + state = try_handle_mmio(regs, &info); switch ( state ) @@ -1939,14 +1947,6 @@ static void do_trap_stage2_abort_guest(struct cpu_user_regs *regs, break; } - /* - * If the instruction syndrome was invalid, then we already checked if - * this was due to a P2M fault. So no point to check again as the result - * will be the same. - */ - if ( (info.dabt_instr.state == INSTR_VALID) && check_p2m(is_data, gpa) ) - return; - break; } default: