abort-macro.S 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  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. uaccess_disable ip @ disable userspace access
  16. and \tmp, \tmp, # 0xfe00 @ Mask opcode field
  17. cmp \tmp, # 0x5600 @ Is it ldrsb?
  18. orreq \tmp, \tmp, #1 << 11 @ Set L-bit if yes
  19. tst \tmp, #1 << 11 @ L = 0 -> write
  20. orreq \fsr, \fsr, #1 << 11 @ yes.
  21. b do_DataAbort
  22. not_thumb:
  23. .endm
  24. /*
  25. * We check for the following instruction encoding for LDRD.
  26. *
  27. * [27:25] == 000
  28. * [7:4] == 1101
  29. * [20] == 0
  30. */
  31. .macro teq_ldrd, tmp, insn
  32. mov \tmp, #0x0e100000
  33. orr \tmp, #0x000000f0
  34. and \tmp, \insn, \tmp
  35. teq \tmp, #0x000000d0
  36. .endm