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: