wok annotate linld/stuff/src/TAZBOOT.CPP @ rev 20751

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