abort-macro.S 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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
  12. tst r3, #PSR_T_BIT
  13. beq not_thumb
  14. ldrh r3, [r2] @ Read aborted Thumb instruction
  15. and r3, r3, # 0xfe00 @ Mask opcode field
  16. cmp r3, # 0x5600 @ Is it ldrsb?
  17. orreq r3, r3, #1 << 11 @ Set L-bit if yes
  18. tst r3, #1 << 11 @ L = 0 -> write
  19. orreq r1, r1, #1 << 11 @ yes.
  20. mov pc, lr
  21. not_thumb:
  22. .endm
  23. /*
  24. * We check for the following insturction encoding for LDRD.
  25. *
  26. * [27:25] == 0
  27. * [7:4] == 1101
  28. * [20] == 0
  29. */
  30. .macro do_ldrd_abort
  31. tst r3, #0x0e000000 @ [27:25] == 0
  32. bne not_ldrd
  33. and r2, r3, #0x000000f0 @ [7:4] == 1101
  34. cmp r2, #0x000000d0
  35. bne not_ldrd
  36. tst r3, #1 << 20 @ [20] == 0
  37. moveq pc, lr
  38. not_ldrd:
  39. .endm