xref: /openbsd/regress/sys/kern/stackpivot/pivot.h (revision 097a140d)
1 #ifndef REGRESS_PIVOT_H
2 #define REGRESS_PIVOT_H
3 
4 static void pivot(void *newstack) {
5 #if defined(__aarch64__)
6     asm("mov sp, %0; ldr lr, [sp]; ret;" ::"r"(newstack));
7 #elif defined(__amd64__)
8     asm("mov %0, %%rsp; retq;" ::"r"(newstack));
9 #elif defined(__i386__)
10     asm("mov %0, %%esp; retl;" ::"r"(newstack));
11 #elif defined(__mips64__)
12     asm("move $sp, %0; ld $ra, 0($sp); jr $ra;" ::"r"(newstack));
13 #elif defined(__powerpc64__)
14     asm("mr %%r1, %0; ld %%r3, 0(%%r1); mtlr %%r3; blr;" ::"r"(newstack));
15 #elif defined(__powerpc__)
16     asm("mr %%r1, %0; lwz %%r3, 0(%%r1); mtlr %%r3; blr;" ::"r"(newstack));
17 #endif
18 }
19 
20 #endif
21