wok-6.x diff plop/stuff/unpack.S @ rev 25565
Reenable rpc for glibc, fix gpxe grub4dos receipt, fix linld url
author | Stanislas Leduc <shann@slitaz.org> |
---|---|
date | Tue May 09 17:24:00 2023 +0000 (13 months ago) |
parents | 89b052a8b781 |
children |
line diff
1.1 --- a/plop/stuff/unpack.S Wed Aug 19 13:03:10 2020 +0000 1.2 +++ b/plop/stuff/unpack.S Tue May 09 17:24:00 2023 +0000 1.3 @@ -6,10 +6,11 @@ 1.4 #define KEEP_BOOTSECTOR 1 1.5 #define LINUX_HEADER 0 1.6 #define UPDATE_SYSSIZE 1 1.7 -#define HARDCODED_SYSSIZE 1 1.8 -#define HARDCODED_SETUPSIZE 1 1.9 #define FLAT16 1 1.10 #define FLAT16OUT 1 1.11 +#define COPYTOHIGHMEM 0 1.12 +#define UPDATE_CODE32_START 0 1.13 +#define DOUBLE_PACKED 0 1.14 #define SAVEREGS 0 1.15 #define ELKS 0 1.16 1.17 @@ -21,12 +22,10 @@ 1.18 #undef UPDATE_SYSSIZE 1.19 #define UPDATE_SYSSIZE 0 1.20 #endif 1.21 -#if defined(FLAT16OUT) && FLAT16OUT == 0 1.22 -#undef FLAT16OUT 1.23 -#endif 1.24 #if ELKS 1.25 .arch i8086 1.26 #define FLAT16 1 1.27 +#define KEEP_BOOTSECTOR 1 1.28 #define LINUX_HEADER 0 1.29 #define SAVEREGS 0 1.30 #define TOPSEG 0x2000 1.31 @@ -34,6 +33,58 @@ 1.32 #define TOPSEG 0x8000 1.33 #endif 1.34 1.35 +.macro pusham 1.36 +#if ELKS 1.37 + pushw %ax 1.38 +// movw %sp, %ax 1.39 +// incw %ax // emulate popa behaviour 1.40 +// incw %ax 1.41 + pushw %cx 1.42 + pushw %dx 1.43 + pushw %bx 1.44 +// pushw %ax // %sp 1.45 + pushw %bp 1.46 + pushw %si 1.47 + pushw %di 1.48 +#else 1.49 + pushaw 1.50 +#endif 1.51 +.endm 1.52 + 1.53 +.macro popam 1.54 +#if ELKS 1.55 + popw %di 1.56 + popw %si 1.57 + popw %bp 1.58 +// popw %ax 1.59 + popw %bx 1.60 + popw %dx 1.61 + popw %cx 1.62 + popw %ax 1.63 +#else 1.64 + popaw 1.65 +#endif 1.66 +.endm 1.67 + 1.68 +.macro pushm val 1.69 +#if ELKS 1.70 + movw \val, %ax 1.71 + pushw %ax 1.72 +#else 1.73 + pushw \val 1.74 +#endif 1.75 +.endm 1.76 + 1.77 +.macro shrwm cnt, reg 1.78 +#if ELKS 1.79 + .rept \cnt 1.80 + shrw $1, \reg 1.81 + .endr 1.82 +#else 1.83 + shrw $\cnt, \reg 1.84 +#endif 1.85 +.endm 1.86 + 1.87 .globl _start 1.88 _start: 1.89 #if LINUX_HEADER 1.90 @@ -56,156 +107,82 @@ 1.91 pushfw 1.92 pushw %cs 1.93 pushw $0 1.94 - pushal 1.95 + pusham 1.96 + xorw %si, %si 1.97 pushw %ds 1.98 + pushw %es 1.99 cld 1.100 #else 1.101 - pushw %cs 1.102 -# if FLAT16 1.103 - xorw %di, %di 1.104 - pushw %di 1.105 -# else 1.106 - pushw $0 1.107 + pushw %cs // return adress is %cs:0 1.108 + xorw %si, %si 1.109 + pushw %si 1.110 +#endif // SAVEREGS 1.111 + pushw %ds // <A> bootsector+setup segment 1.112 +#if FLAT16 1.113 +# 1- move 9000..9020+stp -> TOPSEG 1.114 + pushm $TOPSEG 1.115 + popw %es 1.116 +# if SAVEREGS 1.117 +setup_word: 1.118 + movw $SETUP*256+256, %cx 1.119 + pushw %cx // <B> bootsector+setup words 1.120 # endif 1.121 -#endif 1.122 -#if ELKS 1.123 - movw $0x100, %ax 1.124 - pushw %ax 1.125 -#else 1.126 -# if UPDATE_SYSSIZE || KEEP_BOOTSECTOR 1.127 - pushw %ds // <A> 1.128 -# else 1.129 - pushw %cs // <A> 1.130 -# endif 1.131 -#endif 1.132 -#if FLAT16 1.133 -# 1- move 9000/9020..9020+stp -> TOPSEG 1.134 -#if ELKS 1.135 - movb $TOPSEG/256, %ah 1.136 - movw %ax, %es 1.137 -#else 1.138 - pushw $TOPSEG 1.139 - popw %es 1.140 -#endif 1.141 -#if KEEP_BOOTSECTOR 1.142 - xorw %si, %si 1.143 -#else 1.144 - movw $0x200, %si 1.145 -#endif 1.146 -#if SAVEREGS == 0 1.147 + pushw %es // <C> TOPSEG 1.148 pushw %es 1.149 -#if ELKS 1.150 -# if KEEP_BOOTSECTOR 1.151 - movw $cont+0x200, %ax 1.152 -# else 1.153 - movw $cont, %ax 1.154 -# endif 1.155 - pushw %ax 1.156 -#else 1.157 -# if KEEP_BOOTSECTOR 1.158 - pushw $cont+0x200 1.159 -# else 1.160 - // pushw $cont 1.161 - .byte 0x6A, cont 1.162 -# endif 1.163 -#endif 1.164 - jmp jumpinto 1.165 -#else 1.166 -# if HARDCODED_SETUPSIZE 1.167 -setup_word: 1.168 -# if KEEP_BOOTSECTOR 1.169 -# else 1.170 - movw $SETUP*256, %cx 1.171 -# endif 1.172 -# else 1.173 -# if KEEP_BOOTSECTOR 1.174 - movw $0x100, %cx 1.175 - addb SETUPSIZE, %ch 1.176 -# else 1.177 - xorw %cx, %cx 1.178 - movb SETUPSIZE, %ch 1.179 -# endif 1.180 - movw %cx, %dx 1.181 -# endif 1.182 - pushw %cx // <B> 1.183 - pushw %es 1.184 - pushw %di 1.185 +# if SAVEREGS 1.186 + xorw %di, %di // %ds:%si = 9000:0000 %es:%di = TOPSEG:0 1.187 + pushm $0x200+cont 1.188 rep 1.189 movsw 1.190 lret 1.191 -#endif 1.192 cont: 1.193 +# else 1.194 + movw $-0x200, %di 1.195 + call jumpinto 1.196 +# endif 1.197 # 2- move 1000..1000+sys -> TOPSEG+stp 1.198 -#if ELKS 1.199 - movw $0x1000, %ax 1.200 - movw %ax, %ds 1.201 -#else 1.202 - pushw $0x1000 1.203 + pushm $0x1000 1.204 popw %ds 1.205 -#endif 1.206 - xorw %si, %si 1.207 - subw %di, %cx 1.208 + xorw %si, %si // %ds:%si = 1000:0 1.209 + subw %di, %cx // %cx = 64K - setupsz 1.210 rep 1.211 movsb 1.212 # 3- unlz(TOPSEG+stp:end, 1000-stp:0) 1.213 - pushw %es // <C> 1.214 -# if HARDCODED_SETUPSIZE 1.215 setup_seg: 1.216 -#if ELKS 1.217 -# if KEEP_BOOTSECTOR 1.218 -# if UPDATE_SYSSIZE 1.219 - movw $0x1000-(SETUP*32)-32-32, %ax 1.220 -# else 1.221 - movw $0x1000-(SETUP*32)-32, %ax 1.222 -# endif 1.223 -# else 1.224 -# if UPDATE_SYSSIZE 1.225 - movw $0x1000-(SETUP*32)-32, %ax 1.226 -# else 1.227 - movw $0x1000-(SETUP*32), %ax 1.228 -# endif 1.229 -# endif 1.230 - movw %ax, %es 1.231 -#else 1.232 -# if KEEP_BOOTSECTOR 1.233 -# if UPDATE_SYSSIZE 1.234 - pushw $0x1000-(SETUP*32)-32-32 1.235 -# else 1.236 - pushw $0x1000-(SETUP*32)-32 1.237 -# endif 1.238 -# else 1.239 -# if UPDATE_SYSSIZE 1.240 - pushw $0x1000-(SETUP*32)-32 1.241 -# else 1.242 - pushw $0x1000-(SETUP*32) 1.243 -# endif 1.244 -# endif 1.245 + pushm $0x1000-(SETUP*32)-32 1.246 popw %es 1.247 -#endif 1.248 +#else // FLAT16 1.249 +# 1- move 9020..9020+unpack -> 0700 and jump into 1.250 + movw $0x700, %cx // Up to 3.5KB for unpacker (unlzma is << 1KB) 1.251 + movw %cx, %es // Use 7000 .. 7E00, keep up to 23 elks setup sectors 1.252 + pushw %es 1.253 + xorw %di, %di // %ds:%si = 9000:0000 %es:%di = 0700:0000 1.254 + pushm $0x200+cont 1.255 +# if SAVEREGS 1.256 + rep 1.257 + movsw 1.258 + lret 1.259 # else 1.260 -# if UPDATE_SYSSIZE 1.261 - incb %dh 1.262 -# endif 1.263 -#if ELKS 1.264 - shrw $1, %dx 1.265 - shrw $1, %dx 1.266 - shrw $1, %dx 1.267 -#else 1.268 - shrw $3, %dx 1.269 -#endif 1.270 - movw %ds, %ax 1.271 - subw %dx, %ax 1.272 - movw %ax, %es 1.273 + jmp jumpinto 1.274 # endif 1.275 -#else // FLAT16 1.276 -# 1- move 1000..1000+sys -> 9000-sys 1.277 -# if HARDCODED_SYSSIZE 1.278 +cont: 1.279 +# 2- move 9020..9020+stp -> 9000-sys-stp 1.280 + movw %ds, %dx 1.281 +setup_byte: 1.282 + movb $SETUP+1, %ch 1.283 +setup_para: 1.284 + subw $SETUP*32+32+0xF000, %dx 1.285 packed_syssize: 1.286 - movw $0x1000+0, %ax 1.287 -# else 1.288 - movw SYSSIZE, %ax 1.289 - addw $0x1000, %ax 1.290 -# endif 1.291 + movw $0+0x1000, %ax 1.292 + pushw %cx // <B> bootsector+setup words 1.293 + subw %ax, %dx 1.294 + movw %dx, %es 1.295 + pushw %es // <C> 9000-sys-stp 1.296 + xorw %si, %si 1.297 + xorw %di, %di // %ds:%si = 9000:0 %es:%di = 9000-sys-stp:0 1.298 + rep 1.299 + movsw 1.300 +# 3- move 1000..1000+sys -> 9000-sys 1.301 movw %ds, %dx 1.302 mvsys: 1.303 decw %ax 1.304 @@ -219,136 +196,109 @@ 1.305 movsw 1.306 cmpw $0x1000, %ax 1.307 jne mvsys 1.308 -# 2- move 9000/9020..9020+stp -> 9000-sys-stp 1.309 - 1.310 -# if HARDCODED_SETUPSIZE 1.311 -# if KEEP_BOOTSECTOR 1.312 -setup_byte: 1.313 - movb $SETUP+1, %ch 1.314 -setup_para: 1.315 - subw $SETUP*32+32, %dx 1.316 -# else 1.317 -setup_byte: 1.318 - movb $SETUP, %ch 1.319 -setup_para: 1.320 - subw $SETUP*32, %dx 1.321 -# endif 1.322 -# else 1.323 - movb %ss:SETUPSIZE, %ch 1.324 -# if KEEP_BOOTSECTOR 1.325 - incb $ch 1.326 -# endif 1.327 - movw %cx, %ax 1.328 -#if ELKS 1.329 - shrw $1, %ax 1.330 - shrw $1, %ax 1.331 - shrw $1, %ax 1.332 -#else 1.333 - shrw $3, %ax 1.334 -#endif 1.335 - subw %ax, %dx 1.336 -# endif 1.337 - pushw %cx // <B> 1.338 - movw %dx, %es 1.339 - xorw %si, %si 1.340 - xorw %di, %di 1.341 - rep 1.342 - movsw %cs:(%si),%es:(%di) 1.343 - pushw %es 1.344 -# 3- reloc itself in 0x7C00 1.345 - pushw $0x07C0 1.346 +# 4- unlz(9000-sys-stp:end, 1000-stp:0) 1.347 +setup_seg: 1.348 + pushm $0x1000-(SETUP*32)-32 1.349 popw %es 1.350 - movw $cont, %si 1.351 - movw %si, %di 1.352 - movw $end-_start, %cx 1.353 - pushw %es 1.354 - pushw %di 1.355 - rep 1.356 - movsb %cs:(%si),%es:(%di) 1.357 - lret 1.358 -cont: 1.359 -# 4- unlz(9000-sys-stp:end, 1000-stp:0) 1.360 -# if HARDCODED_SETUPSIZE 1.361 -setup_seg: 1.362 -# if KEEP_BOOTSECTOR 1.363 -# if UPDATE_SYSSIZE 1.364 - pushw $0x1000-(SETUP*32)-32-32 1.365 -# else 1.366 - pushw $0x1000-(SETUP*32)-32 1.367 -# endif 1.368 -# else 1.369 -# if UPDATE_SYSSIZE 1.370 - pushw $0x1000-(SETUP*32)-32 1.371 -# else 1.372 - pushw $0x1000-(SETUP*32) 1.373 -# endif 1.374 -# endif 1.375 - popw %es 1.376 -# else 1.377 - negw %ax 1.378 -# if UPDATE_SYSSIZE 1.379 - addw $0x1000-32, %ax 1.380 -# else 1.381 - addw $0x1000, %ax 1.382 -# endif 1.383 - movw %ax, %es 1.384 -# endif 1.385 #endif // FLAT16 1.386 popw %ds // <C> 1.387 +#if FLAT16 && SAVEREGS == 0 1.388 + movw $end-_start, %si // %ds:%si = TOPSSEG:compressed 1.389 +#else 1.390 + movw $0x200+end-_start, %si // %ds:%si = 9000-sys-stp:compressed 1.391 +#endif 1.392 #if KEEP_BOOTSECTOR 1.393 - movw $0x200+end-_start, %si 1.394 +setup_keep: 1.395 + xorw %di, %di 1.396 #else 1.397 - movw $end-_start, %si 1.398 +# if UPDATE_SYSSIZE 1.399 +setup_syssize: 1.400 + movw $0x1F4, %di // %es:%di = 1000-setup-bootsector:SYSSIZE 1.401 +# else 1.402 + movw $0x200, %di 1.403 +# endif 1.404 #endif 1.405 -#if UPDATE_SYSSIZE 1.406 - movw $SYSSIZE, %di 1.407 -#else 1.408 - xorw %di, %di 1.409 -#endif 1.410 + pushw %di 1.411 + pushw %es 1.412 +#if DOUBLE_PACKED 1.413 +double_packed: 1.414 + pushm $0x4000 1.415 + popw %es 1.416 pushw %di 1.417 pushw %es 1.418 call unpack 1.419 popw %ds 1.420 popw %si 1.421 -# if KEEP_BOOTSECTOR 1.422 -setup_keep: 1.423 - xorw %di, %di 1.424 -# else 1.425 + popw %es 1.426 + popw %di 1.427 + pushw %di 1.428 + pushw %es 1.429 +#endif 1.430 + call unpack 1.431 +#if COPYTOHIGHMEM 1.432 +# if FLAT16OUT 1.433 + movw $0x9310+1, %ax // from 1000:FFFF 1.434 +# else 1.435 +# if 0 1.436 + movw %es, %ax 1.437 + shrw $12, %ax 1.438 + orw $0x9310, %ax 1.439 +# else 1.440 + movw $0x9310+7, %ax // from 7000:FFFF 1.441 +# endif 1.442 +# endif 1.443 + pushw %ss 1.444 + popw %es 1.445 + movw $8, %cx 1.446 +zero1: 1.447 + pushw $0 // 2E..20 1.448 + loop zero1 1.449 +src: 1.450 + pushw %cx // 1E, 16 1.451 + pushw %ax // 1A: dst %ax:%cx, 12: src %ax:%cx 1.452 + pushw %cx 1.453 + pushw $-1 // 18, 10: full 64K segment 1.454 + subb $0x10, %al 1.455 + jnc src 1.456 + movb $8, %cl 1.457 +zero2: 1.458 + pushw $0 // 0E..00 1.459 + loop zero2 1.460 + movw %sp, %si 1.461 +syslp: 1.462 + movb $0x80, %ch 1.463 + movb $0x87, %ah 1.464 + int $0x15 1.465 +# if FLAT16OUT == 0 1.466 + decb %es:0x1C(%si) 1.467 + decb %es:0x14(%si) 1.468 + jne syslp // down to 1000:0000 1.469 +# endif 1.470 + addw $0x30, %sp 1.471 +#endif // COPYTOHIGHMEM 1.472 + popw %ds 1.473 + popw %si // %ds:%si = 1000-setup-bootsector:SYSSIZE / 0 1.474 +#if UPDATE_CODE32_START 1.475 +update_code32_start: 1.476 +// movb $1, 0x216 1.477 +#endif 1.478 +#if FLAT16 == 0 || SAVEREGS 1.479 + popw %cx // <B> bootsector+setup words 1.480 +#endif 1.481 + popw %es // <A> bootsector+setup segment 1.482 movw %si, %di 1.483 -# endif 1.484 -# if SAVEREGS != 0 1.485 - popw %cx // <B> 1.486 -#if UPDATE_SYSSIZE 1.487 -// not need with memtest movb $(512-SYSSIZE)/2, %cl 1.488 +jumpinto: 1.489 +#if FLAT16 && SAVEREGS == 0 1.490 +setup_word: 1.491 + movw $SETUP*256+256, %cx 1.492 #endif 1.493 - popw %es // <A> 1.494 -# 5- move 1000-stp..1000 -> 9020 1.495 -# else 1.496 - popw %es // <A> 1.497 -jumpinto: 1.498 -# if HARDCODED_SETUPSIZE 1.499 -setup_word: 1.500 -# if KEEP_BOOTSECTOR 1.501 - movw $SETUP*256+256, %cx 1.502 -# else 1.503 - movw $SETUP*256, %cx 1.504 -# endif 1.505 -# else 1.506 -# if KEEP_BOOTSECTOR 1.507 - movw $0x100, %cx 1.508 - addb %ss:SETUPSIZE, %ch 1.509 -# else 1.510 - xorw %cx, %cx 1.511 - movb %ss:SETUPSIZE, %ch 1.512 -# endif 1.513 - movw %cx, %dx 1.514 -# endif 1.515 -# endif 1.516 +# 5- move 1000-stp..1000 -> 9000 1.517 rep 1.518 movsw 1.519 #if SAVEREGS 1.520 + popw %es 1.521 popw %ds 1.522 - popal 1.523 + popam 1.524 iret 1.525 #else 1.526 lret 1.527 @@ -356,9 +306,18 @@ 1.528 1.529 unpack: 1.530 #define NO_LZMA_HEADER 1.531 +#define NO_LZSA2_HEADER 1.532 +#define NO_LZSA1_HEADER 1.533 +#define NO_LZ4_HEADER 1.534 #if ELKS 1.535 #define ONLY8086 1 1.536 #endif 1.537 -#include "unlzma.S" 1.538 +#if defined(FLAT16OUT) && FLAT16OUT == 0 1.539 +#undef FLAT16OUT 1.540 +#endif 1.541 +#if defined(FLAT16) && FLAT16 == 0 1.542 +#undef FLAT16 1.543 +#endif 1.544 +#include "uncompress.S" 1.545 1.546 end: