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