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 	/* load pointer to first operation */
9 	mov	$(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, STUB_DATA+4
18 	cmpl	$0, %eax
19 	jz	done
20 
21 	/* save current pointer */
22 	mov	%esp, 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, STUB_DATA
49 
50 	/* stop */
51 	int3
52