xref: /linux/tools/testing/selftests/x86/raw_syscall_helper_32.S (revision 9fb29c734f9e98adc1f2f3c4629fe487cb93f2dd)
1/* SPDX-License-Identifier: GPL-2.0 */
2.global sys32_helper
3sys32_helper:
4	/* Args: syscall_args_32*, function pointer */
5	pushl	%ebp
6	pushl	%ebx
7	pushl	%esi
8	pushl	%edi
9	movl	5*4(%esp), %eax	/* pointer to args struct */
10
11	movl	1*4(%eax), %ebx
12	movl	2*4(%eax), %ecx
13	movl	3*4(%eax), %edx
14	movl	4*4(%eax), %esi
15	movl	5*4(%eax), %edi
16	movl	6*4(%eax), %ebp
17	movl	0*4(%eax), %eax
18
19	call	*(6*4)(%esp)	/* Do the syscall */
20
21	/* Now we need to recover without losing any reg values */
22	pushl	%eax
23	movl	6*4(%esp), %eax
24	popl	0*4(%eax)
25	movl	%ebx, 1*4(%eax)
26	movl	%ecx, 2*4(%eax)
27	movl	%edx, 3*4(%eax)
28	movl	%esi, 4*4(%eax)
29	movl	%edi, 5*4(%eax)
30	movl	%ebp, 6*4(%eax)
31
32	popl	%edi
33	popl	%esi
34	popl	%ebx
35	popl	%ebp
36	ret
37
38	.type sys32_helper, @function
39	.size sys32_helper, .-sys32_helper
40
41.global int80_and_ret
42int80_and_ret:
43	int	$0x80
44	ret
45
46	.type int80_and_ret, @function
47	.size int80_and_ret, .-int80_and_ret
48