Moves 9ns endian helpers
[akaros.git] / kern / arch / x86 / setjmp64.S
1 # Kernel implementations for a slim setjmp/longjmp.
2 #
3 # int setjmp(struct jmpbuf *env);
4 # void longjmp(struct jmpbuf *env, int val);
5 #
6 # Callers *must* clobber all callee-saved registers first, e.g.:
7 #       asm volatile ("" : : : "rbx", "r12", "r13", "r14", "r15");
8
9 # The jmpbuf struct is defined as below:
10 # struct jmpbuf {
11 #       uintptr_t retaddr; // return address
12 #       uintreg_t rsp;     // post-return rsp
13 #       uintreg_t rbp;
14 # };
15
16 .text
17 .align 4
18 .globl slim_setjmp
19 .type slim_setjmp, @function
20 slim_setjmp:
21         xorl %eax,%eax     # Zero out the return value for our first return
22         pop  %rsi          # Temporarily grab the return address and adjust %rsp
23         movq %rsi,(%rdi)   # Save the return address
24         movq %rsp,8(%rdi)  # The adjusted %rsp is the post-return %rsp (see longjmp)
25         movq %rbp,16(%rdi) 
26         push %rsi          # Restore stuff to make the call/return stack happy
27         ret
28         
29 .size slim_setjmp,.-slim_setjmp
30
31 .text
32 .align 4
33 .globl longjmp
34 .type longjmp, @function
35 longjmp:
36         movl %esi,%eax     # Set the return value to val (32-bit int)
37         movq 16(%rdi),%rbp
38         movq 8(%rdi),%rsp  # Set the post-return %rsp
39         jmp *(%rdi)        # Jump back to setjmp callsite (no ret necessary)
40         
41 .size longjmp,.-longjmp