diff -upk.orig lilo-22.7.3.orig/Makefile lilo-22.7.3/Makefile --- lilo-22.7.3.orig/Makefile 2007-01-16 21:09:34 +0300 +++ lilo-22.7.3/Makefile 2007-01-16 21:10:34 +0300 @@ -386,15 +386,15 @@ chain.o: chain.s common.s first.s: first.S lilo.h version.h Makefile $(CPP) $(PCONFIG) -DFIRST=0xff7eeb7 -o first.s first.S -second.s: second.S read.S volume.S mapper.S biosdata.S shs3.S bdata.h lilo.h version.h \ +second.s: second.S gfxlogo.S read.S volume.S mapper.S biosdata.S shs3.S bdata.h lilo.h version.h \ graph.S menu.S strlen.S bitmap.S crt.S display4.S Makefile $(CPP) $(PCONFIG) -DTEXT=0x9b26dbd8 second.S -o second.s -third.s: second.S read.S volume.S mapper.S biosdata.S shs3.S bdata.h lilo.h version.h \ +third.s: second.S gfxlogo.S read.S volume.S mapper.S biosdata.S shs3.S bdata.h lilo.h version.h \ graph.S menu.S strlen.S bitmap.S crt.S display4.S Makefile $(CPP) $(PCONFIG) -DMENU=0x6057ddfc second.S -o third.s -bitmap.s: second.S read.S volume.S mapper.S biosdata.S shs3.S bdata.h lilo.h version.h \ +bitmap.s: second.S gfxlogo.S read.S volume.S mapper.S biosdata.S shs3.S bdata.h lilo.h version.h \ graph.S menu.S strlen.S bitmap.S crt.S display4.S Makefile $(CPP) $(PCONFIG) -DBITMAP=0x422b6fa0 second.S -o bitmap.s @@ -377,16 +377,16 @@ ins: diag install # normal install, but doesn't make the diagnostic binaries # install: all - if [ ! -d $$ROOT$(SBIN_DIR) ]; then mkdir $$ROOT$(SBIN_DIR); fi - if [ ! -d $$ROOT$(CFG_DIR) ]; then mkdir $$ROOT$(CFG_DIR); fi - if [ ! -d $$ROOT$(BOOT_DIR) ]; then mkdir $$ROOT$(BOOT_DIR); fi + if [ ! -d $$ROOT$(SBIN_DIR) ]; then mkdir -p $$ROOT$(SBIN_DIR); fi + if [ ! -d $$ROOT$(CFG_DIR) ]; then mkdir -p $$ROOT$(CFG_DIR); fi + if [ ! -d $$ROOT$(BOOT_DIR) ]; then mkdir -p $$ROOT$(BOOT_DIR); fi if [ ! -d $$ROOT$(USRSBIN_DIR) ]; then \ - mkdir -p $$ROOT$(USRSBIN_DIR); fi - if [ ! -d $$ROOT$(MAN_DIR) ]; then mkdir $$ROOT$(MAN_DIR); fi + mkdir -p -p $$ROOT$(USRSBIN_DIR); fi + if [ ! -d $$ROOT$(MAN_DIR) ]; then mkdir -p $$ROOT$(MAN_DIR); fi if [ ! -d $$ROOT$(MAN_DIR)/man5 ]; then \ - mkdir $$ROOT$(MAN_DIR)/man5; fi + mkdir -p $$ROOT$(MAN_DIR)/man5; fi if [ ! -d $$ROOT$(MAN_DIR)/man8 ]; then \ - mkdir $$ROOT$(MAN_DIR)/man8; fi + mkdir -p $$ROOT$(MAN_DIR)/man8; fi if [ -f diag1.img ]; then \ cp -f diag1.img $$ROOT$(BOOT_DIR); fi if [ -f diag2.img ]; then \ @@ -416,7 +416,7 @@ install: all cp mkrescue $$ROOT$(SBIN_DIR) cp lilo $$ROOT$(SBIN_DIR) strip $$ROOT$(SBIN_DIR)/lilo - cp keytab-lilo.pl $$ROOT$(USRSBIN_DIR) + cp keytab-lilo $$ROOT$(USRSBIN_DIR) cp manPages/lilo.8 $$ROOT$(MAN_DIR)/man8 cp manPages/mkrescue.8 $$ROOT$(MAN_DIR)/man8 cp manPages/lilo.conf.5 $$ROOT$(MAN_DIR)/man5 Files lilo-22.7.1.orig/README.bz2 and lilo-22.7.1/README.bz2 differ diff -upk.orig lilo-22.7.1.orig/bsect.c lilo-22.7.1/bsect.c --- lilo-22.7.1.orig/bsect.c 2006-12-29 13:39:10 +0000 +++ lilo-22.7.1/bsect.c 2006-12-29 13:42:45 +0000 @@ -774,6 +774,7 @@ printf("MAX_IMAGES = %d\n", MAX_IMAGES); if (st.st_size > i) die("%s is too big (> %d bytes)",message,i); param2.msg_len = bitmap ? (st.st_size+15)/16 : st.st_size; + if(!bitmap) param2.msg_len = st.st_size > 0xffff ? 0xffff : st.st_size; map_begin_section(); #ifndef LCF_UNIFY map_add(&geo,0,((st.st_size)+SECTOR_SIZE-1)/SECTOR_SIZE); diff -upk.orig lilo-22.7.1.orig/doc/user.tex lilo-22.7.1/doc/user.tex --- lilo-22.7.1.orig/doc/user.tex 2006-12-29 13:39:10 +0000 +++ lilo-22.7.1/doc/user.tex 2006-12-29 13:42:45 +0000 @@ -2561,17 +2561,17 @@ don't produce any useful character on th \LILO\ obtains layout information from the keyboard translation tables Linux uses for the text console. They are usually stored in \path{/usr/lib/kbd/keytables}. \LILO\ comes with a program -\name{keytab-lilo.pl} that reads those tables and generates a table -suitable for use by the map installer. \name{keytab-lilo.pl} invokes +\name{keytab-lilo} that reads those tables and generates a table +suitable for use by the map installer. \name{keytab-lilo} invokes the program \name{loadkeys} to print the tables in a format that is easy to parse.\footnote{On some systems, only root can execute -\name{loadkeys}. It is then necessary to run \name{keytab-lilo.pl} as +\name{loadkeys}. It is then necessary to run \name{keytab-lilo} as root too.} -\name{keytab-lilo.pl} is used as follows: +\name{keytab-lilo} is used as follows: \begin{command} - keytab-lilo.pl + keytab-lilo \unit{\[ -p \meta{old\_code}=\meta{new\_code} \] $\ldots$} \unit{\[\meta{path}\]\meta{default\_layout}\[.\meta{extension}\] \]} \\ \unit{\[\meta{path}\]\meta{kbd\_layout}\[.\meta{extension}\] \]} @@ -2594,7 +2594,7 @@ root too.} \item[\meta{kbd\_layout}] Is the actual layout of the keyboard. \end{description} -\name{keytab-lilo.pl} writes the resulting translation table as a binary +\name{keytab-lilo} writes the resulting translation table as a binary string to standard output. Such tables can be stored anywhere with any name, but the suggested naming convention is \path{/boot/\meta{kbd}.ktl} (``\underline{K}eyboard \underline{T}able for \underline{L}ilo''), where @@ -2602,7 +2602,7 @@ but the suggested naming convention is \ Example: \begin{verbatim} -keytab-lilo.pl de >/boot/de.ktl +keytab-lilo de >/boot/de.ktl \end{verbatim} @@ -2688,7 +2688,7 @@ Some of the files contained in \path{lil Assembler source of a disk parameter dumper. \item[\path{lilo/mkdist}]~\\ Shell script used to create the current \LILO\ distribution. - \item[\path{lilo/keytab-lilo.pl}]~\\ + \item[\path{lilo/keytab-lilo}]~\\ Perl script to generate keyboard translation tables. \item[\path{lilo/doc/README}]~\\ Description of how to generate the documentation. @@ -2743,7 +2743,7 @@ First, you have to install the \LILO\ fi \item run\quad\raw{make install}\quad to copy all \LILO\ files to the directories where they're installed. \path{/sbin} should now contain the file \path{lilo}, \path{/usr/sbin} should contain - \path{keytab-lilo.pl}, and + \path{keytab-lilo}, and \path{/boot} should contain \path{boot.b}, \path{chain.b}, and \path{os2\_d.b}. \end{itemize} diff -upk.orig lilo-22.7.1.orig/gfxlogo.S lilo-22.7.1/gfxlogo.S --- lilo-22.7.1.orig/gfxlogo.S 1970-01-01 00:00:00 +0000 +++ lilo-22.7.1/gfxlogo.S 2006-12-29 13:42:45 +0000 @@ -0,0 +1,764 @@ +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; gfx stuff +; +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +; != 0 -> everything is fine +gfx_ok: .byte 0 + +; we need it at some point +gfx_tmp: .word 0 + +; the memory area we are working with +gfx_mem: .long 0 ; linear address + +; interface to loadable gfx extension (seg:ofs values) +gfx_bc_jt: .long 0 + +gfx_bc_init: .long 0 +gfx_bc_done: .long 0 +gfx_bc_input: .long 0 +gfx_bc_menu_init: .long 0 +gfx_bc_infobox_init: .long 0 +gfx_bc_infobox_done: .long 0 +gfx_bc_progress_init: .long 0 +gfx_bc_progress_done: .long 0 +gfx_bc_progress_update: .long 0 +gfx_bc_progress_limit: .long 0 +gfx_bc_password_init: .long 0 +gfx_bc_password_done: .long 0 + +; system config data (52 bytes) +gfx_sysconfig: +gfx_bootloader: .byte 0 +gfx_sector_shift: .byte 0 +gfx_media_type: .byte 0 +gfx_failsafe: .byte 0 +gfx_sysconfig_size: .byte gfx_sysconfig_end-gfx_sysconfig +gfx_boot_drive: .byte 0 +gfx_callback: .word 0 +gfx_bootloader_seg: .word 0 +gfx_reserved_1: .word 0 +gfx_user_info_0: .long 0 +gfx_user_info_1: .long 0 +gfx_bios_mem_size: .long 0 +gfx_xmem_0: .word 0x21 ; extended mem area 0 (start:size in MB; 12:4 bits) +gfx_xmem_1: .word 0x41 +gfx_xmem_2: .word 0 +gfx_xmem_3: .word 0 +gfx_file: .long 0 +gfx_archive_start: .long 0 +gfx_archive_end: .long 0 +gfx_mem0_start: .long 0 +gfx_mem0_end: .long 0 +gfx_sysconfig_end: + +; menu entry descriptor +menu_entries equ 0 +menu_default equ 2 ; seg:ofs +menu_ent_list equ 6 ; seg:ofs +menu_ent_size equ 10 +menu_arg_list equ 12 ; seg:ofs +menu_arg_size equ 16 +sizeof_menu_desc equ 18 + +menu_desc: .blkb sizeof_menu_desc + +; 64 dummy entries (all "") +gfx_args_entry: .blkb 64 + +gfx_password_buf: .blkb 32 +gfx_msg_wrong_image: .ascii "Could not find kernel image: " + .byte 0 +gfx_msg_wrong_password: .ascii "Sorry, incorrect password." + .byte 0 + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; I really have no idea how to get as86 to do this properly + + macro farcall + .byte 0xff + .byte 0x1e + .word ?1 + mend + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_get_sysconfig: + xor ax,ax + ret + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_set_sysconfig: + ret + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; Initialize graphics code. Load and display graphics data. +; +; edi file length +; +; return: [gfx_ok] = 0/1 +; +gfx_init: + push es + + cld + + mov byte gfx_ok,#0 + + ; no gfx if we use a serial line + cmp byte par2_port,#0 + jnz near gfx_init_90 + + mov gfx_bootloader_seg,cs + mov gfx_archive_end,edi + + ; define our memory area + ; gfx_mem _must_ be 16-byte aligned + mov dword gfx_mem,#0x10000 + add edi,gfx_mem + add edi,#15 ; add space for alignment + mov gfx_mem0_start,edi + mov dword gfx_mem0_end,#0x80000 + + sub edi,gfx_mem0_end + neg edi + cmp edi,#0x1000 ; we need some minimum space + jc near gfx_init_80 + + ; align 4 + mov eax,gfx_mem0_start + add eax,#3 + and eax,#~3 + mov gfx_mem0_start,eax + + call find_file + or eax,eax + jz near gfx_init_80 + + push edi + push eax + add eax,edi + call align_it + pop eax + pop edi + + sub edi,gfx_mem + mov ecx,gfx_archive_start + add edi,ecx + mov gfx_file,edi + add gfx_archive_end,ecx + add eax,edi + shr eax,4 + mov gfx_bc_jt+2,ax + + ; setup jump table + les bx,gfx_bc_jt + + seg es + mov ax,(bx) + mov gfx_bc_init,ax + mov gfx_bc_init+2,es + + seg es + mov ax,(bx+2) + mov gfx_bc_done,ax + mov gfx_bc_done+2,es + + seg es + mov ax,(bx+4) + mov gfx_bc_input,ax + mov gfx_bc_input+2,es + + seg es + mov ax,(bx+6) + mov gfx_bc_menu_init,ax + mov gfx_bc_menu_init+2,es + + seg es + mov ax,(bx+8) + mov gfx_bc_infobox_init,ax + mov gfx_bc_infobox_init+2,es + + seg es + mov ax,(bx+10) + mov gfx_bc_infobox_done,ax + mov gfx_bc_infobox_done+2,es + + seg es + mov ax,(bx+12) + mov gfx_bc_progress_init,ax + mov gfx_bc_progress_init+2,es + + seg es + mov ax,(bx+14) + mov gfx_bc_progress_done,ax + mov gfx_bc_progress_done+2,es + + seg es + mov ax,(bx+16) + mov gfx_bc_progress_update,ax + mov gfx_bc_progress_update+2,es + + seg es + mov ax,(bx+18) + mov gfx_bc_progress_limit,ax + mov gfx_bc_progress_limit+2,es + + seg es + mov ax,(bx+20) + mov gfx_bc_password_init,ax + mov gfx_bc_password_init+2,es + + seg es + mov ax,(bx+22) + mov gfx_bc_password_done,ax + mov gfx_bc_password_done+2,es + + ; esi sysconfig data + .byte 0x66 + mov si,ds ; mov esi,ds + shl esi,4 + add esi,#gfx_sysconfig + + farcall(gfx_bc_init) + + jc gfx_init_80 + + mov byte gfx_ok,#1 + + jmp gfx_init_90 + +gfx_init_80: + mov byte gfx_ok,#0 +gfx_init_90: + pop es + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; Back to text mode. +; +; return: [gfx_ok] = 0 +; +gfx_done: + cmp byte gfx_ok,#0 + jz gfx_done_90 + farcall(gfx_bc_done) + mov byte gfx_ok,#0 + call gfx_set_sysconfig +gfx_done_90: + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_input: + cmp byte gfx_ok,#0 + jz gfx_input_90 + call gfx_get_sysconfig + + mov ax,#0xffff + xchg ax,par2_timeout + + ; map 0xffff -> 0 + add ax,#1 + cmc + sbb ax,#0 + +gfx_input_20: + .byte 0x66 + mov di,ds ; mov edi,ds + shl edi,4 + add edi,#cmdline + mov ecx,#CL_LENGTH + movzx eax,ax + + ; edi buffer (0: no buffer) + ; ecx buffer size + ; eax timeout value (0: no timeout) + + farcall(gfx_bc_input) + + pushf + call gfx_set_sysconfig + popf + jnc gfx_input_50 + mov ax,#1 +gfx_input_50: + cmp ax,#1 + jz gfx_input_80 + + call find_boot_image + jnc gfx_input_90 + + .byte 0x66 + mov cx,ds ; mov ecx,ds + shl ecx,4 + lea esi,(ecx+gfx_msg_wrong_image) + lea edi,(ecx+cmdline) + + mov al,#0 + call gfx_infobox + + xor ax,ax + jmp gfx_input_20 +gfx_input_80: + push ax + call gfx_done + pop ax +gfx_input_90: + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_setup_menu: + cmp byte gfx_ok,#0 + jz gfx_setup_menu_90 + + mov si,#DESCR0 + mov di,si + xor ax,ax + mov cx,#IMAGES +gfx_setup_menu_20: + cmp byte (si),#0 + jz gfx_setup_menu_30 + inc ax + add si,#id_size + loop gfx_setup_menu_20 +gfx_setup_menu_30: + mov esi,#menu_desc + + xor ah,ah + mov (si+menu_entries),ax + + mov (si+menu_default),di + mov (si+menu_default+2),ds + + mov (si+menu_ent_list),di + mov (si+menu_ent_list+2),ds + mov word (si+menu_ent_size),#id_size + + mov word (si+menu_arg_list),#gfx_args_entry + mov (si+menu_arg_list+2),ds + mov word (si+menu_arg_size),#1 + + .byte 0x66 + mov ax,ds ; mov eax,ds + shl eax,4 + add esi,eax + + farcall(gfx_bc_menu_init) +gfx_setup_menu_90: + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_infobox: + pushad + cmp byte gfx_ok,#0 + jz gfx_infobox_90 + farcall(gfx_bc_infobox_init) + xor edi,edi + xor eax,eax + farcall(gfx_bc_input) + farcall(gfx_bc_infobox_done) +gfx_infobox_90: + popad + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_progress_init: + pushad + cmp byte gfx_ok,#0 + jz gfx_progress_init_90 + movzx eax,ax + farcall(gfx_bc_progress_init) +gfx_progress_init_90: + popad + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_progress_done: + pushad + cmp byte gfx_ok,#0 + jz gfx_progress_done_90 + farcall(gfx_bc_progress_done) +gfx_progress_done_90: + popad + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_progress_update: + pushad + cmp byte gfx_ok,#0 + jz gfx_progress_update_90 + movzx eax,cx + farcall(gfx_bc_progress_update) +gfx_progress_update_90: + popad + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +gfx_progress_limit: + pushad + cmp byte gfx_ok,#0 + jz gfx_progress_limit_90 + movzx eax,ax + farcall(gfx_bc_progress_limit) +gfx_progress_limit_90: + popad + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; ds:di image descr +; +gfx_password: + push es + pushad + cmp byte gfx_ok,#0 + stc + jz gfx_password_90 + push di + .byte 0x66 + mov cx,ds ; mov ecx,ds + shl ecx,4 + lea esi,(ecx+gfx_password_buf) ; not used + movzx edi,di + add edi,ecx + farcall(gfx_bc_password_init) + .byte 0x66 + mov di,ds ; mov edi,ds + shl edi,4 + add edi,#gfx_password_buf + mov ecx,#32 + xor eax,eax + farcall(gfx_bc_input) + .byte 0x66 + mov si,ds ; mov esi,ds + shl esi,4 + add esi,#gfx_password_buf + farcall(gfx_bc_password_done) + pop di + call check_password + jnc gfx_password_90 + .byte 0x66 + mov si,ds ; mov esi,ds + shl esi,4 + add esi,#gfx_msg_wrong_password + xor edi,edi + mov al,#0 + farcall(gfx_bc_infobox_init) + xor edi,edi + xor eax,eax + farcall(gfx_bc_input) + farcall(gfx_bc_infobox_done) + stc +gfx_password_90: + popad + pop es + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; Convert 32bit linear address to seg:ofs. +; +; dword [esp + 2]: linear address +; +; return: +; dword [esp + 2]: seg:ofs +; +; Notes: +; - changes no regs +; +gfx_l2so: + push eax + mov eax,(esp + 6) + shr eax,4 + mov (esp + 8),ax + and word (esp + 6),#0xf + pop eax + ret + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; locate the boot image +; +; return: +; bx boot image index +; CF error (image not found) +; +find_boot_image: + mov dx,#DESCR0 + mov cx,#IMAGES + + xor bx,bx + +find_boot_image_10: + mov si,dx + mov di,#cmdline +find_boot_image_20: + mov al,(si) + or al,al + jz find_boot_image_60 + cmp al,(di) + jnz find_boot_image_30 + inc si + inc di + jmp find_boot_image_20 +find_boot_image_30: + inc bx + add dx,#id_size + cmp bx,cx + jb find_boot_image_10 + ; not found, strip options for fancy error message + + mov si,#cmdline + mov cx,#MAX_IMAGE_NAME+1 +find_boot_image_40: + cmp byte (si),#0x20+1 + inc si + jb find_boot_image_50 + loop find_boot_image_40 +find_boot_image_50: + mov byte (si-1),#0 + jmp find_boot_image_80 +find_boot_image_60: + mov al,(di) + cmp al,#0x20 + ja find_boot_image_30 + imul bx,bx,#id_size + add bx,#DESCR0 + jmp find_boot_image_90 +find_boot_image_80: + stc +find_boot_image_90: + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; ds:di image descr +; +; CF = 0: password valid +; +check_password: +#if defined(SHS_PASSWORDS) + mov bp,di + mov di,#gfx_password_buf + mov si,di + push ds + pop es + mov cx,#32 - 1 + xor al,al + repne + scasb + sub cx,#32 - 1 + not cx + mov bx,cx + + push ss + pop es + mov cx,#32 + sub sp,cx + mov di,sp + rep + movsb + mov si,sp + + push bp + + push bx ; length + push si ; ss:si password + call _shsInit + call _shsUpdate + call _shsFinal + pop si + pop bx + + pop di + + add di,#id_password_crc + mov si,#shs_digest + mov cx,#MAX_PW_CRC*4 + push ds + pop es + repe + cmpsb + je check_pw_50 + inc cx +check_pw_50: + add sp,#32 + pushad ; clear password buffer + mov di,#gfx_password_buf + mov cx,#32 + xor al,al + rep + stosb + popad + cmp cx,#1 + cmc +#endif + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; locate graphics file +; +; return: eax: code offset (0 -> no file found) +; edi: gfx file start +; +find_file: + mov edi,gfx_mem + push edi + call gfx_l2so + pop bx + pop es + call magic_ok + or eax,eax + jnz find_file_90 + + ; ok, maybe it's a cpio archive + + ; note: edi must be properly aligned (2)! + +find_file_20: + mov ecx,gfx_mem0_start + sub ecx,#26 + 12 ; min cpio header + gfx header + cmp edi,ecx + jae find_file_90 + + push edi + call gfx_l2so + pop bx + pop es + seg es + cmp word (bx),#0x71c7 + jnz find_file_90 ; no cpio record + + seg es + movzx esi,word (bx+20) ; file name size + + inc si + and si,#~1 ; align + + seg es + mov ecx,(bx+22) ; data size + rol ecx,#16 ; get word order right + + inc ecx + and ecx,#~1 ; align + + add si,#26 ; skip header + + add edi,esi + add bx,si + call magic_ok + or eax,eax + jnz find_file_90 + + add edi,ecx + jmp find_file_20 + +find_file_90: + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; es:bx file start +; +; return: eax: offset to code entry +; +; Notes: +; - changes no regs except eax +; +magic_ok: + xor eax,eax + seg es + cmp dword (bx),#0x0b2d97f00 ; header.magic_id + jnz magic_ok_90 + ; version 8 + seg es + cmp byte (bx+4),#8 ; header.version + jb magic_ok_90 + seg es + cmp byte (bx+4),#8 ; header.version + ja magic_ok_90 + seg es + mov eax,(bx+8) +magic_ok_90: + ret + + +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +; eax address to be aligned +; +align_it: + push dword gfx_mem + pop dword gfx_archive_start + neg al + and eax,#0x0f + jz align_it_90 + add gfx_archive_start,eax + mov esi,gfx_mem + mov ebx,gfx_mem0_start + sub ebx,esi + sub ebx,#0x0f + add esi,ebx + dec esi + + std + +align_it_30: + or ebx,ebx + jz align_it_60 + mov ecx,ebx + cmp ebx,#0x8000 + jb align_it_40 + mov ecx,#0x8000 +align_it_40: + push esi + sub ebx,ecx + sub (esp),ecx + push esi + call gfx_l2so + pop si + add si,#0x8000 + sub word (esp),#0x8000 >> 4 + pop es + mov di,si + add di,ax + seg es + rep + movsb + pop esi + jmp align_it_30 +align_it_60: + + cld + +align_it_90: + ret + + diff -upk.orig lilo-22.7.3.orig/lilo.h lilo-22.7.3/lilo.h --- lilo-22.7.3.orig/lilo.h 2006-12-29 13:39:10 +0000 +++ lilo-22.7.3/lilo.h 2006-12-29 13:42:45 +0000 @@ -330,7 +330,7 @@ source directory. #define DC_MAGIC 0xf4f2 /* magic number of default cmd. line sector */ #define DC_MGOFF 0x6b6d /* magic number for disabled line */ -#define MAX_MESSAGE 65535 /* maximum message length */ +#define MAX_MESSAGE 8*64*1024-1 /* maximum message length (512k) */ #define MAX_MENU_TITLE 37 /* maximum MENU title length */ #define NEW_HDR_SIG "HdrS" /* setup header signature */ diff -upk.orig lilo-22.7.1.orig/second.S lilo-22.7.1/second.S --- lilo-22.7.1.orig/second.S 2007-01-09 17:01:36 +0300 +++ lilo-22.7.1/second.S 2007-01-16 21:02:16 +0300 @@ -707,7 +707,8 @@ extp: BEG_FS seg es cmp byte ptr (si),#0 ; empty ? je iloop ; yes -> enter interactive mode - jmp niloop ; enter non-interactive mode +niloop0: + br niloop ; enter non-interactive mode ! No external parameters after timeout -> boot first image @@ -715,7 +716,7 @@ noex: push cs ; restore ES pop es mov si,#DFLCMD+2 ; default command line ? cmp byte ptr (si),#0 - jne niloop ; yes -> use it + jne niloop0 ; yes -> use it mov ax,nodfl ; no idea how to tell as86 to do jmp (addr) :-( jmp ax ; fall through @@ -723,16 +724,22 @@ noex: push cs ; restore ES ; Command input processor iloop: -#if defined(MENU) || defined(BITMAP) +#ifdef BITMAP call menu_setup #endif #ifndef BITMAP + cmp byte gfx_ok,#0 + jnz iloop_gfx + + ; load message before doing anything else + ; the graphics/text stuff is mixed in a rather messy way... ;; BEG_FS ;; SEG_FS ; message disabled ? cmp word ptr par2_msg_len,#0 ;MSG_OFF+SSDIFF,#0 ;; END_FS - je nomsg ; yes -> skip this + ; _must_ be 'jz'! + jz iloop_20 ! yes -> skip this call crlf ;BEG_FS ;SEG_FS ; load the message file @@ -746,13 +753,96 @@ iloop: call sread call loadfile + ; es:bx points to file end + movzx ebx,bx + xor edi,edi + mov di,es + shl edi,4 + add edi,ebx + sub edi,#SYSSEG * 16 + + ; edi -> message file size + xor bx,bx ; set the terminating NUL and disable further ; messages xchg bx,par2_msg_len ;MSG_OFF+SSDIFF push #SYSSEG pop ds - mov byte ptr (bx),#0 + + cmp word ptr 0,#0x71c7 ; cpio header + jz iloop_cpio + + cmp dword ptr 0,#0x0b2d97f00 ; magic header + ; _must_ be 'jnz'! + jnz iloop_10 + +iloop_cpio: + + push cs + pop ds + + ; graphical message + + call gfx_init + push cs + pop es + cmp byte gfx_ok,#0 + jz iloop + call gfx_setup_menu +iloop_gfx: + push cs + pop es + call gfx_input + cmp ax,#1 + jz iloop ; text mode + mov gfx_tmp,bx + jmp near scan_cmdline + + ; normal text message +iloop_10: + ; keep the zero flag! + mov byte ptr (bx),#0 + push cs + pop ds + +iloop_20: +#ifdef MENU + pushf + call menu_setup + popf +#endif + jnz totxt + + mov ax,showit + mov dx,showit+2 + mov bx,ax + or bx,dx + jz iloop_40 + push ds + shl dx,12 + mov bx,ax + and bx,#0xf + shr ax,4 + add ax,dx + add ax,#SYSSEG + mov ds,ax + call say + pop ds + xor ax,ax + mov showit,ax + mov showit+2,ax +iloop_40: + + jmp nomsg + +showit: + .long 0 + +totxt: + push #SYSSEG + pop ds + xor bx,bx ; display the message call say @@ -789,11 +879,6 @@ input: seg es ; interactive mode ? inc si jmp gotinp ; go on -tolist: -#ifdef BITMAP - call menu_exit -#endif - br list ; ... kbinp: mov cx,#brto ; get a key @@ -822,7 +907,7 @@ gotinp: cmp al,#9 ; TAB ? cmp al,#8 ; BS ? je todelch ; yes -> erase one character cmp al,#13 ; CR ? - je cr ; yes -> go on + je near cr ; yes -> go on cmp al,#127 ; DEL ? je todelch ; yes -> erase one character ja input ; non-printable -> ignore it @@ -872,6 +957,11 @@ sknext: add di,#id_size ; test next entr todelch:br delch ; ... todell: br delline ; ... +tolist: +#ifdef BITMAP + call menu_exit +#endif + br list ! ... ! End of input, process the command line @@ -914,6 +1004,8 @@ cpsav: lodsb ; copy one byte or al,al ; at end ? jnz cpsav ; no -> go on + +scan_cmdline: cmp bx,#cmdline ; empty line ? je notrspc ; yes -> boot first image cmp byte ptr (bx-1),#32 ; trailing space ? @@ -971,6 +1063,11 @@ vsknb: je chkvga ; yes -> look for options again or al,al ; at end ? jnz vsknb ; no -> go on + + mov bx,gfx_tmp + cmp byte gfx_ok,#0 + jnz near boot + call crlf ; write CR/LF cmp di,#cmdline+1 ; empty line ? emptyl: je bfirst ; yes -> boot first image @@ -1186,6 +1283,16 @@ dopw: ;; SEG_FS mov word ptr par2_timeout,#0xffff ; cancel timeout ;; END_FS + + cmp byte gfx_ok,#0 + jz dopw_nogfx + mov di,bx + call gfx_password + pop bx + jnc toboot + jmp near iloop +dopw_nogfx: + mov bx,#msg_pw ; display a prompt call say @@ -1422,7 +1529,9 @@ pwfail: mov bx,#msg_pf ; display an erro ! Boot the image BX points to -doboot: mov byte ptr prechr,#61 ; switch to equal sign +doboot: + call gfx_done + mov byte ptr prechr,#61 ; switch to equal sign push bx ; save image descr mov bx,#msg_l ; say hi call say @@ -3305,6 +3414,8 @@ nocom: +#include "gfxlogo.S" + #ifdef SHS_PASSWORDS #include "shs3.S" #endif @@ -3453,6 +3564,8 @@ vganum: pop si ; get SI jmp vgaput1 #else xor cx,cx + mov bh,ch + mov bl,#10 ; bx: base (_not_ bl!) mov ah,cl test byte ptr (si),#0xff ; no value ? jz vgaerr ; yes -> error @@ -3461,17 +3574,47 @@ vgadig: lodsb ; get the next character jz vgaput ; yes -> done cmp al,#32 je vgaput - cmp al,#48 ; is it a digit ? (0x30=48="0") - jb vgaerr ; no -> error - cmp al,#57 ; 57=0x39="9" - ja vgaerr - sub al,#48 ; cx = cx*10+al-'0' - imul cx,#10 + cmp al,#0x61 + jb vgadig_10 + sub al,#0x20 ; upper case +vgadig_10: + or cx,cx + jnz vgadig_20 + cmp al,#0x58 + jnz vgadig_20 + mov bl,#16 ; hex + jmp vgadig +vgadig_20: + cmp al,#0x3a + jb vgadig_30 + sub al,#7 +vgadig_30: + sub al,#0x30 + jb vgaerr ; not a digit + cmp al,bl + jae vgaerr ; larger than current base + imul cx,bx add cx,ax jnc vgadig ; next one #endif -vgaerr: mov bx,#msg_v ; display an error message +vgaerr: + mov bx,#msg_v ! display an error message + cmp byte gfx_ok,#0 + jz vgaerr_txt + lea esi,(bx+1) ; skip initial NL + .byte 0x66 + mov di,ds ; mov edi,ds + shl edi,4 + add esi,edi + xor edi,edi + mov al,#0 + mov msg_v1,al ; drop final NL + call gfx_infobox + mov byte msg_v1,#10 ; put it back + stc + ret +vgaerr_txt: call say /* ifdef HIGHMEM_MAX */ xor eax,eax @@ -3612,7 +3755,9 @@ strtoul: /* string to unsigned xor dx,dx mov cx,#10 ; default radix is decimal cmp byte ptr (si),#0x39 - ja s2lbad ; error if > '9' + /* Those were changed to jna and previously */ + ja s2lbad ! error if > '9' + /* Likewise */ cmp byte ptr (si),#0x30 ; == '0'? jb s2lbad ; error if < '0' jne s2lnext @@ -3978,8 +4123,8 @@ msg_pf: .ascii "Sorry." msg_v: .byte 10 .ascii "Valid vga values are ASK, NORMAL, EXTENDED or a " - .ascii "decimal number." - .byte 10,0 + .ascii "number." +msg_v1: .byte 10,0 msg_pks:.byte 10 .ascii "Invalid hexadecimal number. - Ignoring remaining items."