Merge branch 'master' into core32
[profile/ivi/syslinux.git] / dos / crt0.S
1         .code16
2
3 #ifndef REGPARM
4 # error "This file assumes -mregparm=3 -DREGPARM=3"
5 #endif
6
7         .section ".text","ax"
8         .globl _start
9         .type _start,@function
10 _start:
11         # Align the stack and make sure the high half is zero
12         andl $0xfff8,%esp
13
14         # DS, ES points to the PSP at this point
15         pushw %es               # Save PSP pointer
16         movw %cs,%ax
17         movw %ax,%ds
18         movw %ax,%es
19
20         # Clear the .bss
21         cld
22         xorl %eax,%eax
23         movw $__bss_start,%di
24         movw $__bss_end+3,%cx
25         subw %di,%cx
26         shrw $2,%cx
27         rep ; stosl
28
29         # Copy the command line into our own segment
30         popw %fs                # FS -> PSP
31         movw $_cmdline,%di
32         movzbw %fs:0x80,%cx
33         movw $0x81,%si
34         fs ; rep ; movsb
35         # Already zero-terminated since we're writing into clean bss
36
37         # Compute argc and argv (assumes REGPARM)
38         movl $_cmdline,%edx
39         pushl %eax              # Make space for argv
40         movl %esp,%eax
41         calll __parse_argv
42         pushl %eax              # argc
43
44         # Initialize malloc
45         calll __init_memory_arena
46
47         # Now call main... (NOTE: gcc forces main to be regparm 0)
48         popl %eax               # argc
49         popl %edx               # argv
50         calll main
51
52         # Here %eax is the exit code, fall through into exit
53
54         .size _start,.-_start
55
56         .globl exit
57         .type exit,@function
58 exit:
59         # Exit code already in %eax
60         movb $0x4c,%ah          # Terminate program
61         int $0x21
62 1:      hlt
63         jmp 1b
64         .size exit,.-exit
65
66         .section ".bss","aw"
67         .balign 4
68 _cmdline:
69         .space 128
70         .size _cmdline,.-_cmdline