rev |
line source |
pascal@19515
|
1 // This file is distributed under GPL
|
pascal@19515
|
2 //
|
pascal@19515
|
3 // LINLD main() lives here
|
pascal@19515
|
4
|
pascal@19515
|
5 #include "crtl.h"
|
pascal@19515
|
6 #include "common.h"
|
pascal@19515
|
7
|
pascal@19515
|
8 static struct image_himem image;
|
pascal@19515
|
9 static const char msg_cmdline[] = "Error reading cl=@file";
|
pascal@19515
|
10 static char* read_cmdline_or_die(const char* fn) {
|
pascal@19515
|
11 image.errmsg = msg_cmdline;
|
pascal@19515
|
12 open_image(fn, &image);
|
pascal@19515
|
13 u16 size=image.size;
|
pascal@19515
|
14 char *cmdline_buf;
|
pascal@19515
|
15 if(size>=PAGE_SIZE ||
|
pascal@19515
|
16 !(cmdline_buf=(char *)malloc(size)) ||
|
pascal@19515
|
17 read(image.fd, cmdline_buf, size) != size)
|
pascal@19515
|
18 die(msg_cmdline);
|
pascal@19515
|
19 // Strip any trailing cr/lf
|
pascal@19515
|
20 char *p=cmdline_buf+size;
|
pascal@19515
|
21 char c='\0';
|
pascal@19515
|
22 do {
|
pascal@19515
|
23 // Replace all other cr/lfs with spaces
|
pascal@19515
|
24 if(*--p>=' ') c=' ';
|
pascal@19515
|
25 else *p = c;
|
pascal@19515
|
26 } while (p>cmdline_buf);
|
pascal@19515
|
27 return cmdline_buf;
|
pascal@19515
|
28 }
|
pascal@19515
|
29
|
pascal@19515
|
30 const char* kernel_name = "bzImage";
|
pascal@19515
|
31 const char* initrd_name;
|
pascal@19515
|
32 const char* cmdline = "auto";
|
pascal@19515
|
33 u16 root_dev;
|
pascal@19515
|
34 u16 vid_mode; // -3 = ask
|
pascal@19515
|
35 // -2 = Extended VGA
|
pascal@19515
|
36 // -1 = Normal VGA
|
pascal@19515
|
37 // n = as "n" was pressed
|
pascal@19515
|
38
|
pascal@19515
|
39 inline void syntax() {
|
pascal@19515
|
40 die("Syntax:" NL
|
pascal@19515
|
41 "LINLD [image=file] [initrd=files] [vga=mode] [root=num] [mem=max] [cl=cmdline]" NL
|
pascal@19515
|
42 "vga mode: ask,extended,normal or dec/oct/hex number" NL
|
pascal@19515
|
43 "Defaults:" NL
|
pascal@19515
|
44 "\timage=bzImage" NL
|
pascal@19515
|
45 "\tinitrd,vga,root=(void)" NL
|
pascal@19515
|
46 "\tmem=256m" NL
|
pascal@19515
|
47 "\tcl=auto" NL
|
pascal@19515
|
48 "Use quotes: \"cl=...\" if you need spaces in cmdline" NL
|
pascal@19515
|
49 "Use cl=@filename to take cmdline from file"
|
pascal@19515
|
50 #if 1
|
pascal@19515
|
51 NL NL "Examples:" NL
|
pascal@19515
|
52 "\tlinld initrd=rootfs4.gz,rootfs3.gz,rootfs2.gz,rootfs1.gz \"cl=rw root=/dev/null video=-32\""
|
pascal@19515
|
53 NL NL "\tlinld image=memtest"
|
pascal@19515
|
54 #endif
|
pascal@19515
|
55 );
|
pascal@19515
|
56 }
|
pascal@19515
|
57
|
pascal@19515
|
58 int main(int argc, char *argv[]) {
|
pascal@19515
|
59 // Believe it or not - this enables A20
|
pascal@19515
|
60 // on my box! Must be DOS in HMA... -vda
|
pascal@19515
|
61 puts("LINLD v" VERSION_STR "+");
|
pascal@19515
|
62
|
pascal@19515
|
63 // Parse command line
|
pascal@19515
|
64
|
pascal@19515
|
65 if(argc<2) {
|
pascal@19515
|
66 dosyntax:
|
pascal@19515
|
67 syntax();
|
pascal@19515
|
68 }
|
pascal@19515
|
69 {for(int i=1;i<argc;i++) {
|
pascal@19515
|
70 char *s=argv[i];
|
pascal@19515
|
71 if(strhead(s,"image=") == 0) {
|
pascal@19515
|
72 kernel_name=s+6;
|
pascal@19515
|
73 }
|
pascal@19515
|
74 else if(strhead(s,"initrd=") == 0) {
|
pascal@19515
|
75 initrd_name = s+7;
|
pascal@19515
|
76 }
|
pascal@19515
|
77 else if(strhead(s,"cl=") == 0) {
|
pascal@19515
|
78 cmdline=s+3;
|
pascal@19515
|
79 if (cmdline[0] == '@') {
|
pascal@19515
|
80 cmdline=read_cmdline_or_die(cmdline+1);
|
pascal@19515
|
81 puts("Kernel command line:");
|
pascal@19515
|
82 puts(cmdline);
|
pascal@19515
|
83 }
|
pascal@19515
|
84 }
|
pascal@19515
|
85 else if(strhead(s,"vga=") == 0) {
|
pascal@19515
|
86 s+=4;
|
pascal@19515
|
87 const char c = *s|0x20;
|
pascal@19515
|
88 if (c == 'a') vid_mode = -3;
|
pascal@19515
|
89 else if (c == 'e') vid_mode = -2;
|
pascal@19515
|
90 else if (c == 'n') vid_mode = -1;
|
pascal@19515
|
91 else vid_mode = strtol(s);
|
pascal@19515
|
92 }
|
pascal@19515
|
93 else if(strhead(s,"root=") == 0) {
|
pascal@19515
|
94 root_dev = strtol(s+5);
|
pascal@19515
|
95 }
|
pascal@19515
|
96 else if(strhead(s,"mem=") == 0) {
|
pascal@19515
|
97 topmem = strtol(s+4);
|
pascal@19515
|
98 }
|
pascal@19515
|
99 else if(strhead(s,"-f") == 0) {
|
pascal@19515
|
100 extern int skip_xmmalloc;
|
pascal@19515
|
101 skip_xmmalloc++;
|
pascal@19515
|
102 }
|
pascal@19515
|
103 else
|
pascal@19515
|
104 goto dosyntax;
|
pascal@19515
|
105 }}
|
pascal@19515
|
106
|
pascal@19515
|
107 puts(load_kernel());
|
pascal@19515
|
108 load_initrd();
|
pascal@19515
|
109 boot_kernel();
|
pascal@19515
|
110
|
pascal@19515
|
111 // Let compiler be happy
|
pascal@19515
|
112 return _AX;
|
pascal@19515
|
113 }
|