1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | .global sys32_helper |
3 | sys32_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 |
42 | int80_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 | |