mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
918 B
56 lines
918 B
/* 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
|
|
|