|  | #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 |