| 123456789101112131415161718192021222324252627282930313233343536 |
- #define STACK_REFPLUS 1
- #ifdef SLP_EVAL
- #define STACK_MAGIC 0
- #define REGS_TO_SAVE "r8", "r9", "r10", "r11", "r13", \
- "fr12", "fr13", "fr14", "fr15"
- // r12 Global context pointer, GP
- // r14 Frame pointer, FP
- // r15 Stack pointer, SP
- static int
- slp_switch(void)
- {
- int err;
- void* fp;
- int *stackref, stsizediff;
- __asm__ volatile("" : : : REGS_TO_SAVE);
- __asm__ volatile("mov.l r14, %0" : "=m"(fp) : :);
- __asm__("mov r15, %0" : "=r"(stackref));
- {
- SLP_SAVE_STATE(stackref, stsizediff);
- __asm__ volatile(
- "add %0, r15\n"
- "add %0, r14\n"
- : /* no outputs */
- : "r"(stsizediff));
- SLP_RESTORE_STATE();
- __asm__ volatile("mov r0, %0" : "=r"(err) : :);
- }
- __asm__ volatile("mov.l %0, r14" : : "m"(fp) :);
- __asm__ volatile("" : : : REGS_TO_SAVE);
- return err;
- }
- #endif
|