|  | #include <as-layout.h> | 
|  |  | 
|  | .section .__syscall_stub, "ax" | 
|  | .globl batch_syscall_stub | 
|  | batch_syscall_stub: | 
|  | mov	$(STUB_DATA), %rbx | 
|  | /* load pointer to first operation */ | 
|  | mov	%rbx, %rsp | 
|  | add	$0x10, %rsp | 
|  | again: | 
|  | /* load length of additional data */ | 
|  | mov	0x0(%rsp), %rax | 
|  |  | 
|  | /* if(length == 0) : end of list */ | 
|  | /* write possible 0 to header */ | 
|  | mov	%rax, 8(%rbx) | 
|  | cmp	$0, %rax | 
|  | jz	done | 
|  |  | 
|  | /* save current pointer */ | 
|  | mov	%rsp, 8(%rbx) | 
|  |  | 
|  | /* skip additional data */ | 
|  | add	%rax, %rsp | 
|  |  | 
|  | /* load syscall-# */ | 
|  | pop	%rax | 
|  |  | 
|  | /* load syscall params */ | 
|  | pop	%rdi | 
|  | pop	%rsi | 
|  | pop	%rdx | 
|  | pop	%r10 | 
|  | pop	%r8 | 
|  | pop	%r9 | 
|  |  | 
|  | /* execute syscall */ | 
|  | syscall | 
|  |  | 
|  | /* check return value */ | 
|  | pop	%rcx | 
|  | cmp	%rcx, %rax | 
|  | je	again | 
|  |  | 
|  | done: | 
|  | /* save return value */ | 
|  | mov	%rax, (%rbx) | 
|  |  | 
|  | /* stop */ | 
|  | int3 |