|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] arm: lr register in hyp mode is really LR_usr.
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1329921204 0
# Node ID a4d93d0e0df2fafe5b3e2dab3e34799498a875e2
# Parent 70aeec92bd0aaabc9fd1718e753ef2cdba5057b8
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@xxxxxxxxxx>
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Committed-by: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
---
diff -r 70aeec92bd0a -r a4d93d0e0df2 xen/arch/arm/entry.S
--- a/xen/arch/arm/entry.S Wed Feb 22 14:33:23 2012 +0000
+++ b/xen/arch/arm/entry.S Wed Feb 22 14:33:24 2012 +0000
@@ -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 @@
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 @@
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 -r 70aeec92bd0a -r a4d93d0e0df2 xen/include/public/arch-arm.h
--- a/xen/include/public/arch-arm.h Wed Feb 22 14:33:23 2012 +0000
+++ b/xen/include/public/arch-arm.h Wed Feb 22 14:33:24 2012 +0000
@@ -63,7 +63,12 @@
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 @@
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);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |