wok rev 17450
syslinux/iso2exe: fix kernel_version
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Tue Dec 16 18:59:28 2014 +0100 (2014-12-16) |
parents | a8ed437fce5b |
children | aca562aa836e |
files | syslinux/stuff/iso2exe/README syslinux/stuff/iso2exe/a20.c syslinux/stuff/iso2exe/bootlinux.c |
line diff
1.1 --- a/syslinux/stuff/iso2exe/README Tue Dec 16 18:51:42 2014 +0100 1.2 +++ b/syslinux/stuff/iso2exe/README Tue Dec 16 18:59:28 2014 +0100 1.3 @@ -50,7 +50,7 @@ 1.4 1.5 The iso2exe tool moves the isolinux boot sector, installs its own boot sector 1.6 with a DOS .EXE header, and adds a WIN32 .EXE installer, a DOS .COM Linux 1.7 -loader and an initramfs in the end of the first 32Kb. 1.8 +loader, a floppy bootstrap and an initramfs in the end of the first 32Kb. 1.9 1.10 +-----------------+ 1.11 | untouched | ISO9660 files including /boot/bzImage and /boot/rootfs*
2.1 --- a/syslinux/stuff/iso2exe/a20.c Tue Dec 16 18:51:42 2014 +0100 2.2 +++ b/syslinux/stuff/iso2exe/a20.c Tue Dec 16 18:59:28 2014 +0100 2.3 @@ -1,65 +1,39 @@ 2.4 #ifndef __A20 2.5 #define __A20 2.6 2.7 -#define A20HOLDBUFFER 0x80000 2.8 -static int a20buffer = 0; 2.9 -static void movehia20(void) 2.10 -{ 2.11 - if ((mem.base >> 16) != 0x10) { 2.12 - movehi(); 2.13 - return; 2.14 - } 2.15 - a20buffer = 1; 2.16 -#asm 2.17 - pusha // more than 1Mb => 286+ 2.18 - push #A20HOLDBUFFER/16 2.19 - pop es 2.20 - mov di, _mem // mem.base & 0xFFFF 2.21 - mov si, #_buffer 2.22 - mov cx, #BUFFERSZ/2 2.23 - cld 2.24 - rep 2.25 - movsw 2.26 - popa 2.27 -#endasm 2.28 -} 2.29 -#define movehi movehia20 2.30 - 2.31 static void dosshutdowna20(void) 2.32 { 2.33 - if (a20buffer) { 2.34 #asm 2.35 + call _dosshutdown 2.36 + xor ax, ax // 30 2.37 + cmp ax, _a20buffer 2.38 + je no_a20buffer 2.39 pusha // more than 1Mb => 286+ 2.40 - xor di, di // 30 2.41 mov cx, #9 // 2E..1E 2.42 a20z1: 2.43 - push di 2.44 + push ax 2.45 loop a20z1 2.46 - push #0x10 2.47 - push di // 1A 0x100000 2.48 + push #0x9310 2.49 + push ax // 1A 0x100000 2.50 push #-1 // 18 2.51 - push di // 16 2.52 - push #A20HOLDBUFFER/0x10000 2.53 - push di // 12 A20HOLDBUFFER 2.54 + push ax // 16 2.55 + push #0x9300+A20HOLDBUFFER/0x10000 2.56 + push ax // 12 A20HOLDBUFFER 2.57 push #-1 // 10 2.58 mov cl, #8 // 0E..00 2.59 a20z2: 2.60 - push di 2.61 + push ax 2.62 loop a20z2 2.63 mov ch, #0x10000/512 2.64 push ss 2.65 pop es 2.66 mov si, sp 2.67 - mov ax, #0x8793 2.68 - mov [si+0x15], al 2.69 - xchg [si+0x1D], al 2.70 - xchg [si+0x1F], al // bits 24..31 2.71 + mov ah, #0x87 2.72 int 0x15 2.73 add sp, #0x30 2.74 popa 2.75 +no_a20buffer: 2.76 #endasm 2.77 - } 2.78 - dosshutdown(); 2.79 } 2.80 2.81 #define dosshutdown dosshutdowna20
3.1 --- a/syslinux/stuff/iso2exe/bootlinux.c Tue Dec 16 18:51:42 2014 +0100 3.2 +++ b/syslinux/stuff/iso2exe/bootlinux.c Tue Dec 16 18:59:28 2014 +0100 3.3 @@ -2,7 +2,6 @@ 3.4 #include "libdos.h" 3.5 #include "iso9660.h" 3.6 3.7 -static unsigned setup_version; 3.8 #define ELKSSIG 0x1E6 3.9 #define SETUPSECTORS 0x1F1 3.10 #define ROFLAG 0x1F2 3.11 @@ -45,9 +44,9 @@ 3.12 static int vm86(void) 3.13 { 3.14 #asm 3.15 - xor ax, ax 3.16 - cmp ax, _iselks 3.17 - jne fakerealmode // elks may run on a 8086 3.18 + mov ax, _iselks 3.19 + dec ax 3.20 + je fakerealmode // elks may run on a 8086 3.21 smsw ax // 286+ 3.22 and ax, #1 // 0:realmode 1:vm86 3.23 fakerealmode: 3.24 @@ -59,37 +58,51 @@ 3.25 int align; 3.26 } mem = { 0x100000, 0 }; 3.27 3.28 +#ifdef __MSDOS__ 3.29 +#define A20HOLDBUFFER 0x80000 3.30 +static int a20buffer = 0; 3.31 +#endif 3.32 + 3.33 static void movehi(void) 3.34 { 3.35 #asm 3.36 push si 3.37 push di 3.38 3.39 + xor ax, ax 3.40 mov si, #_mem 3.41 cmp word ptr [si+2], #0x10 3.42 +#ifdef __MSDOS__ 3.43 + jne nota20 3.44 + mov ax, #A20HOLDBUFFER/16 3.45 + mov _a20buffer, ax 3.46 + mov di, [si] // mem.base & 0xFFFF 3.47 + jmp mvbuffer 3.48 +nota20: 3.49 +#endif 3.50 jnc movehiz 3.51 - mov ax, [si+1] 3.52 + lodsb 3.53 + xchg ax, di 3.54 + lodsw 3.55 mov cl, #4 3.56 shl ax, cl // 8086 support for elks 3.57 +mvbuffer: 3.58 mov es, ax 3.59 - mov di, #0x00FF 3.60 - and di, [si] 3.61 mov si, #_buffer 3.62 + cld 3.63 mov cx, #BUFFERSZ/2 3.64 - cld 3.65 rep 3.66 movw 3.67 jmp movedone 3.68 -movehiz: 3.69 - xor di, di // 30 3.70 +movehiz: // 30 3.71 mov cx, #9 // 2E..1E 3.72 zero1: 3.73 - push di 3.74 + push ax 3.75 loop zero1 3.76 push dword [si] // 1A mem.base 3.77 push #-1 // 18 3.78 - push di // 16 3.79 - xor eax, eax 3.80 + push ax // 16 3.81 + cwde 3.82 cdq 3.83 mov dx, ds 3.84 shl edx, #4 3.85 @@ -99,7 +112,7 @@ 3.86 push #-1 // 10 3.87 mov cl, #8 // 0E..00 3.88 zero2: 3.89 - push di 3.90 + push #0 3.91 loop zero2 3.92 mov ch, #BUFFERSZ/512 3.93 push ss 3.94 @@ -117,10 +130,6 @@ 3.95 #endasm 3.96 } 3.97 3.98 -#define ZIMAGE_SUPPORT 3.99 -#define FULL_ZIMAGE 3.100 - 3.101 -#ifdef ZIMAGE_SUPPORT 3.102 static unsigned zimage = 0; 3.103 static unsigned getss(void) 3.104 { 3.105 @@ -128,7 +137,6 @@ 3.106 mov ax, ss 3.107 #endasm 3.108 } 3.109 -#endif 3.110 3.111 static unsigned extendedramsizeinkb(void) 3.112 { 3.113 @@ -190,12 +198,13 @@ 3.114 #asm 3.115 push si 3.116 mov es, _setupseg 3.117 + xchg di, _setupofs 3.118 mov si, #_buffer 3.119 - xchg di, _setupofs 3.120 + cld 3.121 mov cx, #BUFFERSZ/2 3.122 rep 3.123 movsw 3.124 - xchg _setupofs, di 3.125 + xchg di, _setupofs 3.126 pop si 3.127 #endasm 3.128 } 3.129 @@ -207,16 +216,25 @@ 3.130 #endasm 3.131 } 3.132 3.133 +#define WORD(x) * (unsigned short *) (x) 3.134 +#define LONG(x) * (unsigned long *) (x) 3.135 +static unsigned setup_version = 0; 3.136 static unsigned long kernel_version = 0; 3.137 unsigned long loadkernel(void) 3.138 { 3.139 - unsigned setup, n = BUFFERSZ; 3.140 + unsigned setup; 3.141 +#define LINUX001_SUPPORT 3.142 +#ifdef LINUX001_SUPPORT 3.143 + unsigned n = 512; 3.144 +#else 3.145 + unsigned n = BUFFERSZ; 3.146 +#endif 3.147 unsigned long syssize = 0; 3.148 3.149 do { 3.150 isoread(buffer, n); 3.151 if (setupofs == 0) { 3.152 - if (* (unsigned short *) (buffer + BOOTFLAG) != 0xAA55) 3.153 + if (WORD(buffer + BOOTFLAG) != 0xAA55) 3.154 die("The kernel is not bootable"); 3.155 #asm 3.156 int 0x12 3.157 @@ -230,16 +248,25 @@ 3.158 mov _setupseg, ax 3.159 has640k: 3.160 #endasm 3.161 + syssize = LONG(buffer + SYSSIZE) << 4; 3.162 + if (!syssize) syssize = 0x7F000; 3.163 setup = (1 + buffer[SETUPSECTORS]) << 9; 3.164 - if (setup == 512) setup = 5 << 9; 3.165 - syssize = * (unsigned long *) (buffer + SYSSIZE) << 4; 3.166 - if (!syssize) syssize = 0x7F000; 3.167 - setup_version = * (unsigned short *) (buffer + VERSION); 3.168 + if (setup == 512) { 3.169 +#ifdef LINUX001_SUPPORT 3.170 + if (WORD(buffer + 0x3F) == 0x3AE8) /* linux 0.01 */ 3.171 + goto linux001; 3.172 +#endif 3.173 + setup = 5 << 9; 3.174 + } 3.175 +#ifdef LINUX001_SUPPORT 3.176 + n = BUFFERSZ; 3.177 + isoread(buffer+512, BUFFERSZ-512); 3.178 +#endif 3.179 #define HDRS 0x53726448 3.180 - if (* (unsigned long *) (buffer + HEADER) != HDRS) 3.181 - setup_version = 0; 3.182 + if (LONG(buffer + HEADER) == HDRS) 3.183 + setup_version = WORD(buffer + VERSION); 3.184 #define ELKS 0x534B4C45 3.185 - if (* (unsigned long *) (buffer + ELKSSIG) == ELKS) 3.186 + if (LONG(buffer + ELKSSIG) == ELKS) 3.187 iselks = 1; 3.188 if (setup_version < 0x204) 3.189 syssize &= 0x000FFFFFUL; 3.190 @@ -256,34 +283,24 @@ 3.191 retf 3.192 end_realmode_switch: 3.193 #endasm 3.194 - * (unsigned short *) (buffer + RMSWOFS) = 3.195 - far_realmode_switch; 3.196 - * (unsigned short *) (buffer + RMSWSEG) = 3.197 - getcs(); 3.198 + WORD(buffer + RMSWOFS) = far_realmode_switch; 3.199 + WORD(buffer + RMSWSEG) = getcs(); 3.200 #endif 3.201 - mem.base = 3.202 - * (unsigned long *) (buffer + SYSTEMCODE); 3.203 - * (unsigned short *) (buffer + HEAPPTR) = 3.204 - 0x9B00; 3.205 + mem.base = LONG(buffer + SYSTEMCODE); 3.206 + WORD(buffer + HEAPPTR) = 0x9B00; 3.207 // buffer[LOADFLAGS] |= 0x80; 3.208 - * (unsigned short *) (buffer + LOADERTYPE) |= 3.209 - 0x80FF; 3.210 + WORD(buffer + LOADERTYPE) |= 0x80FF; 3.211 } 3.212 +#ifdef LINUX001_SUPPORT 3.213 + linux001: 3.214 +#endif 3.215 if (!setup_version || !(buffer[LOADFLAGS] & 1)) { 3.216 -#ifdef ZIMAGE_SUPPORT 3.217 zimage = getss() + 0x1000; 3.218 mem.base = zimage * 16L; 3.219 if (mem.base + syssize > setupseg*16L - 32) { 3.220 -#ifdef FULL_ZIMAGE 3.221 - zimage = 0x11; 3.222 + zimage = 0x9311; 3.223 mem.base = 0x110000L; // 1M + 64K HMA 3.224 -#else 3.225 - die("Out of memory"); 3.226 -#endif 3.227 } 3.228 -#else 3.229 - die("Not a bzImage format"); 3.230 -#endif 3.231 } 3.232 } 3.233 movesetup(); 3.234 @@ -296,25 +313,24 @@ 3.235 mov si, #0x200 3.236 cmp si, _setup_version 3.237 jae noversion 3.238 - push ds 3.239 - mov ds, _setupseg // setup > 2.00 => 386+ 3.240 - xor eax, eax 3.241 - cdq // clear edx 3.242 + mov es, _setupseg 3.243 + seg es 3.244 add si, [si+14] 3.245 - mov cx, #3 3.246 + mov bx, #2 3.247 + mov cl, #4 3.248 +nextnumber: 3.249 + xor ax, ax 3.250 nextdigit: 3.251 - shl al, #4 3.252 - shl ax, #4 3.253 -next: 3.254 + shl al, cl 3.255 + shl ax, cl 3.256 + seg es 3.257 lodsb 3.258 sub al, #0x30 3.259 cmp al, #9 3.260 jbe nextdigit 3.261 - shl eax, #16 3.262 - shld edx, eax, #8 3.263 - loop next 3.264 - pop ds 3.265 - mov _kernel_version, edx 3.266 + mov [bx+_kernel_version], ah 3.267 + dec bx 3.268 + jns nextnumber 3.269 noversion: 3.270 pop si 3.271 #endasm 3.272 @@ -332,52 +348,48 @@ 3.273 { 3.274 dosshutdown(); 3.275 #asm 3.276 + cld 3.277 mov es, _setupseg 3.278 -#endasm 3.279 - if (cmdline) { 3.280 - if (setup_version <= 0x201) { 3.281 -#asm 3.282 + mov ax, _setup_version 3.283 + cmp ax, #0x200 3.284 + jb noinitrd 3.285 + mov di, #0x218 3.286 + mov si, #_initrd_addr 3.287 + movsw 3.288 + movsw 3.289 + mov si, #_initrd_size 3.290 + movsw 3.291 + movsw 3.292 +noinitrd: 3.293 + pop si // return address 3.294 + pop si // .bootlinux.cmdline[bp] 3.295 + or si, si 3.296 + jz nocmdline 3.297 + cmp ax, #0x201 3.298 mov di, #0x0020 3.299 mov ax, #0xA33F 3.300 + mov bx, #CMDLINE_OFFSET 3.301 + push bx 3.302 + jbe oldcmdline 3.303 + mov di, #0x0228 3.304 + mov ax, es 3.305 + mov cl, #12 3.306 + shr ax, cl 3.307 + xchg ax, bx 3.308 +oldcmdline: 3.309 stosw 3.310 - mov ax, #CMDLINE_OFFSET 3.311 + xchg ax, bx 3.312 stosw 3.313 -#endasm 3.314 - } 3.315 - else { 3.316 -#asm 3.317 - mov di, #0x0228 3.318 - mov eax, #SETUP_SEGMENT*16+CMDLINE_OFFSET 3.319 - stosd 3.320 -#endasm 3.321 - } 3.322 -#asm 3.323 - xchg ax, di 3.324 - mov si, .bootlinux.cmdline[bp] 3.325 + pop di 3.326 copy: 3.327 lodsb 3.328 stosb 3.329 or al,al 3.330 jne copy 3.331 -#endasm 3.332 - } 3.333 - if (setup_version >= 0x200) { 3.334 -#asm 3.335 - mov eax, _initrd_addr 3.336 - mov di, #0x218 3.337 - stosd 3.338 - mov eax, _initrd_size 3.339 - stosd 3.340 -#endasm 3.341 - } 3.342 -#asm 3.343 +nocmdline: 3.344 push es 3.345 pop ss 3.346 mov sp, #CMDLINE_OFFSET 3.347 -#endasm 3.348 -#ifdef ZIMAGE_SUPPORT 3.349 -#asm 3.350 - cld 3.351 mov ax, _mem 3.352 mov dx, _mem+2 3.353 mov bx, _zimage 3.354 @@ -395,7 +407,6 @@ 3.355 movsb 3.356 retf 3.357 sysmove: 3.358 -#ifdef FULL_ZIMAGE 3.359 cmp dx, #0x0010 3.360 jb lowsys 3.361 // bx first 64k page, dx:ax last byte+1 3.362 @@ -413,7 +424,7 @@ 3.363 mov [si+0x10], cx // limit = -1 3.364 mov [si+0x18], cx // limit = -1 3.365 mov cx, #0x9300+SYSTEM_SEGMENT/0x1000 3.366 - mov bh, #0x93 3.367 + //mov bh, #0x93 3.368 mvdown: 3.369 mov [si+0x12+2], bx // srce 3.370 mov [si+0x1A+2], cx // dest 3.371 @@ -427,14 +438,12 @@ 3.372 cmp dl, bl 3.373 ja mvdown 3.374 jmp notzimage 3.375 -#endif 3.376 lowsys: 3.377 // bx first segment, dx:ax last byte+1 (paragraph aligned) 3.378 - mov cl, #4 3.379 + mov cl, #4 // elks may run on a 8086 3.380 shr ax, cl 3.381 - mov cl, #12 3.382 shl dx, cl 3.383 - or ax, dx // last segment+1 3.384 + or ah, dl // last segment+1 3.385 mov dx, #SYSTEM_SEGMENT 3.386 sub ax, bx // ax = paragraph count 3.387 sub bx, dx 3.388 @@ -443,44 +452,45 @@ 3.389 dec dx 3.390 sysmovelp: // move ax paragraphs from bx+dx:0 to dx:0 3.391 mov es, dx 3.392 - mov cx, dx 3.393 - add cx, bx 3.394 - mov ds, cx 3.395 - sbb cx, cx // cx = 0 : -1 3.396 + mov si, dx 3.397 + add si, bx 3.398 + mov ds, si 3.399 + sbb si, si // si = 0 : -1 3.400 cmc // C = 1 : 0 3.401 - adc dx, cx 3.402 + adc dx, si 3.403 + mov cl, #8 3.404 xor di, di 3.405 xor si, si 3.406 - mov cx, #8 3.407 rep 3.408 movsw 3.409 dec ax 3.410 jne sysmovelp 3.411 notzimage: 3.412 - or bp, bp 3.413 - jz notelks 3.414 + mov ax, ss 3.415 + mov ds, ax 3.416 + dec bp 3.417 + jnz notelks 3.418 + mov ah, #0x1 3.419 + mov ss, ax 3.420 +notelks: 3.421 push ss 3.422 - pop ds 3.423 - mov cx, #0x100 3.424 - mov es, cx 3.425 - mov ch, #0x78 // do not overload SYSTEM_SEGMENT 3.426 + pop es 3.427 + xor di, di 3.428 xor si, si 3.429 - xor di, di 3.430 - push es 3.431 +#ifdef LINUX001_SUPPORT 3.432 + mov cx, #0x0042 3.433 + cmp word ptr [si+0x3F], #0x3AE8 3.434 + je islinux001 3.435 +#endif 3.436 + mov cx, #0x7800 // do not overload SYSTEM_SEGMENT 3.437 rep 3.438 movsw 3.439 - pop ss 3.440 -notelks: 3.441 -#endasm 3.442 -#endif 3.443 -#asm 3.444 - mov ax, ss 3.445 - mov ds, ax 3.446 - mov es, ax 3.447 - add ax, #0x20 3.448 + push es 3.449 + pop ds 3.450 + xor al, #0x20 3.451 +islinux001: 3.452 push ax 3.453 - xor dx, dx 3.454 - push dx 3.455 + push cx 3.456 retf 3.457 endsysmove: 3.458 #endasm