wok annotate linld/stuff/src/LINLD.CPP @ rev 19515

linld: multi initrd support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Nov 22 21:19:01 2016 +0100 (2016-11-22)
parents
children 7f92b23984dc
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@19515 8 static struct image_himem image;
pascal@19515 9 static const char msg_cmdline[] = "Error reading cl=@file";
pascal@19515 10 static char* read_cmdline_or_die(const char* fn) {
pascal@19515 11 image.errmsg = msg_cmdline;
pascal@19515 12 open_image(fn, &image);
pascal@19515 13 u16 size=image.size;
pascal@19515 14 char *cmdline_buf;
pascal@19515 15 if(size>=PAGE_SIZE ||
pascal@19515 16 !(cmdline_buf=(char *)malloc(size)) ||
pascal@19515 17 read(image.fd, cmdline_buf, size) != size)
pascal@19515 18 die(msg_cmdline);
pascal@19515 19 // Strip any trailing cr/lf
pascal@19515 20 char *p=cmdline_buf+size;
pascal@19515 21 char c='\0';
pascal@19515 22 do {
pascal@19515 23 // Replace all other cr/lfs with spaces
pascal@19515 24 if(*--p>=' ') c=' ';
pascal@19515 25 else *p = c;
pascal@19515 26 } while (p>cmdline_buf);
pascal@19515 27 return cmdline_buf;
pascal@19515 28 }
pascal@19515 29
pascal@19515 30 const char* kernel_name = "bzImage";
pascal@19515 31 const char* initrd_name;
pascal@19515 32 const char* cmdline = "auto";
pascal@19515 33 u16 root_dev;
pascal@19515 34 u16 vid_mode; // -3 = ask
pascal@19515 35 // -2 = Extended VGA
pascal@19515 36 // -1 = Normal VGA
pascal@19515 37 // n = as "n" was pressed
pascal@19515 38
pascal@19515 39 inline void syntax() {
pascal@19515 40 die("Syntax:" NL
pascal@19515 41 "LINLD [image=file] [initrd=files] [vga=mode] [root=num] [mem=max] [cl=cmdline]" NL
pascal@19515 42 "vga mode: ask,extended,normal or dec/oct/hex number" NL
pascal@19515 43 "Defaults:" NL
pascal@19515 44 "\timage=bzImage" NL
pascal@19515 45 "\tinitrd,vga,root=(void)" NL
pascal@19515 46 "\tmem=256m" NL
pascal@19515 47 "\tcl=auto" NL
pascal@19515 48 "Use quotes: \"cl=...\" if you need spaces in cmdline" NL
pascal@19515 49 "Use cl=@filename to take cmdline from file"
pascal@19515 50 #if 1
pascal@19515 51 NL NL "Examples:" NL
pascal@19515 52 "\tlinld initrd=rootfs4.gz,rootfs3.gz,rootfs2.gz,rootfs1.gz \"cl=rw root=/dev/null video=-32\""
pascal@19515 53 NL NL "\tlinld image=memtest"
pascal@19515 54 #endif
pascal@19515 55 );
pascal@19515 56 }
pascal@19515 57
pascal@19515 58 int main(int argc, char *argv[]) {
pascal@19515 59 // Believe it or not - this enables A20
pascal@19515 60 // on my box! Must be DOS in HMA... -vda
pascal@19515 61 puts("LINLD v" VERSION_STR "+");
pascal@19515 62
pascal@19515 63 // Parse command line
pascal@19515 64
pascal@19515 65 if(argc<2) {
pascal@19515 66 dosyntax:
pascal@19515 67 syntax();
pascal@19515 68 }
pascal@19515 69 {for(int i=1;i<argc;i++) {
pascal@19515 70 char *s=argv[i];
pascal@19515 71 if(strhead(s,"image=") == 0) {
pascal@19515 72 kernel_name=s+6;
pascal@19515 73 }
pascal@19515 74 else if(strhead(s,"initrd=") == 0) {
pascal@19515 75 initrd_name = s+7;
pascal@19515 76 }
pascal@19515 77 else if(strhead(s,"cl=") == 0) {
pascal@19515 78 cmdline=s+3;
pascal@19515 79 if (cmdline[0] == '@') {
pascal@19515 80 cmdline=read_cmdline_or_die(cmdline+1);
pascal@19515 81 puts("Kernel command line:");
pascal@19515 82 puts(cmdline);
pascal@19515 83 }
pascal@19515 84 }
pascal@19515 85 else if(strhead(s,"vga=") == 0) {
pascal@19515 86 s+=4;
pascal@19515 87 const char c = *s|0x20;
pascal@19515 88 if (c == 'a') vid_mode = -3;
pascal@19515 89 else if (c == 'e') vid_mode = -2;
pascal@19515 90 else if (c == 'n') vid_mode = -1;
pascal@19515 91 else vid_mode = strtol(s);
pascal@19515 92 }
pascal@19515 93 else if(strhead(s,"root=") == 0) {
pascal@19515 94 root_dev = strtol(s+5);
pascal@19515 95 }
pascal@19515 96 else if(strhead(s,"mem=") == 0) {
pascal@19515 97 topmem = strtol(s+4);
pascal@19515 98 }
pascal@19515 99 else if(strhead(s,"-f") == 0) {
pascal@19515 100 extern int skip_xmmalloc;
pascal@19515 101 skip_xmmalloc++;
pascal@19515 102 }
pascal@19515 103 else
pascal@19515 104 goto dosyntax;
pascal@19515 105 }}
pascal@19515 106
pascal@19515 107 puts(load_kernel());
pascal@19515 108 load_initrd();
pascal@19515 109 boot_kernel();
pascal@19515 110
pascal@19515 111 // Let compiler be happy
pascal@19515 112 return _AX;
pascal@19515 113 }