From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: [PATCH V2 04/40] arm: restore stack on return from trap. Date: Tue, 26 Jun 2012 10:29:28 +0000 Message-ID: <1340706604-1313-4-git-send-email-ian.campbell@citrix.com> References: <1340706574.3832.57.camel@zakaz.uk.xensource.com> <1340706604-1313-1-git-send-email-ian.campbell@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1340706604-1313-1-git-send-email-ian.campbell@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Ian Campbell List-Id: xen-devel@lists.xenproject.org We align the stack before calling into C code but we weren't undoing this on return. Collapse continue_(non)idle_domain into continue_new_vcpu. Signed-off-by: Ian Campbell Acked-by: Stefano Stabellini --- xen/arch/arm/domain.c | 16 +++------------- xen/arch/arm/entry.S | 5 ++++- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 4b38790..9339a11 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -16,17 +16,6 @@ DEFINE_PER_CPU(struct vcpu *, curr_vcpu); -static void continue_idle_domain(struct vcpu *v) -{ - reset_stack_and_jump(idle_loop); -} - -static void continue_nonidle_domain(struct vcpu *v) -{ - /* check_wakeup_from_wait(); */ - reset_stack_and_jump(return_from_trap); -} - void idle_loop(void) { for ( ; ; ) @@ -72,9 +61,10 @@ static void continue_new_vcpu(struct vcpu *prev) schedule_tail(prev); if ( is_idle_vcpu(current) ) - continue_idle_domain(current); + reset_stack_and_jump(idle_loop); else - continue_nonidle_domain(current); + /* check_wakeup_from_wait(); */ + reset_stack_and_jump(return_to_new_vcpu); } void context_switch(struct vcpu *prev, struct vcpu *next) diff --git a/xen/arch/arm/entry.S b/xen/arch/arm/entry.S index f261a9f..7a22e2d 100644 --- a/xen/arch/arm/entry.S +++ b/xen/arch/arm/entry.S @@ -72,7 +72,9 @@ DEFINE_TRAP_ENTRY(hypervisor) DEFINE_TRAP_ENTRY(irq) DEFINE_TRAP_ENTRY(fiq) -ENTRY(return_from_trap) +return_from_trap: + mov sp, r11 +ENTRY(return_to_new_vcpu) ldr r11, [sp, #UREGS_cpsr] and r11, #PSR_MODE_MASK cmp r11, #PSR_MODE_HYP @@ -82,6 +84,7 @@ ENTRY(return_to_guest) mov r11, sp bic sp, #7 /* Align the stack pointer */ bl leave_hypervisor_tail + mov sp, r11 RESTORE_ONE_BANKED(SP_usr) /* LR_usr is the same physical register as lr and is restored below */ RESTORE_BANKED(svc) -- 1.7.9.1