wok-6.x annotate linld/stuff/src/LINLD.CPP @ rev 21791

Fix loram dos boot
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Aug 01 15:16:29 2019 +0200 (2019-08-01)
parents 93f070d4d2d7
children e93e6b4d565f
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@21791 92 if(strhead(s,"initrd=") != -1) {
pascal@21569 93 initrd_name=s+7;
pascal@19538 94 }
pascal@21628 95 else if(strhead(s,"vga=") != -1) {
pascal@21569 96 *(u16*)&vid_mode = (u16)strtol(s+7); // support normal, extended & ask
pascal@19515 97 }
pascal@19580 98 else switch (*(u16 *)s|0x2002) {
pascal@19580 99 case 0x662F: // -F /f
pascal@19580 100 skip_alloc++;
pascal@19580 101 goto next;
pascal@19580 102 case 0x622F: // -B /b
pascal@19580 103 argv++;
pascal@21569 104 ((u16 *)&base_himem)[1] = (u16)(strtol(*argv)>>16);
pascal@19580 105 goto next;
pascal@19580 106 default:
pascal@21628 107 if(strhead(s,"cl=") != -1) {
pascal@20793 108 cmdline=s+=3;
pascal@20793 109 if (*s == '@') {
pascal@20793 110 static struct image_himem image;
pascal@20793 111 char c;
pascal@19538 112
pascal@20793 113 s++;
pascal@20793 114 image.errmsg = "Error in cl=@file";
pascal@21649 115 open_image(&image, s);
pascal@21569 116 s+=read(image.fd, (void *)cmdline=s=
pascal@21569 117 (char *)malloc_or_die(image.size), image.size);
pascal@20793 118 // Strip any trailing cr/lf
pascal@20793 119 c='\0';
pascal@20793 120 do {
pascal@19538 121 // Replace all other cr/lfs with spaces
pascal@19538 122 s--;
pascal@19538 123 if(*s>=' ') c=' ';
pascal@19538 124 else *s = c;
pascal@20793 125 } while (s>cmdline);
pascal@20793 126 puts("Kernel command line:");
pascal@20793 127 puts(cmdline);
pascal@20793 128 }
pascal@20793 129 }
pascal@21628 130 else if(strhead(s,"root=") != -1) {
pascal@21569 131 *(u16*)&root_dev = (u16)strtol(s+5);
pascal@20793 132 goto addincmdline;
pascal@20793 133 }
pascal@21628 134 else if(strhead(s,"mem=") != -1) {
pascal@21569 135 ((u16 *)&topmem)[1] = (u16)(strtol(s+4)>>16);
pascal@20793 136 goto addincmdline;
pascal@20793 137 }
pascal@21791 138 else if(strhead(s,"image=") != -1) {
pascal@21791 139 s+=6;
pascal@21791 140 set_kernel_name:
pascal@21791 141 kernel_name=s;
pascal@21791 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 }