/* SPDX-License-Identifier: GPL-2.0 */ | |
#include <as-layout.h> | |
.section .__syscall_stub, "ax" | |
.globl batch_syscall_stub | |
batch_syscall_stub: | |
/* %esp comes in as "top of page" */ | |
mov %esp, %ecx | |
/* %esp has pointer to first operation */ | |
add $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, 0x4(%ecx) | |
cmpl $0, %eax | |
jz done | |
/* save current pointer */ | |
mov %esp, 0x4(%ecx) | |
/* 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 | |
/* restore top of page pointer in %ecx */ | |
mov %esp, %ecx | |
andl $(~UM_KERN_PAGE_SIZE) + 1, %ecx | |
/* check return value */ | |
pop %ebx | |
cmp %ebx, %eax | |
je again | |
done: | |
/* save return value */ | |
mov %eax, (%ecx) | |
/* stop */ | |
int3 |