| #include <as-layout.h> | 
 |  | 
 | 	.globl syscall_stub | 
 | .section .__syscall_stub, "ax" | 
 |  | 
 | 	.globl batch_syscall_stub | 
 | batch_syscall_stub: | 
 | 	/* load pointer to first operation */ | 
 | 	mov	$(STUB_DATA+8), %esp | 
 |  | 
 | again: | 
 | 	/* load length of additional data */ | 
 | 	mov	0x0(%esp), %eax | 
 |  | 
 | 	/* if(length == 0) : end of list */ | 
 | 	/* write possible 0 to header */ | 
 | 	mov	%eax, STUB_DATA+4 | 
 | 	cmpl	$0, %eax | 
 | 	jz	done | 
 |  | 
 | 	/* save current pointer */ | 
 | 	mov	%esp, STUB_DATA+4 | 
 |  | 
 | 	/* skip additional data */ | 
 | 	add	%eax, %esp | 
 |  | 
 | 	/* load syscall-# */ | 
 | 	pop	%eax | 
 |  | 
 | 	/* load syscall params */ | 
 | 	pop	%ebx | 
 | 	pop	%ecx | 
 | 	pop	%edx | 
 | 	pop	%esi | 
 |  	pop	%edi | 
 | 	pop	%ebp | 
 |  | 
 | 	/* execute syscall */ | 
 | 	int	$0x80 | 
 |  | 
 | 	/* check return value */ | 
 | 	pop	%ebx | 
 | 	cmp	%ebx, %eax | 
 | 	je	again | 
 |  | 
 | done: | 
 | 	/* save return value */ | 
 | 	mov	%eax, STUB_DATA | 
 |  | 
 | 	/* stop */ | 
 | 	int3 |