[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] ARM32/traps: Fix do_trap_undefined_instruction()'s detection of kernel text



commit 414dde38b0cf8a38230c8c3f9e8564da9762e743
Author:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Fri Feb 7 23:15:01 2025 +0000
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Thu Feb 13 23:39:08 2025 +0000

    ARM32/traps: Fix do_trap_undefined_instruction()'s detection of kernel text
    
    While fixing some common/arch boundaries for UBSAN support on other
    architectures, the following debugging patch:
    
      diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
      index c1f2d1b89d43..58d1d048d339 100644
      --- a/xen/arch/arm/setup.c
      +++ b/xen/arch/arm/setup.c
      @@ -504,6 +504,8 @@ void asmlinkage __init start_xen(unsigned long 
fdt_paddr)
    
           system_state = SYS_STATE_active;
    
      +    dump_execution_state();
      +
           for_each_domain( d )
               domain_unpause_by_systemcontroller(d);
    
    failed with:
    
      (XEN) *** Serial input to DOM0 (type 'CTRL-a' three times to switch input)
      (XEN) CPU0: Unexpected Trap: Undefined Instruction
      (XEN) ----[ Xen-4.20-rc  arm32  debug=n  Not tainted ]----
      (XEN) CPU:    0
      <snip>
      (XEN)
      (XEN) ****************************************
      (XEN) Panic on CPU 0:
      (XEN) CPU0: Unexpected Trap: Undefined Instruction
      (XEN) ****************************************
    
    This is because the condition for init text is wrong.  While there's nothing
    interesting from that point onwards in start_xen(), it's also wrong for
    livepatches too.
    
    Use is_active_kernel_text() which is the correct test for this purpose, and 
is
    aware of init and livepatch regions as well as their lifetimes.
    
    Fixes: 3e802c6ca1fb ("xen/arm: Correctly support WARN_ON")
    Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx>
    Release-Acked-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
 xen/arch/arm/arm32/traps.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/xen/arch/arm/arm32/traps.c b/xen/arch/arm/arm32/traps.c
index a2fc1c22cb..b88d41811b 100644
--- a/xen/arch/arm/arm32/traps.c
+++ b/xen/arch/arm/arm32/traps.c
@@ -36,8 +36,7 @@ void do_trap_undefined_instruction(struct cpu_user_regs *regs)
     uint32_t pc = regs->pc;
     uint32_t instr;
 
-    if ( !is_kernel_text(pc) &&
-         (system_state >= SYS_STATE_active || !is_kernel_inittext(pc)) )
+    if ( !is_active_kernel_text(pc) )
         goto die;
 
     /* PC should be always a multiple of 4, as Xen is using ARM instruction 
set */
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.