root/tools/testing/selftests/x86/raw_syscall_helper_32.S
/* SPDX-License-Identifier: GPL-2.0 */
.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

.section .note.GNU-stack,"",%progbits