abort-macro.S 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * The ARM LDRD and Thumb LDRSB instructions use bit 20/11 (ARM/Thumb)
  3. * differently than every other instruction, so it is set to 0 (write)
  4. * even though the instructions are read instructions. This means that
  5. * during an abort the instructions will be treated as a write and the
  6. * handler will raise a signal from unwriteable locations if they
  7. * fault. We have to specifically check for these instructions
  8. * from the abort handlers to treat them properly.
  9. *
  10. */
  11. .macro do_thumb_abort, fsr, pc, psr, tmp
  12. tst \psr, #PSR_T_BIT
  13. beq not_thumb
  14. ldrh \tmp, [\pc] @ Read aborted Thumb instruction
  15. and \tmp, \tmp, # 0xfe00 @ Mask opcode field
  16. cmp \tmp, # 0x5600 @ Is it ldrsb?
  17. orreq \tmp, \tmp, #1 << 11 @ Set L-bit if yes
  18. tst \tmp, #1 << 11 @ L = 0 -> write
  19. orreq \fsr, \fsr, #1 << 11 @ yes.
  20. b do_DataAbort
  21. not_thumb:
  22. .endm
  23. /*
  24. * We check for the following instruction encoding for LDRD.
  25. *
  26. * [27:25] == 000
  27. * [7:4] == 1101
  28. * [20] == 0
  29. */
  30. .macro do_ldrd_abort, tmp, insn
  31. tst \insn, #0x0e100000 @ [27:25,20] == 0
  32. bne not_ldrd
  33. and \tmp, \insn, #0x000000f0 @ [7:4] == 1101
  34. cmp \tmp, #0x000000d0
  35. beq do_DataAbort
  36. not_ldrd:
  37. .endm