1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #include <as-layout.h> |
3 | |
4 | .section .__syscall_stub, "ax" |
5 | |
6 | .globl batch_syscall_stub |
7 | batch_syscall_stub: |
8 | /* %esp comes in as "top of page" */ |
9 | mov %esp, %ecx |
10 | /* %esp has pointer to first operation */ |
11 | add $8, %esp |
12 | again: |
13 | /* load length of additional data */ |
14 | mov 0x0(%esp), %eax |
15 | |
16 | /* if(length == 0) : end of list */ |
17 | /* write possible 0 to header */ |
18 | mov %eax, 0x4(%ecx) |
19 | cmpl $0, %eax |
20 | jz done |
21 | |
22 | /* save current pointer */ |
23 | mov %esp, 0x4(%ecx) |
24 | |
25 | /* skip additional data */ |
26 | add %eax, %esp |
27 | |
28 | /* load syscall-# */ |
29 | pop %eax |
30 | |
31 | /* load syscall params */ |
32 | pop %ebx |
33 | pop %ecx |
34 | pop %edx |
35 | pop %esi |
36 | pop %edi |
37 | pop %ebp |
38 | |
39 | /* execute syscall */ |
40 | int $0x80 |
41 | |
42 | /* restore top of page pointer in %ecx */ |
43 | mov %esp, %ecx |
44 | andl $(~UM_KERN_PAGE_SIZE) + 1, %ecx |
45 | |
46 | /* check return value */ |
47 | pop %ebx |
48 | cmp %ebx, %eax |
49 | je again |
50 | |
51 | done: |
52 | /* save return value */ |
53 | mov %eax, (%ecx) |
54 | |
55 | /* stop */ |
56 | int3 |
57 | |