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

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