.section ".data" .globl linux_errno linux_errno: .int 0 .section ".text" .code32 .globl linux_syscall .type linux_syscall, @function linux_syscall: /* Save registers */ pushl %ebx pushl %esi pushl %edi pushl %ebp movl 20(%esp), %eax // C arg1 -> syscall number movl 24(%esp), %ebx // C arg2 -> syscall arg1 movl 28(%esp), %ecx // C arg3 -> syscall arg2 movl 32(%esp), %edx // C arg4 -> syscall arg3 movl 36(%esp), %esi // C arg5 -> syscall arg4 movl 40(%esp), %edi // C arg6 -> syscall arg5 movl 44(%esp), %ebp // C arg7 -> syscall arg6 int $0x80 /* Restore registers */ popl %ebp popl %edi popl %esi popl %ebx cmpl $-4095, %eax jae 1f ret 1: negl %eax movl %eax, linux_errno movl $-1, %eax ret .size linux_syscall, . - linux_syscall