linux/arch/arm/mm/abort-ev7.S
<<
>>
Prefs
   1#include <linux/linkage.h>
   2#include <asm/assembler.h>
   3/*
   4 * Function: v7_early_abort
   5 *
   6 * Params  : r2 = pt_regs
   7 *         : r4 = aborted context pc
   8 *         : r5 = aborted context psr
   9 *
  10 * Returns : r4 - r11, r13 preserved
  11 *
  12 * Purpose : obtain information about current aborted instruction.
  13 */
  14        .align  5
  15ENTRY(v7_early_abort)
  16        /*
  17         * The effect of data aborts on on the exclusive access monitor are
  18         * UNPREDICTABLE. Do a CLREX to clear the state
  19         */
  20        clrex
  21
  22        mrc     p15, 0, r1, c5, c0, 0           @ get FSR
  23        mrc     p15, 0, r0, c6, c0, 0           @ get FAR
  24
  25        /*
  26         * V6 code adjusts the returned DFSR.
  27         * New designs should not need to patch up faults.
  28         */
  29
  30#if defined(CONFIG_VERIFY_PERMISSION_FAULT)
  31        /*
  32         * Detect erroneous permission failures and fix
  33         */
  34        ldr     r3, =0x40d                      @ On permission fault
  35        and     r3, r1, r3
  36        cmp     r3, #0x0d
  37        bne     do_DataAbort
  38
  39        mcr     p15, 0, r0, c7, c8, 0           @ Retranslate FAR
  40        isb
  41        mrc     p15, 0, ip, c7, c4, 0           @ Read the PAR
  42        and     r3, ip, #0x7b                   @ On translation fault
  43        cmp     r3, #0x0b
  44        bne     do_DataAbort
  45        bic     r1, r1, #0xf                    @ Fix up FSR FS[5:0]
  46        and     ip, ip, #0x7e
  47        orr     r1, r1, ip, LSR #1
  48#endif
  49
  50        b       do_DataAbort
  51ENDPROC(v7_early_abort)
  52