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
49.section .note.GNU-stack,"",%progbits
50

source code of linux/tools/testing/selftests/x86/raw_syscall_helper_32.S