xref: /openbmc/linux/arch/x86/um/stub_32.S (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
237185b33SAl Viro#include <as-layout.h>
35c48b108SAl Viro
45c48b108SAl Viro.section .__syscall_stub, "ax"
55c48b108SAl Viro
65c48b108SAl Viro	.globl batch_syscall_stub
75c48b108SAl Virobatch_syscall_stub:
8*9f0b4807SJohannes Berg	/* %esp comes in as "top of page" */
9*9f0b4807SJohannes Berg	mov %esp, %ecx
10*9f0b4807SJohannes Berg	/* %esp has pointer to first operation */
11*9f0b4807SJohannes Berg	add $8, %esp
125c48b108SAl Viroagain:
135c48b108SAl Viro	/* load length of additional data */
145c48b108SAl Viro	mov	0x0(%esp), %eax
155c48b108SAl Viro
165c48b108SAl Viro	/* if(length == 0) : end of list */
175c48b108SAl Viro	/* write possible 0 to header */
18*9f0b4807SJohannes Berg	mov	%eax, 0x4(%ecx)
195c48b108SAl Viro	cmpl	$0, %eax
205c48b108SAl Viro	jz	done
215c48b108SAl Viro
225c48b108SAl Viro	/* save current pointer */
23*9f0b4807SJohannes Berg	mov	%esp, 0x4(%ecx)
245c48b108SAl Viro
255c48b108SAl Viro	/* skip additional data */
265c48b108SAl Viro	add	%eax, %esp
275c48b108SAl Viro
285c48b108SAl Viro	/* load syscall-# */
295c48b108SAl Viro	pop	%eax
305c48b108SAl Viro
315c48b108SAl Viro	/* load syscall params */
325c48b108SAl Viro	pop	%ebx
335c48b108SAl Viro	pop	%ecx
345c48b108SAl Viro	pop	%edx
355c48b108SAl Viro	pop	%esi
365c48b108SAl Viro 	pop	%edi
375c48b108SAl Viro	pop	%ebp
385c48b108SAl Viro
395c48b108SAl Viro	/* execute syscall */
405c48b108SAl Viro	int	$0x80
415c48b108SAl Viro
42*9f0b4807SJohannes Berg	/* restore top of page pointer in %ecx */
43*9f0b4807SJohannes Berg	mov	%esp, %ecx
44*9f0b4807SJohannes Berg	andl	$(~UM_KERN_PAGE_SIZE) + 1, %ecx
45*9f0b4807SJohannes Berg
465c48b108SAl Viro	/* check return value */
475c48b108SAl Viro	pop	%ebx
485c48b108SAl Viro	cmp	%ebx, %eax
495c48b108SAl Viro	je	again
505c48b108SAl Viro
515c48b108SAl Virodone:
525c48b108SAl Viro	/* save return value */
53*9f0b4807SJohannes Berg	mov	%eax, (%ecx)
545c48b108SAl Viro
555c48b108SAl Viro	/* stop */
565c48b108SAl Viro	int3
57