summaryrefslogtreecommitdiff
path: root/arch/um/sys-x86_64/stub.S
blob: 957f2eff32cabde7cf1cc7e4e8dcdb06137664e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "uml-config.h"

	.globl syscall_stub
.section .__syscall_stub, "x"
syscall_stub:
	syscall
	/* We don't have 64-bit constants, so this constructs the address
	 * we need.
	 */
	movq	$(UML_CONFIG_STUB_DATA >> 32), %rbx
	salq	$32, %rbx
	movq	$(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx
	or	%rcx, %rbx
	movq	%rax, (%rbx)
	int3

	.globl batch_syscall_stub
batch_syscall_stub:
	movq	$(UML_CONFIG_STUB_DATA >> 32), %rbx
	salq	$32, %rbx
	movq	$(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx
	or	%rcx, %rbx
	movq	%rbx, %rsp
again:	pop	%rax
	cmpq	$0, %rax
jz	done
	pop	%rdi
	pop	%rsi
	pop	%rdx
	pop	%r10
 	pop	%r8
	pop	%r9
	syscall
	mov	%rax, (%rbx)
	jmp	again
done:	int3