trap.s 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #
  2. ! $Source: /cvsroot/tack/Ack/plat/linux386/libsys/_syscall.s,v $
  3. ! $State: Exp $
  4. ! $Revision: 1.1 $
  5. ! Declare segments (the order is important).
  6. .sect .text
  7. .sect .rom
  8. .sect .data
  9. .sect .bss
  10. .sect .text
  11. #define IFFALSE 4
  12. #define IFTRUE 12
  13. #define ALWAYS 20
  14. #define LT 0
  15. #define GT 1
  16. #define EQ 2
  17. #define OV 3
  18. EARRAY = 0
  19. ERANGE = 1
  20. ESET = 2
  21. EIOVFL = 3
  22. EFOVFL = 4
  23. EFUNFL = 5
  24. EIDIVZ = 6
  25. EFDIVZ = 7
  26. EIUND = 8
  27. EFUND = 9
  28. ECONV = 10
  29. ESTACK = 16
  30. EHEAP = 17
  31. EILLINS = 18
  32. EODDZ = 19
  33. ECASE = 20
  34. EMEMFLT = 21
  35. EBADPTR = 22
  36. EBADPC = 23
  37. EBADLAE = 24
  38. EBADMON = 25
  39. EBADLIN = 26
  40. EBADGTO = 27
  41. EUNIMPL = 63 ! unimplemented em-instruction called
  42. ! EM trap handling.
  43. .define .trap_ecase
  44. .trap_ecase:
  45. addi r3, r0, ECASE
  46. b .trap
  47. .define .trap_earray
  48. .trap_earray:
  49. addi r3, r0, EARRAY
  50. b .trap
  51. .define .trap
  52. .trap:
  53. cmpi cr0, 0, r3, 15 ! traps >15 can't be ignored
  54. bc IFTRUE, LT, 1f
  55. addi r4, r0, 1
  56. rlwnm r4, r4, r3, 0, 31 ! calculate trap bit
  57. addis r5, r0, <.ignmask
  58. ori r5, r5, >.ignmask
  59. lwz r5, 0(r5) ! load ignore mask
  60. and. r4, r4, r5 ! compare
  61. bclr IFFALSE, EQ, 0 ! return if non-zero
  62. 1:
  63. addis r4, r0, <.trppc
  64. ori r4, r4, >.trppc
  65. lwz r5, 0(r4) ! load user trap routine
  66. or. r5, r5, r5 ! test
  67. bc IFTRUE, EQ, fatal ! if no user trap routine, bail out
  68. addi r0, r0, 0
  69. stw r0, 0(r4) ! reset trap routine
  70. mfspr r0, lr
  71. stwu r0, -4(sp) ! save old lr
  72. stwu r3, -4(sp)
  73. mtspr ctr, r5
  74. bcctrl ALWAYS, 0, 0 ! call trap routine
  75. lwz r0, 4(sp) ! load old lr again
  76. addi sp, sp, 8 ! retract over stack usage
  77. bclr ALWAYS, 0, 0 ! return
  78. fatal:
  79. addi r3, r0, 1
  80. addis r4, r0, <message
  81. ori r4, r4, >message
  82. addi r5, r0, 6
  83. addi r0, r0, 4 ! write()
  84. sc 0
  85. addi r0, r0, 1 ! exit()
  86. sc 0
  87. .sect .rom
  88. message:
  89. .ascii "TRAP!\n"