# HG changeset patch # User Pascal Bellard # Date 1573070538 -3600 # Node ID 306a4bbdee7dd31f99a9ae1c9832cb7ccc12e729 # Parent a1677855824a749691c47788405a1fe006f6ca21 linld: hack for VCPI diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/CRTL.ASM --- a/linld/stuff/src/CRTL.ASM Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/CRTL.ASM Wed Nov 06 21:02:18 2019 +0100 @@ -57,8 +57,6 @@ org $-7 endif _xfer_buf db 4096 dup (?) - global _no_exit:byte -_no_exit db ? filecnt db ? ; in fact 0 minus file count... nextfilename dw ? ifdef LARGE_IMAGES @@ -178,33 +176,6 @@ ;*************************************************************** -;_fastcall void puts(bx:const char* s): -;*************************************************************** - global @puts$qpxzc:near - -; global puts:near ; puts(bx) -@putsz: - call @putc -@puts$qpxzc: -puts: - mov dl,[bx] - inc bx - or dl,dl - jne @putsz - mov dl,10 -@putc: - cmp dl,10 - jne @putcz - call @putcz2 -@putcz2: - xor dl,7 ; 10^13 1010^1101 -@putcz: - mov ah,2 - int 21h - ret - - -;*************************************************************** ;_fastcall int open(bx:const char* name, int flags=O_RDONLY); ;_fastcall int openargs(bx:const char* name, int flags=O_RDONLY); ;*************************************************************** @@ -504,13 +475,14 @@ endif + include "himem.inc" + ;*************************************************************** ;_fastcall char* strdup(bx:const char* a); ;_fastcall char* malloc_or_die(ax:unsigned size); ;*************************************************************** global @strdup$qpxzc:near @strdup$qpxzc: -strdup: ; ax = strdup(bx) mov ax,[_heap_top] xchg ax,bx call @strcpy$qpxzct1 ; bx = strcpy(bx, ax) end +1 @@ -533,8 +505,8 @@ ;*************************************************************** ;_fastcall int die(bx:const char* msg); -;int exit(); -;int abort(); +;int exit(ax:int status); +;int abort(void); ;*************************************************************** global @die$qpxzc:near proc @die$qpxzc near @@ -545,12 +517,10 @@ global @exit$qv:near @exit$qv: _exit: - mov al,[_no_exit] - or al,al - jne @@hang + extrn _imgs:image_himem + mov cx,[(word _imgs.buf)+2] ; no_exit ? mov ah,4Ch - int 21h -@@hang: + jcxz do_int21h mov bx, offset msg_hang call puts ; global _abort:near @@ -561,7 +531,33 @@ endp @die$qpxzc - include "himem.inc" +;*************************************************************** +;_fastcall void puts(bx:const char* s): +;*************************************************************** + global @puts$qpxzc:near + +; global puts:near ; puts(bx) +@putsz: + call @putc +@puts$qpxzc: +puts: + mov dl,[bx] + inc bx + or dl,dl + jne @putsz + mov dl,10 +@putc: + cmp dl,10 + jne @putcz + call @putcz2 +@putcz2: + xor dl,7 ; 10^13 1010^1101 +@putcz: + mov ah,2 +do_int21h: + int 21h + ret + ;*************************************************************** ;static long next_chunk(struct image_himem *di); @@ -691,8 +687,7 @@ endif shl eax,12 ; i*_4k ; if (edx < pm.fallback+i*_4k && edx >= pm.fallback) again - extrn _imgs - mov bx,offset _imgs+2 + mov bx,offset _imgs.fallback push eax add eax,[bx-2+2] cmp eax,edx ; pm.fallback+i*_4k <= edx ? @@ -702,8 +697,7 @@ jae @@vcpi_alloc @@pmok: ; if (edx >= initrd.fallback+i*_4k && edx < initrd.fallback+initrd.size) again - extrn _imgs - mov bx,offset _imgs+32+2 + mov bx,offset _imgs.fallback+32 add eax,[bx-2+2] ; +initrd.fallback cmp eax,edx ; initrd.fallback+i*_4k > edx ? ja @@initrdok diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/CRTL.H --- a/linld/stuff/src/CRTL.H Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/CRTL.H Wed Nov 06 21:02:18 2019 +0100 @@ -47,7 +47,6 @@ #define sti() do { asm { sti } } while(0) #define int3() do { asm { db 0cch } } while(0) #define nop() do { asm { db 90h } } while(0) -extern char no_exit; extern void exit(); extern _fastcall int die(const char* msg); //extern "C" char* malloc_or_die(unsigned size); diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/HIMEM.CPP --- a/linld/stuff/src/HIMEM.CPP Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/HIMEM.CPP Wed Nov 06 21:02:18 2019 +0100 @@ -9,9 +9,8 @@ int skip_alloc; void load_image(struct image_himem *m) { - no_exit++; // die() won't return to DOS m->remaining = m->size; - m->buf = m->fallback; + m->buf = m->fallback; // set no_exit btw: die() won't return to DOS u32 buf; u32* bufv= &buf; if(((u16 *)&m->fallback)[1] >= 0x10 && !skip_alloc) { // >= _1m ? diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/JUMP.ASM --- a/linld/stuff/src/JUMP.ASM Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/JUMP.ASM Wed Nov 06 21:02:18 2019 +0100 @@ -133,13 +133,13 @@ xor ax,2b30h ; ipxe ? loopne @@notipxe - dos_shutdown ; clear si; ds=0 - push cs - pop ds ; finish loading extrn @last_ditch$qv:near push cs call @last_ditch$qv + dos_shutdown ; clear si; ds=0; kill VCPI + push cs + pop ds @@notipxe: pop cx diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/LOAD.CPP --- a/linld/stuff/src/LOAD.CPP Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/LOAD.CPP Wed Nov 06 21:02:18 2019 +0100 @@ -158,6 +158,7 @@ if((kernelparams->setup_sects)>=(_32k/512) || // 0th sector not counted kernelparams->boot_flag != 0xAA55) die("Not a kernel"); + heap_top += // Hack for VCPI. Need fix. _rm_size=0x200*(kernelparams->setup_sects+1); m->size -= _rm_size; m->chunk_size -= _rm_size; @@ -174,7 +175,7 @@ if((int)root_dev) kernelparams->root_dev = root_dev; if(kernelparams->header == HdrS) { // starting linux 1.3.73 - if(kernelparams->loadflags & 1) { + if(kernelparams->loadflags & 1) { // zImage as pre 1.3.73 extern void far last_ditch(); kernelparams->realmode_switch_ofs = (u16) last_ditch; kernelparams->realmode_switch_seg = _CS; diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/VCPI.ASM --- a/linld/stuff/src/VCPI.ASM Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/VCPI.ASM Wed Nov 06 21:02:18 2019 +0100 @@ -140,11 +140,7 @@ ;push ax ;Calculate pagedir/page0 addrs, initialize cr3 and pagedir[0] - xor eax,eax ; heap_top = prepare_vcpi(malloc_or_die(8*1024+4)); - mov ah,8*1024/256 - extrn malloc_or_die:near - call malloc_or_die mov edx,cs shl edx,4 ;edx = linear addr of CS @@ -159,6 +155,8 @@ add bx,8 js @@fixup mov bh,10h + extrn _heap_top:word + movzx eax,[_heap_top] add eax,edx and ax,0f000h ;eax = 4k aligned linear addr of pagebuf add eax,ebx ;eax=page0 linear addr @@ -176,7 +174,6 @@ ; => ######## ; Return lea ax,[bx+di+4] - extrn _heap_top:word mov [_heap_top],ax ;ret diff -r a1677855824a -r 306a4bbdee7d linld/stuff/src/pipehole.awk --- a/linld/stuff/src/pipehole.awk Wed Nov 06 17:56:42 2019 +0100 +++ b/linld/stuff/src/pipehole.awk Wed Nov 06 21:02:18 2019 +0100 @@ -87,7 +87,7 @@ $0="; " $0 } } - if (/word ptr \[si\+21\],513$/) isload=11 + if (/i\+21\],513$/) isload=11 if (isload == 12) { # LOAD.LST if (/cmp/) next if (/jb/) isload=0 @@ -96,13 +96,17 @@ if (isload == 11) { # LOAD.LST if (/cmp/) { print " mov cx,513" - $0=" sub cx,word ptr [si+21]" + sub(/cmp /,"sub cx,") + sub(/,513/,"") } if (/jb/) isload=12 sub(/jb/,"ja") } - sub(/DGROUP:_imgs\+65534/,"[di-2]") - if (/short @1@366$/) isload=10 + if (/i,offset/) split($2,sidi,",") + if (sidi[1] == "si") sidi[2]="di" + else sidi[2]="si" + sub(/DGROUP:_imgs\+65534/,"[" sidi[1] "-2]") + if (/m, _rm_size/) isload=10 if (isload == 10) { # LOAD.LST if (/^ je /) next if (/ptr @die\$qpxzc/) { @@ -124,12 +128,12 @@ if (isload == 7) { # LOAD.LST if (/add/ || /xor/ || /extrn/ || /N_LXLSH@/ || /cl,4/) next if (/enable A20 if needed/) { - print " mov word ptr [bx+si],8000h" + print " mov word ptr [bx+" sidi[2] "],8000h" isload=0 } if (/,ax/) $0=" mov bx,55" - if (/si-463/) $0=" mov bx,-463" - if (/si-465/) $0=" mov word ptr [bx+si-2],-23745" + if (/i-463/) $0=" mov bx,-463" + if (/i-465/) { sub(/465/,"2"); sub(/\[/,"[bx+"); } if (/,dx/) { print " mov cl,12" print " shr ax,cl" @@ -225,11 +229,10 @@ if (isload == 1) { # LOAD.LST if (/ptr .die\$qpxzc/) $0="@die@:\n" $0 if (/mov al,byte ptr/ && is386) { - print " movzx eax,byte ptr [si]" - next + sub(/mov al/,"movzx eax") } if (is386 == 0) { - if (/di-5\],ax/) print " cwd" + if (/m->size -= _rm_size/) print " cwd" sub(/,0$/,",dx") } if (/ax,word ptr/) next