mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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 <ian.campbell@citrix.com> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Committed-by: Ian Campbell <Ian.Campbell@citrix.com>
This commit is contained in:
1 parent
c52f64c8dc
commit
d77aed8fda
2 files changed
+16
-15
No files matched your search
+4
-12
@@ -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]
|
||||
|
||||
@@ -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);
|
||||
|
||||