b9a21c3c91c47e090316e28d759194e46628ed49vboxsync#include <linux/unistd.h>
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync .section ".text"
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync .code32
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync .globl _linux_start
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync .type _linux_start, @function
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync_linux_start:
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync xorl %ebp, %ebp
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync popl %esi // save argc
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync movl %esp, %edi // save argv
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync andl $~15, %esp // 16-byte align the stack
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pushl %edi // argv -> C arg2
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync pushl %esi // argc -> C arg1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync call save_args
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync /* Our main doesn't use any arguments */
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync call main
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync movl %eax, %ebx // rc -> syscall arg1
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync movl $__NR_exit, %eax
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync int $0x80
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync .size _linux_start, . - _linux_start
b9a21c3c91c47e090316e28d759194e46628ed49vboxsync