wok view linld/stuff/src/TAZBOOT.CPP @ rev 23994

linld: no initrd fix
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Dec 15 08:41:50 2020 +0000 (2020-12-15)
parents 78bc4b109dd6
children
line source
1 // This file is distributed under GPL
2 //
3 // TAZBOOT main() lives here
5 #include "crtl.h"
6 #include "crtlx.h"
7 #include "common.h"
8 #include "iso9660.h"
10 struct initrd_info {
11 u32 ofs;
12 u32 size;
13 };
14 #define MAXINITRD 10
15 static struct initrd_state {
16 struct initrd_info info[MAXINITRD];
17 u16 cnt;
18 } initrd_state;
20 static void next_chunk(struct image_himem *m)
21 {
22 m->chunk_size = 0;
23 if (m->state >= initrd_state.cnt) return;
24 struct initrd_info *i = &initrd_state.info[m->state];
25 m->chunk_size = i->size;
26 m->state++;
27 lseekset2(m->fd,&i->ofs);
28 }
30 static u32 isofilesize4round()
31 {
32 return (isofilesize+3)&-4;
33 }
35 static void addinitrd()
36 {
37 u16 *pcnt = &initrd_state.cnt;
38 if (*pcnt >= MAXINITRD) return;
39 struct initrd_info *i = &initrd_state.info[(*pcnt)++];
40 i->size = isofilesize;
41 i->ofs = isofileofs;
42 initrd.size += isofilesize4round();
43 }
45 static void load_initrds()
46 {
47 struct image_himem *m = &initrd;
48 if (!m->size) return;
49 m->next_chunk = next_chunk;
50 m->fd = isofd;
51 m->state = 0;
52 next_chunk(m);
53 load_initrd();
54 }
56 static char *isokernel()
57 {
58 struct image_himem *m = &pm;
59 m->chunk_size = m->size = isofilesize4round();
60 m->fd = isofd;
61 load_kernel();
62 return version_string;
63 }
65 static char buf_cmdline[4096];
66 const char *cmdline = (const char *) buf_cmdline+1;
67 static void bootiso(char **iso)
68 {
69 const char *init = " rdinit=/init.exe", *mode="menu";
70 char c;
71 static char rootfs[16], fallback[16], noauto;
72 unsigned long magic;
73 struct isostate *x=&isostate;
75 if (isoreset(*iso) == -1) return;
76 #ifdef WITH_XMM_ALLOC
77 skip_alloc--;
78 #endif
79 base_himem = memtop() /2;
80 //if (base_himem >= _64m) base_himem = _64m;
81 if (* ((char *) &base_himem +3) >= 4) ((short *)&base_himem)[1] = _64m/_64k;
82 isoopen("boot");
83 if (iso[1] && !strcmp(mode = iso[1], "text"))
84 init = "";
85 if (isoopen(mode) == -1 || ++noauto == 0) // custom
86 isoopen("bzImage"); // SliTaz
87 magic = kver2ul(isokernel());
88 for (c = 0, x->curdirsize = 0xFFFF; isoreaddir() != -1;) {
89 if (strstr(x->filename, ".gz"))
90 strcpy(fallback, x->filename);
91 if (strhead(x->filename, "rootfs") == -1
92 || c > x->filename[6]) continue;
93 c = x->filename[6];
94 strcpy(rootfs, x->filename);
95 }
97 strcatb(buf_cmdline,"autologin bootfrom=");
98 strcat(buf_cmdline,*iso);
99 if (magic < 0x20630)
100 init = ""; // Does not support multiple initramfs
102 if (noauto) {
103 char *s;
104 * (int *) buf_cmdline = 0;
105 iso++;
106 while ((s = *++iso) != NULL) {
107 if (strhead(s,"initrd=") == -1)
108 strcatb(buf_cmdline,s);
109 else if (isoopen(s+7) != -1)
110 addinitrd();
111 }
112 }
113 else if (magic != 0) {
114 static const unsigned long initrddesc = 18L;
116 if (isoopen("rootfs.gz") != -1 ||
117 isoopen(rootfs[0] ? rootfs : fallback) != -1) {
118 addinitrd();
119 }
120 if (*init) {
121 isolseek(&initrddesc);
122 read(x->fd, &x->filemod, 10); // + x->fileofs & x->filesize
123 magic = x->filemod;
124 x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF);
125 if (((short *) &x->fileofs)[1] == 0) addinitrd();
126 else init="";
127 }
128 strcat(buf_cmdline,init);
129 strcatb(buf_cmdline,"mode=");
130 strcat(buf_cmdline,mode);
131 strcatb(buf_cmdline,"magic=");
132 strcat(buf_cmdline,(char *)utoa(magic));
133 }
134 load_initrds();
135 close(x->fd);
136 boot_kernel();
137 }
139 u32 root_dev;
140 u32 vid_mode;
141 u32 topmem;
142 u32 base_himem;
143 const char* kernel_name = "bzImage";
144 const char* initrd_name;
145 static char* iso;
147 int main(int argc, char *argv[])
148 {
149 ((u16*) &base_himem)[1] |= (_1m+_64k)>>16; // base_himem = _1m+_64k
151 if (argc < 2) {
152 try_default_args();
153 dousage:
154 die("Usage: tazboot [[@commands]|"
155 #ifdef WITH_XMM_ALLOC
156 "[-f]"
157 #endif
158 "[-b base_himem][kernel=<bzImage>] [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] ...]\n\n\
159 Defaults: tazboot kernel=bzImage auto\n\n\
160 Examples for tazboot.cmd:\n\n\
161 bootfrom=\\isos\\slitaz-4.0.iso\n\
162 kernel=boot/bzImage\n\
163 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\n\
164 root=/dev/null vga=normal autologin\n\n\
165 kernel=\\slitaz\\elks\n\
166 root=/dev/bda1 ro\n");
167 }
168 bootiso(argv + 1); // iso ? parsing is /init.exe stuff !
169 for (int i=0;;) {
170 char *s;
171 next: argv++;
172 s=*argv;
173 i++;
174 if (!s) {
175 if (isoreset(iso) != -1) {
176 s = (char *) initrd_name;
177 if (isoopen((char *) kernel_name) != -1) {
178 isokernel();
179 }
180 if (s) {
181 do {
182 char *p, c;
183 for (p = s; *s && *s != ','; s++);
184 c = *s; *s = 0;
185 if (isoopen(p) != -1) {
186 addinitrd();
187 }
188 *s = c;
189 if (c) s++;
190 } while (*s);
191 load_initrds();
192 }
193 }
194 else {
195 load_kernel();
196 load_initrd();
197 }
198 boot_kernel();
199 }
200 #ifdef USE_ARGSTR
201 #ifdef WITH_XMM_ALLOC
202 if ((*(u16 *)s|0x2002) == 0x662F) { // -F /f
203 skip_alloc--;
204 goto next;
205 }
206 #endif
207 if (argstr(s,"kernel/image|initrd|bootfrom/iso",&kernel_name) != -1);
208 else if (argnum(s,"root|vga|mem/-e|-b",&root_dev) != -1);
209 else if(i == 1 && fileexist(s) != -1) {
210 kernel_name = s;
211 }
212 else strcatb(buf_cmdline,*argv); // FIXME mem ?
213 }
214 #else
215 if (strhead(s,"initrd=") != -1) {
216 s += 7;
217 initrd_name = s;
218 }
219 else if (strhead(s,"bootfrom=") != -1) {
220 s += 9;
221 goto set_iso;
222 }
223 else if (strhead(s,"iso=") != -1) {
224 s += 4;
225 set_iso:
226 iso = s;
227 }
228 else if (strhead(s,"image=") != -1) {
229 goto set_kernel;
230 }
231 else if(strhead(s,"vga=") != -1) {
232 *(u16*)&vid_mode = (u16)strtol(s+4); // support normal, extended & ask
233 }
234 else if (strhead(s,"kernel=") != -1) {
235 s++;
236 set_kernel:
237 s += 6;
238 set_kernelz:
239 kernel_name = s;
240 }
241 else switch (*(u16 *)s|0x2002) {
242 #ifdef WITH_XMM_ALLOC
243 case 0x662F: // -F /f
244 skip_alloc--;
245 goto next;
246 #endif
247 case 0x652F: // -E /e
248 s=*++argv;
249 goto set_topmem;
250 case 0x622F: // -B /b
251 argv++;
252 ((u16 *)&base_himem)[1] = (u16)(strtol(*argv)>>16);
253 goto next;
254 default:
255 if(i == 1 && fileexist(s) != -1) {
256 goto set_kernelz;
257 }
258 else {
259 strcatb(buf_cmdline,*argv);
260 if(strhead(s,"root=") != -1) {
261 *(u16*)&root_dev = (u16)strtol(s+5);
262 }
263 if(strhead(s,"mem=") != -1) {
264 s += 4;
265 set_topmem:
266 ((u16 *)&topmem)[1] = (u16)(strtol(s)>>16);
267 }
268 }}
269 }
270 #endif
271 }