# HG changeset patch # User Pascal Bellard # Date 1561386669 -7200 # Node ID 2373992ff7512a9012b3d783c1b040eb2846af84 # Parent 56ab00f400e9e3c12539fe15f488182807c3ba64 tazboot: spave 40k+ for zImage diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/A20.ASM --- a/linld/stuff/src/A20.ASM Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/A20.ASM Mon Jun 24 16:31:09 2019 +0200 @@ -16,6 +16,7 @@ enable_a20_methods: dw _enable_a20_fast, _enable_a20_kbd, _enable_a20_xmm, die msg_a20 db "Can't use A20",0 +overflow db "Loaded too close to 9000:0",0 ends _DATA @@ -84,12 +85,59 @@ endp _enable_a20_fast ;*************************************************************** +;_fastcall void moverm(bx:struct himem *m); +;*************************************************************** + + global @moverm$qp11image_himem:near +@moverm$qp11image_himem: + push si di + global sssp:dword + extrn _heap_top:word + ifdef NO386 + extrn _topseg:near + call near _topseg + mov cl,4 + org $-4 +sssp dd ? + mov [word sssp+2],ax + ;extrn _initrd_desc:dword + ;mov [word _initrd_desc+2],ax + xchg ax,dx + mov ax,[_heap_top] + shr ax,cl + else + p386 + mov ax,[_heap_top] + shr ax,4 + mov dx,9000h + org $-4 +sssp dd ? + endif + mov es,dx + mov cx,cs + add ax,cx + cmp ax,dx + jb @@nooverflow +; Oops! We can stomp on our toes... better stop now + mov bx,offset overflow + call near die +@@nooverflow: + mov cx,[bx-5] ; size + mov si,[bx-2] ; data + xor di,di + rep + movsb + ;push ds + ;pop es + ;pop di si + pop di + +;*************************************************************** ;void enable_a20_or_die(); ;*************************************************************** - global _enable_a20_or_die:near proc _enable_a20_or_die near - push si + ;push si mov si,offset enable_a20_methods jmp @@check @@loop: @@ -108,7 +156,7 @@ ; time on certain systems; Toshiba Tecras are known to have this ; problem. - push ds es + push ds xor bx,bx mov ds,bx mov cx,0FFFFh @@ -124,13 +172,15 @@ sti a20ko: loopne a20lp - xchg ax,cx - pop es ds + ;xchg ax,cx + pop ds ;ret ;endp _check_a20 jne @@loop + ;push ds + ;pop es pop si ret diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/COMMON.H --- a/linld/stuff/src/COMMON.H Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/COMMON.H Mon Jun 24 16:31:09 2019 +0200 @@ -2,7 +2,7 @@ // // Common defs not belonging to CRTL -#define NL "\r\n" +#define NL "\n" #define VERSION_STR "0.97" #if 0 // DEBUG diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/CRTL.ASM --- a/linld/stuff/src/CRTL.ASM Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/CRTL.ASM Mon Jun 24 16:31:09 2019 +0200 @@ -19,8 +19,7 @@ global _heap_top extrn _bss_end _heap_top dw _bss_end -msg_hang db "High mem corrupted - not exiting to DOS" -msg_lf db 10,0 +msg_hang db "High mem corrupted - not exiting to DOS",0 vcpi_alloc_err db "VCPI " msg_malloc db "malloc error",0 ifdef EXTRA @@ -86,18 +85,14 @@ global @strcatb$qpxzct1:near proc @strcatb$qpxzct1 near - ifdef EXTRA mov cl,7Fh db 0bah ; mov dx,imm opcode global @strcpy$qpxzct1:near @strcpy$qpxzct1: xor cx,cx - endif push si xchg ax,si ; b - ifdef EXTRA jcxz @@nocat - endif dec bx @@catlp: inc bx @@ -185,29 +180,32 @@ ;_fastcall void puts(bx:const char* s): ;*************************************************************** global @puts$qpxzc:near - proc @puts$qpxzc near ; global puts:near ; puts(bx) +@putsz: + call @putc +@puts$qpxzc: puts: - call @@putsz - mov bx,offset msg_lf - mov dl,13 -@@putcz: - mov ah,2 - int 21h -@@putsz: mov dl,[bx] inc bx or dl,dl - jne @@putcz ; ZF=1 (for malloc failure) + 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 - endp @puts$qpxzc - - ;*************************************************************** ;_fastcall int open(bx:const char* name, int flags=O_RDONLY); +;_fastcall int openargs(bx:const char* name, int flags=O_RDONLY); ;*************************************************************** global openargs:near ; openargs(bx) openargs: @@ -508,8 +506,19 @@ endif ;*************************************************************** +;_fastcall char* strdup(bx:const char* a); ;_fastcall char* malloc_or_die(ax:unsigned size); ;*************************************************************** + global @strdup$qpxzc:near +@strdup$qpxzc: + mov ax,[_heap_top] + xchg ax,bx + call @strcpy$qpxzct1 + xchg ax,bx +xchg_heap_top: + xchg ax,[_heap_top] + ret + global @malloc_or_die$qui:near proc @malloc_or_die$qui near @@ -520,11 +529,10 @@ mov bx,sp add bh,-14h ; MIN_STACK=_1k+PAGE_SIZE sub bx,ax ; can't overflow + add ax,cx cmp bx,cx mov bx,offset msg_malloc - jb die - add [_heap_top],cx ; _BEG has zero'd heap - ret + ja xchg_heap_top endp @malloc_or_die$qui @@ -545,9 +553,8 @@ mov al,[_no_exit] or al,al jne @@hang - extrn exit:near - inc ax - jmp near exit + mov ah,4Ch + int 21h @@hang: mov bx, offset msg_hang call puts @@ -1330,7 +1337,7 @@ global _progname:near proc _progname near - push si di es + push si di mov ah,30h int 21h xor di,di @@ -1363,7 +1370,7 @@ push es pop ds @@skip: - pop es di si + pop di si ret endp _progname diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/CRTL.H --- a/linld/stuff/src/CRTL.H Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/CRTL.H Mon Jun 24 16:31:09 2019 +0200 @@ -21,6 +21,8 @@ void parse_cmdline(); extern _fastcall void strcatb(const char* a,const char* b); +extern _fastcall void strcpy(const char* a,const char* b); +extern _fastcall int strdup(const char* a); #ifdef USE_ARGSTR extern _fastcall int argstr(const char *s, const char keywords[], const char **var); extern _fastcall int argnum(char *s, const char keywords[], unsigned long *var); @@ -33,6 +35,7 @@ //extern "C" int open(const char* name, int flags); extern _fastcall int open(const char* name); extern _fastcall int close(int fd); +extern _fastcall int moverm(struct image_himem *m); extern _fastcall int readrm(struct image_himem *m, int sz); extern _fastcall int read(int fd, void* data, int sz); extern _fastcall long lseekcur(int fd, int whence); diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/CRTLX.H --- a/linld/stuff/src/CRTLX.H Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/CRTLX.H Mon Jun 24 16:31:09 2019 +0200 @@ -1,7 +1,6 @@ // This file is distributed under GPL // extern _fastcall long lseekset2(int fd, unsigned long* whence); -extern _fastcall void strcpy(const char* a,const char* b); extern _fastcall void strcat(const char* a,const char* b); extern _fastcall int strcmp(const char* a,const char* b); //extern "C" char* strstr(const char* a,const char* b); diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/JUMP.ASM --- a/linld/stuff/src/JUMP.ASM Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/JUMP.ASM Mon Jun 24 16:31:09 2019 +0200 @@ -11,15 +11,9 @@ p386 endif - group DGROUP _TEXT,_DATA,_BSS + group DGROUP _TEXT,_BSS assume cs:DGROUP,ds:DGROUP - segment _DATA byte public use16 'DATA' - -overflow db "Loaded too close to 9000:0",0 - - ends _DATA - segment _BSS byte public use16 'BSS' global _imgs:dword @@ -90,38 +84,14 @@ global _boot_kernel:near proc _boot_kernel near + ifdef NO386 p8086 - extrn _heap_top:word - global sssp:dword - ifdef NO386 - extrn _topseg:near - call near _topseg - mov cl,4 - org $-4 -sssp dd ? - mov [word sssp+2],ax - xchg ax,bx - mov ax,[_heap_top] - shr ax,cl else p386 - mov ax,[_heap_top] - shr ax,4 - mov bx,9000h - org $-4 -sssp dd ? endif - mov es,bx - mov dx,cs - add ax,dx - cmp ax,bx - jb @@nooverflow -; Oops! We can stomp on our toes... better stop now - mov bx,offset overflow - extrn die:near - call near die -@@nooverflow: ;cli ; we start doing destructive things to DOS + extrn sssp:word + mov es,[sssp+2] push es pop ss mov sp,0A000h @@ -131,18 +101,12 @@ lodsw push ax ; _csip high push [word si-4] ; _csip low + lodsw else - mov si,offset _rm_size ; _rm_size, _pm_high, _rm_buf - push [dword si-4] ; _csip + mov si,offset _rm_size+2 ; _rm_size, _pm_high, _rm_buf + push [dword si-6] ; _csip endif - lodsw - xchg ax,cx ; _rm_size lodsb ; _pm_high - mov si,[si] ; _rm_buf - xor di,di - ;cld - rep - movsb extrn _cmdline:word mov si,[_cmdline] mov di,8000h diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/LOAD.CPP --- a/linld/stuff/src/LOAD.CPP Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/LOAD.CPP Mon Jun 24 16:31:09 2019 +0200 @@ -122,8 +122,10 @@ static u8 pm_high; // @ = @rm_size + 2, see JUMP.ASM static u8* rm_buf; // @ = @rm_size + 3, see JUMP.ASM struct image_himem imgs[2]; +u32 far *initrd_desc = (u32 far *) MK_FP(0x9000,0x218); static const char kernel_file_error[] = "Can't use kernel file"; +char *version_string=""; char* load_kernel() { struct image_himem *m = ± @@ -131,10 +133,9 @@ #define _pm_high (((u8*)(m))[-3]) #define _rm_size (*(u16*)((u8*)(m)-5)) #define _csip (*(u32*)((u8*)(m)-9)) - char *version_string; { struct kernelparams_t *kernelparams; - kernelparams = &(((first1k_t*) (_rm_buf(m) = (u8 *)malloc_or_die(_32k)))->params); + kernelparams = &(((first1k_t*) (_rm_buf(m) = (u8 *)heap_top))->params); #define first1k ((first1k_t*)((u8 *)kernelparams-0x1F1)) *((u16 *)&_csip+1)=topseg()|0x20; @@ -143,7 +144,6 @@ open_image(m, kernel_name); do { - // Do not use malloc below until heap_top adjustment (see <*>) if (readrm(m, 0x200) == 0x200) { lseekcur(m->fd,-0x200); @@ -159,7 +159,7 @@ if((kernelparams->setup_sects)>=(_32k/512) || // 0th sector not counted kernelparams->boot_flag != 0xAA55) die("Not a kernel"); - heap_top = _rm_buf(m)+(_rm_size=0x200*(kernelparams->setup_sects+1)); // <*> + _rm_size=0x200*(kernelparams->setup_sects+1); m->size -= _rm_size; m->chunk_size -= _rm_size; @@ -173,7 +173,6 @@ if((int)vid_mode) kernelparams->vid_mode = vid_mode; if((int)root_dev) kernelparams->root_dev = root_dev; - version_string = ""; if(kernelparams->header == HdrS) { // starting linux 1.3.73 if(kernelparams->loadflags & 1) { @@ -183,10 +182,10 @@ pm_high++; // Hook on int15 to work around fn 88 DOS breakage - hook_int15_88(); + hook_int15_88(); // break _ES } if (kernelparams->kernel_version) - version_string = (char *) first1k+kernelparams->kernel_version+0x200; + version_string = (char *) strdup((char *) first1k+kernelparams->kernel_version+0x200); kernelparams->type_of_loader = 0xff; // kernel do not know us (yet :-) if(kernelparams->version >= 0x201) { // * offset limit of the setup heap @@ -206,40 +205,23 @@ } cmd_line_ok: - // Check and enable A20 if needed - enable_a20_or_die(); + + // Move setup & Check and enable A20 if needed + moverm(m); // break _ES // Read remaining kernel (pm part) // Try to load kernel high, maybe even blindly storing it // in unallocated memory as a last resort - { - struct image_himem *m = ± - if((u16)(((m->fallback=(u32(u16(_CS)+0x1000)<<4))+m->size)>>16) >= + if((u16)(((m->fallback=(u32(u16(_CS)+(u16(heap_top)>>4)+1)<<4))+m->size)>>16) >= (u16)(topseg()>>12) || _pm_high) { m->fallback = base_himem; } load_image(m); - } return version_string; } -struct initrdparams_t { - u32 header; // 0202 Magic signature "HdrS" - u16 version; // 0206 Boot protocol version supported - u16 realmode_switch_ofs; // 0208 Hook called just before rm->pm - u16 realmode_switch_seg; - u16 start_sys_seg; // 020C - u16 kernel_version; // 020E Points to kernel version string - u8 type_of_loader; // 0210 Boot loader identifier - u8 loadflags; // 0211 Boot protocol option flags - u16 setup_move_size;// 0212 Move to high memory size (used with hooks) - u32 code32_start; // 0214 Boot loader hook (see below) - u32 initrd_buf; // 0218 initrd load address (set by boot loader) - u32 initrd_size; // 021C initrd size (set by boot loader) -}; - // Read initrd if needed void load_initrd() { struct image_himem *m = &initrd; @@ -262,9 +244,8 @@ load_image(m); - struct initrdparams_t *initrdparams = ((struct initrdparams_t *)&(((first1k_t*) _rm_buf(m-1))->params.header)); - if(initrdparams->header == HdrS) { - initrdparams->initrd_buf = m->fallback; - initrdparams->initrd_size = m->size; + if (*version_string) { + initrd_desc[0] = m->fallback; + initrd_desc[1] = m->size; } } diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/MEMTOP.ASM --- a/linld/stuff/src/MEMTOP.ASM Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/MEMTOP.ASM Mon Jun 24 16:31:09 2019 +0200 @@ -82,14 +82,16 @@ call rdcmos17 popf tokb: + mov cl,10 ;multiply by 1024 + ifndef NO386 + add ah,4h ;account for 1024 low kb + setc dl ; (optimized to death) + shld dx,ax,cl + shl ax,cl ; (kbytes -> bytes) + else xor dx,dx add ah,4h ;account for 1024 low kb adc dx,dx ; (optimized to death) - mov cl,10 ;multiply by 1024 - ifndef NO386 - shld dx,ax,cl - shl ax,cl ; (kbytes -> bytes) - else db 0A9h ; test ax,04B1h global N_LXLSH@4:near N_LXLSH@4: @@ -208,6 +210,8 @@ xchg ax,[es:bx+15*4+2] mov [word saved15+2],ax endif + ;push ds + ;pop es @@skip: ret int15_88: diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/TAZBOOT.CPP --- a/linld/stuff/src/TAZBOOT.CPP Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/TAZBOOT.CPP Mon Jun 24 16:31:09 2019 +0200 @@ -170,15 +170,15 @@ try_default_args(); dousage: die("Usage: tazboot [[@commands]|[-f][-b base_himem][kernel=] \ -[initrd=[,...]] [bootfrom=] ...]\r\n\n\ -Defaults: tazboot kernel=bzImage auto\r\n\n\ -Examples for tazboot.cmd:\r\n\n\ - bootfrom=\\isos\\slitaz-4.0.iso\r\n\ - kernel=boot/bzImage\r\n\ - initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\r\n\ - rw root=/dev/null vga=normal autologin\r\n\n\ - kernel=\\slitaz\\elks\r\n\ - root=/dev/bda1 ro\r\n"); +[initrd=[,...]] [bootfrom=] ...]\n\n\ +Defaults: tazboot kernel=bzImage auto\n\n\ +Examples for tazboot.cmd:\n\n\ + bootfrom=\\isos\\slitaz-4.0.iso\n\ + kernel=boot/bzImage\n\ + initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.gz\n\ + rw root=/dev/null vga=normal autologin\n\n\ + kernel=\\slitaz\\elks\n\ + root=/dev/bda1 ro\n"); } bootiso(argv + 1); chdirname(*argv); diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/XMM.ASM --- a/linld/stuff/src/XMM.ASM Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/XMM.ASM Mon Jun 24 16:31:09 2019 +0200 @@ -51,18 +51,18 @@ endif jne @@gotit - xchg ax,cx ; save cmd + push ax ; save cmd mov ax,4300h ; installation check in al int 2fh mov bx,offset xmm_fail - push cs + push ds pop es cmp al,80h jne @@err mov ax,4310h ; get driver address in es:bx int 2fh @@err: - xchg ax,cx ; restore cmd + pop ax ; restore cmd mov [si],bx mov [si+2],es @@gotit: diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/_BEG.ASM --- a/linld/stuff/src/_BEG.ASM Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/_BEG.ASM Mon Jun 24 16:31:09 2019 +0200 @@ -26,8 +26,13 @@ ends _DATA segment _BSS byte public use16 'BSS' + +STACK_SIZE = 1024 + global _bss_start:byte label _bss_start byte + db STACK_SIZE-2 dup(?) +stktop dw ? ifdef EXTRA global _cpu_features:dword _cpu_features dd ? @@ -47,7 +52,8 @@ ;*************************************************************** ; clear bss ;*************************************************************** - mov si,offset _bss_start + mov sp,offset stktop + mov si,sp mov bx, 0F000h ; cld ; cli & empty string clearbss: mov [si],bl ; clear bss + heap + sp @@ -140,7 +146,7 @@ ;call _get_vcpi_interface mov bx,offset msg_badmapping jnz no_vcpi - inc [byte bx+_vcpi-msg_badmapping] + inc [word bx+_vcpi-msg_badmapping] endcpu386: ifdef EXTRA pushfd @@ -251,14 +257,12 @@ endif ;*************************************************************** - extrn _main:near - call _main + extrn _main:near + call _main + ;never return ;*************************************************************** - global exit:near -exit: - mov ah,4Ch - int 21h + ends _TEXT diff -r 56ab00f400e9 -r 2373992ff751 linld/stuff/src/pipehole.awk --- a/linld/stuff/src/pipehole.awk Sat Jun 22 21:11:47 2019 +0200 +++ b/linld/stuff/src/pipehole.awk Mon Jun 24 16:31:09 2019 +0200 @@ -5,6 +5,70 @@ if (/^@.*:$/ || / endp$/) afterjmp=0 if (/dword ptr/) is386=1 + sub(/DGROUP:_imgs\+65534/,"[di-2]") + if (/cmd_line_ptr =/ && is386 == 0) isload=7 + if (isload == 7) { # LOAD.LST + if (/add/ || /xor/ || /extrn/ || /N_LXLSH@/ || /cl,4/) next + if (/,ax/) { + sub(/ax/,"8000h") + isload=0 + } + if (/,dx/) { + print " mov cl,12" + print " shr ax,cl" + sub(/dx/,"ax") + } + } + if (/\[0\] = m-\>fallback/) isload=6 + if (isload == 6) { # LOAD.LST + if (/si\+2/) { + print " inc si" + $0=" inc si" + } + if (/les/) sub(/bx,/,"ax,") + if (/bx\+4/ || /es:/) { + if (/bx\+4/) isload=0 + next + } + if (/si\+6/) { + print " xchg ax,di" + print " movsw" + print " movsw" + print " movsw" + print " movsw" + print " xchg ax,di" + next + } + } + if (/version_string = /) isload=5 + if (isload == 5) { # LOAD.LST + sub(/ax,/,"bx,") + if (/_version_string,/) isload=0 + if (/mov bx,ax/) next + } + if (/topseg\(\)>>12/) isload=4 + if (isload == 4 && is386 == 0) { # LOAD.LST + if (/push/ || /pop/) next + if (/ax,cs/) { + print " cwd" + sub(/ax,cs/,"bx,cs") + } + if (/dx,dx/) next + sub(/ax,dx/,"ax,bx") + if (/call/) isload=400 + } + if (isload == 400 && /,0/) { + sub(/,0/,",dh") + isload=0 + } + if (isload == 4 && is386) { # LOAD.LST + sub(/dx,cs/,"edx,cs") + sub(/eax/,"edx") + sub(/ax,9/,"dx,9") + if (/,0/) sub(/,0/,",dh") + if (/movzx/) next + if (/fallback = base_himem/) { isload=0 } + } if (/void load_initrd\(\)/) isload=3 if (isload == 3) { # LOAD.LST if(/push di/ || /pop di/) next @@ -17,9 +81,9 @@ sub(/je/,"jcxz") if (/ax,word/) next sub(/,ax/,",cx") - if (/version_string/) isload=0 + if (/version_string/ || /starting linux 1\.3\.73/) isload=0 } - if (/heap_top = _rm_buf/) isload=1 + if (/_rm_size=0x200/ || /heap_top = _rm_buf/) isload=1 if (isload == 1) { # LOAD.LST if (/mov al,byte ptr/ && is386) { print " movzx eax,byte ptr [si]" @@ -190,6 +254,8 @@ if (isotazboot == 100) { # TAZBOOT.LST if (/cx,ax/) { print " mov si,offset _isostate+8" + print " push ds" + print " pop es" print " xchg ax,di" print " movsw" print " movsw"