MSI cleanup and IRQ routing
[akaros.git] / kern / arch / x86 / setjmp64.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 rsp;     // post-return rsp
10 #       uintreg_t rbx;
11 #       uintreg_t rbp;
12 #       uintreg_t r12;
13 #       uintreg_t r13;
14 #       uintreg_t r14;
15 #       uintreg_t r15;
16 # };
17
18 .text
19 .align 4
20 .globl setjmp
21 .type setjmp, @function
22 setjmp:
23         xorl %eax,%eax     # Zero out the return value for our first return
24         pop  %rsi          # Temporarily grab the return address and adjust %rsp
25         movq %rsi,(%rdi)   # Save the return address
26         movq %rsp,8(%rdi)  # The adjusted %rsp is the post-return %rsp (see longjmp)
27         movq %rbx,16(%rdi) # Save all the callee saved registers into the jmpbuf
28         movq %rbp,24(%rdi) 
29         movq %r12,32(%rdi) 
30         movq %r13,40(%rdi) 
31         movq %r14,48(%rdi) 
32         movq %r15,56(%rdi) 
33         push %rsi          # Restore stuff to make the call/return stack happy
34         ret
35         
36 .size setjmp,.-setjmp
37
38 .text
39 .align 4
40 .globl longjmp
41 .type longjmp, @function
42 longjmp:
43         movl %esi,%eax     # Set the return value to val (32-bit int)
44         movq 56(%rdi),%r15 # Restore all the callee saved registers from the jmpbuf
45         movq 48(%rdi),%r14  
46         movq 40(%rdi),%r13
47         movq 32(%rdi),%r12
48         movq 24(%rdi),%rbp
49         movq 16(%rdi),%rbx
50         movq 8(%rdi),%rsp  # Set the post-return %rsp
51         jmp *(%rdi)        # Jump back to setjmp callsite (no ret necessary)
52         
53 .size longjmp,.-longjmp