ARM: entry: prefetch abort: tail-call the main prefetch abort handler
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 26 Jun 2011 11:37:35 +0000 (12:37 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 2 Jul 2011 09:56:10 +0000 (10:56 +0100)
Tail-call the main C prefetch abort handler code from the per-CPU
helper code.  Also note that the helper function becomes ABI
compliant in terms of the registers preserved.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/entry-armv.S
arch/arm/mm/pabort-legacy.S
arch/arm/mm/pabort-v6.S
arch/arm/mm/pabort-v7.S

index b17e57949d3b59faa42982158a34b27a30708d40..af2fba7a4cae8802e693eba8971970986ba87485 100644 (file)
@@ -45,7 +45,7 @@
        .endm
 
        .macro  pabt_helper
-       @ PABORT handler takes fault address in r4
+       @ PABORT handler takes pt_regs in r2, fault address in r4 and psr in r5
 #ifdef MULTI_PABORT
        ldr     ip, .LCprocfns
        mov     lr, pc
@@ -306,9 +306,8 @@ ENDPROC(__und_svc)
        .align  5
 __pabt_svc:
        svc_entry
-       pabt_helper
        mov     r2, sp                          @ regs
-       bl      do_PrefetchAbort                @ call abort handler
+       pabt_helper
 
        @
        @ IRQs off again before pulling preserved data off the stack
@@ -653,9 +652,8 @@ ENDPROC(__und_usr_unknown)
        .align  5
 __pabt_usr:
        usr_entry
-       pabt_helper
        mov     r2, sp                          @ regs
-       bl      do_PrefetchAbort                @ call abort handler
+       pabt_helper
  UNWIND(.fnend         )
        /* fall through */
 /*
index 8a5d8aaf2d5ed88f027fafef8f5a1721644761ba..8bbff025269a26b7d436f70bc8806434c605f202 100644 (file)
@@ -4,10 +4,11 @@
 /*
  * Function: legacy_pabort
  *
- * Params  : r4 = address of aborted instruction
+ * Params  : r2 = pt_regs
+ *        : r4 = address of aborted instruction
+ *        : r5 = psr for parent context
  *
- * Returns : r0 = address of abort
- *        : r1 = Simulated IFSR with section translation fault status
+ * Returns : r4 - r11, r13 preserved
  *
  * Purpose : obtain information about current prefetch abort.
  */
@@ -16,5 +17,5 @@
 ENTRY(legacy_pabort)
        mov     r0, r4
        mov     r1, #5
-       mov     pc, lr
+       b       do_PrefetchAbort
 ENDPROC(legacy_pabort)
index eaac1cb7c4cc4ceea1375b531f048d6b8218e92b..9627646ce7832adc9cc8026e9a8dccd101f297fc 100644 (file)
@@ -4,10 +4,11 @@
 /*
  * Function: v6_pabort
  *
- * Params  : r4 = address of aborted instruction
+ * Params  : r2 = pt_regs
+ *        : r4 = address of aborted instruction
+ *        : r5 = psr for parent context
  *
- * Returns : r0 = address of abort
- *        : r1 = IFSR
+ * Returns : r4 - r11, r13 preserved
  *
  * Purpose : obtain information about current prefetch abort.
  */
@@ -16,5 +17,5 @@
 ENTRY(v6_pabort)
        mov     r0, r4
        mrc     p15, 0, r1, c5, c0, 1           @ get IFSR
-       mov     pc, lr
+       b       do_PrefetchAbort
 ENDPROC(v6_pabort)
index b515e0b059b327fbf22d9572fcc96c18ec6deeec..875761f44f3bbb7d5bb064ab0e6a06144de22a96 100644 (file)
@@ -2,12 +2,13 @@
 #include <asm/assembler.h>
 
 /*
- * Function: v6_pabort
+ * Function: v7_pabort
  *
- * Params  : r4 = address of aborted instruction
+ * Params  : r2 = pt_regs
+ *        : r4 = address of aborted instruction
+ *        : r5 = psr for parent context
  *
- * Returns : r0 = address of abort
- *        : r1 = IFSR
+ * Returns : r4 - r11, r13 preserved
  *
  * Purpose : obtain information about current prefetch abort.
  */
@@ -16,5 +17,5 @@
 ENTRY(v7_pabort)
        mrc     p15, 0, r0, c6, c0, 2           @ get IFAR
        mrc     p15, 0, r1, c5, c0, 1           @ get IFSR
-       mov     pc, lr
+       b       do_PrefetchAbort
 ENDPROC(v7_pabort)