Merge branch 'process_vm' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux
[pandora-kernel.git] / arch / x86 / um / setjmp_64.S
1 #
2 # arch/x86_64/setjmp.S
3 #
4 # setjmp/longjmp for the x86-64 architecture
5 #
6
7 #
8 # The jmp_buf is assumed to contain the following, in order:
9 #       %rbx
10 #       %rsp (post-return)
11 #       %rbp
12 #       %r12
13 #       %r13
14 #       %r14
15 #       %r15
16 #       <return address>
17 #
18
19         .text
20         .align 4
21         .globl setjmp
22         .type setjmp, @function
23 setjmp:
24         pop  %rsi                       # Return address, and adjust the stack
25         xorl %eax,%eax                  # Return value
26         movq %rbx,(%rdi)
27         movq %rsp,8(%rdi)               # Post-return %rsp!
28         push %rsi                       # Make the call/return stack happy
29         movq %rbp,16(%rdi)
30         movq %r12,24(%rdi)
31         movq %r13,32(%rdi)
32         movq %r14,40(%rdi)
33         movq %r15,48(%rdi)
34         movq %rsi,56(%rdi)              # Return address
35         ret
36
37         .size setjmp,.-setjmp
38
39         .text
40         .align 4
41         .globl longjmp
42         .type longjmp, @function
43 longjmp:
44         movl %esi,%eax                  # Return value (int)
45         movq (%rdi),%rbx
46         movq 8(%rdi),%rsp
47         movq 16(%rdi),%rbp
48         movq 24(%rdi),%r12
49         movq 32(%rdi),%r13
50         movq 40(%rdi),%r14
51         movq 48(%rdi),%r15
52         jmp *56(%rdi)
53
54         .size longjmp,.-longjmp