switch_sh_gcc.h 901 B

123456789101112131415161718192021222324252627282930313233343536
  1. #define STACK_REFPLUS 1
  2. #ifdef SLP_EVAL
  3. #define STACK_MAGIC 0
  4. #define REGS_TO_SAVE "r8", "r9", "r10", "r11", "r13", \
  5. "fr12", "fr13", "fr14", "fr15"
  6. // r12 Global context pointer, GP
  7. // r14 Frame pointer, FP
  8. // r15 Stack pointer, SP
  9. static int
  10. slp_switch(void)
  11. {
  12. int err;
  13. void* fp;
  14. int *stackref, stsizediff;
  15. __asm__ volatile("" : : : REGS_TO_SAVE);
  16. __asm__ volatile("mov.l r14, %0" : "=m"(fp) : :);
  17. __asm__("mov r15, %0" : "=r"(stackref));
  18. {
  19. SLP_SAVE_STATE(stackref, stsizediff);
  20. __asm__ volatile(
  21. "add %0, r15\n"
  22. "add %0, r14\n"
  23. : /* no outputs */
  24. : "r"(stsizediff));
  25. SLP_RESTORE_STATE();
  26. __asm__ volatile("mov r0, %0" : "=r"(err) : :);
  27. }
  28. __asm__ volatile("mov.l %0, r14" : : "m"(fp) :);
  29. __asm__ volatile("" : : : REGS_TO_SAVE);
  30. return err;
  31. }
  32. #endif