switch_riscv_unix.h 949 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #define STACK_REFPLUS 1
  2. #ifdef SLP_EVAL
  3. #define STACK_MAGIC 0
  4. #define REGS_TO_SAVE "s1", "s2", "s3", "s4", "s5", \
  5. "s6", "s7", "s8", "s9", "s10", "s11", "fs0", "fs1", \
  6. "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", \
  7. "fs10", "fs11"
  8. static int
  9. slp_switch(void)
  10. {
  11. int ret;
  12. long fp;
  13. long *stackref, stsizediff;
  14. __asm__ volatile ("" : : : REGS_TO_SAVE);
  15. __asm__ volatile ("mv %0, fp" : "=r" (fp) : );
  16. __asm__ volatile ("mv %0, sp" : "=r" (stackref) : );
  17. {
  18. SLP_SAVE_STATE(stackref, stsizediff);
  19. __asm__ volatile (
  20. "add sp, sp, %0\n\t"
  21. "add fp, fp, %0\n\t"
  22. : /* no outputs */
  23. : "r" (stsizediff)
  24. );
  25. SLP_RESTORE_STATE();
  26. }
  27. __asm__ volatile ("" : : : REGS_TO_SAVE);
  28. #if __riscv_xlen == 32
  29. __asm__ volatile ("lw fp, %0" : : "m" (fp));
  30. #else
  31. __asm__ volatile ("ld fp, %0" : : "m" (fp));
  32. #endif
  33. __asm__ volatile ("mv %0, zero" : "=r" (ret) : );
  34. return ret;
  35. }
  36. #endif