GNU Linux-libre 4.14.266-gnu1
[releases.git] / arch / x86 / um / stub_64.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <as-layout.h>
3
4 .section .__syscall_stub, "ax"
5         .globl batch_syscall_stub
6 batch_syscall_stub:
7         mov     $(STUB_DATA), %rbx
8         /* load pointer to first operation */
9         mov     %rbx, %rsp
10         add     $0x10, %rsp
11 again:
12         /* load length of additional data */
13         mov     0x0(%rsp), %rax
14
15         /* if(length == 0) : end of list */
16         /* write possible 0 to header */
17         mov     %rax, 8(%rbx)
18         cmp     $0, %rax
19         jz      done
20
21         /* save current pointer */
22         mov     %rsp, 8(%rbx)
23
24         /* skip additional data */
25         add     %rax, %rsp
26
27         /* load syscall-# */
28         pop     %rax
29
30         /* load syscall params */
31         pop     %rdi
32         pop     %rsi
33         pop     %rdx
34         pop     %r10
35         pop     %r8
36         pop     %r9
37
38         /* execute syscall */
39         syscall
40
41         /* check return value */
42         pop     %rcx
43         cmp     %rcx, %rax
44         je      again
45
46 done:
47         /* save return value */
48         mov     %rax, (%rbx)
49
50         /* stop */
51         int3