You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

__call.S 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* Trampoline for calling outside of etherboot */
  2. .text
  3. .globl __call
  4. .proc __call
  5. __call:
  6. alloc loc0=ar.pfs,8,3,8,0 /* in, local, out, rotating */
  7. mov loc1=rp
  8. mov loc2=gp
  9. ld8 r14=[in0],8
  10. ;;
  11. ld8 gp=[in0]
  12. mov r28=in1 /* So we can use stacked pal calling conventions */
  13. mov out0=in1
  14. mov out1=in2
  15. mov out2=in3
  16. mov out3=in4
  17. mov out4=in5
  18. mov out5=in6
  19. mov out6=in7
  20. mov out7=0 /* So we can work with sal calling conventions */
  21. mov b6=r14
  22. ;;
  23. br.call.sptk.few rp=b6
  24. ;;
  25. rsm psr.i /* disable interrupts */
  26. ;;
  27. mov gp=loc2
  28. mov rp=loc1
  29. ;;
  30. mov ar.pfs=loc0
  31. br.ret.sptk.many rp
  32. .size __call, . - __call
  33. .endp __call
  34. .text
  35. .globl pal_call
  36. .proc pal_call
  37. pal_call:
  38. alloc loc0 = ar.pfs,4,3,0,0 /* in, local, out, rotating */
  39. mov loc1 = rp
  40. mov loc2 = gp
  41. add r8 = @gprel(pal_entry),gp
  42. add r9 = @gprel(pal_ret),gp
  43. ;;
  44. ld8 r14 = [r8]
  45. ;;
  46. mov r28 = in0
  47. mov r29 = in1
  48. mov r30 = in2
  49. mov r31 = in3
  50. mov b6 = r14
  51. mov rp = r9
  52. rsm psr.i /* disable interrupts */
  53. ;;
  54. br.sptk.few b6
  55. ;;
  56. pal_ret:
  57. rsm psr.i /* disable interrupts */
  58. ;;
  59. mov gp=loc2
  60. mov rp=loc1
  61. ;;
  62. mov ar.pfs=loc0
  63. br.ret.sptk.many rp