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

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