57 строки
918 B
ArmAsm
57 строки
918 B
ArmAsm
/* 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
|