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

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