summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/x86/raw_syscall_helper_32.S
blob: 534e71e35c6a1ff0a8e003f8cdeee7550511df7c (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
37
38
39
40
41
42
43
44
45
46
.global sys32_helper
sys32_helper:
	/* Args: syscall_args_32*, function pointer */
	pushl	%ebp
	pushl	%ebx
	pushl	%esi
	pushl	%edi
	movl	5*4(%esp), %eax	/* pointer to args struct */

	movl	1*4(%eax), %ebx
	movl	2*4(%eax), %ecx
	movl	3*4(%eax), %edx
	movl	4*4(%eax), %esi
	movl	5*4(%eax), %edi
	movl	6*4(%eax), %ebp
	movl	0*4(%eax), %eax

	call	*(6*4)(%esp)	/* Do the syscall */

	/* Now we need to recover without losing any reg values */
	pushl	%eax
	movl	6*4(%esp), %eax
	popl	0*4(%eax)
	movl	%ebx, 1*4(%eax)
	movl	%ecx, 2*4(%eax)
	movl	%edx, 3*4(%eax)
	movl	%esi, 4*4(%eax)
	movl	%edi, 5*4(%eax)
	movl	%ebp, 6*4(%eax)

	popl	%edi
	popl	%esi
	popl	%ebx
	popl	%ebp
	ret

	.type sys32_helper, @function
	.size sys32_helper, .-sys32_helper

.global int80_and_ret
int80_and_ret:
	int	$0x80
	ret

	.type int80_and_ret, @function
	.size int80_and_ret, .-int80_and_ret