wok-6.x diff linld/stuff/src/LOAD.CPP @ rev 19767

rsync: may not require /etc/inetd.conf
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Feb 20 12:42:22 2017 +0100 (2017-02-20)
parents 23fc786c04e8
children 6f494adb2c71
line diff
     1.1 --- a/linld/stuff/src/LOAD.CPP	Sat Dec 24 19:16:59 2016 +0100
     1.2 +++ b/linld/stuff/src/LOAD.CPP	Mon Feb 20 12:42:22 2017 +0100
     1.3 @@ -91,8 +91,9 @@
     1.4      u16     ext_mem_size;   // 0002 extended memory size in Kb (from int 0x15 fn 0x88)
     1.5      u8      pad00[0x20-4];
     1.6                              // old-style cmdline (not used in LINLD (yet?))
     1.7 -    u16     cl_magic;       // 0020 commandline magic number (=0xA33F)
     1.8 -    u16     cl_ofs;         // 0022 commandline offset
     1.9 +    u32     cl_magic_ofs;
    1.10 +    //u16     cl_magic;       // 0020 commandline magic number (=0xA33F)
    1.11 +    //u16     cl_ofs;         // 0022 commandline offset
    1.12      u8      pad10[0x80-0x24];
    1.13                              // these two set by rm setup:
    1.14      u8      hd0_disk_par[16]; // 0080 hd0-disk-parameter from intvector 0x41
    1.15 @@ -110,9 +111,9 @@
    1.16  
    1.17  const u32 HdrS = 'H' + ('d'<<8) + (u32('r')<<16) + (u32('S')<<24);
    1.18  
    1.19 -u8* rm_buf;
    1.20  u16 rm_size;
    1.21 -u8 pm_high;
    1.22 +u8 pm_high;	// @ = @rm_size + 2, see JUMP.ASM
    1.23 +u8* rm_buf;	// @ = @rm_size + 3, see JUMP.ASM
    1.24  u32 base_himem = _1m+_64k;
    1.25  extern struct image_himem pm, initrd;
    1.26  
    1.27 @@ -128,24 +129,25 @@
    1.28  static const char kernel_file_error[] = "Can't use kernel file";
    1.29  char* load_kernel() {
    1.30  
    1.31 +    struct	image_himem *m = &pm;
    1.32  #ifdef NO386
    1.33 -    csip=((u32)(topseg()+0x20)<<16);
    1.34 +    *((u16 *)&csip+1)=topseg()+0x20;
    1.35  #endif
    1.36      // Open kernel, read first kb, check it
    1.37 -    pm.errmsg = kernel_file_error;
    1.38 -    open_image(kernel_name, &pm);
    1.39 +    m->errmsg = kernel_file_error;
    1.40 +    open_image(kernel_name, m);
    1.41  
    1.42      char *version_string;
    1.43    {
    1.44      struct first1k_t *first1k;
    1.45      struct kernelparams_t *kernelparams;
    1.46 -    first1k = (first1k_t*) (rm_buf = malloc_or_die(_32k));
    1.47 -    kernelparams = &first1k->params;
    1.48 +    kernelparams = &(((first1k_t*) (rm_buf = malloc_or_die(_32k)))->params);
    1.49 +#define first1k		((first1k_t*)((u8 *)kernelparams-0x1F1))
    1.50     {
    1.51      u16 rm_seek;
    1.52  
    1.53      // Do not use malloc below until heap_top adjustment (see <*>)
    1.54 -    if (read(pm.fd, rm_buf, rm_seek=0x400) != 0x400) {
    1.55 +    if (read(m->fd, rm_buf, rm_seek=0x400) != 0x400) {
    1.56    readfail:
    1.57          die(kernel_file_error);
    1.58      }
    1.59 @@ -154,22 +156,22 @@
    1.60  #if 1
    1.61          if(* (int *) &first1k->pad10[0x3F-0x24] == 0x3AE8) {
    1.62              lseekset(pm.fd,rm_seek=0x200);
    1.63 -            csip=((u32)topseg()<<16)+0x0042;
    1.64 +            csip+=0xFFE00042;
    1.65          }
    1.66          else
    1.67  #endif
    1.68          kernelparams->setup_sects=4;
    1.69      }
    1.70 -    rm_size = 0x200*(kernelparams->setup_sects+1); // 0th sector is not counted there
    1.71 -    if(rm_size>_32k || kernelparams->boot_flag != 0xAA55)
    1.72 +    if((kernelparams->setup_sects)>=(_32k/512) || // 0th sector not counted
    1.73 +	 kernelparams->boot_flag != 0xAA55)
    1.74          die("It's not a kernel");
    1.75 -    heap_top = rm_buf+rm_size;  // <*>
    1.76 +    heap_top = rm_buf+(rm_size=0x200*(kernelparams->setup_sects+1));  // <*>
    1.77  
    1.78      // Read remaining rm loader
    1.79  
    1.80      {
    1.81      u16 cnt = rm_size-rm_seek;
    1.82 -    if (read(pm.fd, rm_buf+rm_seek, cnt) != cnt) goto readfail;
    1.83 +    if (read(m->fd, rm_buf+rm_seek, cnt) != cnt) goto readfail;
    1.84      }
    1.85     }
    1.86  
    1.87 @@ -215,8 +217,7 @@
    1.88              goto cmd_line_ok;
    1.89          }
    1.90      }
    1.91 -    first1k->cl_magic = 0xA33F;
    1.92 -    first1k->cl_ofs   = 0x8000;
    1.93 +    first1k->cl_magic_ofs = 0x8000A33F;
    1.94    }
    1.95  
    1.96  cmd_line_ok:
    1.97 @@ -232,7 +233,7 @@
    1.98      m->fallback = (u32((u16(_CS)+0x1FFF)&0xF000)<<4);
    1.99      m->size -= rm_size;
   1.100      m->chunk_size -= rm_size;
   1.101 -    if(m->fallback+m->size > (((u32)topseg())<<4) || pm_high) {
   1.102 +    if((u16)((m->fallback+m->size)>>4) > topseg() || pm_high) {
   1.103          m->fallback = base_himem;
   1.104      }
   1.105  
   1.106 @@ -245,20 +246,16 @@
   1.107  
   1.108  void load_initrd() {
   1.109      struct image_himem *m = &initrd;
   1.110 +    m->errmsg = "Can't use initrd file";
   1.111      if (!initrd_name && !m->fd) return;
   1.112 -    m->errmsg = "Can't use initrd file";
   1.113 -    if (!pm.errmsg) {
   1.114 -noinitrd:
   1.115 +
   1.116 +    open_image(initrd_name, m);
   1.117 +
   1.118 +    if ((m->fallback=(memtop()-m->size)&(~PAGE_MASK)) < pm.fallback+pm.size) {
   1.119 +        close(m->fd);
   1.120          puts(m->errmsg);
   1.121          return;
   1.122      }
   1.123 -    open_image(initrd_name, m);
   1.124 -
   1.125 -    m->fallback = (memtop()-m->size) & (~PAGE_MASK);
   1.126 -    if (m->fallback < pm.fallback + pm.size) {
   1.127 -        close(m->fd);
   1.128 -	goto noinitrd;
   1.129 -    }
   1.130  
   1.131      load_image(m);
   1.132      struct kernelparams_t *kernelparams = &(((first1k_t*) rm_buf)->params);
   1.133 @@ -280,8 +277,6 @@
   1.134          die("Loaded too close to 9000:0");
   1.135      }
   1.136  
   1.137 -    cli(); // we start doing destructive things to DOS
   1.138 -
   1.139      // Move rm loader & commandline to 0x90000, Jump to kernel rm code
   1.140      set_sregs_jump_seg_ofs(csip);
   1.141  }