wok view linld/stuff/src/LINLD.CPP @ rev 21984

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