1/* SPDX-License-Identifier: GPL-2.0 */ 2#include <as-layout.h> 3 4.section .__syscall_stub, "ax" 5 6 .globl batch_syscall_stub 7batch_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 12again: 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 51done: 52 /* save return value */ 53 mov %eax, (%ecx) 54 55 /* stop */ 56 int3 57