xref: /kernel/linux/linux-5.10/arch/x86/um/stub_64.S (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#include <as-layout.h>
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci.section .__syscall_stub, "ax"
58c2ecf20Sopenharmony_ci	.globl batch_syscall_stub
68c2ecf20Sopenharmony_cibatch_syscall_stub:
78c2ecf20Sopenharmony_ci	mov	$(STUB_DATA), %rbx
88c2ecf20Sopenharmony_ci	/* load pointer to first operation */
98c2ecf20Sopenharmony_ci	mov	%rbx, %rsp
108c2ecf20Sopenharmony_ci	add	$0x10, %rsp
118c2ecf20Sopenharmony_ciagain:
128c2ecf20Sopenharmony_ci	/* load length of additional data */
138c2ecf20Sopenharmony_ci	mov	0x0(%rsp), %rax
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci	/* if(length == 0) : end of list */
168c2ecf20Sopenharmony_ci	/* write possible 0 to header */
178c2ecf20Sopenharmony_ci	mov	%rax, 8(%rbx)
188c2ecf20Sopenharmony_ci	cmp	$0, %rax
198c2ecf20Sopenharmony_ci	jz	done
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	/* save current pointer */
228c2ecf20Sopenharmony_ci	mov	%rsp, 8(%rbx)
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	/* skip additional data */
258c2ecf20Sopenharmony_ci	add	%rax, %rsp
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	/* load syscall-# */
288c2ecf20Sopenharmony_ci	pop	%rax
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	/* load syscall params */
318c2ecf20Sopenharmony_ci	pop	%rdi
328c2ecf20Sopenharmony_ci	pop	%rsi
338c2ecf20Sopenharmony_ci	pop	%rdx
348c2ecf20Sopenharmony_ci	pop	%r10
358c2ecf20Sopenharmony_ci 	pop	%r8
368c2ecf20Sopenharmony_ci	pop	%r9
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	/* execute syscall */
398c2ecf20Sopenharmony_ci	syscall
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	/* check return value */
428c2ecf20Sopenharmony_ci	pop	%rcx
438c2ecf20Sopenharmony_ci	cmp	%rcx, %rax
448c2ecf20Sopenharmony_ci	je	again
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cidone:
478c2ecf20Sopenharmony_ci	/* save return value */
488c2ecf20Sopenharmony_ci	mov	%rax, (%rbx)
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	/* stop */
518c2ecf20Sopenharmony_ci	int3
52