wok-current 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 56ab00f400e9
children d8f824013cf6
files linld/stuff/src/A20.ASM linld/stuff/src/COMMON.H linld/stuff/src/CRTL.ASM linld/stuff/src/CRTL.H linld/stuff/src/CRTLX.H linld/stuff/src/JUMP.ASM linld/stuff/src/LOAD.CPP linld/stuff/src/MEMTOP.ASM linld/stuff/src/TAZBOOT.CPP linld/stuff/src/XMM.ASM linld/stuff/src/_BEG.ASM linld/stuff/src/pipehole.awk
line diff
     1.1 --- a/linld/stuff/src/A20.ASM	Sat Jun 22 21:11:47 2019 +0200
     1.2 +++ b/linld/stuff/src/A20.ASM	Mon Jun 24 16:31:09 2019 +0200
     1.3 @@ -16,6 +16,7 @@
     1.4  enable_a20_methods:
     1.5  		dw	_enable_a20_fast, _enable_a20_kbd, _enable_a20_xmm, die
     1.6  msg_a20		db	"Can't use A20",0
     1.7 +overflow	db	"Loaded too close to 9000:0",0
     1.8  
     1.9          ends    _DATA
    1.10  
    1.11 @@ -84,12 +85,59 @@
    1.12          endp    _enable_a20_fast
    1.13  
    1.14  ;***************************************************************
    1.15 +;_fastcall void moverm(bx:struct himem *m);
    1.16 +;***************************************************************
    1.17 +
    1.18 +	global	@moverm$qp11image_himem:near
    1.19 +@moverm$qp11image_himem:
    1.20 +		push	si di
    1.21 +		global	sssp:dword
    1.22 +		extrn	_heap_top:word
    1.23 +		ifdef	NO386
    1.24 +		extrn	_topseg:near
    1.25 +		call	near _topseg
    1.26 +		mov	cl,4
    1.27 +		org	$-4
    1.28 +sssp		dd	?
    1.29 +		mov	[word sssp+2],ax
    1.30 +		;extrn	_initrd_desc:dword
    1.31 +		;mov	[word _initrd_desc+2],ax
    1.32 +		xchg	ax,dx
    1.33 +		mov	ax,[_heap_top]
    1.34 +		shr	ax,cl
    1.35 +		else
    1.36 +                p386
    1.37 +		mov	ax,[_heap_top]
    1.38 +		shr	ax,4
    1.39 +		mov	dx,9000h
    1.40 +		org	$-4
    1.41 +sssp		dd	?
    1.42 +		endif
    1.43 +		mov	es,dx
    1.44 +		mov	cx,cs
    1.45 +		add	ax,cx
    1.46 +		cmp	ax,dx
    1.47 +		jb	@@nooverflow
    1.48 +; Oops! We can stomp on our toes... better stop now
    1.49 +		mov	bx,offset overflow
    1.50 +		call	near die
    1.51 +@@nooverflow:
    1.52 +		mov	cx,[bx-5]	; size
    1.53 +		mov	si,[bx-2]	; data
    1.54 +		xor	di,di
    1.55 +		rep
    1.56 +		  movsb
    1.57 +		;push	ds
    1.58 +		;pop	es
    1.59 +		;pop	di si
    1.60 +		pop	di
    1.61 +
    1.62 +;***************************************************************
    1.63  ;void enable_a20_or_die();
    1.64  ;***************************************************************
    1.65 -        global  _enable_a20_or_die:near
    1.66          proc    _enable_a20_or_die near
    1.67  
    1.68 -		push	si
    1.69 +		;push	si
    1.70  		mov	si,offset enable_a20_methods
    1.71  		jmp	@@check
    1.72  @@loop:
    1.73 @@ -108,7 +156,7 @@
    1.74  ; time on certain systems; Toshiba Tecras are known to have this
    1.75  ; problem.
    1.76  
    1.77 -                push    ds es
    1.78 +                push    ds
    1.79  		xor	bx,bx
    1.80  		mov	ds,bx
    1.81  		mov	cx,0FFFFh
    1.82 @@ -124,13 +172,15 @@
    1.83  		sti
    1.84  a20ko:
    1.85  		loopne	a20lp
    1.86 -		xchg	ax,cx
    1.87 -                pop     es ds
    1.88 +		;xchg	ax,cx
    1.89 +                pop     ds
    1.90                  ;ret
    1.91  
    1.92          ;endp    _check_a20
    1.93  
    1.94  		jne	@@loop
    1.95 +		;push	ds
    1.96 +		;pop	es
    1.97  		pop	si
    1.98                  ret
    1.99  
     2.1 --- a/linld/stuff/src/COMMON.H	Sat Jun 22 21:11:47 2019 +0200
     2.2 +++ b/linld/stuff/src/COMMON.H	Mon Jun 24 16:31:09 2019 +0200
     2.3 @@ -2,7 +2,7 @@
     2.4  //
     2.5  // Common defs not belonging to CRTL
     2.6  
     2.7 -#define NL "\r\n"
     2.8 +#define NL "\n"
     2.9  #define VERSION_STR "0.97"
    2.10  
    2.11  #if 0       // DEBUG
     3.1 --- a/linld/stuff/src/CRTL.ASM	Sat Jun 22 21:11:47 2019 +0200
     3.2 +++ b/linld/stuff/src/CRTL.ASM	Mon Jun 24 16:31:09 2019 +0200
     3.3 @@ -19,8 +19,7 @@
     3.4  		global	_heap_top
     3.5  		extrn	_bss_end
     3.6  _heap_top	dw	_bss_end
     3.7 -msg_hang	db      "High mem corrupted - not exiting to DOS"
     3.8 -msg_lf		db	10,0
     3.9 +msg_hang	db      "High mem corrupted - not exiting to DOS",0
    3.10  vcpi_alloc_err	db	"VCPI "
    3.11  msg_malloc      db      "malloc error",0
    3.12  	ifdef	EXTRA
    3.13 @@ -86,18 +85,14 @@
    3.14          global  @strcatb$qpxzct1:near
    3.15          proc	@strcatb$qpxzct1 near
    3.16  
    3.17 -	ifdef	EXTRA
    3.18  		mov	cl,7Fh
    3.19  		db	0bah			; mov	dx,imm opcode
    3.20          global	@strcpy$qpxzct1:near
    3.21  @strcpy$qpxzct1:
    3.22  		xor	cx,cx
    3.23 -	endif
    3.24                  push	si
    3.25                  xchg	ax,si			; b
    3.26 -	ifdef	EXTRA
    3.27  		jcxz	@@nocat
    3.28 -	endif
    3.29  		dec	bx
    3.30  @@catlp:
    3.31                  inc	bx
    3.32 @@ -185,29 +180,32 @@
    3.33  ;_fastcall void puts(bx:const char* s):
    3.34  ;***************************************************************
    3.35          global  @puts$qpxzc:near
    3.36 -        proc    @puts$qpxzc near
    3.37  
    3.38  ;        global  puts:near			; puts(bx)
    3.39 +@putsz:
    3.40 +		call	@putc
    3.41 +@puts$qpxzc:
    3.42  puts:
    3.43 -		call	@@putsz
    3.44 -                mov	bx,offset msg_lf
    3.45 -		mov	dl,13
    3.46 -@@putcz:
    3.47 -		mov	ah,2
    3.48 -		int	21h
    3.49 -@@putsz:
    3.50  		mov	dl,[bx]
    3.51  		inc	bx
    3.52  		or	dl,dl
    3.53 -		jne	@@putcz			; ZF=1  (for malloc failure)
    3.54 +		jne	@putsz
    3.55 +		mov	dl,10
    3.56 +@putc:
    3.57 +		cmp	dl,10
    3.58 +		jne	@putcz
    3.59 +		call	@putcz2
    3.60 +@putcz2:
    3.61 +		xor	dl,7		; 10^13  1010^1101
    3.62 +@putcz:
    3.63 +		mov	ah,2
    3.64 +		int	21h
    3.65  		ret
    3.66  
    3.67 -        endp    @puts$qpxzc
    3.68 -
    3.69 -
    3.70  
    3.71  ;***************************************************************
    3.72  ;_fastcall int open(bx:const char* name, int flags=O_RDONLY);
    3.73 +;_fastcall int openargs(bx:const char* name, int flags=O_RDONLY);
    3.74  ;***************************************************************
    3.75          global  openargs:near			; openargs(bx)
    3.76  openargs:
    3.77 @@ -508,8 +506,19 @@
    3.78  		endif
    3.79  
    3.80  ;***************************************************************
    3.81 +;_fastcall char* strdup(bx:const char* a);
    3.82  ;_fastcall char* malloc_or_die(ax:unsigned size);
    3.83  ;***************************************************************
    3.84 +	global	@strdup$qpxzc:near
    3.85 +@strdup$qpxzc:
    3.86 +		mov	ax,[_heap_top]
    3.87 +		xchg	ax,bx
    3.88 +		call	@strcpy$qpxzct1
    3.89 +		xchg	ax,bx
    3.90 +xchg_heap_top:
    3.91 +		xchg	ax,[_heap_top]
    3.92 +		ret
    3.93 +
    3.94          global  @malloc_or_die$qui:near
    3.95          proc    @malloc_or_die$qui near
    3.96  
    3.97 @@ -520,11 +529,10 @@
    3.98  		mov	bx,sp
    3.99  		add	bh,-14h			; MIN_STACK=_1k+PAGE_SIZE
   3.100  		sub	bx,ax			; can't overflow
   3.101 +		add	ax,cx
   3.102  		cmp	bx,cx
   3.103  		mov	bx,offset msg_malloc
   3.104 -		jb	die
   3.105 -		add	[_heap_top],cx		; _BEG has zero'd heap
   3.106 -		ret
   3.107 +		ja	xchg_heap_top
   3.108  
   3.109          endp    @malloc_or_die$qui
   3.110  
   3.111 @@ -545,9 +553,8 @@
   3.112  		mov	al,[_no_exit]
   3.113  		or	al,al
   3.114  		jne	@@hang
   3.115 -		extrn	exit:near
   3.116 -		inc	ax
   3.117 -		jmp	near exit
   3.118 +                mov	ah,4Ch
   3.119 +                int	21h
   3.120  @@hang:
   3.121  		mov	bx, offset msg_hang
   3.122  		call	puts
   3.123 @@ -1330,7 +1337,7 @@
   3.124          global  _progname:near
   3.125          proc    _progname near
   3.126  
   3.127 -		push	si di es
   3.128 +		push	si di
   3.129  		mov	ah,30h
   3.130  		int	21h
   3.131  		xor	di,di
   3.132 @@ -1363,7 +1370,7 @@
   3.133  		push	es
   3.134  		pop	ds
   3.135  @@skip:
   3.136 -		pop	es di si
   3.137 +		pop	di si
   3.138  		ret
   3.139  
   3.140          endp    _progname
     4.1 --- a/linld/stuff/src/CRTL.H	Sat Jun 22 21:11:47 2019 +0200
     4.2 +++ b/linld/stuff/src/CRTL.H	Mon Jun 24 16:31:09 2019 +0200
     4.3 @@ -21,6 +21,8 @@
     4.4  
     4.5  void parse_cmdline();
     4.6  extern _fastcall void strcatb(const char* a,const char* b);
     4.7 +extern _fastcall void strcpy(const char* a,const char* b);
     4.8 +extern _fastcall int strdup(const char* a);
     4.9  #ifdef USE_ARGSTR
    4.10  extern _fastcall int argstr(const char *s, const char keywords[], const char **var);
    4.11  extern _fastcall int argnum(char *s, const char keywords[], unsigned long *var);
    4.12 @@ -33,6 +35,7 @@
    4.13  //extern "C" int open(const char* name, int flags);
    4.14  extern _fastcall int open(const char* name);
    4.15  extern _fastcall int close(int fd);
    4.16 +extern _fastcall int moverm(struct image_himem *m);
    4.17  extern _fastcall int readrm(struct image_himem *m, int sz);
    4.18  extern _fastcall int read(int fd, void* data, int sz);
    4.19  extern _fastcall long lseekcur(int fd, int whence);
     5.1 --- a/linld/stuff/src/CRTLX.H	Sat Jun 22 21:11:47 2019 +0200
     5.2 +++ b/linld/stuff/src/CRTLX.H	Mon Jun 24 16:31:09 2019 +0200
     5.3 @@ -1,7 +1,6 @@
     5.4  // This file is distributed under GPL
     5.5  //
     5.6  extern _fastcall long lseekset2(int fd, unsigned long* whence);
     5.7 -extern _fastcall void strcpy(const char* a,const char* b);
     5.8  extern _fastcall void strcat(const char* a,const char* b);
     5.9  extern _fastcall int strcmp(const char* a,const char* b);
    5.10  //extern "C" char* strstr(const char* a,const char* b);
     6.1 --- a/linld/stuff/src/JUMP.ASM	Sat Jun 22 21:11:47 2019 +0200
     6.2 +++ b/linld/stuff/src/JUMP.ASM	Mon Jun 24 16:31:09 2019 +0200
     6.3 @@ -11,15 +11,9 @@
     6.4                  p386
     6.5  		endif
     6.6  
     6.7 -        group   DGROUP  _TEXT,_DATA,_BSS
     6.8 +        group   DGROUP  _TEXT,_BSS
     6.9          assume  cs:DGROUP,ds:DGROUP
    6.10  
    6.11 -        segment _DATA byte public use16 'DATA'
    6.12 -
    6.13 -overflow	db	"Loaded too close to 9000:0",0
    6.14 -
    6.15 -        ends    _DATA
    6.16 -
    6.17          segment _BSS byte public use16 'BSS'
    6.18  
    6.19          global  _imgs:dword
    6.20 @@ -90,38 +84,14 @@
    6.21  	global	_boot_kernel:near
    6.22          proc    _boot_kernel near
    6.23          
    6.24 +		ifdef	NO386
    6.25                  p8086
    6.26 -		extrn	_heap_top:word
    6.27 -		global	sssp:dword
    6.28 -		ifdef	NO386
    6.29 -		extrn	_topseg:near
    6.30 -		call	near _topseg
    6.31 -		mov	cl,4
    6.32 -		org	$-4
    6.33 -sssp		dd	?
    6.34 -		mov	[word sssp+2],ax
    6.35 -		xchg	ax,bx
    6.36 -		mov	ax,[_heap_top]
    6.37 -		shr	ax,cl
    6.38  		else
    6.39                  p386
    6.40 -		mov	ax,[_heap_top]
    6.41 -		shr	ax,4
    6.42 -		mov	bx,9000h
    6.43 -		org	$-4
    6.44 -sssp		dd	?
    6.45  		endif
    6.46 -		mov	es,bx
    6.47 -		mov	dx,cs
    6.48 -		add	ax,dx
    6.49 -		cmp	ax,bx
    6.50 -		jb	@@nooverflow
    6.51 -; Oops! We can stomp on our toes... better stop now
    6.52 -		mov	bx,offset overflow
    6.53 -		extrn	die:near
    6.54 -		call	near die
    6.55 -@@nooverflow:
    6.56  		;cli				; we start doing destructive things to DOS
    6.57 +		extrn	sssp:word
    6.58 +		mov	es,[sssp+2]
    6.59  		push	es
    6.60  		pop	ss
    6.61  		mov	sp,0A000h
    6.62 @@ -131,18 +101,12 @@
    6.63  		lodsw
    6.64  		push	ax			; _csip high
    6.65  		push	[word si-4]		; _csip low
    6.66 +		lodsw
    6.67  		else
    6.68 -		mov	si,offset _rm_size	; _rm_size, _pm_high, _rm_buf
    6.69 -		push	[dword si-4]		; _csip
    6.70 +		mov	si,offset _rm_size+2	; _rm_size, _pm_high, _rm_buf
    6.71 +		push	[dword si-6]		; _csip
    6.72  		endif
    6.73 -		lodsw
    6.74 -		xchg	ax,cx			; _rm_size
    6.75  		lodsb				; _pm_high
    6.76 -		mov	si,[si]			; _rm_buf
    6.77 -		xor	di,di
    6.78 -		;cld
    6.79 -		rep
    6.80 -		  movsb
    6.81  		extrn	_cmdline:word
    6.82  		mov	si,[_cmdline]
    6.83  		mov	di,8000h
     7.1 --- a/linld/stuff/src/LOAD.CPP	Sat Jun 22 21:11:47 2019 +0200
     7.2 +++ b/linld/stuff/src/LOAD.CPP	Mon Jun 24 16:31:09 2019 +0200
     7.3 @@ -122,8 +122,10 @@
     7.4  static u8 pm_high;	// @ = @rm_size + 2, see JUMP.ASM
     7.5  static u8* rm_buf;	// @ = @rm_size + 3, see JUMP.ASM
     7.6  struct image_himem imgs[2];
     7.7 +u32 far *initrd_desc = (u32 far *) MK_FP(0x9000,0x218);
     7.8  
     7.9  static const char kernel_file_error[] = "Can't use kernel file";
    7.10 +char *version_string="";
    7.11  char* load_kernel() {
    7.12  
    7.13      struct	image_himem *m = &pm;
    7.14 @@ -131,10 +133,9 @@
    7.15  #define _pm_high	(((u8*)(m))[-3])
    7.16  #define _rm_size	(*(u16*)((u8*)(m)-5))
    7.17  #define _csip		(*(u32*)((u8*)(m)-9))
    7.18 -    char *version_string;
    7.19    {
    7.20      struct kernelparams_t *kernelparams;
    7.21 -    kernelparams = &(((first1k_t*) (_rm_buf(m) = (u8 *)malloc_or_die(_32k)))->params);
    7.22 +    kernelparams = &(((first1k_t*) (_rm_buf(m) = (u8 *)heap_top))->params);
    7.23  #define first1k		((first1k_t*)((u8 *)kernelparams-0x1F1))
    7.24  
    7.25      *((u16 *)&_csip+1)=topseg()|0x20;
    7.26 @@ -143,7 +144,6 @@
    7.27      open_image(m, kernel_name);
    7.28  
    7.29  do {
    7.30 -    // Do not use malloc below until heap_top adjustment (see <*>)
    7.31   if (readrm(m, 0x200) == 0x200) {
    7.32  
    7.33      lseekcur(m->fd,-0x200);
    7.34 @@ -159,7 +159,7 @@
    7.35      if((kernelparams->setup_sects)>=(_32k/512) || // 0th sector not counted
    7.36  	 kernelparams->boot_flag != 0xAA55)
    7.37          die("Not a kernel");
    7.38 -    heap_top = _rm_buf(m)+(_rm_size=0x200*(kernelparams->setup_sects+1));  // <*>
    7.39 +    _rm_size=0x200*(kernelparams->setup_sects+1);
    7.40      m->size -= _rm_size;
    7.41      m->chunk_size -= _rm_size;
    7.42  
    7.43 @@ -173,7 +173,6 @@
    7.44  
    7.45      if((int)vid_mode) kernelparams->vid_mode = vid_mode;
    7.46      if((int)root_dev) kernelparams->root_dev = root_dev;
    7.47 -    version_string = "";
    7.48  
    7.49      if(kernelparams->header == HdrS) { // starting linux 1.3.73
    7.50  	if(kernelparams->loadflags & 1) {
    7.51 @@ -183,10 +182,10 @@
    7.52              pm_high++;
    7.53  
    7.54              // Hook on int15 to work around fn 88 DOS breakage
    7.55 -            hook_int15_88();
    7.56 +            hook_int15_88(); // break _ES
    7.57          }
    7.58          if (kernelparams->kernel_version)
    7.59 -            version_string = (char *) first1k+kernelparams->kernel_version+0x200;
    7.60 +            version_string = (char *) strdup((char *) first1k+kernelparams->kernel_version+0x200);
    7.61          kernelparams->type_of_loader = 0xff; // kernel do not know us (yet :-)
    7.62          if(kernelparams->version >= 0x201) {
    7.63              // * offset limit of the setup heap
    7.64 @@ -206,40 +205,23 @@
    7.65    }
    7.66  
    7.67  cmd_line_ok:
    7.68 -    // Check and enable A20 if needed
    7.69 -    enable_a20_or_die();
    7.70 +
    7.71 +    // Move setup & Check and enable A20 if needed
    7.72 +    moverm(m); // break _ES
    7.73  
    7.74      // Read remaining kernel (pm part)
    7.75      // Try to load kernel high, maybe even blindly storing it
    7.76      // in unallocated memory as a last resort
    7.77  
    7.78 -  {
    7.79 -    struct image_himem *m = &pm;
    7.80 -    if((u16)(((m->fallback=(u32(u16(_CS)+0x1000)<<4))+m->size)>>16) >=
    7.81 +    if((u16)(((m->fallback=(u32(u16(_CS)+(u16(heap_top)>>4)+1)<<4))+m->size)>>16) >=
    7.82  		 (u16)(topseg()>>12) || _pm_high) {
    7.83          m->fallback = base_himem;
    7.84      }
    7.85  
    7.86      load_image(m);
    7.87 -  }
    7.88      return version_string;
    7.89  }
    7.90  
    7.91 -struct initrdparams_t {
    7.92 -    u32     header;         // 0202 Magic signature "HdrS"
    7.93 -    u16     version;        // 0206 Boot protocol version supported
    7.94 -    u16     realmode_switch_ofs; // 0208 Hook called just before rm->pm
    7.95 -    u16     realmode_switch_seg;
    7.96 -    u16     start_sys_seg;  // 020C
    7.97 -    u16     kernel_version; // 020E Points to kernel version string
    7.98 -    u8      type_of_loader; // 0210 Boot loader identifier
    7.99 -    u8      loadflags;      // 0211 Boot protocol option flags
   7.100 -    u16     setup_move_size;// 0212 Move to high memory size (used with hooks)
   7.101 -    u32     code32_start;   // 0214 Boot loader hook (see below)
   7.102 -    u32     initrd_buf;     // 0218 initrd load address (set by boot loader)
   7.103 -    u32     initrd_size;    // 021C initrd size (set by boot loader)
   7.104 -};
   7.105 -
   7.106  // Read initrd if needed
   7.107  void load_initrd() {
   7.108      struct image_himem *m = &initrd;
   7.109 @@ -262,9 +244,8 @@
   7.110  
   7.111      load_image(m);
   7.112  
   7.113 -    struct initrdparams_t *initrdparams = ((struct initrdparams_t *)&(((first1k_t*) _rm_buf(m-1))->params.header));
   7.114 -    if(initrdparams->header == HdrS) {
   7.115 -        initrdparams->initrd_buf  = m->fallback;
   7.116 -        initrdparams->initrd_size = m->size;
   7.117 +    if (*version_string) {
   7.118 +        initrd_desc[0] = m->fallback;
   7.119 +        initrd_desc[1] = m->size;
   7.120      }
   7.121  }
     8.1 --- a/linld/stuff/src/MEMTOP.ASM	Sat Jun 22 21:11:47 2019 +0200
     8.2 +++ b/linld/stuff/src/MEMTOP.ASM	Mon Jun 24 16:31:09 2019 +0200
     8.3 @@ -82,14 +82,16 @@
     8.4                  call	rdcmos17
     8.5                  popf
     8.6  tokb:
     8.7 +		mov	cl,10		;multiply by 1024
     8.8 +		ifndef	NO386
     8.9 +                add     ah,4h           ;account for 1024 low kb
    8.10 +                setc    dl              ;  (optimized to death)
    8.11 +		shld    dx,ax,cl
    8.12 +		shl     ax,cl		;  (kbytes -> bytes)
    8.13 +		else
    8.14                  xor     dx,dx
    8.15                  add     ah,4h           ;account for 1024 low kb
    8.16                  adc     dx,dx           ;  (optimized to death)
    8.17 -		mov	cl,10		;multiply by 1024
    8.18 -		ifndef	NO386
    8.19 -		shld    dx,ax,cl
    8.20 -		shl     ax,cl		;  (kbytes -> bytes)
    8.21 -		else
    8.22  		db	0A9h		; test ax,04B1h
    8.23          global  N_LXLSH@4:near
    8.24  N_LXLSH@4:
    8.25 @@ -208,6 +210,8 @@
    8.26  		xchg	ax,[es:bx+15*4+2]
    8.27  		mov	[word saved15+2],ax
    8.28  		endif
    8.29 +		;push	ds
    8.30 +		;pop	es
    8.31  @@skip:
    8.32  		ret
    8.33  int15_88:
     9.1 --- a/linld/stuff/src/TAZBOOT.CPP	Sat Jun 22 21:11:47 2019 +0200
     9.2 +++ b/linld/stuff/src/TAZBOOT.CPP	Mon Jun 24 16:31:09 2019 +0200
     9.3 @@ -170,15 +170,15 @@
     9.4  		try_default_args();
     9.5  dousage:
     9.6  		die("Usage: tazboot [[@commands]|[-f][-b base_himem][kernel=<bzImage>] \
     9.7 -[initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] ...]\r\n\n\
     9.8 -Defaults: tazboot kernel=bzImage auto\r\n\n\
     9.9 -Examples for tazboot.cmd:\r\n\n\
    9.10 -  bootfrom=\\isos\\slitaz-4.0.iso\r\n\
    9.11 -  kernel=boot/bzImage\r\n\
    9.12 -  initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\r\n\
    9.13 -  rw root=/dev/null vga=normal autologin\r\n\n\
    9.14 -  kernel=\\slitaz\\elks\r\n\
    9.15 -  root=/dev/bda1 ro\r\n");
    9.16 +[initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] ...]\n\n\
    9.17 +Defaults: tazboot kernel=bzImage auto\n\n\
    9.18 +Examples for tazboot.cmd:\n\n\
    9.19 +  bootfrom=\\isos\\slitaz-4.0.iso\n\
    9.20 +  kernel=boot/bzImage\n\
    9.21 +  initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\n\
    9.22 +  rw root=/dev/null vga=normal autologin\n\n\
    9.23 +  kernel=\\slitaz\\elks\n\
    9.24 +  root=/dev/bda1 ro\n");
    9.25  	}
    9.26  	bootiso(argv + 1);
    9.27  	chdirname(*argv);
    10.1 --- a/linld/stuff/src/XMM.ASM	Sat Jun 22 21:11:47 2019 +0200
    10.2 +++ b/linld/stuff/src/XMM.ASM	Mon Jun 24 16:31:09 2019 +0200
    10.3 @@ -51,18 +51,18 @@
    10.4  		endif
    10.5  		jne	@@gotit
    10.6  
    10.7 -		xchg	ax,cx			; save cmd
    10.8 +		push	ax			; save cmd
    10.9                  mov     ax,4300h		; installation check in al
   10.10                  int     2fh
   10.11                  mov     bx,offset xmm_fail
   10.12 -                push    cs
   10.13 +                push    ds
   10.14                  pop     es
   10.15                  cmp     al,80h
   10.16                  jne     @@err
   10.17                  mov     ax,4310h		; get driver address in es:bx
   10.18                  int     2fh
   10.19  @@err:
   10.20 -		xchg	ax,cx			; restore cmd
   10.21 +		pop	ax			; restore cmd
   10.22  		mov	[si],bx
   10.23  		mov	[si+2],es
   10.24  @@gotit:
    11.1 --- a/linld/stuff/src/_BEG.ASM	Sat Jun 22 21:11:47 2019 +0200
    11.2 +++ b/linld/stuff/src/_BEG.ASM	Mon Jun 24 16:31:09 2019 +0200
    11.3 @@ -26,8 +26,13 @@
    11.4          ends    _DATA
    11.5  
    11.6          segment _BSS byte public use16 'BSS'
    11.7 +
    11.8 +STACK_SIZE = 1024
    11.9 +
   11.10          global  _bss_start:byte
   11.11          label   _bss_start byte
   11.12 +		db	STACK_SIZE-2 dup(?)
   11.13 +stktop		dw	?
   11.14  		ifdef	EXTRA
   11.15          global  _cpu_features:dword
   11.16  _cpu_features	dd	?
   11.17 @@ -47,7 +52,8 @@
   11.18  ;***************************************************************
   11.19  ; clear bss
   11.20  ;***************************************************************
   11.21 -		mov	si,offset _bss_start
   11.22 +		mov	sp,offset stktop
   11.23 +		mov	si,sp
   11.24  		mov	bx, 0F000h	; cld ; cli & empty string
   11.25  clearbss:
   11.26  		mov	[si],bl		; clear bss + heap + sp
   11.27 @@ -140,7 +146,7 @@
   11.28  		;call	_get_vcpi_interface
   11.29  		mov	bx,offset msg_badmapping
   11.30  		jnz	no_vcpi
   11.31 -		inc	[byte bx+_vcpi-msg_badmapping]
   11.32 +		inc	[word bx+_vcpi-msg_badmapping]
   11.33  endcpu386:
   11.34  		ifdef	EXTRA
   11.35  		pushfd
   11.36 @@ -251,14 +257,12 @@
   11.37  	endif
   11.38  
   11.39  ;***************************************************************
   11.40 -                extrn   _main:near
   11.41 -                call    _main
   11.42 +                extrn	_main:near
   11.43 +                call	_main
   11.44 +		;never return
   11.45  
   11.46  ;***************************************************************
   11.47 -	        global  exit:near
   11.48 -exit:
   11.49 -                mov	ah,4Ch
   11.50 -                int	21h
   11.51 +
   11.52          ends    _TEXT
   11.53  
   11.54  
    12.1 --- a/linld/stuff/src/pipehole.awk	Sat Jun 22 21:11:47 2019 +0200
    12.2 +++ b/linld/stuff/src/pipehole.awk	Mon Jun 24 16:31:09 2019 +0200
    12.3 @@ -5,6 +5,70 @@
    12.4  
    12.5  	if (/^@.*:$/ || /	endp$/) afterjmp=0
    12.6  	if (/dword ptr/) is386=1
    12.7 +	sub(/DGROUP:_imgs\+65534/,"[di-2]")
    12.8 +	if (/cmd_line_ptr =/ && is386 == 0) isload=7
    12.9 +	if (isload == 7) {  # LOAD.LST
   12.10 +		if (/add/ || /xor/ || /extrn/ || /N_LXLSH@/ || /cl,4/) next
   12.11 +		if (/,ax/) {
   12.12 +			sub(/ax/,"8000h")
   12.13 +			isload=0
   12.14 +		}
   12.15 +		if (/,dx/) {
   12.16 +			print "	mov	cl,12"
   12.17 +			print "	shr	ax,cl"
   12.18 +			sub(/dx/,"ax")
   12.19 +		}
   12.20 +	}
   12.21 +	if (/\[0\] = m-\>fallback/) isload=6
   12.22 +	if (isload == 6) {  # LOAD.LST
   12.23 +		if (/si\+2/) {
   12.24 +			print "	inc	si"
   12.25 +			$0="	inc	si"
   12.26 +		}
   12.27 +		if (/les/) sub(/bx,/,"ax,")
   12.28 +		if (/bx\+4/ || /es:/) {
   12.29 +			if (/bx\+4/) isload=0
   12.30 +			next
   12.31 +		}
   12.32 +		if (/si\+6/) {
   12.33 +			print "	xchg	ax,di"
   12.34 +			print "	movsw"
   12.35 +			print "	movsw"
   12.36 +			print "	movsw"
   12.37 +			print "	movsw"
   12.38 +			print "	xchg	ax,di"
   12.39 +			next
   12.40 +		}
   12.41 +	}
   12.42 +	if (/version_string = /) isload=5
   12.43 +	if (isload == 5) {  # LOAD.LST
   12.44 +		sub(/ax,/,"bx,")
   12.45 +		if (/_version_string,/) isload=0
   12.46 +		if (/mov	bx,ax/) next
   12.47 +	}
   12.48 +	if (/topseg\(\)>>12/) isload=4
   12.49 +	if (isload == 4 && is386 == 0) {  # LOAD.LST
   12.50 +		if (/push/ || /pop/) next
   12.51 +		if (/ax,cs/) {
   12.52 +			print "	cwd"
   12.53 +			sub(/ax,cs/,"bx,cs")
   12.54 +		}
   12.55 +		if (/dx,dx/) next
   12.56 +		sub(/ax,dx/,"ax,bx")
   12.57 +		if (/call/) isload=400
   12.58 +	}
   12.59 +	if (isload == 400 && /,0/) {
   12.60 +		sub(/,0/,",dh")
   12.61 +		isload=0
   12.62 +	}
   12.63 +	if (isload == 4 && is386) {  # LOAD.LST
   12.64 +		sub(/dx,cs/,"edx,cs")
   12.65 +		sub(/eax/,"edx")
   12.66 +		sub(/ax,9/,"dx,9")
   12.67 +		if (/,0/) sub(/,0/,",dh")
   12.68 +		if (/movzx/) next
   12.69 +		if (/fallback = base_himem/) { isload=0 }
   12.70 +	}
   12.71  	if (/void load_initrd\(\)/) isload=3
   12.72  	if (isload == 3) {  # LOAD.LST
   12.73  		if(/push	di/ || /pop	di/) next
   12.74 @@ -17,9 +81,9 @@
   12.75  		sub(/je/,"jcxz")
   12.76  		if (/ax,word/) next
   12.77  		sub(/,ax/,",cx")
   12.78 -		if (/version_string/) isload=0
   12.79 +		if (/version_string/ || /starting linux 1\.3\.73/) isload=0
   12.80  	}
   12.81 -	if (/heap_top = _rm_buf/) isload=1
   12.82 +	if (/_rm_size=0x200/ || /heap_top = _rm_buf/) isload=1
   12.83  	if (isload == 1) {  # LOAD.LST
   12.84  		if (/mov	al,byte ptr/ && is386) {
   12.85  			print "	movzx	eax,byte ptr [si]"
   12.86 @@ -190,6 +254,8 @@
   12.87  	if (isotazboot == 100) { # TAZBOOT.LST
   12.88  		if (/cx,ax/) {
   12.89  			print "	mov	si,offset _isostate+8"
   12.90 +			print "	push	ds"
   12.91 +			print "	pop	es"
   12.92  			print "	xchg	ax,di"
   12.93  			print "	movsw"
   12.94  			print "	movsw"