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@21984
|
8 const char* cmdline = "auto";
|
pascal@19515
|
9 const char* kernel_name = "bzImage";
|
pascal@21984
|
10 #ifdef USE_ARGSTR
|
pascal@21984
|
11 const char* initrd_name = NULL;
|
pascal@21984
|
12 #else
|
pascal@19515
|
13 const char* initrd_name;
|
pascal@21984
|
14 #endif
|
pascal@20528
|
15 u32 root_dev;
|
pascal@20528
|
16 u32 vid_mode; // -3 = ask
|
pascal@20528
|
17 // -2 = Extended VGA
|
pascal@20528
|
18 // -1 = Normal VGA
|
pascal@20528
|
19 // n = as "n" was pressed
|
pascal@20528
|
20 u32 topmem;
|
pascal@21569
|
21 u32 base_himem;
|
pascal@19515
|
22
|
pascal@19515
|
23 inline void syntax() {
|
pascal@19515
|
24 die("Syntax:" NL
|
pascal@19515
|
25 "LINLD [image=file] [initrd=files] [vga=mode] [root=num] [mem=max] [cl=cmdline]" NL
|
pascal@19515
|
26 "vga mode: ask,extended,normal or dec/oct/hex number" NL
|
pascal@23992
|
27 #ifdef WITH_XMM_ALLOC
|
pascal@19538
|
28 "-f force" NL
|
pascal@23992
|
29 #endif
|
pascal@21984
|
30 "-64 for cpu64 only" NL
|
pascal@19515
|
31 "Defaults:" NL
|
pascal@19515
|
32 "\timage=bzImage" NL
|
pascal@19515
|
33 "\tinitrd,vga,root=(void)" NL
|
pascal@19515
|
34 "\tmem=256m" NL
|
pascal@19515
|
35 "\tcl=auto" NL
|
pascal@19580
|
36 "\t-b 1088k" NL
|
pascal@19515
|
37 "Use quotes: \"cl=...\" if you need spaces in cmdline" NL
|
pascal@19538
|
38 "Use cl=@filename to get it from a file"
|
pascal@19515
|
39 #if 1
|
pascal@19515
|
40 NL NL "Examples:" NL
|
pascal@23992
|
41 "\tLINLD "
|
pascal@23992
|
42 #ifdef WITH_XMM_ALLOC
|
pascal@23992
|
43 "-f "
|
pascal@23992
|
44 #endif
|
pascal@23992
|
45 "-b 64m "
|
pascal@21569
|
46 "initrd=rootfs4.gz,rootfs3.gz,rootfs2.gz,rootfs1.gz "
|
pascal@23890
|
47 "\"cl=root=/dev/null video=-32\""
|
pascal@20451
|
48 NL NL "\tLINLD image=memtest"
|
pascal@19515
|
49 #endif
|
pascal@19515
|
50 );
|
pascal@19515
|
51 }
|
pascal@19515
|
52
|
pascal@20453
|
53 static char buf_cmdline[128];
|
pascal@19515
|
54 int main(int argc, char *argv[]) {
|
pascal@19571
|
55
|
pascal@19571
|
56 (void) argc;
|
pascal@19571
|
57
|
pascal@21569
|
58 ((u16*) &base_himem)[1] |= (_1m+_64k)>>16; // base_himem = _1m+_64k
|
pascal@19515
|
59 puts("LINLD v" VERSION_STR "+");
|
pascal@19515
|
60
|
pascal@19538
|
61 // Parse command line
|
pascal@20751
|
62 #ifdef USE_ARGSTR
|
pascal@23994
|
63 if (!*++argv) syntax();
|
pascal@23992
|
64 const char **clp = &cmdline;
|
pascal@23994
|
65 do {
|
pascal@21984
|
66 if ((*(u16 *)*argv|2) == 0x362F) { // -64 /64
|
pascal@21984
|
67 if (cpuhaslm() == 0) exit();
|
pascal@23992
|
68 continue;
|
pascal@21984
|
69 }
|
pascal@23992
|
70 #ifdef WITH_XMM_ALLOC
|
pascal@21984
|
71 if ((*(u16 *)*argv|0x2002) == 0x662F) { // -F /f
|
pascal@22632
|
72 skip_alloc--;
|
pascal@23992
|
73 continue;
|
pascal@21984
|
74 }
|
pascal@23992
|
75 #endif
|
pascal@23993
|
76 if (argstr(*argv,"cl|image|initrd",clp) == (int) clp) continue;
|
pascal@23993
|
77 if (argnum(*argv,"root|vga|mem|-b",&root_dev) == (int) &base_himem) continue;
|
pascal@23992
|
78 if (fileexist(*argv) != -1) {
|
pascal@21984
|
79 kernel_name=*argv;
|
pascal@23992
|
80 continue;
|
pascal@23992
|
81 }
|
pascal@23992
|
82 *clp = (const char *) buf_cmdline + 1;
|
pascal@23992
|
83 strcatb((const char *) buf_cmdline,*argv);
|
pascal@23994
|
84 } while (*++argv);
|
pascal@23992
|
85 puts(*clp);
|
pascal@23992
|
86 set_cmdline(*clp);
|
pascal@23992
|
87 load_kernel();
|
pascal@23992
|
88 load_initrd();
|
pascal@23992
|
89 boot_kernel();
|
pascal@20751
|
90 #else
|
pascal@21576
|
91 if (!argv[1]) syntax();
|
pascal@21576
|
92 while (1) {
|
pascal@19571
|
93 char *s;
|
pascal@19580
|
94 next:
|
pascal@19571
|
95 argv++;
|
pascal@19571
|
96 s=*argv;
|
pascal@19538
|
97 if (!s) {
|
pascal@22170
|
98 load_kernel();
|
pascal@22170
|
99 puts(version_string);
|
pascal@19538
|
100 load_initrd();
|
pascal@19538
|
101 boot_kernel();
|
pascal@19538
|
102 }
|
pascal@21791
|
103 if(strhead(s,"initrd=") != -1) {
|
pascal@21569
|
104 initrd_name=s+7;
|
pascal@19538
|
105 }
|
pascal@21628
|
106 else if(strhead(s,"vga=") != -1) {
|
pascal@21569
|
107 *(u16*)&vid_mode = (u16)strtol(s+7); // support normal, extended & ask
|
pascal@19515
|
108 }
|
pascal@19580
|
109 else switch (*(u16 *)s|0x2002) {
|
pascal@21984
|
110 case 0x362F: // -64 /64
|
pascal@21984
|
111 if (cpuhaslm() == 0) exit();
|
pascal@21984
|
112 goto next;
|
pascal@23992
|
113 #ifdef WITH_XMM_ALLOC
|
pascal@19580
|
114 case 0x662F: // -F /f
|
pascal@22632
|
115 skip_alloc--;
|
pascal@19580
|
116 goto next;
|
pascal@23992
|
117 #endif
|
pascal@19580
|
118 case 0x622F: // -B /b
|
pascal@19580
|
119 argv++;
|
pascal@21569
|
120 ((u16 *)&base_himem)[1] = (u16)(strtol(*argv)>>16);
|
pascal@19580
|
121 goto next;
|
pascal@19580
|
122 default:
|
pascal@21628
|
123 if(strhead(s,"cl=") != -1) {
|
pascal@20793
|
124 cmdline=s+=3;
|
pascal@20793
|
125 if (*s == '@') {
|
pascal@20793
|
126 static struct image_himem image;
|
pascal@20793
|
127 char c;
|
pascal@19538
|
128
|
pascal@20793
|
129 s++;
|
pascal@20793
|
130 image.errmsg = "Error in cl=@file";
|
pascal@21649
|
131 open_image(&image, s);
|
pascal@21569
|
132 s+=read(image.fd, (void *)cmdline=s=
|
pascal@21569
|
133 (char *)malloc_or_die(image.size), image.size);
|
pascal@20793
|
134 // Strip any trailing cr/lf
|
pascal@20793
|
135 c='\0';
|
pascal@20793
|
136 do {
|
pascal@19538
|
137 // Replace all other cr/lfs with spaces
|
pascal@19538
|
138 s--;
|
pascal@19538
|
139 if(*s>=' ') c=' ';
|
pascal@19538
|
140 else *s = c;
|
pascal@20793
|
141 } while (s>cmdline);
|
pascal@20793
|
142 puts("Kernel command line:");
|
pascal@20793
|
143 puts(cmdline);
|
pascal@20793
|
144 }
|
pascal@20793
|
145 }
|
pascal@21628
|
146 else if(strhead(s,"root=") != -1) {
|
pascal@21569
|
147 *(u16*)&root_dev = (u16)strtol(s+5);
|
pascal@20793
|
148 goto addincmdline;
|
pascal@20793
|
149 }
|
pascal@21628
|
150 else if(strhead(s,"mem=") != -1) {
|
pascal@21569
|
151 ((u16 *)&topmem)[1] = (u16)(strtol(s+4)>>16);
|
pascal@20793
|
152 goto addincmdline;
|
pascal@20793
|
153 }
|
pascal@21791
|
154 else if(strhead(s,"image=") != -1) {
|
pascal@21791
|
155 s+=6;
|
pascal@21791
|
156 set_kernel_name:
|
pascal@21791
|
157 kernel_name=s;
|
pascal@21791
|
158 }
|
pascal@20793
|
159 else {
|
pascal@20793
|
160 addincmdline:
|
pascal@20793
|
161 if(cmdline == (const char *) buf_cmdline + 1) {
|
pascal@20793
|
162 strcatb(buf_cmdline,*argv);
|
pascal@20793
|
163 }
|
pascal@20793
|
164 else {
|
pascal@20793
|
165 if(fileexist(s) != -1) goto set_kernel_name;
|
pascal@20793
|
166 cmdline = (const char *) buf_cmdline + 1;
|
pascal@20793
|
167 goto addincmdline;
|
pascal@20793
|
168 }
|
pascal@20793
|
169 }
|
pascal@19580
|
170 }
|
pascal@20793
|
171 }
|
pascal@20751
|
172 #endif
|
pascal@19515
|
173
|
pascal@19515
|
174 // Let compiler be happy
|
pascal@22183
|
175 //return _AX;
|
pascal@19515
|
176 }
|