summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/dos/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/dos/crt0.S')
-rw-r--r--contrib/syslinux-4.02/dos/crt0.S70
1 files changed, 70 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/dos/crt0.S b/contrib/syslinux-4.02/dos/crt0.S
new file mode 100644
index 0000000..3be5712
--- /dev/null
+++ b/contrib/syslinux-4.02/dos/crt0.S
@@ -0,0 +1,70 @@
+ .code16
+
+#ifndef REGPARM
+# error "This file assumes -mregparm=3 -DREGPARM=3"
+#endif
+
+ .section ".text","ax"
+ .globl _start
+ .type _start,@function
+_start:
+ # Align the stack and make sure the high half is zero
+ andl $0xfff8,%esp
+
+ # DS, ES points to the PSP at this point
+ pushw %es # Save PSP pointer
+ movw %cs,%ax
+ movw %ax,%ds
+ movw %ax,%es
+
+ # Clear the .bss
+ cld
+ xorl %eax,%eax
+ movw $__bss_start,%di
+ movw $__bss_end+3,%cx
+ subw %di,%cx
+ shrw $2,%cx
+ rep ; stosl
+
+ # Copy the command line into our own segment
+ popw %fs # FS -> PSP
+ movw $_cmdline,%di
+ movzbw %fs:0x80,%cx
+ movw $0x81,%si
+ fs ; rep ; movsb
+ # Already zero-terminated since we're writing into clean bss
+
+ # Compute argc and argv (assumes REGPARM)
+ movl $_cmdline,%edx
+ pushl %eax # Make space for argv
+ movl %esp,%eax
+ calll __parse_argv
+ pushl %eax # argc
+
+ # Initialize malloc
+ calll __init_memory_arena
+
+ # Now call main... (NOTE: gcc forces main to be regparm 0)
+ popl %eax # argc
+ popl %edx # argv
+ calll main
+
+ # Here %eax is the exit code, fall through into exit
+
+ .size _start,.-_start
+
+ .globl exit
+ .type exit,@function
+exit:
+ # Exit code already in %eax
+ movb $0x4c,%ah # Terminate program
+ int $0x21
+1: hlt
+ jmp 1b
+ .size exit,.-exit
+
+ .section ".bss","aw"
+ .balign 4
+_cmdline:
+ .space 128
+ .size _cmdline,.-_cmdline