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 = ± 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 = ± 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 }