xref: /OK3568_Linux_fs/kernel/arch/x86/um/stub_64.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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