From: Ian Campbell Date: Mon, 29 Jul 2013 12:21:01 +0000 (+0100) Subject: xen: arm: handle traps from 64-bit guests X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~6587 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b068e6a63c116889197dd6d7409fd8f5bec6d110;p=xen.git xen: arm: handle traps from 64-bit guests While there observe that we weren't ever restoring the outer stack frame, even for 32-bit guests when running a 64-bit hypervisor! The outer stack frame "only" contains most of the SPSR registers for 32-bit... Signed-off-by: Ian Campbell Acked-by: Tim Deegan --- diff --git a/xen/arch/arm/arm64/entry.S b/xen/arch/arm/arm64/entry.S index 390a11d36f..9cda8f1342 100644 --- a/xen/arch/arm/arm64/entry.S +++ b/xen/arch/arm/arm64/entry.S @@ -56,6 +56,38 @@ lr .req x30 // link register .endm + .macro exit_guest, compat + + add x21, sp, #UREGS_SPSR_el1 + ldr x23, [x21] + msr SPSR_el1, x23 + + .if \compat == 0 /* Aarch64 mode */ + + add x21, sp, #UREGS_SP_el0 + ldr x22, [x21] + msr SP_el0, x22 + + add x21, sp, #UREGS_SP_el1 + ldp x22, x23, [x21] + msr SP_el1, x22 + msr ELR_el1, x23 + + .else /* Aarch32 mode */ + + add x21, sp, #UREGS_SPSR_fiq + ldp w22, w23, [x21] + msr SPSR_fiq, x22 + msr SPSR_irq, x23 + + add x21, sp, #UREGS_SPSR_und + ldp w22, w23, [x21] + msr SPSR_und, x22 + msr SPSR_abt, x23 + + .endif + + .endm /* * Save state on entry to hypervisor, restore on exit */ @@ -102,6 +134,8 @@ lr .req x30 // link register bl leave_hypervisor_tail /* Disables interrupts on return */ + exit_guest \compat + .endif b return_from_trap @@ -155,11 +189,16 @@ hyp_irq: guest_sync: entry hyp=0, compat=0 - invalid BAD_SYNC /* No AArch64 guest support yet */ + msr daifclr, #2 + mov x0, sp + bl do_trap_hypervisor + exit hyp=0, compat=0 guest_irq: entry hyp=0, compat=0 - invalid BAD_IRQ /* No AArch64 guest support yet */ + mov x0, sp + bl do_trap_irq + exit hyp=0, compat=0 guest_fiq_invalid: entry hyp=0, compat=0