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.
50 lines
779 B
50 lines
779 B
/* SPDX-License-Identifier: GPL-2.0 */ |
|
#include <as-layout.h> |
|
|
|
.section .__syscall_stub, "ax" |
|
.globl batch_syscall_stub |
|
batch_syscall_stub: |
|
/* %rsp has the pointer to first operation */ |
|
mov %rsp, %rbx |
|
add $0x10, %rsp |
|
again: |
|
/* load length of additional data */ |
|
mov 0x0(%rsp), %rax |
|
|
|
/* if(length == 0) : end of list */ |
|
/* write possible 0 to header */ |
|
mov %rax, 8(%rbx) |
|
cmp $0, %rax |
|
jz done |
|
|
|
/* save current pointer */ |
|
mov %rsp, 8(%rbx) |
|
|
|
/* skip additional data */ |
|
add %rax, %rsp |
|
|
|
/* load syscall-# */ |
|
pop %rax |
|
|
|
/* load syscall params */ |
|
pop %rdi |
|
pop %rsi |
|
pop %rdx |
|
pop %r10 |
|
pop %r8 |
|
pop %r9 |
|
|
|
/* execute syscall */ |
|
syscall |
|
|
|
/* check return value */ |
|
pop %rcx |
|
cmp %rcx, %rax |
|
je again |
|
|
|
done: |
|
/* save return value */ |
|
mov %rax, (%rbx) |
|
|
|
/* stop */ |
|
int3
|
|
|