# HG changeset patch # User Pascal Bellard # Date 1610437632 0 # Node ID 5c1ce90eb1d639f3b75b84b19cfd611c31322c21 # Parent 42a48dc164f3728d6c585e69443523216ff1bf55 syslinux/iso2exe: read isolinux.cfg diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/!COMPILE.BAT --- a/linld/stuff/src/!COMPILE.BAT Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/!COMPILE.BAT Tue Jan 12 07:47:12 2021 +0000 @@ -3,7 +3,7 @@ tasm /h > helptasm.log bcc > helpbcc.log tlink > helptlink.log -bcc @bccopt.opt -S -mt -DISOHOOK -DMOVE_SETUP -DUSE_ARGSTR -DLARGE_IMAGES *.cpp > cpp.log +bcc @bccopt.opt -S -mt -DISOHOOK -DMOVE_SETUP -DLARGE_IMAGES *.cpp > cpp.log ren LINLD.ASM LINLD.ASO ren LOAD.ASM LOAD.ASO ren HIMEM.ASM HIMEM.ASO @@ -12,5 +12,5 @@ mawk -f pipehole.awk LOAD.ASO > LOAD.ASM mawk -f pipehole.awk HIMEM.ASO > HIMEM.ASM mawk -f pipehole.awk ISO9660.ASO > ISO9660.ASM -tasm /la /m /dISOHOOK /dBIG_CMDLINE /dMOVE_SETUP /dUSE_ARGSTR /dNO386 /dLARGE_IMAGES /dLONG_FILENAME *.asm > asm.log +tasm /la /m /dISOHOOK /dBIG_CMDLINE /dMOVE_SETUP /dNO386 /dLARGE_IMAGES /dLONG_FILENAME *.asm > asm.log tlink /m /s /t @link.cmd > lnk.log diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/COMMON.H --- a/linld/stuff/src/COMMON.H Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/COMMON.H Tue Jan 12 07:47:12 2021 +0000 @@ -65,7 +65,8 @@ #define vid_mode (cmdnum[1]) // -3 = ask, -2 = Extended VGA, -1 = Normal VGA, n = as "n" was pressed #define topmem (cmdnum[2]) #define base_himem (cmdnum[3]) -extern u32 cmdnum[4]; +#define skip_alloc (* (char *) &cmdnum[4]) +extern u32 cmdnum[5]; extern _fastcall void memcpy_image(struct image_himem *m); extern _fastcall void storepage(u32 *dst); diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/CRTL.ASM --- a/linld/stuff/src/CRTL.ASM Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/CRTL.ASM Tue Jan 12 07:47:12 2021 +0000 @@ -292,6 +292,7 @@ endp @isoreadsector$qpxul + ifdef ISOHOOK ;*************************************************************** ;_fastcall int strhead(bx:const char* a, ax:const char* b); ;*************************************************************** @@ -327,6 +328,28 @@ endp @strcmp$qpxzct1 + else + +;*************************************************************** +;_fastcall int strcmp(bx:const char* a, ax:const char* b); +;*************************************************************** + global @strcmp$qpxzct1:near + proc @strcmp$qpxzct1 near + +@@loop: + xchg ax,bx + mov dl,[bx] ; dl = *b++ + inc bx + xchg ax,bx + xor dl,[bx] ; dl ^= *a++ + jne fail ; return -1 + inc bx + or dl,dl ; clear C + jz failifc ; return 0 + jmp @@loop + + endp @strcmp$qpxzct1 + endif ;*************************************************************** ;_fastcall const char **argstr(bx:const char *s, ax:const char keywords[], dx:const char **var); @@ -356,7 +379,7 @@ @@match: inc bx ; keywords++ lodsb ; *s++ - or al,20h + or al,20h ; locase cmp al,[bx] je @@match cmp al,'/' ; 2f @@ -377,6 +400,8 @@ cmp [byte bx],dh jne @@loop @@testal: + cmp al,'*' + je @@setnum cmp al,'=' ;je @@found ;cmp al,0 ; eos, si=next argv @@ -387,6 +412,7 @@ dec dx je @@done call @strtol$qpxzc +@@setnum: xchg ax,si mov [di+2],dx @@done: diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/ISO9660.CPP --- a/linld/stuff/src/ISO9660.CPP Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/ISO9660.CPP Tue Jan 12 07:47:12 2021 +0000 @@ -19,14 +19,15 @@ struct isostate *x=&isostate; - if (x->curpos >= SECTORSZ || * (short *) (x->buffer + x->curpos) == 0) { + p = x->buffer; + if (x->curpos >= SECTORSZ || * (short *) (p + x->curpos) == 0) { if ((x->curdirsize =- DIRSECTORSZ) < 0) return -1; isoreadsector(&x->curdirofs); // x->filepos = 0 //x->curdirofs += SECTORSZ; *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256; x->curpos = 0; } - p = x->buffer; p += x->curpos; + p += x->curpos; x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS; if ((x->entrysize = * (short *) p) == 0) { return -1; @@ -66,8 +67,10 @@ #define _64bits (x->_64bits) char *s; +#ifdef ISOHOOK _64bits = cpuhaslm(); _32bits: +#endif s = (char *) x->filename2open; if (*s == '/') { s++; @@ -82,17 +85,21 @@ c = *s; *s = 0; do { if (isoreaddir() == -1) { +#ifdef ISOHOOK if ((_64bits ^= CPUMASKLM) == 0) goto _32bits; +#endif return -1; } const char *n = name; #define i (x->tmp) i = x->filename; +#ifdef ISOHOOK if (_64bits) { if (strhead(i, n) == -1) continue; n = "64"; i += s - name; // strlen(name); } +#endif if (strcmp(i, n) != -1) break; } while (1); *s++ = c; diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/LINLD.CPP --- a/linld/stuff/src/LINLD.CPP Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/LINLD.CPP Tue Jan 12 07:47:12 2021 +0000 @@ -8,7 +8,7 @@ extern char bzimagestr[]; const char* cmdstr[4] = {"auto",bzimagestr,NULL,NULL}; -u32 cmdnum[4]; +u32 cmdnum[5]; inline void syntax() { die("Syntax:" NL @@ -51,7 +51,7 @@ exit(); } if (argstr(*argv,"cl|image|initrd|iso",clp) == (int) clp) continue; - if (argnum(*argv,"root|vga|mem|-b",&root_dev) == (int) &base_himem) continue; + if (argnum(*argv,"root|vga|mem|-b|-f*",&root_dev) >= (int) &base_himem) continue; if (fileexist(*argv) != -1) { kernel_name=*argv; continue; diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/MEMCPY32.ASM --- a/linld/stuff/src/MEMCPY32.ASM Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/MEMCPY32.ASM Tue Jan 12 07:47:12 2021 +0000 @@ -108,8 +108,8 @@ jnz @@2flat pop dx ; dstseg pop ax ; srcseg - dec bx ; <1mb ? - jns @@pmcopy + cmp bx,si ; <1mb ? + jne @@pmcopy push di @@movlp: mov ds,ax @@ -124,18 +124,16 @@ inc cx sub [word sz],cx ;jae @@movpara - sbb [word sz+2],0 + sbb [word sz+2],bx jae @@movpara add cx,[word sz] ;stc @@movpara: rep movsb jae @@movlp - dec cx ; set S pop di + jmp @@done16 @@pmcopy: - pop si - js @@done16 p386 pushad ; struct declared in VCPI.ASM mov esi,[srcofs] @@ -193,6 +191,9 @@ popad p8086 @@done16: + ifdef NO386 + pop si + endif pop es ds popf ; restore I & D ifndef NO386 diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/VCPI.ASM --- a/linld/stuff/src/VCPI.ASM Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/VCPI.ASM Tue Jan 12 07:47:12 2021 +0000 @@ -66,15 +66,15 @@ use_32 = 01000000b ;****** rm32,imm16 helper -macro movzx_e rm,i - db 66h - mov rm,i - dw 0 +macro movzx_e rm,i + db 66h + mov rm,i + dw 0 endm -macro pushd v - db 66h - push v +macro pushd sreg + db 66h + push sreg endm group DGROUP _TEXT @@ -259,49 +259,35 @@ ;*************************************************************** mov bp,sp ; ss:bp => struct pm_regs - pushd gs ; IRET stack for return to vm - pushd fs ; (9 dwords) - pushd ds ; - pushd es ; - pushd ss ; + mov bx,5 ; IRET stack for return to vm +@@push_sreg: + pushd ss ; fake pushd gs fs ds es ss + dec bx + jnz @@push_sreg ; (9 dwords) push ebp ; esp pushfd ; eflags: IF saved here pushd cs ; - push 0 ;\eip - push offset @@vm_ret ;/ - - ;;mov [saved_xx],xx ;use if your vcpi trashes bp/etc + push bx ;\eip + push offset vcpi_ret ;/ call switch_to_pm ; EAX, EDX/ESI, DS, ES, FS, GS destroyed assume nothing assume cs:DGROUP ; Now we are in 16-bit protected mode - ;push SEL_DATA - ;pop ss - mov ax,SEL_DATA - mov ss,ax - ;;mov ds,ax - ;;mov es,ax - ;;mov fs,ax - ;;mov gs,ax - - ;;mov xx,[saved_xx] ;use if your vcpi trashes bp/etc - lea sp,[bp-9*4] ;else we can do this trick with bp + mov bl,SEL_DATA + mov ss,bx + lea sp,[bp-8-9*4] ; Call the routine (bp points to params on stack if any) - call do_memcpy_vcpi + call do_memcpy_vcpi ; set ds=all_addrspace ; Ok, let's return to vm mov ax,0DE0Ch ; maybe we need whole eax? cli ; to be safe clts ; - ;;push SEL_ABS ; vcpi wants ds=all_addrspace - ;;pop ds ; (done by do_memcpy_vcpi) - call [pword cs:vcpi_pm_entry] -@@vm_ret: -; Now we are in vm86 mode. Sregs, esp, eflags (IF) restored from IRET stack - ret +; Go to vm86 mode. Sregs, esp, eflags (IF) restored from IRET stack + jmp [pword cs:vcpi_pm_entry] ;*************************************************************** @@ -310,8 +296,6 @@ ;*************************************************************** label do_memcpy_vcpi near -; Note: ss:bp => params -; Move data push SEL_ABS pop ds push ds @@ -325,30 +309,15 @@ xchg eax,edi mov al,03h ; writeable, present call @@set_mapping - ;push eax ;X we'll need to restore mapping... xor edi,edi ;es:edi => remapped page ; Set up source addr mov esi,edx ; Do copying -; xor ecx,ecx -; mov ch,4096/256 - ;cld -;; cmp esi,edi -;; jae @@do_copy -;; add esi,ecx ;src=64k - ;mov ss,ax ; or you may get limit violations - ;mov ds,ax ; later in rm - ;mov es,ax ; (actually I prefer 4gig limits :-) - ;mov fs,ax ; - ;mov gs,ax ; - ; Black magic here mov eax,cr0 and eax,7ffffffeh ; clear PG,P bits diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/XMM.ASM --- a/linld/stuff/src/XMM.ASM Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/XMM.ASM Tue Jan 12 07:47:12 2021 +0000 @@ -75,6 +75,10 @@ global @xmm_alloc$qp11image_himem:near proc @xmm_alloc$qp11image_himem near + extrn _cmdnum:dword +skip_alloc = (byte _cmdnum+16) + cmp [skip_alloc],0 + jne @@err ifndef NO386 mov edx,[(image_himem si).size] ; m->size ;dec edx @@ -94,16 +98,14 @@ mov ah,9h ;allocate blk of DX kilobytes (<64Mb) endif call xmm_driver ; - jnz @@goerr + jnz @@err ;now: dx=handle of the blk mov ah,0Ch ;lock blk call xmm_driver ; ;now: dx:bx=addr of blk - xchg ax,bx -@@goerr: jnz @@err - mov [word (image_himem bx).buf],ax ; lo m->buf - mov [word (image_himem bx+2).buf],dx ; hi m->buf + mov [word (image_himem si).buf],bx ; lo m->buf + mov [word (image_himem si+2).buf],dx ; hi m->buf @@err: ret diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/_BEG.ASM --- a/linld/stuff/src/_BEG.ASM Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/_BEG.ASM Tue Jan 12 07:47:12 2021 +0000 @@ -273,7 +273,6 @@ ;*************************************************************** - ifdef USE_ARGSTR ;*************************************************************** ;_fastcall void set_cmdline(bx:const char *filename); ;*************************************************************** @@ -287,7 +286,6 @@ jmp read_cmdline ; read_cmdline(ax,di,cx) endp @set_cmdline$qpxzc - endif ifdef NO386 ;*************************************************************** diff -r 42a48dc164f3 -r 5c1ce90eb1d6 linld/stuff/src/pipehole.awk --- a/linld/stuff/src/pipehole.awk Fri Jan 08 21:11:45 2021 +0000 +++ b/linld/stuff/src/pipehole.awk Tue Jan 12 07:47:12 2021 +0000 @@ -159,7 +159,7 @@ sub(/_imgs\+65534/,"_imgs-2") if (/setup_sects == 0/) isload=9 if (isload == 9) { # LOAD.LST - sub(/,0/,",al") + sub(/,0/,",al ; worst case 2k boundary (iso)") if (/jne/) isload=0 } if (/cmd_line_ptr =/ && is386 == 0) isload=7 @@ -261,7 +261,7 @@ sub(/mov al/,"movzx eax") } if (is386 == 0) { - if (/m->size -= _rm_size/) print " cwd" + if (/m->size -= _rm_size/) print " cwd ; do not trust rewind result (iso case)" sub(/,0$/,",dx") } if (/ax,word ptr/) next @@ -308,9 +308,8 @@ if (/,bx/) next if (/isoreadrootsector/) { print - print " cmp word ptr [si+39],17475" - print " stc" - $0=" jne returnC" + print " xor word ptr [si+39],17475 ; clear C" + $0=" jne returnNotC" } } if (/cpytodirpage.x->dirpage/) isiso=16 @@ -436,7 +435,7 @@ if (/@2@142$/) { print " inc di"; sub(/jmp/,"loop") } } if (/i\+36\]/) next - sub(/DGROUP:_isostate\[bx/,"[bx+si") + sub(/di,offset DGROUP:_isostate/,"di,si") } # file == "iso9660.cpp" if (wascall) { if (rcall != "") { diff -r 42a48dc164f3 -r 5c1ce90eb1d6 syslinux/stuff/iso2exe/bootiso.S --- a/syslinux/stuff/iso2exe/bootiso.S Fri Jan 08 21:11:45 2021 +0000 +++ b/syslinux/stuff/iso2exe/bootiso.S Tue Jan 12 07:47:12 2021 +0000 @@ -268,10 +268,10 @@ rep movsb movw EXEADRS(headbuf+18),%ax // magic - movw $10,%si + movw $10,%bp magiclp1: xorw %dx,%dx - divw %si + divw %bp pushw %dx incw %cx orw %ax,%ax @@ -285,7 +285,7 @@ // iso= arg movb $5,%cl - movw $EXEADRS(isostr),%si + //movw $EXEADRS(isostr),%si rep movsb popw %si diff -r 42a48dc164f3 -r 5c1ce90eb1d6 syslinux/stuff/iso2exe/iso2exe.sh --- a/syslinux/stuff/iso2exe/iso2exe.sh Fri Jan 08 21:11:45 2021 +0000 +++ b/syslinux/stuff/iso2exe/iso2exe.sh Tue Jan 12 07:47:12 2021 +0000 @@ -107,10 +107,11 @@ i=$(($(get 20 $1)-0xC0)) store $(($i-6)) $(($(stat -m /tmp/mnt$$/boot/linld.com | sed q)*2048)) $1 32 store $(($i-2)) $(stat -c %s /tmp/mnt$$/boot/linld.com) $1 - r0="$(cd /tmp/mnt$$/boot/ ; ls rootfs.gz 2> /dev/null)" - r1="$(cd /tmp/mnt$$/boot/ ; ls -r rootfs?*.gz 2> /dev/null | sed q)" - [ "$r0" -a "$r1" ] && r0="$r0," - echo -n "image=/boot/bzImage initrd=$r0$r1,! autologin rdinit=/init.exe" | \ + r="rootfs.gz" + grep -qE 'rootfs[0-9]' /tmp/mnt$$/boot/isolinux/isolinux.cfg && + r="$(sed '/rootfs[0-9]/!d;s|.* initrd=||;s|/boot/||g;s| .*||' \ + /tmp/mnt$$/boot/isolinux/isolinux.cfg | tail -n1)" + echo -n "image=/boot/bzImage initrd=$r,! autologin rdinit=/init.exe" | \ ddn bs=1 of=$1 conv=notrunc seek=$(($i-134)) fi umount /tmp/mnt$$