]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/blobdiff - arch/arm/common/fiq_glue.S
FIQ: Implement WDT FIQ debugger
[sojka/nv-tegra/linux-3.10.git] / arch / arm / common / fiq_glue.S
index 24b42cec4813fa45f9abe0974cb9a3880500d4f8..596565afed9d2652e5127935f91775a48c37afa8 100644 (file)
@@ -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
                /* 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