asm.S 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. Entry point of all programs (_start).
  3. It initializes DWARF call frame information, the stack pointer, the
  4. frame pointer (needed for closures to work in start_rust) and the global
  5. pointer. Then it calls _start_rust.
  6. */
  7. .section .init, "ax"
  8. .global _start
  9. _start:
  10. .cfi_startproc
  11. .cfi_undefined ra
  12. // .option push
  13. // .option norelax
  14. lui gp, %hi(__global_pointer$)
  15. addi gp, gp, %lo(__global_pointer$)
  16. // .option pop
  17. lui sp, %hi(_stack_start)
  18. addi sp, sp, %lo(_stack_start)
  19. add s0, sp, zero
  20. jal zero, _start_rust
  21. .cfi_endproc
  22. /*
  23. Trap entry point (_start_trap)
  24. Saves caller saved registers ra, t0..6, a0..7, calls _start_trap_rust,
  25. restores caller saved registers and then returns.
  26. */
  27. .section .trap, "ax"
  28. .global _start_trap
  29. _start_trap:
  30. addi sp, sp, -16*4
  31. sw ra, 0*4(sp)
  32. sw t0, 1*4(sp)
  33. sw t1, 2*4(sp)
  34. sw t2, 3*4(sp)
  35. sw t3, 4*4(sp)
  36. sw t4, 5*4(sp)
  37. sw t5, 6*4(sp)
  38. sw t6, 7*4(sp)
  39. sw a0, 8*4(sp)
  40. sw a1, 9*4(sp)
  41. sw a2, 10*4(sp)
  42. sw a3, 11*4(sp)
  43. sw a4, 12*4(sp)
  44. sw a5, 13*4(sp)
  45. sw a6, 14*4(sp)
  46. sw a7, 15*4(sp)
  47. jal ra, _start_trap_rust
  48. lw ra, 0*4(sp)
  49. lw t0, 1*4(sp)
  50. lw t1, 2*4(sp)
  51. lw t2, 3*4(sp)
  52. lw t3, 4*4(sp)
  53. lw t4, 5*4(sp)
  54. lw t5, 6*4(sp)
  55. lw t6, 7*4(sp)
  56. lw a0, 8*4(sp)
  57. lw a1, 9*4(sp)
  58. lw a2, 10*4(sp)
  59. lw a3, 11*4(sp)
  60. lw a4, 12*4(sp)
  61. lw a5, 13*4(sp)
  62. lw a6, 14*4(sp)
  63. lw a7, 15*4(sp)
  64. addi sp, sp, 16*4
  65. mret
  66. /* Make sure there is an abort when linking */
  67. .section .init
  68. .globl abort
  69. abort:
  70. jal zero, _start