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 | /* %rsp has the pointer to first operation */ |
8 | mov %rsp, %rbx |
9 | add $0x10, %rsp |
10 | again: |
11 | /* load length of additional data */ |
12 | mov 0x0(%rsp), %rax |
13 | |
14 | /* if(length == 0) : end of list */ |
15 | /* write possible 0 to header */ |
16 | mov %rax, 8(%rbx) |
17 | cmp $0, %rax |
18 | jz done |
19 | |
20 | /* save current pointer */ |
21 | mov %rsp, 8(%rbx) |
22 | |
23 | /* skip additional data */ |
24 | add %rax, %rsp |
25 | |
26 | /* load syscall-# */ |
27 | pop %rax |
28 | |
29 | /* load syscall params */ |
30 | pop %rdi |
31 | pop %rsi |
32 | pop %rdx |
33 | pop %r10 |
34 | pop %r8 |
35 | pop %r9 |
36 | |
37 | /* execute syscall */ |
38 | syscall |
39 | |
40 | /* check return value */ |
41 | pop %rcx |
42 | cmp %rcx, %rax |
43 | je again |
44 | |
45 | done: |
46 | /* save return value */ |
47 | mov %rax, (%rbx) |
48 | |
49 | /* stop */ |
50 | int3 |
51 | |