1 #pragma once 2 3 inline void switch_stack(unsigned long stack,void (* func)())4switch_stack(unsigned long stack, void (*func)()) 5 { 6 register unsigned long v0 asm("v0") = 0; 7 register unsigned long t9 asm("t9") = reinterpret_cast<unsigned long>(func); 8 asm volatile ( ".set push \n\t" 9 ".set noreorder \n\t" 10 "jr %[func] \n\t" 11 " move $sp, %[stack] \n\t" 12 ".set pop \n\t" 13 : : [stack] "r" (stack), [func] "r" (t9), "r" (v0) 14 : "memory"); 15 } 16 17