From c8cb33fa64c9ccbfa2a494a9dad2e0a763c09176 Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Tue, 1 Oct 2019 13:07:53 +0100 Subject: [PATCH 1/4] xen/arm32: entry: Split __DEFINE_ENTRY_TRAP in two The preprocessing macro __DEFINE_ENTRY_TRAP is used to generate trap entry function. While the macro is fairly small today, follow-up patches will increase the size signicantly. In general, assembly macros are more readable as they allow you to name parameters and avoid '\'. So the actual implementation of the trap is now switched to an assembly macro. This is part of XSA-303. Reported-by: Julien Grall Signed-off-by: Julien Grall Reviewed-by: Stefano Stabellini Reviewed-by: Andre Przywara --- xen/arch/arm/arm32/entry.S | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/xen/arch/arm/arm32/entry.S b/xen/arch/arm/arm32/entry.S index 0b4cd19abd..4a762e04f1 100644 --- a/xen/arch/arm/arm32/entry.S +++ b/xen/arch/arm/arm32/entry.S @@ -126,24 +126,28 @@ abort_guest_exit_end: skip_check: mov pc, lr -/* - * Macro to define trap entry. The iflags corresponds to the list of - * interrupts (Asynchronous Abort, IRQ, FIQ) to unmask. - */ + /* + * Macro to define trap entry. The iflags corresponds to the list of + * interrupts (Asynchronous Abort, IRQ, FIQ) to unmask. + */ + .macro vector trap, iflags + SAVE_ALL + cpsie \iflags + adr lr, return_from_trap + mov r0, sp + /* + * Save the stack pointer in r11. It will be restored after the + * trap has been handled (see return_from_trap). + */ + mov r11, sp + bic sp, #7 /* Align the stack pointer (noop on guest trap) */ + b do_trap_\trap + .endm + #define __DEFINE_TRAP_ENTRY(trap, iflags) \ ALIGN; \ trap_##trap: \ - SAVE_ALL; \ - cpsie iflags; \ - adr lr, return_from_trap; \ - mov r0, sp; \ - /* \ - * Save the stack pointer in r11. It will be restored after the \ - * trap has been handled (see return_from_trap). \ - */ \ - mov r11, sp; \ - bic sp, #7; /* Align the stack pointer (noop on guest trap) */ \ - b do_trap_##trap + vector trap, iflags /* Trap handler which unmask IRQ/Abort, keep FIQ masked */ #define DEFINE_TRAP_ENTRY(trap) __DEFINE_TRAP_ENTRY(trap, ai) -- 2.11.0