Merge branch 'core/debugobjects' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6] / arch / um / sys-i386 / setjmp.S
1 #
2 # arch/i386/setjmp.S
3 #
4 # setjmp/longjmp for the i386 architecture
5 #
6
7 #
8 # The jmp_buf is assumed to contain the following, in order:
9 #       %ebx
10 #       %esp
11 #       %ebp
12 #       %esi
13 #       %edi
14 #       <return address>
15 #
16
17         .text
18         .align 4
19         .globl setjmp
20         .type setjmp, @function
21 setjmp:
22 #ifdef _REGPARM
23         movl %eax,%edx
24 #else
25         movl 4(%esp),%edx
26 #endif
27         popl %ecx                       # Return address, and adjust the stack
28         xorl %eax,%eax                  # Return value
29         movl %ebx,(%edx)
30         movl %esp,4(%edx)               # Post-return %esp!
31         pushl %ecx                      # Make the call/return stack happy
32         movl %ebp,8(%edx)
33         movl %esi,12(%edx)
34         movl %edi,16(%edx)
35         movl %ecx,20(%edx)              # Return address
36         ret
37
38         .size setjmp,.-setjmp
39
40         .text
41         .align 4
42         .globl longjmp
43         .type longjmp, @function
44 longjmp:
45 #ifdef _REGPARM
46         xchgl %eax,%edx
47 #else
48         movl 4(%esp),%edx               # jmp_ptr address
49         movl 8(%esp),%eax               # Return value
50 #endif
51         movl (%edx),%ebx
52         movl 4(%edx),%esp
53         movl 8(%edx),%ebp
54         movl 12(%edx),%esi
55         movl 16(%edx),%edi
56         jmp *20(%edx)
57
58         .size longjmp,.-longjmp