BXE: min->MIN, plus an spatch
[akaros.git] / kern / arch / x86 / setjmp32.S
1 # Kernel implementations for slim setjmp/longjmp.
2 #
3 # int setjmp(struct jmpbuf *env);
4 # void longjmp(struct jmpbuf *env, int val);
5
6 # The jmpbuf struct is defined as below:
7 # struct jmpbuf {
8 #       uintptr_t retaddr; // return address
9 #       uintreg_t esp;     // post-return esp
10 #       uintreg_t ebp;
11 # };
12
13 .text
14 .align 4
15 .globl slim_setjmp
16 .type slim_setjmp, @function
17 slim_setjmp:
18         movl 4(%esp),%edx  # Grab a reference to the jmpbuf passed in
19         xorl %eax,%eax     # Zero out the return value for our first return
20         popl %ecx          # Temporarily grab the return address and adjust %rsp
21         movl %ecx,(%edx)   # Save the return address
22         movl %esp,4(%edx)  # The adjusted %esp is the post-return %esp (see longjmp)
23         movl %ebp,8(%edx)
24         pushl %ecx         # Restore stuff to make the call/return stack happy
25         ret
26  
27 .size slim_setjmp,.-slim_setjmp
28  
29 .text
30 .align 4
31 .globl longjmp
32 .type longjmp, @function
33 longjmp:
34         movl 4(%esp),%edx  # Grab a reference to the jmpbuf passed in
35         movl 8(%esp),%eax  # Set the return value to val (32-bit int)
36         movl 8(%edx),%ebp
37         movl 4(%edx),%esp  # Set the post-return %rsp
38         jmp *(%edx)        # Jump back to setjmp callsite (no ret necessary)
39  
40 .size longjmp,.-longjmp