Monitor command showmappings updates
[akaros.git] / kern / arch / x86 / setjmp32.S
1 # Kernel implementations for 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 ebx;     // callee saved registers
11 #       uintreg_t ebp;
12 #       uintreg_t esi;
13 #       uintreg_t edi;
14 # };
15
16 .text
17 .align 4
18 .globl setjmp
19 .type setjmp, @function
20 setjmp:
21         movl 4(%esp),%edx  # Grab a reference to the jmpbuf passed in
22         xorl %eax,%eax     # Zero out the return value for our first return
23         popl %ecx          # Temporarily grab the return address and adjust %rsp
24         movl %ecx,(%edx)   # Save the return address
25         movl %esp,4(%edx)  # The adjusted %esp is the post-return %esp (see longjmp)
26         movl %ebx,8(%edx)  # Save all the callee saved registers into the jmpbuf
27         movl %ebp,12(%edx)
28         movl %esi,16(%edx)
29         movl %edi,20(%edx)
30         pushl %ecx         # Restore stuff to make the call/return stack happy
31         ret
32  
33 .size setjmp,.-setjmp
34  
35 .text
36 .align 4
37 .globl longjmp
38 .type longjmp, @function
39 longjmp:
40         movl 4(%esp),%edx  # Grab a reference to the jmpbuf passed in
41         movl 8(%esp),%eax  # Set the return value to val (32-bit int)
42         movl 20(%edx),%edi # Restore all the callee saved registers from the jmpbuf
43         movl 16(%edx),%esi
44         movl 12(%edx),%ebp
45         movl 8(%edx),%ebx
46         movl 4(%edx),%esp  # Set the post-return %rsp
47         jmp *(%edx)        # Jump back to setjmp callsite (no ret necessary)
48  
49 .size longjmp,.-longjmp