1 #pragma once
2 
3 inline void
switch_stack(unsigned long stack,void (* func)())4 switch_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