wok diff linld/stuff/src/LOAD.CPP @ rev 19538

linld: add 'linld <kernel> <cmdline>' syntax
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Dec 02 12:37:59 2016 +0100 (2016-12-02)
parents bb42796dcd3b
children e428345df29a
line diff
     1.1 --- a/linld/stuff/src/LOAD.CPP	Tue Nov 22 21:19:01 2016 +0100
     1.2 +++ b/linld/stuff/src/LOAD.CPP	Fri Dec 02 12:37:59 2016 +0100
     1.3 @@ -43,23 +43,8 @@
     1.4  00000000+------------------------+
     1.5  */
     1.6  
     1.7 -struct first1k_t {
     1.8 -                            // these two set by rm setup:
     1.9 -    u16     curr_curs;      // 0000 saved cursor position
    1.10 -    u16     ext_mem_size;   // 0002 extended memory size in Kb (from int 0x15 fn 0x88)
    1.11 -    u8      pad00[0x20-4];
    1.12 -                            // old-style cmdline (not used in LINLD (yet?))
    1.13 -    u16     cl_magic;       // 0020 commandline magic number (=0xA33F)
    1.14 -    u16     cl_ofs;         // 0022 commandline offset
    1.15 -    u8      pad10[0x80-0x24];
    1.16 -                            // these two set by rm setup:
    1.17 -    u8      hd0_disk_par[16]; // 0080 hd0-disk-parameter from intvector 0x41
    1.18 -    u8      hd1_disk_par[16]; // 0090 hd1-disk-parameter from intvector 0x46
    1.19 -    u8      pad20[0x01e0-0xa0];
    1.20 -                            // this is set by rm setup:
    1.21 -    u32     alt_mem_size;   // 01E0 extended memory size in Kb (from int 0x15 fn 0xe801)
    1.22 -    u8      pad28[0x01f1-0x1e4];
    1.23 -
    1.24 +struct kernelparams_t {
    1.25 +    u8      pad0;
    1.26      u8      setup_sects;    // 01F1 The size of the setup in sectors
    1.27                              //      boot sector is NOT included here
    1.28      u16     ro_flag;        // 01F2 If set, the root is mounted readonly
    1.29 @@ -101,6 +86,25 @@
    1.30                              // int 0x15 fn 0xe820
    1.31  }; //__attribute((packed));
    1.32  
    1.33 +struct first1k_t {
    1.34 +                            // these two set by rm setup:
    1.35 +    u16     curr_curs;      // 0000 saved cursor position
    1.36 +    u16     ext_mem_size;   // 0002 extended memory size in Kb (from int 0x15 fn 0x88)
    1.37 +    u8      pad00[0x20-4];
    1.38 +                            // old-style cmdline (not used in LINLD (yet?))
    1.39 +    u16     cl_magic;       // 0020 commandline magic number (=0xA33F)
    1.40 +    u16     cl_ofs;         // 0022 commandline offset
    1.41 +    u8      pad10[0x80-0x24];
    1.42 +                            // these two set by rm setup:
    1.43 +    u8      hd0_disk_par[16]; // 0080 hd0-disk-parameter from intvector 0x41
    1.44 +    u8      hd1_disk_par[16]; // 0090 hd1-disk-parameter from intvector 0x46
    1.45 +    u8      pad20[0x01e0-0xa0];
    1.46 +                            // this is set by rm setup:
    1.47 +    u32     alt_mem_size;   // 01E0 extended memory size in Kb (from int 0x15 fn 0xe801)
    1.48 +    u8      pad28[0x01f0-0x1e4];
    1.49 +    struct kernelparams_t params;
    1.50 +}; //__attribute((packed));
    1.51 +
    1.52  #if sizeof(first1k_t)!=0x400
    1.53  #error BUG: Bad first1k
    1.54  #endif
    1.55 @@ -116,7 +120,7 @@
    1.56  static void memcpy_image(struct image_himem *m) {
    1.57      if (m->fallback != m->buf)
    1.58          memcpy32(
    1.59 -            0, m->fallback, // dst seg,ofs
    1.60 +            m->fallback,    // dst seg,ofs
    1.61              0, m->buf,      // src seg,ofs
    1.62              m->size         // size
    1.63          );
    1.64 @@ -152,7 +156,7 @@
    1.65          // Move kernel
    1.66          // 'Gathering' copy in chunks of PAGE_SIZE
    1.67          // No risk of overlapping: kernel is copied from above to 1m mark
    1.68 -        pm.size = PAGE_SIZE;
    1.69 +        pm.size = initrd.size = PAGE_SIZE;
    1.70          u32 *p = pm.bufv;
    1.71          if (p) while(*p) {
    1.72              pm.buf = *p;
    1.73 @@ -167,7 +171,6 @@
    1.74              // (overlapping still can happen with more than 256mb ram)
    1.75              // (generic solution for this overwrite problem, anyone?)
    1.76              p=initrd.bufv;
    1.77 -            initrd.size = PAGE_SIZE;
    1.78              do {
    1.79                  p++; initrd.fallback+=PAGE_SIZE;
    1.80              } while(*p);
    1.81 @@ -216,7 +219,9 @@
    1.82      char *version_string;
    1.83    {
    1.84      struct first1k_t *first1k;
    1.85 +    struct kernelparams_t *kernelparams;
    1.86      first1k = (first1k_t*) (rm_buf = malloc_or_die(_32k));
    1.87 +    kernelparams = &first1k->params;
    1.88     {
    1.89      u16 rm_seek;
    1.90  
    1.91 @@ -226,7 +231,7 @@
    1.92          die(kernel_file_error);
    1.93      }
    1.94  
    1.95 -    if(!first1k->setup_sects) {
    1.96 +    if(!kernelparams->setup_sects) {
    1.97  #if 1
    1.98          if(* (int *) &first1k->pad10[0x3F-0x24] == 0x3AE8) {
    1.99              lseek(pm.fd,rm_seek=0x200,SEEK_SET);
   1.100 @@ -234,10 +239,10 @@
   1.101          }
   1.102          else
   1.103  #endif
   1.104 -        first1k->setup_sects=4;
   1.105 +        kernelparams->setup_sects=4;
   1.106      }
   1.107 -    rm_size = 0x200*(first1k->setup_sects+1); // 0th sector is not counted there
   1.108 -    if(rm_size>_32k || first1k->boot_flag != 0xAA55)
   1.109 +    rm_size = 0x200*(kernelparams->setup_sects+1); // 0th sector is not counted there
   1.110 +    if(rm_size>_32k || kernelparams->boot_flag != 0xAA55)
   1.111          die("It's not a kernel");
   1.112      heap_top = rm_buf+rm_size;  // <*>
   1.113  
   1.114 @@ -251,15 +256,15 @@
   1.115  
   1.116      // Tell rm loader some info
   1.117  
   1.118 -    if(vid_mode) first1k->vid_mode = vid_mode;
   1.119 -    if(root_dev) first1k->root_dev = root_dev;
   1.120 +    if(vid_mode) kernelparams->vid_mode = vid_mode;
   1.121 +    if(root_dev) kernelparams->root_dev = root_dev;
   1.122      version_string = 0;
   1.123  
   1.124  #if 1
   1.125 -    if(first1k->header == HdrS) { // starting linux 1.3.73
   1.126 -	if(first1k->loadflags & 1) {
   1.127 +    if(kernelparams->header == HdrS) { // starting linux 1.3.73
   1.128 +	if(kernelparams->loadflags & 1) {
   1.129  #else
   1.130 -    if((first1k->header != HdrS) || (first1k->loadflags & 1) == 0)
   1.131 +    if((kernelparams->header != HdrS) || (kernelparams->loadflags & 1) == 0)
   1.132          die("I can't load bzImage low");
   1.133      {
   1.134          {
   1.135 @@ -270,23 +275,23 @@
   1.136              hook_int15_88();
   1.137  
   1.138              // * will be called just before rm -> pm
   1.139 -            first1k->realmode_switch_ofs = ofs(last_ditch);
   1.140 -            first1k->realmode_switch_seg = seg(last_ditch);
   1.141 +            kernelparams->realmode_switch_ofs = ofs(last_ditch);
   1.142 +            kernelparams->realmode_switch_seg = seg(last_ditch);
   1.143          }
   1.144 -        if(first1k->kernel_version)
   1.145 -            version_string = (char *) first1k+first1k->kernel_version+0x200;
   1.146 -        first1k->type_of_loader = 0xff; // kernel do not know us (yet :-)
   1.147 -        if(first1k->version >= 0x201) {
   1.148 +        if(kernelparams->kernel_version)
   1.149 +            version_string = (char *) first1k+kernelparams->kernel_version+0x200;
   1.150 +        kernelparams->type_of_loader = 0xff; // kernel do not know us (yet :-)
   1.151 +        if(kernelparams->version >= 0x201) {
   1.152              // * offset limit of the setup heap
   1.153              //   heap_end_ptr appears to be relative to the start of setup (ofs 0x0200)
   1.154 -            first1k->heap_end_ptr = _32k-0x0200;
   1.155 -            first1k->loadflags |= 0x80; // says to rm loader it's ok to use heap
   1.156 +            kernelparams->heap_end_ptr = _32k-0x0200;
   1.157 +            kernelparams->loadflags |= 0x80; // says to rm loader it's ok to use heap
   1.158          }
   1.159          // * if we will ever stop moving ourself to 0x90000
   1.160          //   we must say setup.S how much to move
   1.161 -        //first1k->setup_move_size = _32k;
   1.162 -        if(first1k->version >= 0x202) { // starting linux 2.4.0-test3-pre3
   1.163 -            first1k->cmd_line_ptr = (((u32)(topseg()+0x0800))<<4);
   1.164 +        //kernelparams->setup_move_size = _32k;
   1.165 +        if(kernelparams->version >= 0x202) { // starting linux 2.4.0-test3-pre3
   1.166 +            kernelparams->cmd_line_ptr = (((u32)(topseg()+0x0800))<<4);
   1.167              goto cmd_line_ok;
   1.168          }
   1.169      }
   1.170 @@ -304,6 +309,7 @@
   1.171  
   1.172      pm.fallback = (u32((u16(_CS)+0x1FFF)&0xF000)<<4);
   1.173      pm.size -= rm_size;
   1.174 +    pm.chunk_size -= rm_size;
   1.175      if(pm.fallback+pm.size > (((u32)topseg())<<4) || pm_high) {
   1.176          pm.fallback = _1m+_64k;
   1.177      }
   1.178 @@ -314,16 +320,15 @@
   1.179  
   1.180  // Read initrd if needed
   1.181  
   1.182 -static const char msg_initrd[] = "Can't use initrd file";
   1.183  void load_initrd() {
   1.184      struct image_himem *m = &initrd;
   1.185      if (!initrd_name && !initrd.fd) return;
   1.186 -    if (!pm.fd) {
   1.187 +    m->errmsg = "Can't use initrd file";
   1.188 +    if (!pm.errmsg) {
   1.189  noinitrd:
   1.190 -        puts(msg_initrd);
   1.191 +        puts(m->errmsg);
   1.192          return;
   1.193      }
   1.194 -    m->errmsg = msg_initrd;
   1.195      open_image(initrd_name, m);
   1.196  
   1.197      m->fallback = (memtop()-m->size) & (~PAGE_MASK);
   1.198 @@ -333,10 +338,10 @@
   1.199      }
   1.200  
   1.201      load_image(m);
   1.202 -    struct first1k_t *first1k = (first1k_t*)rm_buf;
   1.203 -    if(first1k->header == HdrS) {
   1.204 -        first1k->initrd_buf  = m->fallback;
   1.205 -        first1k->initrd_size = m->size;
   1.206 +    struct kernelparams_t *kernelparams = (kernelparams_t *)(rm_buf+0x1F0);
   1.207 +    if(kernelparams->header == HdrS) {
   1.208 +        kernelparams->initrd_buf  = m->fallback;
   1.209 +        kernelparams->initrd_size = m->size;
   1.210      }
   1.211  }
   1.212  
   1.213 @@ -355,29 +360,8 @@
   1.214      cli(); // we start doing destructive things to DOS
   1.215  
   1.216      // Move rm loader & commandline to 0x90000
   1.217 -    if(vcpi==0) {
   1.218 -        memcpy32(
   1.219 -            topseg(),0,
   1.220 -            seg(rm_buf),ofs(rm_buf),
   1.221 -            rm_size //_32k
   1.222 -        );
   1.223 -        memcpy32(
   1.224 -            topseg()+0x0800,0,
   1.225 -            seg(cmdline),ofs(cmdline),
   1.226 -            PAGE_SIZE
   1.227 -        );
   1.228 -    } else { //vcpi
   1.229 -        u32 dst=((u32)topseg()<<4);
   1.230 -        u16 pos=ofs(rm_buf);
   1.231 -        do {
   1.232 -            memcpy_vcpi(dst,seg(rm_buf),pos);
   1.233 -            dst+=PAGE_SIZE;
   1.234 -            pos+=PAGE_SIZE;
   1.235 -            rm_size-=PAGE_SIZE;
   1.236 -          } while(s16(rm_size) > 0);
   1.237 -        // overkill: copy PAGE_SIZE bytes
   1.238 -        memcpy_vcpi(((u32)(topseg()+0x0800)<<4),seg(cmdline),ofs(cmdline));
   1.239 -    }
   1.240 +    // overkill: copy PAGE_SIZE bytes
   1.241 +    rmcpy(rm_buf, rm_size);
   1.242  
   1.243      // Jump to kernel rm code
   1.244      set_sregs_jump_seg_ofs(csip, sssp);