1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /* 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
|