wok-current rev 19634

linld: some fixes for strtoul
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Jan 16 10:15:15 2017 +0100 (2017-01-16)
parents 7c138665bd75
children faf865f8822c
files linld/stuff/src/CRTL.ASM linld/stuff/src/CRTL.H linld/stuff/src/CRTLX.ASM linld/stuff/src/MEMCPY32.ASM linld/stuff/src/MEMTOP.ASM linld/stuff/src/VCPI.ASM linld/stuff/src/_BEG.ASM
line diff
     1.1 --- a/linld/stuff/src/CRTL.ASM	Sun Jan 15 10:32:17 2017 +0100
     1.2 +++ b/linld/stuff/src/CRTL.ASM	Mon Jan 16 10:15:15 2017 +0100
     1.3 @@ -39,6 +39,7 @@
     1.4  ;***************************************************************
     1.5  ;char* strcpy(const char* a, const char* b);
     1.6  ;char* strcat(const char* a, const char* b);
     1.7 +;char* strcatb(const char* a, const char* b);
     1.8  ;***************************************************************
     1.9          global  _strcpy:near
    1.10          proc    _strcpy near
    1.11 @@ -48,7 +49,10 @@
    1.12          global  _strcat:near
    1.13  _strcat:
    1.14  		mov	dl,1
    1.15 -cat:
    1.16 +		db	0bbh			; mov	bx,imm opcode
    1.17 +        global  _strcatb:near
    1.18 +_strcatb:
    1.19 +		mov	dl,3
    1.20  		pop	ax			;caller return address
    1.21                  pop	cx			; a
    1.22                  pop	bx			; b
    1.23 @@ -86,18 +90,6 @@
    1.24  
    1.25  
    1.26  ;***************************************************************
    1.27 -;char* strcatb(const char* a, const char* b);
    1.28 -;***************************************************************
    1.29 -        global  _strcatb:near
    1.30 -        proc    _strcatb near
    1.31 -
    1.32 -		mov	dl,3
    1.33 -                jmp	cat
    1.34 -
    1.35 -        endp    _strcatb
    1.36 -
    1.37 -
    1.38 -;***************************************************************
    1.39  ;void* malloc(unsigned sz);
    1.40  ;***************************************************************
    1.41          global  _malloc:near
    1.42 @@ -129,7 +121,6 @@
    1.43  
    1.44  ;***************************************************************
    1.45  ;void puts(const char* s):
    1.46 -;void putsz(const char* s):
    1.47  ;***************************************************************
    1.48          global  _puts:near
    1.49          proc    _puts near
    1.50 @@ -142,14 +133,7 @@
    1.51  puts:
    1.52  		call	putsz
    1.53                  mov	bx,offset msg_crlf
    1.54 -		jmp	putsz
    1.55  
    1.56 -        global  _putsz:near
    1.57 -_putsz:
    1.58 -		pop	ax			;caller return address
    1.59 -                pop	bx			; s
    1.60 -                push	bx
    1.61 -                push	ax
    1.62          global  putsz:near			; putsz(bx)
    1.63  putsz:
    1.64                  push	bx
    1.65 @@ -243,7 +227,7 @@
    1.66          proc    _read near
    1.67  
    1.68                  stc
    1.69 -		db	73h			; jnc
    1.70 +		db	0B0h			; mov al,im
    1.71          global  _write:near
    1.72                  clc
    1.73  		pop	ax			;caller return address
    1.74 @@ -256,7 +240,6 @@
    1.75                  push	ax
    1.76                  mov	ah,40h
    1.77  		sbb	ah,0
    1.78 -                clc
    1.79                  jcxz	fail
    1.80  		jmp	dos
    1.81  
    1.82 @@ -280,8 +263,10 @@
    1.83          global  lseekset:near
    1.84  lseekset:
    1.85  		clc
    1.86 +		db	0B0h			; mov al,im
    1.87          global  rewind:near
    1.88 -rewind:						; rewind(bx,C=1)
    1.89 +rewind:						; rewind(bx)
    1.90 +		stc
    1.91  		mov	ax,4200h
    1.92  		jnc	dos
    1.93  lseek0:						; lseek0(bx,ax=dir)
    1.94 @@ -326,24 +311,23 @@
    1.95          proc    _strhead near
    1.96  
    1.97  		pop	cx			;caller return address
    1.98 -                pop	ax			; a
    1.99 -                pop	bx			; b
   1.100 +                pop	bx			; a
   1.101 +                pop	ax			; b
   1.102 +                push	ax
   1.103                  push	bx
   1.104 -                push	ax
   1.105                  push	cx
   1.106  @@loop:
   1.107 +		xchg	ax,bx
   1.108                  mov	cl,[bx]			; cl = *b++
   1.109                  inc	bx
   1.110  		or	cl,cl			; clear C
   1.111  		jz	fail			; return 0
   1.112  		xchg	ax,bx
   1.113                  xor	cl,[bx]			; cl -= *a++
   1.114 +                inc	bx
   1.115  		and	cl,0dfh			; case insensitive
   1.116 -		stc
   1.117 -		jnz	fail			; return -1
   1.118 -                inc	bx
   1.119 -		xchg	ax,bx
   1.120 -                jmp	@@loop
   1.121 +                jz	@@loop
   1.122 +		ret				; return b (is not 0)
   1.123  
   1.124          endp    _strhead
   1.125  
   1.126 @@ -653,12 +637,11 @@
   1.127          global  _reset_bufv:near
   1.128          proc    _reset_bufv near
   1.129  
   1.130 -		pop	bx			;caller return address
   1.131 -		pop	ax
   1.132 +		pop	ax			;caller return address
   1.133 +		pop	bx
   1.134 +		push	bx
   1.135  		push	ax
   1.136 -		push	bx
   1.137 -		mov	[curdata],ax
   1.138 -		xchg	ax,bx
   1.139 +		mov	[curdata],bx
   1.140  		and	[dword (data_himem bx).cacheidx],0
   1.141  		ret
   1.142  
   1.143 @@ -725,7 +708,7 @@
   1.144  
   1.145  
   1.146  ;***************************************************************
   1.147 -;void next_chunk(struct image_himem *m);
   1.148 +;void next_chunk(struct image_himem *di);
   1.149  ;***************************************************************
   1.150          proc    next_chunk near
   1.151  
   1.152 @@ -770,7 +753,6 @@
   1.153  		mov	bx,[(image_himem di).fd]
   1.154  		ifndef	NO386
   1.155  		push	eax
   1.156 -		stc
   1.157  		call	rewind
   1.158  		pop	eax
   1.159  @@end:
   1.160 @@ -778,7 +760,6 @@
   1.161  		else
   1.162  		push	ax
   1.163  		push	dx
   1.164 -		stc
   1.165  		call	rewind
   1.166  		pop	dx
   1.167  		pop	ax
   1.168 @@ -909,7 +890,6 @@
   1.169  		xor	cx,cx
   1.170  		ifndef	NO386
   1.171  		cwde				; ax < 8000h
   1.172 -		cwd
   1.173  		sub	[(image_himem di).chunk_size],eax
   1.174  		else
   1.175  		cwd				; ax < 8000h
   1.176 @@ -963,29 +943,30 @@
   1.177  		push	cx
   1.178  		push	ax
   1.179  		xor	ebx,ebx
   1.180 -		jcxz	@@jncend
   1.181  		push	si
   1.182 +		jcxz	@@end
   1.183  		mov	si,cx
   1.184  		xor	ecx,ecx
   1.185  		xor	eax,eax
   1.186  		lodsb
   1.187 -		mov	dl,20h
   1.188 -		or	dl,al
   1.189 -		cmp	dl,'n'			; vga=normal
   1.190 +		mov	dx,ax
   1.191 +		or	al,20h
   1.192 +		cmp	al,'n'			; vga=normal
   1.193  		je	@@vga
   1.194  		dec	cx
   1.195 -		cmp	dl,'e'			; vga=extended
   1.196 +		cmp	al,'e'			; vga=extended
   1.197  		je	@@vga
   1.198  		dec	cx
   1.199 -		cmp	dl,'a'			; vga=ask
   1.200 +		cmp	al,'a'			; vga=ask
   1.201  		jne	@@notvga
   1.202  @@vga:
   1.203  		dec	cx
   1.204  		xchg	ax,cx
   1.205  		cwd
   1.206 -		jmp	popsiret
   1.207 +		jmp	@@popsiret
   1.208  @@notvga:
   1.209  		mov	cx,10			; radix
   1.210 +		xchg	ax,dx
   1.211  		cmp	al,'+'
   1.212  		je	@@radixskip
   1.213  		cmp	al,'-'
   1.214 @@ -1000,19 +981,18 @@
   1.215  		jne	@@radixok
   1.216  		mov	cl,8
   1.217  		lodsb
   1.218 -		mov	dl,20h
   1.219 -		or	dl,al
   1.220 -		cmp	dl,'x'
   1.221 +		or	al,20h
   1.222 +		cmp	al,'x'
   1.223  		jne	@@radixok
   1.224  		mov	cl,16
   1.225  @@strtollp:
   1.226  		lodsb
   1.227  @@radixok:
   1.228 +		or	al,20h
   1.229  		sub	al,'0'
   1.230  		jb	@@endstrtol
   1.231  		cmp	al,9
   1.232  		jbe	@@digitok
   1.233 -		or	al,20h
   1.234  		cmp	al,'a'-'0'
   1.235  		jb	@@endstrtol
   1.236  		sub	al,'a'-'0'-10
   1.237 @@ -1038,14 +1018,13 @@
   1.238  		shl	ebx,cl
   1.239  @@noshift:
   1.240  		popf
   1.241 -@@jncend:
   1.242  		jnc	@@end
   1.243  		neg	ebx
   1.244  @@end:
   1.245  		push	ebx
   1.246  		pop	ax
   1.247  		pop	dx
   1.248 -popsiret:
   1.249 +@@popsiret:
   1.250  		pop	si
   1.251  		else
   1.252  		pop	ax			;caller return address
   1.253 @@ -1056,29 +1035,28 @@
   1.254  		push	di
   1.255  		xor	ax,ax
   1.256  		cwd
   1.257 +		jcxz	@@goend
   1.258  		xchg	ax,di
   1.259 -		jcxz	@@goend
   1.260  		mov	si,cx
   1.261  		lodsb
   1.262 -		mov	dl,20h
   1.263 -		or	dl,al
   1.264 +		mov	bx,ax
   1.265 +		or	al,20h
   1.266  		mov	cx,-1
   1.267 -		cmp	dl,'n'			; vga=normal
   1.268 +		cmp	al,'n'			; vga=normal
   1.269  		je	@@vga
   1.270  		dec	cx
   1.271 -		cmp	dl,'e'			; vga=extended
   1.272 +		cmp	al,'e'			; vga=extended
   1.273  		je	@@vga
   1.274  		dec	cx
   1.275 -		cmp	dl,'a'			; vga=ask
   1.276 +		cmp	al,'a'			; vga=ask
   1.277  		jne	@@notvga
   1.278  @@vga:
   1.279  		xchg	ax,cx
   1.280 -		cwd
   1.281 -		jmp	popsiret
   1.282  @@goend:
   1.283 -		jmp	@@end
   1.284 +		jmp	@@popdisiret
   1.285  @@notvga:
   1.286  		mov	cx,10			; radix
   1.287 +		xchg	ax,bx
   1.288  		cmp	al,'+'
   1.289  		je	@@radixskip
   1.290  		cmp	al,'-'
   1.291 @@ -1093,19 +1071,18 @@
   1.292  		jne	@@radixok
   1.293  		mov	cl,8
   1.294  		lodsb
   1.295 -		mov	ah,20h
   1.296 -		or	ah,al
   1.297 -		cmp	ah,'x'
   1.298 +		mov	al,20h
   1.299 +		cmp	al,'x'
   1.300  		jne	@@radixok
   1.301  		mov	cl,16
   1.302  @@strtollp:
   1.303  		lodsb
   1.304  @@radixok:
   1.305 +		or	al,20h
   1.306  		sub	al,'0'
   1.307  		jb	@@endstrtol
   1.308  		cmp	al,9
   1.309  		jbe	@@digitok
   1.310 -		or	al,20h
   1.311  		cmp	al,'a'-'0'
   1.312  		jb	@@endstrtol
   1.313  		sub	al,'a'-'0'-10
   1.314 @@ -1155,8 +1132,8 @@
   1.315  		inc	dx
   1.316  @@end:
   1.317  		xchg	ax,di
   1.318 +@@popdisiret:
   1.319  		pop	di
   1.320 -popsiret:
   1.321  		pop	si
   1.322  		endif
   1.323  		ret
   1.324 @@ -1175,7 +1152,7 @@
   1.325  		jnc	@@max640k
   1.326  		mov	ax,640			; 9000
   1.327  @@max640k:
   1.328 -		sub	ax,028h
   1.329 +		dec	ax
   1.330  		and	al,0C0h
   1.331  		mov	cl,6
   1.332  		shl	ax,cl
     2.1 --- a/linld/stuff/src/CRTL.H	Sun Jan 15 10:32:17 2017 +0100
     2.2 +++ b/linld/stuff/src/CRTL.H	Mon Jan 16 10:15:15 2017 +0100
     2.3 @@ -43,7 +43,6 @@
     2.4  extern "C" long lseekset(int fd, long sz);
     2.5  extern "C" void* malloc(unsigned sz);
     2.6  extern "C" void puts(const char* s);
     2.7 -extern "C" void putsz(const char* s);
     2.8  extern "C" unsigned long strtol(const char *s);
     2.9  
    2.10  // Extensions
     3.1 --- a/linld/stuff/src/CRTLX.ASM	Sun Jan 15 10:32:17 2017 +0100
     3.2 +++ b/linld/stuff/src/CRTLX.ASM	Mon Jan 16 10:15:15 2017 +0100
     3.3 @@ -30,18 +30,18 @@
     3.4          global  _strcmp:near
     3.5          proc    _strcmp near
     3.6  
     3.7 -		pop	ax			;caller return address
     3.8 -                pop	cx			; a
     3.9 -                pop	bx			; b
    3.10 +		pop	cx			;caller return address
    3.11 +                pop	bx			; a
    3.12 +                pop	ax			; b
    3.13 +                push	ax
    3.14                  push	bx
    3.15                  push	cx
    3.16 -                push	ax
    3.17                  push	si
    3.18 -                mov	si,cx
    3.19 +		xchg	ax,si
    3.20                  sub	bx,si
    3.21  @@lp:
    3.22 -                mov	al,[bx+si]
    3.23 -                sub	al,[si]
    3.24 +                mov	al,[si]
    3.25 +                sub	al,[bx+si]
    3.26  		jnz	@@out
    3.27                  lodsb
    3.28  		cmp	al,0
    3.29 @@ -295,16 +295,16 @@
    3.30          global  _kver2ul:near
    3.31          proc    _kver2ul near
    3.32  
    3.33 +		pop	bx
    3.34  		pop	ax
    3.35 -		pop	dx
    3.36 -		push	dx
    3.37  		push	ax
    3.38 +		push	bx
    3.39  		push	bp si di
    3.40 +		xchg	ax,si
    3.41  		xor	di,di
    3.42  		push	di
    3.43  		push	di
    3.44  		mov	bp,sp
    3.45 -		mov	si,dx
    3.46  		inc	di
    3.47  		inc	di
    3.48  		mov	cl,4
    3.49 @@ -372,7 +372,6 @@
    3.50  		push	cx
    3.51  		push	dx
    3.52  		push	ax
    3.53 -		xor	ax,ax
    3.54  		extrn	_isostate:isostate
    3.55  		mov	bx,[_isostate.fd]
    3.56  		extrn	lseekset:near
     4.1 --- a/linld/stuff/src/MEMCPY32.ASM	Sun Jan 15 10:32:17 2017 +0100
     4.2 +++ b/linld/stuff/src/MEMCPY32.ASM	Mon Jan 16 10:15:15 2017 +0100
     4.3 @@ -113,15 +113,13 @@
     4.4                          oldGDTR :pword  = TEMP_SIZE
     4.5  
     4.6  ;****** Init ***************************************************
     4.7 -		push	bp
     4.8 -		mov	bp,sp
     4.9 -		sub	sp,TEMP_SIZE
    4.10 +
    4.11 +			ifndef	NO386
    4.12 +
    4.13 +		enter	TEMP_SIZE,0
    4.14  		;cld
    4.15                  pushf
    4.16                  push    ds es
    4.17 -
    4.18 -			ifndef	NO386
    4.19 -
    4.20                  pushad
    4.21  		mov	cl,4
    4.22                  movzx   esi,[srcseg]
    4.23 @@ -156,6 +154,12 @@
    4.24  @@pmcopy:
    4.25  			else
    4.26  
    4.27 +		push	bp
    4.28 +		mov	bp,sp
    4.29 +		sub	sp,TEMP_SIZE
    4.30 +		;cld
    4.31 +                pushf
    4.32 +                push    ds es
    4.33  		push	si
    4.34  		xor	bx,bx
    4.35  		xor	dx,dx
    4.36 @@ -233,7 +237,7 @@
    4.37                  mov     eax,cs
    4.38                  shl     eax,4
    4.39                  addzx_e ax,<offset GDT>
    4.40 -                mov     [word GDTR],-1          ;GDT limit = 0FFFFh
    4.41 +                or      [word GDTR],-1          ;GDT limit = 0FFFFh
    4.42                  mov     [dword GDTR+2],eax      ;GDT base
    4.43                  lgdt    [GDTR]
    4.44  
    4.45 @@ -248,7 +252,7 @@
    4.46                  pop     ds              ;base=0, lim = 4gb
    4.47                  push    ds              ;
    4.48                  pop     es              ;
    4.49 -                db      66h     ;operand width override for ecx
    4.50 +                ;db      66h     ;operand width override for ecx
    4.51                  db      67h     ;address width override for esi/edi
    4.52              rep movsb
    4.53  		cld
    4.54 @@ -266,8 +270,12 @@
    4.55  @@done16:
    4.56                  pop     es ds
    4.57                  popf
    4.58 +			ifndef	NO386
    4.59 +		leave
    4.60 +			else
    4.61  		mov	sp,bp
    4.62  		pop	bp
    4.63 +			endif
    4.64                  ret
    4.65  
    4.66  ;****** Const data *********************************************
     5.1 --- a/linld/stuff/src/MEMTOP.ASM	Sun Jan 15 10:32:17 2017 +0100
     5.2 +++ b/linld/stuff/src/MEMTOP.ASM	Mon Jan 16 10:15:15 2017 +0100
     5.3 @@ -78,10 +78,11 @@
     5.4                  jnc     @@ok            ;  error: cf=1 or ax=0
     5.5                  xor     ax,ax           ;
     5.6  @@ok:
     5.7 -                xor     dx,dx
     5.8 +;                xor     dx,dx
     5.9                  test    ax,ax           ;happens on big mem systems
    5.10                  jz      @@fail
    5.11  tokb:
    5.12 +                xor     dx,dx
    5.13                  add     ah,4h           ;account for 1024 low kb
    5.14                  adc     dx,dx           ;  (optimized to death)
    5.15  		ifndef	NO386
    5.16 @@ -117,7 +118,6 @@
    5.17                  cli
    5.18                  call	rdcmos17
    5.19                  popf
    5.20 -		xor     dx,dx
    5.21  		jmp	tokb
    5.22  
    5.23  rdcmos17:       mov     al,18h		; read bytes 17-18 from CMOS
     6.1 --- a/linld/stuff/src/VCPI.ASM	Sun Jan 15 10:32:17 2017 +0100
     6.2 +++ b/linld/stuff/src/VCPI.ASM	Mon Jan 16 10:15:15 2017 +0100
     6.3 @@ -65,11 +65,6 @@
     6.4  use_32          = 01000000b
     6.5  
     6.6  ;****** rm32,imm16 helpers
     6.7 -macro   movzx_e rm,i
     6.8 -        db      66h
     6.9 -        mov     rm,i
    6.10 -        dw      0
    6.11 -endm
    6.12  macro   addzx_e rm,i
    6.13          db      66h
    6.14          add     rm,i
    6.15 @@ -77,13 +72,11 @@
    6.16  endm
    6.17  
    6.18  
    6.19 -        group   DGROUP  _TEXT,_DATA
    6.20 +        group   DGROUP  _TEXT,_DATA,_BSS
    6.21          assume  cs:DGROUP,ds:DGROUP
    6.22  
    6.23          segment _DATA byte public use16 'DATA'
    6.24  
    6.25 -tss             dd      0,0     ;enough, we'll never use it anyway
    6.26 -
    6.27  label   gdt     byte
    6.28  gdt_null        descr   <?>     ;0000
    6.29  gdt_vcpi        descr   <?>     ;0008
    6.30 @@ -104,39 +97,42 @@
    6.31  label   gdtr    pword
    6.32  gdt_lim         dw      0ffffh
    6.33  gdt_base        dw      offset gdt,0
    6.34 -label   idtr    pword
    6.35 -idt_lim         dw      03ffh   ;we won't enable ints,
    6.36 -idt_base        dd      0       ;  so let's leave it the same as for rm
    6.37  
    6.38  ;Note: layout dictated by vcpi api, don't rearrange!
    6.39  label sw2pm_params byte
    6.40  ;Note: base addrs will be fixed up in prepare_vcpi()
    6.41 +label	pagedir_laddr   dword
    6.42  sw2pm_cr3       dd      ?
    6.43  sw2pm_gdtr_ptr  dw      offset gdtr,0
    6.44  sw2pm_idtr_ptr  dw      offset idtr,0
    6.45  sw2pm_ldtr      dw      0       ;we don't need it
    6.46  sw2pm_tr        dw      SEL_TSS ;vcpi thinks we need it... can't set to 0
    6.47 -sw2pm_jumpaddr  dd      ?
    6.48 +sw2pm_jumpaddr  dd      0
    6.49                  dw      SEL_CODE
    6.50  
    6.51 +vcpi_pm_entry   dd      0
    6.52 +                dw      SEL_VCPI
    6.53 +
    6.54 +label   idtr    pword
    6.55 +idt_lim         dw      03ffh   ;we won't enable ints,
    6.56 +idt_base        dd      0       ;  so let's leave it the same as for rm
    6.57 +
    6.58 +        ends    _DATA
    6.59 +
    6.60 +        segment _BSS byte public use16 'BSS'
    6.61 +
    6.62  ;Pagedir/page0 addrs: linear, seg:0 and cs:ofs
    6.63 -pagedir_laddr   dd      ?
    6.64  page0_laddr     dd      ?
    6.65 -;;pagedir_seg     dw      ?
    6.66 -;;page0_seg       dw      ?
    6.67 -pagedir_ofs     dw      ?
    6.68 -page0_ofs       dw      ?
    6.69 -
    6.70 -vcpi_pm_entry   dd      ?
    6.71 -                dw      SEL_VCPI
    6.72 +;pagedir_ofs     dw      ?
    6.73 +;page0_ofs       dw      ?
    6.74  
    6.75  label   saved_ss_sp dword
    6.76  saved_sp        dw      ?
    6.77  saved_ss        dw      ?
    6.78  
    6.79 +tss             dd      ?,?     ;enough, we'll never use it anyway
    6.80  
    6.81 -        ends    _DATA
    6.82 -
    6.83 +        ends    _BSS
    6.84  
    6.85          segment _TEXT byte public use16 'CODE'
    6.86  
    6.87 @@ -166,45 +162,51 @@
    6.88  
    6.89  		mov	cl,4
    6.90                  mov     edx,cs
    6.91 -                shl     edx,cl          ;ebx = linear addr of CS
    6.92 -                mov     bx, offset page0_laddr
    6.93 +                shl     edx,cl          ;edx = linear addr of CS
    6.94 +                mov     si,offset gdt_vcpi
    6.95  ; Fix up base of some gdt descriptors
    6.96  ; Note: 'add [dword xx.base0],edx' actually updates 24 bit quantity!
    6.97  ; Do NOT replace with mov!
    6.98 -                add     [dword bx+gdt_base-page0_laddr],edx
    6.99 -                add     [dword bx+sw2pm_gdtr_ptr-page0_laddr],edx
   6.100 -                add     [dword bx+sw2pm_idtr_ptr-page0_laddr],edx
   6.101 -                add     [dword bx+(gdt_code.base0)-page0_laddr],edx
   6.102 -                add     [dword bx+(gdt_data.base0)-page0_laddr],edx
   6.103 -                add     [dword bx+(gdt_tss.base0)-page0_laddr],edx
   6.104 +		xor	ebx,ebx
   6.105 +                add     [dword bx+si+sw2pm_idtr_ptr-gdt_vcpi],edx
   6.106 +@@fixup:
   6.107 +                add     [dword bx+si+(gdt_code.base0)-gdt_vcpi],edx
   6.108 +		add	bl,8
   6.109 +		cmp	bl,28h
   6.110 +		jb	@@fixup
   6.111 +                ;add     [dword si+(gdt_data.base0)-gdt_vcpi],edx
   6.112 +                ;add     [dword si+(gdt_tss.base0)-gdt_vcpi],edx
   6.113 +                ;add     [dword si+gdt_base-gdt_vcpi],edx
   6.114 +                ;add     [dword si+sw2pm_gdtr_ptr-gdt_vcpi],edx
   6.115 +                ;add     [dword si+sw2pm_idtr_ptr-gdt_vcpi],edx
   6.116                  add     eax,edx
   6.117 -                mov     esi,0FFFh
   6.118 -                add     eax,esi
   6.119 -		inc	si		;esi=00001000h
   6.120 +                mov     bx,0FFFh
   6.121 +                add     eax,ebx
   6.122 +		inc	bx		;ebx=00001000h
   6.123  
   6.124                  shr     eax,cl
   6.125                  mov     al,0   ;eax = 4k aligned linear addr of pagebuf
   6.126                  mov     es,ax           ;es:0->page0,es:1000h->pagedir
   6.127                  shl     eax,cl          ;eax=page0 linear addr
   6.128 -                mov     [bx+page0_laddr-page0_laddr],eax
   6.129                  mov     al,3            ;add present+writable bits
   6.130 -                mov     [es:si],eax     ;stuff it into pagedir[0]
   6.131 +                mov     [es:bx],eax     ;stuff it into pagedir[0]
   6.132 +                push    ds
   6.133 +                pop     es
   6.134  
   6.135 -                add     eax,esi
   6.136  		mov	al,0
   6.137 -                mov     [bx+pagedir_laddr-page0_laddr],eax
   6.138 +                mov     [page0_laddr],eax
   6.139 +                add     eax,ebx
   6.140 +                ;mov     [pagedir_laddr],eax
   6.141                          ;page directory will use only one entry (4 bytes):
   6.142                          ;cr3 => pagedir => page0  => ########
   6.143                          ;      (1 entry)  (1024   => #  4M  #
   6.144                          ;                 entries)=> # page #
   6.145                          ;                         => ########
   6.146 -                mov     [bx+sw2pm_cr3-page0_laddr],eax
   6.147 +                mov     [sw2pm_cr3],eax
   6.148                  sub     eax,edx         ;ax = offset in CS of pagedir
   6.149 -                mov     [bx+pagedir_ofs-page0_laddr],ax
   6.150 -                sub     ax,si   ;ax-=1000
   6.151 -                mov     [bx+page0_ofs-page0_laddr],ax
   6.152 -                push    ds
   6.153 -                pop     es
   6.154 +                ;mov     [pagedir_ofs],ax
   6.155 +                sub     ax,bx   ;ax-=1000
   6.156 +                ;mov     [page0_ofs],ax
   6.157                  mov     di,ax          ;ES:DI => page0
   6.158  ; Return
   6.159                  ;pop     es
   6.160 @@ -219,8 +221,8 @@
   6.161  
   6.162  ;***************************************************************
   6.163  ;int get_vcpi_interface();
   6.164 -;****** Return: AX=1 - page mapping for low 640k is 1:1
   6.165 -;******         AX=0 - otherwise (it's bad)
   6.166 +;****** Return: Z  - page mapping for low 640k is 1:1
   6.167 +;******         NZ - otherwise (it's bad)
   6.168  ;****** Uses:   Flags
   6.169  ;***************************************************************
   6.170          global  _get_vcpi_interface:near
   6.171 @@ -229,32 +231,29 @@
   6.172                  ;push    si di
   6.173  
   6.174  ; Get and save VCPI pm interface
   6.175 -                mov     si,offset gdt_vcpi      ;DS:DI => 3 GDT entries for VCPI
   6.176 +                ;mov     si,offset gdt_vcpi      ;DS:DI => 3 GDT entries for VCPI
   6.177                  ;mov     di,[si+page0_ofs-gdt_vcpi]          ;ES:DI => page0
   6.178                  ;push    ds
   6.179                  ;pop     es
   6.180 +                push    di
   6.181                  mov     ax,0DE01h               ;get vcpi pm interface
   6.182                  int     67h
   6.183 -                mov     [vcpi_pm_entry],ebx
   6.184 +                xchg    [vcpi_pm_entry],ebx	;clear ebx
   6.185 +                ;xor     bx,bx
   6.186  
   6.187  ; Check that mapping for low 640k is 1:1
   6.188 -                mov     si,[page0_ofs]
   6.189 -                xor     bx,bx
   6.190 +                pop     si			; [page0_ofs]
   6.191                  ;cld
   6.192  @@map_chk:
   6.193                  lodsd
   6.194                  shr     eax,12
   6.195                  cmp     ax,bx
   6.196 -                stc
   6.197                  jne     @@bad
   6.198                  inc     bx
   6.199 -                cmp     ax,((640*1024) shr 12)-1
   6.200 +                cmp     al,((640*1024) shr 12)-1
   6.201                  jne     @@map_chk
   6.202  ; Return
   6.203  @@bad:
   6.204 -                sbb     ax,ax
   6.205 -                inc	ax			; update Z
   6.206 -                ;pop     di si
   6.207                  ret
   6.208          endp    _get_vcpi_interface
   6.209  
   6.210 @@ -302,17 +301,10 @@
   6.211                  push    ax              ;\eip
   6.212                  push    offset @@vm_ret ;/
   6.213  
   6.214 -                cli
   6.215                ;;mov     [saved_xx],xx   ;use if your vcpi trashes bp/etc
   6.216  
   6.217 -                movzx_e <[word sw2pm_jumpaddr]>,<offset @@pm_entry>
   6.218 -               ;mov     [word sw2pm_jumpaddr+4],SEL_CODE
   6.219 -                mov     esi,cs
   6.220 -                shl     esi,4
   6.221 -                addzx_e si,<offset sw2pm_params>
   6.222 -                mov     ax,0DE0Ch       ; vcpi: switch to pm
   6.223 -                int     67h
   6.224 -@@pm_entry:
   6.225 +		call	switch_to_pm
   6.226 +
   6.227  ; Now we are in 16-bit protected mode
   6.228                  mov     ax,SEL_DATA
   6.229                  mov     ss,ax
   6.230 @@ -332,17 +324,30 @@
   6.231                  call    ax
   6.232  
   6.233  ; Ok, let's return to vm
   6.234 +                mov     ax,0DE0Ch       ; maybe we need whole eax?
   6.235                  cli     ; to be safe
   6.236                  clts    ;
   6.237                  push    SEL_ABS         ; vcpi wants ds=all_addrspace
   6.238                  pop     ds              ;
   6.239 -                mov     ax,0DE0Ch       ; maybe we need whole eax?
   6.240                  call    [pword cs:vcpi_pm_entry]
   6.241  @@vm_ret:
   6.242  ; Now we are in vm86 mode. Sregs, esp, eflags (IF) restored from IRET stack
   6.243                  ret
   6.244  
   6.245  ;***************************************************************
   6.246 +switch_to_pm:
   6.247 +                assume  cs:DGROUP,ds:DGROUP
   6.248 +                pop	[word sw2pm_jumpaddr]
   6.249 +               ;mov     [word sw2pm_jumpaddr+2],0
   6.250 +               ;mov     [word sw2pm_jumpaddr+4],SEL_CODE
   6.251 +                mov     esi,cs
   6.252 +                shl     esi,4
   6.253 +                addzx_e si,<offset sw2pm_params>
   6.254 +                mov     ax,0DE0Ch       ; vcpi: switch to pm
   6.255 +                cli
   6.256 +                int     67h
   6.257 +
   6.258 +;***************************************************************
   6.259  ;****** Helper: This is where real copy is done
   6.260  ;***************************************************************
   6.261  	global	do_memcpy_vcpi:near
   6.262 @@ -350,29 +355,27 @@
   6.263  
   6.264  ; Note: ss:bp => params
   6.265  ; Move data
   6.266 -                mov     cx,SEL_ABS
   6.267 -                mov     ds,cx
   6.268 -                mov     es,cx
   6.269 +                mov     ax,SEL_ABS
   6.270 +                mov     ds,ax
   6.271 +                mov     es,ax
   6.272                  assume  nothing
   6.273                  assume  cs:DGROUP
   6.274  
   6.275          ; Set up target addr:
   6.276          ; replace page mapping for page at 0 so
   6.277          ; that it points to dstofs
   6.278 -                mov     esi,[cs:page0_laddr]
   6.279                  mov     eax,[dstofs]
   6.280                  mov     al,03h          ; writeable, present
   6.281 -                xchg    [esi],eax       ; replace page0[0]
   6.282 +		call	@@set_mapping
   6.283                 ;push    eax             ;X we'll need to restore mapping...
   6.284 -                mov     ecx,cr3         ; reload TLB cache
   6.285 -                mov     cr3,ecx         ;
   6.286                  xor     edi,edi         ;es:edi => remapped page
   6.287  
   6.288          ; Set up source addr
   6.289                  mov     esi,[srcofs]
   6.290  
   6.291          ; Do copying
   6.292 -                mov     ecx,4096/2
   6.293 +		xor	ecx,ecx
   6.294 +                mov     ch,4096/256
   6.295                  ;cld
   6.296  ;;              cmp     esi,edi
   6.297  ;;              jae     @@do_copy
   6.298 @@ -383,13 +386,14 @@
   6.299  ;;              std                     ;
   6.300  ;;@@do_copy:
   6.301                  db      67h     ;address width override for esi/edi
   6.302 -            rep movsw
   6.303 +            rep movsb
   6.304  ;;              cld
   6.305  
   6.306          ; Restore page mapping for page at 0
   6.307                 ;pop     eax             ;X
   6.308 +@@set_mapping:
   6.309                  mov     esi,[cs:page0_laddr]
   6.310 -                mov     [esi],eax       ; restore page0[0]
   6.311 +                xchg    [esi],eax       ; restore page0[0]
   6.312                  mov     ecx,cr3         ; reload TLB cache
   6.313                  mov     cr3,ecx         ;
   6.314  ; Return
   6.315 @@ -410,29 +414,22 @@
   6.316  		extrn	_vcpi:byte
   6.317  		test	[_vcpi],-1
   6.318  		jz	@@ret
   6.319 -                push	esi
   6.320 +                push	si
   6.321                ;;pushf
   6.322 -              ;;cli
   6.323                ;;pushad
   6.324                  push    cs      ;*
   6.325                  push    ds
   6.326 -                push    es
   6.327 +                ;push    es
   6.328                  mov     [saved_ss],ss
   6.329                  mov     [saved_sp],sp
   6.330  
   6.331 -                movzx_e <[word sw2pm_jumpaddr]>,<offset @@pm_entry>
   6.332 -               ;mov     [word sw2pm_jumpaddr+4],SEL_CODE
   6.333 -                mov     esi,cs
   6.334 -                shl     esi,4
   6.335 -                addzx_e si,<offset sw2pm_params>
   6.336 -                mov     ax,0DE0Ch       ; vcpi: switch to pm
   6.337 -                int     67h
   6.338 +		call	switch_to_pm
   6.339 +
   6.340  ; Now we are in 16-bit protected mode
   6.341 -@@pm_entry:
   6.342                  mov     ax,SEL_DATA     ; load data sregs with limit >=64k
   6.343                  mov     ss,ax           ;   or you may get limit violations
   6.344                  mov     ds,ax           ;   later in rm
   6.345 -                mov     es,ax           ;   (actually I prefer 4gig limits :-)
   6.346 +                ;mov     es,ax           ;   (actually I prefer 4gig limits :-)
   6.347                  ;mov     fs,ax           ;
   6.348                  ;mov     gs,ax           ;
   6.349  
   6.350 @@ -446,7 +443,7 @@
   6.351  
   6.352  ; Now we are in rm, but not yet: have to restore sregs:
   6.353                  lss     sp,[saved_ss_sp]; SS
   6.354 -                pop     es              ; ES
   6.355 +                ;pop     es              ; ES
   6.356                  pop     ds              ; DS
   6.357                 ;push    cs      ;* done earlier
   6.358                  push    offset @@next
   6.359 @@ -454,7 +451,7 @@
   6.360  @@next:
   6.361                ;;popad
   6.362                ;;popf
   6.363 -                pop	esi
   6.364 +                pop	si
   6.365  @@ret:
   6.366                  ret             ; We don't care much about rest (FS/GS)
   6.367  
     7.1 --- a/linld/stuff/src/_BEG.ASM	Sun Jan 15 10:32:17 2017 +0100
     7.2 +++ b/linld/stuff/src/_BEG.ASM	Mon Jan 16 10:15:15 2017 +0100
     7.3 @@ -100,7 +100,7 @@
     7.4                  ;extrn   _get_vcpi_interface:near
     7.5  		;call	_get_vcpi_interface
     7.6  		mov	bx,offset msg_badmapping
     7.7 -		jnz	endcpu
     7.8 +		jz	endcpu
     7.9  no_vcpi:
    7.10                ;;pop     dx              ;$ handle
    7.11                ;;mov     ax,4500h        ; DEALLOCATE PAGES