Merge remote-tracking branch 'battery/master'
[linux-2.6/next.git] / arch / um / sys-x86_64 / stub.S
blob20e4a96a6dcbe064ddc99f719e7ffdb506fa4cdc
1 #include "as-layout.h"
3         .globl syscall_stub
4 .section .__syscall_stub, "ax"
5 syscall_stub:
6         syscall
7         /* We don't have 64-bit constants, so this constructs the address
8          * we need.
9          */
10         movq    $(STUB_DATA >> 32), %rbx
11         salq    $32, %rbx
12         movq    $(STUB_DATA & 0xffffffff), %rcx
13         or      %rcx, %rbx
14         movq    %rax, (%rbx)
15         int3
17         .globl batch_syscall_stub
18 batch_syscall_stub:
19         mov     $(STUB_DATA >> 32), %rbx
20         sal     $32, %rbx
21         mov     $(STUB_DATA & 0xffffffff), %rax
22         or      %rax, %rbx
23         /* load pointer to first operation */
24         mov     %rbx, %rsp
25         add     $0x10, %rsp
26 again:
27         /* load length of additional data */
28         mov     0x0(%rsp), %rax
30         /* if(length == 0) : end of list */
31         /* write possible 0 to header */
32         mov     %rax, 8(%rbx)
33         cmp     $0, %rax
34         jz      done
36         /* save current pointer */
37         mov     %rsp, 8(%rbx)
39         /* skip additional data */
40         add     %rax, %rsp
42         /* load syscall-# */
43         pop     %rax
45         /* load syscall params */
46         pop     %rdi
47         pop     %rsi
48         pop     %rdx
49         pop     %r10
50         pop     %r8
51         pop     %r9
53         /* execute syscall */
54         syscall
56         /* check return value */
57         pop     %rcx
58         cmp     %rcx, %rax
59         je      again
61 done:
62         /* save return value */
63         mov     %rax, (%rbx)
65         /* stop */
66         int3