mirror of https://github.com/ipxe/ipxe.git
[linux] Add linux_syscall
Add linux_syscall for both i386 and x86_64. Signed-off-by: Piotr Jaroszyński <p.jaroszynski@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1/head
parent
0e5fc47a25
commit
e743910cf9
|
@ -0,0 +1,45 @@
|
||||||
|
|
||||||
|
.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
|
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
.section ".data"
|
||||||
|
.globl linux_errno
|
||||||
|
|
||||||
|
linux_errno: .int 0
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.code64
|
||||||
|
.globl linux_syscall
|
||||||
|
.type linux_syscall, @function
|
||||||
|
|
||||||
|
linux_syscall:
|
||||||
|
movq %rdi, %rax // C arg1 -> syscall number
|
||||||
|
movq %rsi, %rdi // C arg2 -> syscall arg1
|
||||||
|
movq %rdx, %rsi // C arg3 -> syscall arg2
|
||||||
|
movq %rcx, %rdx // C arg4 -> syscall arg3
|
||||||
|
movq %r8, %r10 // C arg5 -> syscall arg4
|
||||||
|
movq %r9, %r8 // C arg6 -> syscall arg5
|
||||||
|
movq 8(%rsp), %r9 // C arg7 -> syscall arg6
|
||||||
|
|
||||||
|
syscall
|
||||||
|
|
||||||
|
cmpq $-4095, %rax
|
||||||
|
jae 1f
|
||||||
|
ret
|
||||||
|
|
||||||
|
1:
|
||||||
|
negq %rax
|
||||||
|
movl %eax, linux_errno
|
||||||
|
movq $-1, %rax
|
||||||
|
ret
|
||||||
|
|
||||||
|
.size linux_syscall, . - linux_syscall
|
Loading…
Reference in New Issue