From: Ian Campbell Date: Wed, 22 Feb 2012 14:33:24 +0000 (+0000) Subject: arm: lr register in hyp mode is really LR_usr. X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=d77aed8fdabdf67f6af144d90ed791d56ec1b85f;p=xen.git arm: lr register in hyp mode is really LR_usr. Save and restore it in the same way for both hypervisor and user stack frames rather than saving both individually in the user stack frame. Signed-off-by: Ian Campbell Acked-by: Stefano Stabellini Committed-by: Ian Campbell --- diff --git a/xen/arch/arm/entry.S b/xen/arch/arm/entry.S index b2986289c5..f261a9fff4 100644 --- a/xen/arch/arm/entry.S +++ b/xen/arch/arm/entry.S @@ -29,11 +29,10 @@ blne save_guest_regs save_guest_regs: - ldr r11, [sp, #UREGS_lr] - str r11, [sp, #UREGS_LR_usr] ldr r11, =0xffffffff /* Clobber SP which is only valid for hypervisor frames. */ str r11, [sp, #UREGS_sp] SAVE_ONE_BANKED(SP_usr) + /* LR_usr is the same physical register as lr and is saved in SAVE_ALL */ SAVE_BANKED(svc) SAVE_BANKED(abt) SAVE_BANKED(und) @@ -78,16 +77,13 @@ ENTRY(return_from_trap) and r11, #PSR_MODE_MASK cmp r11, #PSR_MODE_HYP beq return_to_hypervisor - + /* Fall thru */ ENTRY(return_to_guest) mov r11, sp bic sp, #7 /* Align the stack pointer */ bl leave_hypervisor_tail - ldr r11, [sp, #UREGS_pc] - msr ELR_hyp, r11 - ldr r11, [sp, #UREGS_cpsr] - msr SPSR_hyp, r11 RESTORE_ONE_BANKED(SP_usr) + /* LR_usr is the same physical register as lr and is restored below */ RESTORE_BANKED(svc) RESTORE_BANKED(abt) RESTORE_BANKED(und) @@ -95,11 +91,7 @@ ENTRY(return_to_guest) RESTORE_BANKED(fiq) RESTORE_ONE_BANKED(R8_fiq); RESTORE_ONE_BANKED(R9_fiq); RESTORE_ONE_BANKED(R10_fiq) RESTORE_ONE_BANKED(R11_fiq); RESTORE_ONE_BANKED(R12_fiq); - ldr lr, [sp, #UREGS_LR_usr] - pop {r0-r12} - add sp, #(UREGS_R8_fiq - UREGS_sp); /* SP, LR, SPSR, PC */ - eret - + /* Fall thru */ ENTRY(return_to_hypervisor) ldr lr, [sp, #UREGS_lr] ldr r11, [sp, #UREGS_pc] diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index e3d5c08c00..edb78b488b 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -63,7 +63,12 @@ struct cpu_user_regs uint32_t r12; uint32_t sp; /* r13 - SP: Valid for Hyp. frames only, o/w banked (see below) */ - uint32_t lr; /* r14 - LR: Valid for Hyp. Same physical register as lr_usr. */ + + /* r14 - LR: is the same physical register as LR_usr */ + union { + uint32_t lr; /* r14 - LR: Valid for Hyp. Same physical register as lr_usr. */ + uint32_t lr_usr; + }; uint32_t pc; /* Return IP */ uint32_t cpsr; /* Return mode */ @@ -73,10 +78,14 @@ struct cpu_user_regs uint32_t r8_fiq, r9_fiq, r10_fiq, r11_fiq, r12_fiq; - uint32_t sp_usr, sp_svc, sp_abt, sp_und, sp_irq, sp_fiq; - uint32_t lr_usr, lr_svc, lr_abt, lr_und, lr_irq, lr_fiq; + uint32_t sp_usr; /* LR_usr is the same register as LR, see above */ + + uint32_t sp_svc, sp_abt, sp_und, sp_irq, sp_fiq; + uint32_t lr_svc, lr_abt, lr_und, lr_irq, lr_fiq; uint32_t spsr_svc, spsr_abt, spsr_und, spsr_irq, spsr_fiq; + + uint32_t pad1; /* Doubleword-align the user half of the frame */ }; typedef struct cpu_user_regs cpu_user_regs_t; DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);