1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun#include <as-layout.h> 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun.section .__syscall_stub, "ax" 5*4882a593Smuzhiyun .globl batch_syscall_stub 6*4882a593Smuzhiyunbatch_syscall_stub: 7*4882a593Smuzhiyun mov $(STUB_DATA), %rbx 8*4882a593Smuzhiyun /* load pointer to first operation */ 9*4882a593Smuzhiyun mov %rbx, %rsp 10*4882a593Smuzhiyun add $0x10, %rsp 11*4882a593Smuzhiyunagain: 12*4882a593Smuzhiyun /* load length of additional data */ 13*4882a593Smuzhiyun mov 0x0(%rsp), %rax 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* if(length == 0) : end of list */ 16*4882a593Smuzhiyun /* write possible 0 to header */ 17*4882a593Smuzhiyun mov %rax, 8(%rbx) 18*4882a593Smuzhiyun cmp $0, %rax 19*4882a593Smuzhiyun jz done 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* save current pointer */ 22*4882a593Smuzhiyun mov %rsp, 8(%rbx) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* skip additional data */ 25*4882a593Smuzhiyun add %rax, %rsp 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* load syscall-# */ 28*4882a593Smuzhiyun pop %rax 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* load syscall params */ 31*4882a593Smuzhiyun pop %rdi 32*4882a593Smuzhiyun pop %rsi 33*4882a593Smuzhiyun pop %rdx 34*4882a593Smuzhiyun pop %r10 35*4882a593Smuzhiyun pop %r8 36*4882a593Smuzhiyun pop %r9 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* execute syscall */ 39*4882a593Smuzhiyun syscall 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* check return value */ 42*4882a593Smuzhiyun pop %rcx 43*4882a593Smuzhiyun cmp %rcx, %rax 44*4882a593Smuzhiyun je again 45*4882a593Smuzhiyun 46*4882a593Smuzhiyundone: 47*4882a593Smuzhiyun /* save return value */ 48*4882a593Smuzhiyun mov %rax, (%rbx) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* stop */ 51*4882a593Smuzhiyun int3 52