diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/ipxe/src/arch/i386/core/linux | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip | |
Diffstat (limited to 'roms/ipxe/src/arch/i386/core/linux')
| -rw-r--r-- | roms/ipxe/src/arch/i386/core/linux/linux_syscall.S | 45 | ||||
| -rw-r--r-- | roms/ipxe/src/arch/i386/core/linux/linuxprefix.S | 28 | 
2 files changed, 73 insertions, 0 deletions
| diff --git a/roms/ipxe/src/arch/i386/core/linux/linux_syscall.S b/roms/ipxe/src/arch/i386/core/linux/linux_syscall.S new file mode 100644 index 00000000..38a3e74b --- /dev/null +++ b/roms/ipxe/src/arch/i386/core/linux/linux_syscall.S @@ -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 diff --git a/roms/ipxe/src/arch/i386/core/linux/linuxprefix.S b/roms/ipxe/src/arch/i386/core/linux/linuxprefix.S new file mode 100644 index 00000000..398d3cb2 --- /dev/null +++ b/roms/ipxe/src/arch/i386/core/linux/linuxprefix.S @@ -0,0 +1,28 @@ +#include <linux/unistd.h> + +	.section ".text" +	.code32 +	.globl _linux_start +	.type _linux_start, @function + +_linux_start: +	xorl	%ebp, %ebp + +	popl	%esi       // save argc +	movl	%esp, %edi // save argv + +	andl	$~15, %esp // 16-byte align the stack + +	pushl	%edi // argv -> C arg2 +	pushl	%esi // argc -> C arg1 + +	call	save_args + +	/* Our main doesn't use any arguments */ +	call	main + +	movl	%eax, %ebx // rc -> syscall arg1 +	movl	$__NR_exit, %eax +	int	$0x80 + +	.size _linux_start, . - _linux_start | 
