.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 |