Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6] / arch / um / sys-i386 / stub.S
1 #include "uml-config.h"
2
3         .globl syscall_stub
4 .section .__syscall_stub, "x"
5
6         .globl batch_syscall_stub
7 batch_syscall_stub:
8         /* load pointer to first operation */
9         mov     $(UML_CONFIG_STUB_DATA+8), %esp
10
11 again:
12         /* load length of additional data */
13         mov     0x0(%esp), %eax
14
15         /* if(length == 0) : end of list */
16         /* write possible 0 to header */
17         mov     %eax, UML_CONFIG_STUB_DATA+4
18         cmpl    $0, %eax
19         jz      done
20
21         /* save current pointer */
22         mov     %esp, UML_CONFIG_STUB_DATA+4
23
24         /* skip additional data */
25         add     %eax, %esp
26
27         /* load syscall-# */
28         pop     %eax
29
30         /* load syscall params */
31         pop     %ebx
32         pop     %ecx
33         pop     %edx
34         pop     %esi
35         pop     %edi
36         pop     %ebp
37
38         /* execute syscall */
39         int     $0x80
40
41         /* check return value */
42         pop     %ebx
43         cmp     %ebx, %eax
44         je      again
45
46 done:
47         /* save return value */
48         mov     %eax, UML_CONFIG_STUB_DATA
49
50         /* stop */
51         int3