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

Up libcomerr (1.44.5)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jan 24 12:15:02 2020 +0100 (2020-01-24)
parents 53c1379e13fa
children 00ef8230cd61
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@21752 22 m->chunk_size = 0;
pascal@21750 23 if (m->state >= initrd_state.cnt) return;
pascal@19825 24 struct initrd_info *i = &initrd_state.info[m->state];
pascal@19825 25 m->chunk_size = i->size;
pascal@19515 26 m->state++;
pascal@21750 27 lseekset2(m->fd,&i->ofs);
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 if (*pcnt >= MAXINITRD) return;
pascal@21750 39 struct initrd_info *i = &initrd_state.info[(*pcnt)++];
pascal@19825 40 i->size = isofilesize;
pascal@19825 41 i->ofs = isofileofs;
pascal@19538 42 initrd.size += isofilesize4round();
pascal@19515 43 }
pascal@19515 44
pascal@19515 45 static void load_initrds()
pascal@19515 46 {
pascal@19538 47 struct image_himem *m = &initrd;
pascal@19538 48 if (!m->size) return;
pascal@19538 49 m->next_chunk = next_chunk;
pascal@19538 50 m->fd = isofd;
pascal@20458 51 m->state = 0;
pascal@19538 52 next_chunk(m);
pascal@19515 53 load_initrd();
pascal@19515 54 }
pascal@19515 55
pascal@19538 56 static char *isokernel()
pascal@19515 57 {
pascal@19538 58 struct image_himem *m = &pm;
pascal@19538 59 m->chunk_size = m->size = isofilesize4round();
pascal@19538 60 m->fd = isofd;
pascal@22170 61 load_kernel();
pascal@22170 62 return version_string;
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@21801 71 static char rootfs[16], fallback[16], noauto;
pascal@19515 72 unsigned long magic;
pascal@19571 73 struct isostate *x=&isostate;
pascal@19515 74
pascal@21628 75 if (isoreset(*iso) == -1) return;
pascal@22632 76 skip_alloc--;
pascal@19580 77 base_himem = memtop() /2;
pascal@20473 78 //if (base_himem >= _64m) base_himem = _64m;
pascal@21750 79 if (* ((char *) &base_himem +3) >= 4) ((short *)&base_himem)[1] = _64m/_64k;
pascal@21801 80 isoopen("boot");
pascal@19515 81 if (iso[1] && !strcmp(mode = iso[1], "text"))
pascal@19515 82 init = "";
pascal@21801 83 if (isoopen(mode) == -1 || ++noauto == 0) // custom
pascal@21801 84 isoopen("bzImage"); // SliTaz
pascal@21801 85 magic = kver2ul(isokernel());
pascal@21576 86 for (c = 0, x->curdirsize = 0xFFFF; isoreaddir() != -1;) {
pascal@19571 87 if (strstr(x->filename, ".gz"))
pascal@19571 88 strcpy(fallback, x->filename);
pascal@21628 89 if (strhead(x->filename, "rootfs") == -1
pascal@19571 90 || c > x->filename[6]) continue;
pascal@21750 91 c = x->filename[6];
pascal@19571 92 strcpy(rootfs, x->filename);
pascal@19515 93 }
pascal@19515 94
pascal@21801 95 strcatb(buf_cmdline,"autologin bootfrom=");
pascal@20486 96 strcat(buf_cmdline,*iso);
pascal@19515 97 if (magic < 0x20630)
pascal@19515 98 init = ""; // Does not support multiple initramfs
pascal@19515 99
pascal@19825 100 if (noauto) {
pascal@19825 101 char *s;
pascal@20486 102 * (int *) buf_cmdline = 0;
pascal@19825 103 iso++;
pascal@19825 104 while ((s = *++iso) != NULL) {
pascal@21628 105 if (strhead(s,"initrd=") == -1)
pascal@20486 106 strcatb(buf_cmdline,s);
pascal@21628 107 else if (isoopen(s+7) != -1)
pascal@19825 108 addinitrd();
pascal@19825 109 }
pascal@19825 110 }
pascal@21754 111 else if (magic != 0) {
pascal@19872 112 static const unsigned long initrddesc = 18L;
pascal@19515 113
pascal@21801 114 if (isoopen("rootfs.gz") != -1 ||
pascal@21801 115 isoopen(rootfs[0] ? rootfs : fallback) != -1) {
pascal@19515 116 addinitrd();
pascal@19515 117 }
pascal@22749 118 if (*init) {
pascal@22749 119 isolseek(&initrddesc);
pascal@19872 120 read(x->fd, &x->filemod, 10); // + x->fileofs & x->filesize
pascal@19872 121 magic = x->filemod;
pascal@20876 122 x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF);
pascal@19825 123 if (((short *) &x->fileofs)[1] == 0) addinitrd();
pascal@19515 124 else init="";
pascal@19515 125 }
pascal@20486 126 strcat(buf_cmdline,init);
pascal@20486 127 strcatb(buf_cmdline,"mode=");
pascal@20486 128 strcat(buf_cmdline,mode);
pascal@20486 129 strcatb(buf_cmdline,"magic=");
pascal@20528 130 strcat(buf_cmdline,(char *)ultoa(magic));
pascal@19515 131 }
pascal@19825 132 load_initrds();
pascal@19571 133 close(x->fd);
pascal@19515 134 boot_kernel();
pascal@19515 135 }
pascal@19515 136
pascal@20528 137 u32 root_dev;
pascal@20528 138 u32 vid_mode;
pascal@20528 139 u32 topmem;
pascal@21569 140 u32 base_himem;
pascal@19515 141 const char* kernel_name = "bzImage";
pascal@19515 142 const char* initrd_name;
pascal@21998 143 static char* iso;
pascal@20528 144
pascal@19515 145 int main(int argc, char *argv[])
pascal@19515 146 {
pascal@21569 147 ((u16*) &base_himem)[1] |= (_1m+_64k)>>16; // base_himem = _1m+_64k
pascal@19515 148
pascal@19515 149 if (argc < 2) {
pascal@19546 150 try_default_args();
pascal@19515 151 dousage:
pascal@20451 152 die("Usage: tazboot [[@commands]|[-f][-b base_himem][kernel=<bzImage>] \
pascal@21757 153 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] ...]\n\n\
pascal@21757 154 Defaults: tazboot kernel=bzImage auto\n\n\
pascal@21757 155 Examples for tazboot.cmd:\n\n\
pascal@21757 156 bootfrom=\\isos\\slitaz-4.0.iso\n\
pascal@21757 157 kernel=boot/bzImage\n\
pascal@21757 158 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\n\
pascal@21822 159 vga=normal autologin\n\n\
pascal@21757 160 kernel=\\slitaz\\elks\n\
pascal@21757 161 root=/dev/bda1 ro\n");
pascal@19515 162 }
pascal@21791 163 bootiso(argv + 1); // iso ? parsing is /init.exe stuff !
pascal@19538 164 for (int i=0;;) {
pascal@19546 165 char *s;
pascal@19580 166 next: argv++;
pascal@19546 167 s=*argv;
pascal@19538 168 i++;
pascal@21791 169 if (!s) {
pascal@21791 170 if (isoreset(iso) != -1) {
pascal@21791 171 s = (char *) initrd_name;
pascal@21791 172 if (isoopen((char *) kernel_name) != -1) {
pascal@21791 173 isokernel();
pascal@21791 174 }
pascal@21791 175 if (s) {
pascal@21791 176 do {
pascal@21791 177 char *p, c;
pascal@21791 178 for (p = s; *s && *s != ','; s++);
pascal@21791 179 c = *s; *s = 0;
pascal@21791 180 if (isoopen(p) != -1) {
pascal@21791 181 addinitrd();
pascal@21791 182 }
pascal@21791 183 *s = c;
pascal@21791 184 if (c) s++;
pascal@21791 185 } while (*s);
pascal@21791 186 load_initrds();
pascal@21791 187 }
pascal@21791 188 }
pascal@21791 189 else {
pascal@21791 190 load_kernel();
pascal@21791 191 load_initrd();
pascal@21791 192 }
pascal@21791 193 boot_kernel();
pascal@21791 194 }
pascal@20751 195 #ifdef USE_ARGSTR
pascal@20751 196 if ((*(u16 *)s|0x2002) == 0x662F) { // -F /f
pascal@22632 197 skip_alloc--;
pascal@20751 198 goto next;
pascal@20751 199 }
pascal@21576 200 if (argstr(s,"kernel/image|initrd|bootfrom/iso",&kernel_name) != -1);
pascal@21576 201 else if (argnum(s,"root|vga|mem/-e|-b",&root_dev) != -1);
pascal@20751 202 else if(i == 1 && fileexist(s) != -1) {
pascal@20751 203 kernel_name = s;
pascal@20751 204 }
pascal@21569 205 else strcatb(buf_cmdline,*argv); // FIXME mem ?
pascal@20751 206 }
pascal@20751 207 #else
pascal@21791 208 if (strhead(s,"initrd=") != -1) {
pascal@21791 209 s += 7;
pascal@21791 210 initrd_name = s;
pascal@21791 211 }
pascal@21791 212 else if (strhead(s,"bootfrom=") != -1) {
pascal@21791 213 s += 9;
pascal@21791 214 goto set_iso;
pascal@21791 215 }
pascal@21791 216 else if (strhead(s,"iso=") != -1) {
pascal@21791 217 s += 4;
pascal@21791 218 set_iso:
pascal@21791 219 iso = s;
pascal@21791 220 }
pascal@21791 221 else if (strhead(s,"image=") != -1) {
pascal@21791 222 goto set_kernel;
pascal@21791 223 }
pascal@21791 224 else if(strhead(s,"vga=") != -1) {
pascal@21791 225 *(u16*)&vid_mode = (u16)strtol(s+4); // support normal, extended & ask
pascal@21791 226 }
pascal@21791 227 else if (strhead(s,"kernel=") != -1) {
pascal@19825 228 s++;
pascal@19538 229 set_kernel:
pascal@19825 230 s += 6;
pascal@19898 231 set_kernelz:
pascal@19538 232 kernel_name = s;
pascal@19538 233 }
pascal@19580 234 else switch (*(u16 *)s|0x2002) {
pascal@19580 235 case 0x662F: // -F /f
pascal@22632 236 skip_alloc--;
pascal@19580 237 goto next;
pascal@19580 238 case 0x652F: // -E /e
pascal@21569 239 s=*++argv;
pascal@21569 240 goto set_topmem;
pascal@19580 241 case 0x622F: // -B /b
pascal@19580 242 argv++;
pascal@21569 243 ((u16 *)&base_himem)[1] = (u16)(strtol(*argv)>>16);
pascal@19580 244 goto next;
pascal@19580 245 default:
pascal@20632 246 if(i == 1 && fileexist(s) != -1) {
pascal@19898 247 goto set_kernelz;
pascal@19538 248 }
pascal@19515 249 else {
pascal@21569 250 strcatb(buf_cmdline,*argv);
pascal@21628 251 if(strhead(s,"root=") != -1) {
pascal@21569 252 *(u16*)&root_dev = (u16)strtol(s+5);
pascal@19515 253 }
pascal@21628 254 if(strhead(s,"mem=") != -1) {
pascal@19538 255 s += 4;
pascal@21569 256 set_topmem:
pascal@21569 257 ((u16 *)&topmem)[1] = (u16)(strtol(s)>>16);
pascal@19515 258 }
pascal@19580 259 }}
pascal@19515 260 }
pascal@20751 261 #endif
pascal@19515 262 }