setjmp.S 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* $FreeBSD$ */
  2. /* from: NetBSD: setjmp.S,v 1.1 1998/01/27 15:13:12 sakamoto Exp $ */
  3. /* from: OpenBSD: setjmp.S,v 1.2 1996/12/28 06:22:18 rahnds Exp */
  4. /* kernel version of this file, does not have signal goop */
  5. /* int setjmp(jmp_buf env) */
  6. #include <machine/asm.h>
  7. #ifdef __powerpc64__
  8. #define LD_REG ld
  9. #define ST_REG std
  10. #define REGWIDTH 8
  11. #else
  12. #define LD_REG lwz
  13. #define ST_REG stw
  14. #define REGWIDTH 4
  15. #endif
  16. #define JMP_r1 1*REGWIDTH
  17. #define JMP_r2 2*REGWIDTH
  18. #define JMP_r14 3*REGWIDTH
  19. #define JMP_r15 4*REGWIDTH
  20. #define JMP_r16 5*REGWIDTH
  21. #define JMP_r17 6*REGWIDTH
  22. #define JMP_r18 7*REGWIDTH
  23. #define JMP_r19 8*REGWIDTH
  24. #define JMP_r20 9*REGWIDTH
  25. #define JMP_r21 10*REGWIDTH
  26. #define JMP_r22 11*REGWIDTH
  27. #define JMP_r23 12*REGWIDTH
  28. #define JMP_r24 13*REGWIDTH
  29. #define JMP_r25 14*REGWIDTH
  30. #define JMP_r26 15*REGWIDTH
  31. #define JMP_r27 16*REGWIDTH
  32. #define JMP_r28 17*REGWIDTH
  33. #define JMP_r29 18*REGWIDTH
  34. #define JMP_r30 19*REGWIDTH
  35. #define JMP_r31 20*REGWIDTH
  36. #define JMP_lr 21*REGWIDTH
  37. #define JMP_cr 22*REGWIDTH
  38. #define JMP_ctr 23*REGWIDTH
  39. #define JMP_xer 24*REGWIDTH
  40. ASENTRY_NOPROF(setjmp)
  41. ST_REG 31, JMP_r31(3)
  42. /* r1, r2, r14-r30 */
  43. ST_REG 1, JMP_r1 (3)
  44. ST_REG 2, JMP_r2 (3)
  45. ST_REG 14, JMP_r14(3)
  46. ST_REG 15, JMP_r15(3)
  47. ST_REG 16, JMP_r16(3)
  48. ST_REG 17, JMP_r17(3)
  49. ST_REG 18, JMP_r18(3)
  50. ST_REG 19, JMP_r19(3)
  51. ST_REG 20, JMP_r20(3)
  52. ST_REG 21, JMP_r21(3)
  53. ST_REG 22, JMP_r22(3)
  54. ST_REG 23, JMP_r23(3)
  55. ST_REG 24, JMP_r24(3)
  56. ST_REG 25, JMP_r25(3)
  57. ST_REG 26, JMP_r26(3)
  58. ST_REG 27, JMP_r27(3)
  59. ST_REG 28, JMP_r28(3)
  60. ST_REG 29, JMP_r29(3)
  61. ST_REG 30, JMP_r30(3)
  62. /* cr, lr, ctr, xer */
  63. mfcr 0
  64. ST_REG 0, JMP_cr(3)
  65. mflr 0
  66. ST_REG 0, JMP_lr(3)
  67. mfctr 0
  68. ST_REG 0, JMP_ctr(3)
  69. mfxer 0
  70. ST_REG 0, JMP_xer(3)
  71. /* f14-f31, fpscr */
  72. li 3, 0
  73. blr
  74. ASEND(setjmp)
  75. .extern sigsetmask
  76. ASENTRY_NOPROF(longjmp)
  77. LD_REG 31, JMP_r31(3)
  78. /* r1, r2, r14-r30 */
  79. LD_REG 1, JMP_r1 (3)
  80. LD_REG 2, JMP_r2 (3)
  81. LD_REG 14, JMP_r14(3)
  82. LD_REG 15, JMP_r15(3)
  83. LD_REG 16, JMP_r16(3)
  84. LD_REG 17, JMP_r17(3)
  85. LD_REG 18, JMP_r18(3)
  86. LD_REG 19, JMP_r19(3)
  87. LD_REG 20, JMP_r20(3)
  88. LD_REG 21, JMP_r21(3)
  89. LD_REG 22, JMP_r22(3)
  90. LD_REG 23, JMP_r23(3)
  91. LD_REG 24, JMP_r24(3)
  92. LD_REG 25, JMP_r25(3)
  93. LD_REG 26, JMP_r26(3)
  94. LD_REG 27, JMP_r27(3)
  95. LD_REG 28, JMP_r28(3)
  96. LD_REG 29, JMP_r29(3)
  97. LD_REG 30, JMP_r30(3)
  98. /* cr, lr, ctr, xer */
  99. LD_REG 0, JMP_cr(3)
  100. mtcr 0
  101. LD_REG 0, JMP_lr(3)
  102. mtlr 0
  103. LD_REG 0, JMP_ctr(3)
  104. mtctr 0
  105. LD_REG 0, JMP_xer(3)
  106. mtxer 0
  107. /* f14-f31, fpscr */
  108. mr 3, 4
  109. blr
  110. ASEND(longjmp)