diff options
Diffstat (limited to 'arch/arm/common/fiq_glue.S')
-rw-r--r-- | arch/arm/common/fiq_glue.S | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/arch/arm/common/fiq_glue.S b/arch/arm/common/fiq_glue.S index 24b42cec4813..596565afed9d 100644 --- a/arch/arm/common/fiq_glue.S +++ b/arch/arm/common/fiq_glue.S @@ -1,5 +1,6 @@ /* * Copyright (C) 2008 Google, Inc. + * Copyright (C) 2010-2015 NVIDIA Corporation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -22,14 +23,13 @@ /* fiq stack: r0-r15,cpsr,spsr of interrupted mode */ ENTRY(fiq_glue) - /* store pc, cpsr from previous mode, reserve space for spsr */ + /* store pc, cpsr from previous mode */ mrs r12, spsr - sub lr, lr, #4 + sub r11, lr, #4 subs r10, #1 bne nested_fiq - str r12, [sp, #-8]! - str lr, [sp, #-4]! + stmfd sp!, {r11-r12, lr} /* store r8-r14 from previous mode */ sub sp, sp, #(7 * 4) @@ -86,15 +86,12 @@ fiq_from_usr_mode_exit: msr cpsr_c, #(FIQ_MODE | PSR_I_BIT | PSR_F_BIT) ldmfd sp!, {r0-r7} - ldr lr, [sp, #(4 * 7)] - ldr r12, [sp, #(4 * 8)] - add sp, sp, #(10 * 4) + add sp, sp, #(7 * 4) + ldmfd sp!, {r11-r12, lr} exit_fiq: msr spsr_cxsf, r12 add r10, #1 - cmp r11, #0 - moveqs pc, lr - bx r11 /* jump to custom fiq return function */ + movs pc, r11 nested_fiq: orr r12, r12, #(PSR_F_BIT) @@ -102,17 +99,14 @@ nested_fiq: fiq_glue_end: -ENTRY(fiq_glue_setup) /* func, data, sp, smc call number */ - stmfd sp!, {r4} - mrs r4, cpsr +ENTRY(fiq_glue_setup) /* func, data, sp */ + mrs r3, cpsr msr cpsr_c, #(FIQ_MODE | PSR_I_BIT | PSR_F_BIT) movs r8, r0 mov r9, r1 mov sp, r2 - mov r11, r3 moveq r10, #0 movne r10, #1 - msr cpsr_c, r4 - ldmfd sp!, {r4} + msr cpsr_c, r3 bx lr |