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

tazboot: spave 40k+ for zImage
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jun 24 16:31:09 2019 +0200 (2019-06-24)
parents 93f070d4d2d7
children d8f824013cf6
line diff
     1.1 --- a/linld/stuff/src/LOAD.CPP	Thu May 30 10:51:27 2019 +0200
     1.2 +++ b/linld/stuff/src/LOAD.CPP	Mon Jun 24 16:31:09 2019 +0200
     1.3 @@ -122,8 +122,10 @@
     1.4  static u8 pm_high;	// @ = @rm_size + 2, see JUMP.ASM
     1.5  static u8* rm_buf;	// @ = @rm_size + 3, see JUMP.ASM
     1.6  struct image_himem imgs[2];
     1.7 +u32 far *initrd_desc = (u32 far *) MK_FP(0x9000,0x218);
     1.8  
     1.9  static const char kernel_file_error[] = "Can't use kernel file";
    1.10 +char *version_string="";
    1.11  char* load_kernel() {
    1.12  
    1.13      struct	image_himem *m = &pm;
    1.14 @@ -131,10 +133,9 @@
    1.15  #define _pm_high	(((u8*)(m))[-3])
    1.16  #define _rm_size	(*(u16*)((u8*)(m)-5))
    1.17  #define _csip		(*(u32*)((u8*)(m)-9))
    1.18 -    char *version_string;
    1.19    {
    1.20      struct kernelparams_t *kernelparams;
    1.21 -    kernelparams = &(((first1k_t*) (_rm_buf(m) = (u8 *)malloc_or_die(_32k)))->params);
    1.22 +    kernelparams = &(((first1k_t*) (_rm_buf(m) = (u8 *)heap_top))->params);
    1.23  #define first1k		((first1k_t*)((u8 *)kernelparams-0x1F1))
    1.24  
    1.25      *((u16 *)&_csip+1)=topseg()|0x20;
    1.26 @@ -143,7 +144,6 @@
    1.27      open_image(m, kernel_name);
    1.28  
    1.29  do {
    1.30 -    // Do not use malloc below until heap_top adjustment (see <*>)
    1.31   if (readrm(m, 0x200) == 0x200) {
    1.32  
    1.33      lseekcur(m->fd,-0x200);
    1.34 @@ -159,7 +159,7 @@
    1.35      if((kernelparams->setup_sects)>=(_32k/512) || // 0th sector not counted
    1.36  	 kernelparams->boot_flag != 0xAA55)
    1.37          die("Not a kernel");
    1.38 -    heap_top = _rm_buf(m)+(_rm_size=0x200*(kernelparams->setup_sects+1));  // <*>
    1.39 +    _rm_size=0x200*(kernelparams->setup_sects+1);
    1.40      m->size -= _rm_size;
    1.41      m->chunk_size -= _rm_size;
    1.42  
    1.43 @@ -173,7 +173,6 @@
    1.44  
    1.45      if((int)vid_mode) kernelparams->vid_mode = vid_mode;
    1.46      if((int)root_dev) kernelparams->root_dev = root_dev;
    1.47 -    version_string = "";
    1.48  
    1.49      if(kernelparams->header == HdrS) { // starting linux 1.3.73
    1.50  	if(kernelparams->loadflags & 1) {
    1.51 @@ -183,10 +182,10 @@
    1.52              pm_high++;
    1.53  
    1.54              // Hook on int15 to work around fn 88 DOS breakage
    1.55 -            hook_int15_88();
    1.56 +            hook_int15_88(); // break _ES
    1.57          }
    1.58          if (kernelparams->kernel_version)
    1.59 -            version_string = (char *) first1k+kernelparams->kernel_version+0x200;
    1.60 +            version_string = (char *) strdup((char *) first1k+kernelparams->kernel_version+0x200);
    1.61          kernelparams->type_of_loader = 0xff; // kernel do not know us (yet :-)
    1.62          if(kernelparams->version >= 0x201) {
    1.63              // * offset limit of the setup heap
    1.64 @@ -206,40 +205,23 @@
    1.65    }
    1.66  
    1.67  cmd_line_ok:
    1.68 -    // Check and enable A20 if needed
    1.69 -    enable_a20_or_die();
    1.70 +
    1.71 +    // Move setup & Check and enable A20 if needed
    1.72 +    moverm(m); // break _ES
    1.73  
    1.74      // Read remaining kernel (pm part)
    1.75      // Try to load kernel high, maybe even blindly storing it
    1.76      // in unallocated memory as a last resort
    1.77  
    1.78 -  {
    1.79 -    struct image_himem *m = &pm;
    1.80 -    if((u16)(((m->fallback=(u32(u16(_CS)+0x1000)<<4))+m->size)>>16) >=
    1.81 +    if((u16)(((m->fallback=(u32(u16(_CS)+(u16(heap_top)>>4)+1)<<4))+m->size)>>16) >=
    1.82  		 (u16)(topseg()>>12) || _pm_high) {
    1.83          m->fallback = base_himem;
    1.84      }
    1.85  
    1.86      load_image(m);
    1.87 -  }
    1.88      return version_string;
    1.89  }
    1.90  
    1.91 -struct initrdparams_t {
    1.92 -    u32     header;         // 0202 Magic signature "HdrS"
    1.93 -    u16     version;        // 0206 Boot protocol version supported
    1.94 -    u16     realmode_switch_ofs; // 0208 Hook called just before rm->pm
    1.95 -    u16     realmode_switch_seg;
    1.96 -    u16     start_sys_seg;  // 020C
    1.97 -    u16     kernel_version; // 020E Points to kernel version string
    1.98 -    u8      type_of_loader; // 0210 Boot loader identifier
    1.99 -    u8      loadflags;      // 0211 Boot protocol option flags
   1.100 -    u16     setup_move_size;// 0212 Move to high memory size (used with hooks)
   1.101 -    u32     code32_start;   // 0214 Boot loader hook (see below)
   1.102 -    u32     initrd_buf;     // 0218 initrd load address (set by boot loader)
   1.103 -    u32     initrd_size;    // 021C initrd size (set by boot loader)
   1.104 -};
   1.105 -
   1.106  // Read initrd if needed
   1.107  void load_initrd() {
   1.108      struct image_himem *m = &initrd;
   1.109 @@ -262,9 +244,8 @@
   1.110  
   1.111      load_image(m);
   1.112  
   1.113 -    struct initrdparams_t *initrdparams = ((struct initrdparams_t *)&(((first1k_t*) _rm_buf(m-1))->params.header));
   1.114 -    if(initrdparams->header == HdrS) {
   1.115 -        initrdparams->initrd_buf  = m->fallback;
   1.116 -        initrdparams->initrd_size = m->size;
   1.117 +    if (*version_string) {
   1.118 +        initrd_desc[0] = m->fallback;
   1.119 +        initrd_desc[1] = m->size;
   1.120      }
   1.121  }