From 0b55965d083bc5363ec2f4f20a15e5e00e073761 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 5 Feb 2011 08:01:14 +0100 Subject: [PATCH] Adding upstream version 3.53. --- Makefile | 20 +- NEWS | 23 + README.menu | 4 +- abort.inc | 2 + bcopy32.inc | 73 +- bootsect.inc | 39 +- cache.inc | 2 +- cleanup.inc | 4 +- com32.inc | 16 +- com32/include/alloca.h | 12 + com32/include/endian.h | 15 + com32/include/klibc/endian.h | 38 + com32/include/setjmp.h | 65 +- com32/include/string.h | 2 + com32/include/sys/pci.h | 39 +- com32/include/sys/time.h | 6 + com32/include/syslinux/config.h | 6 + com32/include/time.h | 6 + com32/lib/Makefile | 5 +- com32/lib/libcom32.a | Bin 1357078 -> 1362480 bytes com32/lib/mempcpy.S | 37 + com32/lib/pci/scan.c | 259 ++++- com32/lib/stpncpy.c | 23 + com32/lib/sys/entry.S | 5 +- com32/lib/syslinux/load_linux.c | 26 + com32/lib/syslinux/shuffle.c | 15 + com32/libutil/Makefile | 5 +- com32/libutil/crypt-md5.c | 2 - com32/libutil/libutil_com.a | Bin 23480 -> 37922 bytes com32/libutil/libutil_lnx.a | Bin 64356 -> 114282 bytes com32/libutil/sha256crypt.c | 721 +++++++++++++ com32/libutil/sha512crypt.c | 790 +++++++++++++++ com32/modules/Makefile | 6 +- com32/modules/chain.c32 | Bin 3848 -> 3848 bytes com32/modules/cpuidtest.c32 | Bin 10244 -> 10244 bytes com32/modules/dmitest.c32 | Bin 21772 -> 21772 bytes com32/modules/elf.c | 3 +- com32/modules/elf.c32 | Bin 6564 -> 9252 bytes com32/modules/ethersel.c | 4 +- com32/modules/ethersel.c32 | Bin 5796 -> 7972 bytes com32/modules/linux.c32 | Bin 12588 -> 12716 bytes com32/modules/mboot.c | 1 - com32/modules/mboot.c32 | Bin 47404 -> 47404 bytes com32/modules/menu.c32 | Bin 36940 -> 37196 bytes com32/modules/menumain.c | 50 +- com32/modules/pcitest.c | 44 +- com32/modules/pcitest.c32 | Bin 5896 -> 10148 bytes com32/modules/readconfig.c | 2 +- com32/modules/reboot.c | 16 + com32/modules/reboot.c32 | Bin 0 -> 520 bytes com32/modules/vesamenu.c32 | Bin 124196 -> 124452 bytes com32/samples/Makefile | 4 +- com32/samples/cat.c32 | Bin 5644 -> 5644 bytes com32/samples/fancyhello.c32 | Bin 8528 -> 8656 bytes com32/samples/fancyhello.lnx | Bin 10815 -> 10841 bytes com32/samples/hello.c32 | Bin 4876 -> 4876 bytes com32/samples/keytest.c32 | Bin 9424 -> 9424 bytes com32/samples/keytest.lnx | Bin 15942 -> 15824 bytes com32/samples/localboot.c | 9 + com32/samples/localboot.c32 | Bin 0 -> 1160 bytes com32/samples/resolv.c32 | Bin 4104 -> 4232 bytes com32/samples/serialinfo.c32 | Bin 4104 -> 4104 bytes com32/samples/vesainfo.c32 | Bin 4744 -> 4744 bytes comboot.doc | 11 + comboot.inc | 32 +- dnsresolv.inc | 6 +- dos/inttypes.h | 1 + dos/stdint.h | 142 +++ dos/syslinux.com | Bin 18848 -> 18880 bytes extlinux.asm | 9 +- extlinux.bin | Bin 11267 -> 11275 bytes extlinux.bss | Bin 512 -> 512 bytes extlinux.sys | Bin 10755 -> 10763 bytes extlinux/extlinux | Bin 21636 -> 21644 bytes font.inc | 7 +- getc.inc | 2 +- gethostip | Bin 4200 -> 4400 bytes graphics.inc | 2 +- isolinux-debug.bin | Bin 12191 -> 12223 bytes isolinux.asm | 61 +- isolinux.bin | Bin 11531 -> 11579 bytes layout.inc | 37 +- ldlinux.asm | 9 +- ldlinux.bin | Bin 11335 -> 11359 bytes ldlinux.bss | Bin 512 -> 512 bytes ldlinux.sys | Bin 10823 -> 10847 bytes libfat/ulint.h | 20 +- mbr/Makefile | 2 + mbr/mbr.S | 2 +- mbr/mbr.bin | Bin 410 -> 410 bytes mbr/mbr.elf | Bin 3951 -> 0 bytes mbr/mbr.lst | 367 ------- mbr/mbr.o | Bin 1576 -> 0 bytes memdisk/Makefile | 9 +- memdisk/memdisk | Bin 20064 -> 20068 bytes memdisk/memdisk.asm | 19 +- memdisk/setup.c | 70 +- memdump/Makefile | 64 ++ memdump/README | 19 + memdump/__divdi3.c | 29 + memdump/__udivmoddi4.c | 31 + memdump/argv.c | 92 ++ memdump/code16.h | 6 + memdump/com16.ld | 127 +++ memdump/conio.c | 42 + memdump/crt0.S | 53 + memdump/errno.h | 7 + memdump/inttypes.h | 1 + memdump/io.h | 40 + memdump/main.c | 141 +++ memdump/malloc.h | 54 + memdump/memcpy.S | 23 + memdump/memdump.com | Bin 0 -> 5656 bytes memdump/memset.S | 21 + memdump/mystuff.h | 24 + memdump/printf.c | 297 ++++++ memdump/serial.c | 80 ++ memdump/skipatou.c | 10 + memdump/stdint.h | 142 +++ memdump/stdio.h | 21 + memdump/stdlib.h | 14 + memdump/string.h | 23 + memdump/strtoul.c | 72 ++ memdump/ymodem.txt | 2112 +++++++++++++++++++++++++++++++++++++++ memdump/ymsend.c | 167 ++++ memdump/ymsend.h | 27 + menu/Makefile | 3 +- mkdiskimage | 31 +- mkdiskimage.in | 29 +- mtools/syslinux | Bin 21808 -> 22056 bytes parsecmd.inc | 2 +- parseconfig.inc | 2 +- pxelinux.0 | Bin 13936 -> 13988 bytes pxelinux.asm | 20 +- pxelinux.doc | 24 + sample/Makefile | 5 +- stack.inc | 5 +- syslinux.spec | 4 +- unix/syslinux | Bin 21304 -> 21392 bytes unix/syslinux-nomtools | Bin 21304 -> 21392 bytes version | 2 +- version.gen | 4 +- version.h | 4 +- win32/hello.exe | Bin 5632 -> 5632 bytes win32/syslinux.exe | Bin 24064 -> 24064 bytes 145 files changed, 6403 insertions(+), 678 deletions(-) create mode 100644 com32/include/alloca.h create mode 100644 com32/include/endian.h create mode 100644 com32/include/klibc/endian.h rewrite com32/include/setjmp.h (73%) create mode 100644 com32/include/sys/time.h create mode 100644 com32/lib/mempcpy.S create mode 100644 com32/lib/stpncpy.c create mode 100644 com32/libutil/sha256crypt.c create mode 100644 com32/libutil/sha512crypt.c rewrite com32/modules/elf.c32 (81%) rewrite com32/modules/ethersel.c32 (81%) rewrite com32/modules/linux.c32 (66%) rewrite com32/modules/pcitest.c32 (96%) create mode 100644 com32/modules/reboot.c create mode 100755 com32/modules/reboot.c32 rewrite com32/samples/cat.c32 (76%) rewrite com32/samples/fancyhello.c32 (77%) rewrite com32/samples/fancyhello.lnx (82%) rewrite com32/samples/hello.c32 (71%) rewrite com32/samples/keytest.lnx (74%) create mode 100644 com32/samples/localboot.c create mode 100755 com32/samples/localboot.c32 rewrite com32/samples/resolv.c32 (94%) rewrite com32/samples/serialinfo.c32 (82%) rewrite com32/samples/vesainfo.c32 (80%) create mode 100644 dos/inttypes.h create mode 100644 dos/stdint.h rewrite extlinux.bin (83%) rewrite extlinux.bss (81%) rewrite extlinux.sys (83%) rewrite extlinux/extlinux (63%) rewrite gethostip (87%) rewrite isolinux-debug.bin (83%) rewrite isolinux.bin (85%) rewrite ldlinux.bin (83%) rewrite ldlinux.bss (81%) rewrite ldlinux.sys (83%) delete mode 100755 mbr/mbr.elf delete mode 100644 mbr/mbr.lst delete mode 100644 mbr/mbr.o create mode 100644 memdump/Makefile create mode 100644 memdump/README create mode 100644 memdump/__divdi3.c create mode 100644 memdump/__udivmoddi4.c create mode 100644 memdump/argv.c create mode 100644 memdump/code16.h create mode 100644 memdump/com16.ld create mode 100644 memdump/conio.c create mode 100644 memdump/crt0.S create mode 100644 memdump/errno.h create mode 100644 memdump/inttypes.h create mode 100644 memdump/io.h create mode 100644 memdump/main.c create mode 100644 memdump/malloc.h create mode 100644 memdump/memcpy.S create mode 100755 memdump/memdump.com create mode 100644 memdump/memset.S create mode 100644 memdump/mystuff.h create mode 100644 memdump/printf.c create mode 100644 memdump/serial.c create mode 100644 memdump/skipatou.c create mode 100644 memdump/stdint.h create mode 100644 memdump/stdio.h create mode 100644 memdump/stdlib.h create mode 100644 memdump/string.h create mode 100644 memdump/strtoul.c create mode 100644 memdump/ymodem.txt create mode 100644 memdump/ymsend.c create mode 100644 memdump/ymsend.h rewrite mtools/syslinux (69%) rewrite pxelinux.0 (83%) rewrite unix/syslinux (71%) rewrite unix/syslinux-nomtools (71%) diff --git a/Makefile b/Makefile index 03e69fd0..73b06b42 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,7 @@ AR = ar RANLIB = ranlib NASM = nasm +NASMOPT = -O9999 NINCLUDE = BINDIR = /usr/bin SBINDIR = /sbin @@ -73,11 +74,12 @@ BTARGET = kwdhash.gen version.gen version.h \ ldlinux.bss ldlinux.sys ldlinux.bin \ pxelinux.0 isolinux.bin isolinux-debug.bin \ extlinux.bin extlinux.bss extlinux.sys -BOBJECTS = $(BTARGET) mbr/mbr.bin dos/syslinux.com win32/syslinux.exe memdisk/memdisk +BOBJECTS = $(BTARGET) mbr/mbr.bin dos/syslinux.com win32/syslinux.exe \ + memdisk/memdisk memdump/memdump.com # BESUBDIRS and IESUBDIRS are "early", i.e. before the root; BSUBDIRS # and ISUBDIRS are "late", after the root. BESUBDIRS = mbr -BSUBDIRS = memdisk dos win32 +BSUBDIRS = memdisk memdump dos win32 ITARGET = copybs.com gethostip mkdiskimage IOBJECTS = $(ITARGET) mtools/syslinux unix/syslinux extlinux/extlinux IESUBDIRS = @@ -124,7 +126,9 @@ all: all-local: $(BTARGET) $(ITARGET) $(BINFILES) -installer: installer-local +installer: + set -e ; for i in $(IESUBDIRS); do $(MAKE) -C $$i all ; done + $(MAKE) installer-local set -e ; for i in $(ISUBDIRS); do $(MAKE) -C $$i all ; done -ls -l $(BOBJECTS) $(IOBJECTS) @@ -141,7 +145,7 @@ kwdhash.gen: keywords genhash.pl # Standard rule for {ldlinux,pxelinux,isolinux,isolinux-debug,extlinux}.bin %.bin: %.asm kwdhash.gen version.gen - $(NASM) -O99 -f bin -DDATE_STR="'$(DATE)'" -DHEXDATE="$(HEXDATE)" \ + $(NASM) $(NASMOPT) -f bin -DDATE_STR="'$(DATE)'" -DHEXDATE="$(HEXDATE)" \ -DMAP=$(@:.bin=.map) -l $(@:.bin=.lsr) -o $@ $< $(PERL) lstadjust.pl $(@:.bin=.lsr) $(@:.bin=.map) $(@:.bin=.lst) $(PERL) checkov.pl $(@:.bin=.map) $@ @@ -165,7 +169,7 @@ mbr_bin.c: mbr/mbr.bin bin2c.pl $(PERL) bin2c.pl syslinux_mbr < $< > $@ copybs.com: copybs.asm - $(NASM) -O99 -f bin -l copybs.lst -o copybs.com copybs.asm + $(NASM) $(NASMOPT) -f bin -l copybs.lst -o copybs.com copybs.asm bootsect_bin.c: ldlinux.bss bin2c.pl $(PERL) bin2c.pl syslinux_bootsect < $< > $@ @@ -214,13 +218,13 @@ local-tidy: rm -f $(OBSOLETE) tidy: local-tidy - set -e ; for i in $(BSUBDIRS) $(ISUBDIRS) ; do $(MAKE) -C $$i $@ ; done + set -e ; for i in $(BESUBDIRS) $(IESUBDIRS) $(BSUBDIRS) $(ISUBDIRS) ; do $(MAKE) -C $$i $@ ; done local-clean: rm -f $(ITARGET) clean: local-tidy local-clean - set -e ; for i in $(BSUBDIRS) $(ISUBDIRS) ; do $(MAKE) -C $$i $@ ; done + set -e ; for i in $(BESUBDIRS) $(IESUBDIRS) $(BSUBDIRS) $(ISUBDIRS) ; do $(MAKE) -C $$i $@ ; done dist: tidy for dir in . sample memdisk ; do \ @@ -231,7 +235,7 @@ local-spotless: rm -f $(BTARGET) .depend *.so.* spotless: local-clean dist local-spotless - set -e ; for i in $(BSUBDIRS) $(ISUBDIRS) ; do $(MAKE) -C $$i $@ ; done + set -e ; for i in $(BESUBDIRS) $(IESUBDIRS) $(BSUBDIRS) $(ISUBDIRS) ; do $(MAKE) -C $$i $@ ; done .depend: rm -f .depend diff --git a/NEWS b/NEWS index 817fbb52..39702e5e 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,21 @@ Starting with 1.47, changes marked with SYSLINUX/PXELINUX/ISOLINUX apply to that specific program only; other changes apply to all of them. +Changes in 3.53: + * Fix bugs related to the $PnP BIOS functionality on some + platforms. + * PXELINUX: Fix the "naked" version of :: (suppress prefix.) + * elf.c32: better error messages. + * Faster operation under Intel VT virtualization. + * PXELINUX: Fix DHCP bootfile option. + * mkdiskimage: Support more than 1024 cylinders. + * (Hopefully) fix installer on non-x86 platforms. + * Fix shuffle_and_boot_rm, used by linux.c32. + * Fix shuffle_and_boot_pm on 386/486. + * ISOLINUX (at least): fix bss memory overwrite hang. + * MBR: Fix booting from logical partitions. + * Code cleanups. + Changes in 3.52: * Handle capitalized F-key commands in the menu system. * Fix padding error when loading multiple ramdisks. @@ -19,6 +34,14 @@ Changes in 3.52: the menu unless the user presses a key. * Simple menu system: support MD5-encrypted passwords (modern Unix standard style, with "$1$" prefixes.) + * pcitest.c32: now functions as a full "lspci". Thanks to + Erwan Velu for this work. + * MEMDISK: Make EDD actually work. + * ISOLINUX: Fix for certain broken CD-ROM BIOSes which + randomly corrupted register FS. + * Simple menu system: fix memory overwrite bug that caused + some systems to lock up or behave weirdly. + * Fix building on 64-bit systems without a 32-bit libc installed. Changes in 3.51: * EXTLINUX: Fix failure to find the configuration file. diff --git a/README.menu b/README.menu index dec54105..1d7f52d7 100644 --- a/README.menu +++ b/README.menu @@ -149,8 +149,10 @@ MENU INCLUDE filename MENU AUTOBOOT message - Replaces the message "Automatic boot in # seconds". The + Replaces the message "Automatic boot in # second{,s}...". The symbol # is replaced with the number of seconds remaining. + The syntax "{singular,[dual,]plural}" can be used to conjugate + appropriately. MENU TABMSG message diff --git a/abort.inc b/abort.inc index abd160c4..4744aa51 100644 --- a/abort.inc +++ b/abort.inc @@ -67,3 +67,5 @@ error_or_command: section .data aborted_msg db ' aborted.', CR, LF + section .text + diff --git a/bcopy32.inc b/bcopy32.inc index 4eef874d..e3a22e13 100644 --- a/bcopy32.inc +++ b/bcopy32.inc @@ -37,20 +37,40 @@ __bcopy_start: ; This is in the .text segment since it needs to be ; contiguous with the rest of the bcopy stuff -bcopy_gdt: dw bcopy_gdt_size-1 ; Null descriptor - contains GDT +; GDT descriptor entry +%macro desc 1 +bcopy_gdt.%1: +PM_%1 equ bcopy_gdt.%1-bcopy_gdt +%endmacro + +bcopy_gdt: + dw bcopy_gdt_size-1 ; Null descriptor - contains GDT dd bcopy_gdt ; pointer for LGDT instruction dw 0 - dd 0000ffffh ; Code segment, use16, readable, + + desc CS16 + dd 0000ffffh ; 08h Code segment, use16, readable, dd 00009b00h ; present, dpl 0, cover 64K - dd 0000ffffh ; Data segment, use16, read/write, + desc DS16_4G + dd 0000ffffh ; 10h Data segment, use16, read/write, dd 008f9300h ; present, dpl 0, cover all 4G - dd 0000ffffh ; Data segment, use16, read/write, + desc DS16_RM + dd 0000ffffh ; 18h Data segment, use16, read/write, dd 00009300h ; present, dpl 0, cover 64K - ; The rest are used for COM32 only - dd 0000ffffh ; Code segment, use32, readable, + ; The next two segments are used for COM32 only + desc CS32 + dd 0000ffffh ; 20h Code segment, use32, readable, dd 00cf9b00h ; present, dpl 0, cover all 4G - dd 0000ffffh ; Data segment, use32, read/write, + desc DS32 + dd 0000ffffh ; 28h Data segment, use32, read/write, dd 00cf9300h ; present, dpl 0, cover all 4G + + ; TSS segment to keep Intel VT happy. Intel VT is + ; unhappy about anything that doesn't smell like a + ; full-blown 32-bit OS. + desc TSS + dw 104-1, DummyTSS ; 30h 32-bit task state segment + dd 00008900h ; present, dpl 0, 104 bytes @DummyTSS bcopy_gdt_size: equ $-bcopy_gdt ; @@ -82,15 +102,17 @@ bcopy: push eax cli call enable_a20 + mov byte [bcopy_gdt.TSS+5],89h ; Mark TSS unbusy + mov bx,ss ; Save the stack segment value! o32 lgdt [cs:bcopy_gdt] mov eax,cr0 or al,1 mov cr0,eax ; Enter protected mode - jmp 08h:.in_pm + jmp PM_CS16:.in_pm -.in_pm: mov ax,10h ; Data segment selector +.in_pm: mov ax,PM_DS16_4G ; Data segment selector mov es,ax mov ds,ax @@ -100,11 +122,16 @@ bcopy: push eax ; ss is NOT zero in general, so we have to preserve ; the value. - mov ax,18h ; Real-mode-like segment + mov al,PM_DS16_RM ; Real-mode-like segment mov fs,ax mov gs,ax mov ss,ax + mov al,PM_TSS ; Intel VT really doesn't want + ltr ax ; an invalid TR and LDTR, so give + xor ax,ax ; it something that it can use... + lldt ax ; (sigh) + cmp esi,-1 je .bzero @@ -153,7 +180,7 @@ bcopy: push eax ; jmp .exit .exit: - mov ax,18h ; "Real-mode-like" data segment + mov ax,PM_DS16_RM ; "Real-mode-like" data segment mov es,ax mov ds,ax @@ -501,17 +528,26 @@ shuffle_and_boot: trampoline_to_pm: cli call enable_a20 + mov byte [cs:bcopy_gdt.TSS+5],89h ; Mark TSS unbusy o32 lgdt [cs:bcopy_gdt] mov eax,cr0 or al,1 mov cr0,eax ; Enter protected mode - mov ax,28h ; 32-bit data segment selector - mov es,ax + jmp PM_CS32:.next ; Synchronize and go to 32-bit mode + + bits 32 +.next: xor eax,eax + lldt ax ; TR <- 0 to be nice to Intel VT + mov al,PM_TSS + ltr ax ; Bogus TSS to be nice to Intel VT + mov al,PM_DS32 + mov es,ax ; 32-bit data segment selector mov ds,ax mov ss,ax mov fs,ax mov gs,ax - jmp 020h:TrampolineBuf ; 20h = 32-bit code segment + jmp word TrampolineBuf + bits 16 align 2 A20List dw a20_dunno, a20_none, a20_bios, a20_kbc, a20_fast @@ -535,4 +571,13 @@ A20Tries resb 1 ; Times until giving up on A20 ; For the PM case, it is 9*5 = 45 bytes long; for the RM case it is ; 8*6 to set the GPRs, 6*5 to set the segment registers (including a dummy ; setting of CS), 5 bytes to set CS:IP, for a total of 83 bytes. +; TrampolineBuf resb 83 ; Shuffle and boot trampoline + +; +; Space for a dummy task state segment. It should never be actually +; accessed, but just in case it is, point to a chunk of memory not used +; for anything real. +; + alignb 4 +DummyTSS resb 104 diff --git a/bootsect.inc b/bootsect.inc index 69899565..00605171 100644 --- a/bootsect.inc +++ b/bootsect.inc @@ -79,7 +79,7 @@ load_bootsec: rep movsw pop si ; DS:SI points to partition info %elif IS_ISOLINUX - mov dl,[DriveNo] + mov dl,[DriveNumber] %elif IS_PXELINUX mov byte [KeepPXE],1 ; Chainloading another NBP call reset_pxe @@ -142,37 +142,14 @@ replace_bootstrap: ; For PXE, ES:BX -> PXENV+, and this would corrupt ; that use. - ; Hunt for $PnP header if one exists - mov ax,0F000h - mov fs,ax - xor bx,bx -.findpnp: - cmp dword [fs:bx], "$PnP" - jz .foundpnp - inc bx - cmp bx,-3 ; Don't get a segment overflow error! - jb .findpnp - jmp .donepnp ; No $PnP header found -.foundpnp: - movzx cx,byte [fs:bx+5] ; Size of $PnP header - cmp cl,21h - jb .findpnp ; Invalid $PnP header (too short) - push bx - xor ax,ax -.checkpnp: - add al,byte [fs:bx] - inc bx - loop .checkpnp - pop bx - and al,al - jnz .findpnp - - ; Found a valid $PnP header, point ES:DI to it - mov [es:di+8], bx ; New DI - mov [es:di+4], fs ; New ES -%endif + ; Restore ES:DI -> $PnP (if we were ourselves called + ; that way...) + mov ax,[OrigESDI] + mov bx,[OrigESDI+2] -.donepnp: + mov [es:di+8],ax ; New DI + mov [es:di+4],bx ; New ES +%endif pop bx ; Copy from... pop ax ; Copy list count diff --git a/cache.inc b/cache.inc index 0d9d453f..99ae9652 100644 --- a/cache.inc +++ b/cache.inc @@ -103,7 +103,7 @@ getcachesector: pop cx ret - section .latebss + section .bss ; Each CachePtr contains: ; - Block pointer diff --git a/cleanup.inc b/cleanup.inc index 801c0412..10257051 100644 --- a/cleanup.inc +++ b/cleanup.inc @@ -16,6 +16,7 @@ ;; Some final tidying before jumping to a kernel or bootsector ;; + section .text ; ; cleanup_hardware: ; @@ -23,7 +24,7 @@ ; Can trash any registers. ; cleanup_hardware: - + pushad ; ; Linux wants the floppy motor shut off before starting the kernel, ; at least bootsect.S seems to imply so. If we don't load the floppy @@ -49,4 +50,5 @@ cleanup_hardware: .no_vmware: %endif + popad ret diff --git a/com32.inc b/com32.inc index 6b65dd93..c4a1faa2 100644 --- a/com32.inc +++ b/com32.inc @@ -82,24 +82,30 @@ com32_enter_pm: call enable_a20 .a20ok: + mov byte [bcopy_gdt.TSS+5],89h ; Mark TSS unbusy + lgdt [bcopy_gdt] ; We can use the same GDT just fine lidt [com32_pmidt] ; Set up the IDT mov eax,cr0 or al,1 mov cr0,eax ; Enter protected mode - jmp 20h:.in_pm + jmp PM_CS32:.in_pm bits 32 .in_pm: xor eax,eax ; Available for future use... mov fs,eax mov gs,eax + lldt ax - mov al,28h ; Set up data segments + mov al,PM_DS32 ; Set up data segments mov es,eax mov ds,eax mov ss,eax + mov al,PM_TSS ; Be nice to Intel's VT by + ltr ax ; giving it a valid TR + mov esp,[PMESP] ; Load protmode %esp if available jmp ebx ; Go to where we need to go @@ -176,11 +182,11 @@ com32_enter_rm: cld mov [PMESP],esp ; Save exit %esp xor esp,esp ; Make sure the high bits are zero - jmp 08h:.in_pm16 ; Return to 16-bit mode first + jmp PM_CS16:.in_pm16 ; Return to 16-bit mode first bits 16 .in_pm16: - mov ax,18h ; Real-mode-like segment + mov ax,PM_DS16_RM ; Real-mode-like segment mov es,ax mov ds,ax mov ss,ax @@ -350,7 +356,7 @@ com32_sys_resume: bits 16 - section .bss + section .bss1 alignb 4 RealModeSSSP resd 1 ; Real-mode SS:SP PMESP resd 1 ; Protected-mode ESP diff --git a/com32/include/alloca.h b/com32/include/alloca.h new file mode 100644 index 00000000..91ef4c0d --- /dev/null +++ b/com32/include/alloca.h @@ -0,0 +1,12 @@ +/* + * alloca.h + * + * Just call the builtin alloca() function + */ + +#ifndef _ALLOCA_H +#define _ALLOCA_H + +#define alloca(size) __builtin_alloca(size) + +#endif /* _ALLOCA_H */ diff --git a/com32/include/endian.h b/com32/include/endian.h new file mode 100644 index 00000000..a6cd6d9b --- /dev/null +++ b/com32/include/endian.h @@ -0,0 +1,15 @@ +/* + * endian.h + */ + +#ifndef _ENDIAN_H +#define _ENDIAN_H + +#include + +#define LITTLE_ENDIAN __LITTLE_ENDIAN +#define BIG_ENDIAN __BIG_ENDIAN +#define PDP_ENDIAN __PDP_ENDIAN +#define BYTE_ORDER __BYTE_ORDER + +#endif /* _ENDIAN_H */ diff --git a/com32/include/klibc/endian.h b/com32/include/klibc/endian.h new file mode 100644 index 00000000..7537a47e --- /dev/null +++ b/com32/include/klibc/endian.h @@ -0,0 +1,38 @@ +/* + * klibc/endian.h + * + * Like , but export only double-underscore symbols + */ + +#ifndef _KLIBC_ENDIAN_H +#define _KLIBC_ENDIAN_H + +#define __LITTLE_ENDIAN /* we're on i386, littleendian */ + +/* Linux' asm/byteorder.h defines either __LITTLE_ENDIAN or + __BIG_ENDIAN, but the glibc/BSD-ish macros expect both to be + defined with __BYTE_ORDER defining which is actually used... */ + +#if defined(__LITTLE_ENDIAN) +# undef __LITTLE_ENDIAN +# define __LITTLE_ENDIAN 1234 +# define __BIG_ENDIAN 4321 +# define __PDP_ENDIAN 3412 +# define __BYTE_ORDER __LITTLE_ENDIAN +#elif defined(__BIG_ENDIAN) +# undef __BIG_ENDIAN +# define __LITTLE_ENDIAN 1234 +# define __BIG_ENDIAN 4321 +# define __PDP_ENDIAN 3412 +# define __BYTE_ORDER __BIG_ENDIAN +#elif defined(__PDP_ENDIAN) +# undef __PDP_ENDIAN +# define __LITTLE_ENDIAN 1234 +# define __BIG_ENDIAN 4321 +# define __PDP_ENDIAN 3412 +# define __BYTE_ORDER __PDP_ENDIAN +#else +# error "Unknown byte order!" +#endif + +#endif /* _KLIBC_ENDIAN_H */ diff --git a/com32/include/setjmp.h b/com32/include/setjmp.h dissimilarity index 73% index b504eb6d..11b18fbd 100644 --- a/com32/include/setjmp.h +++ b/com32/include/setjmp.h @@ -1,43 +1,22 @@ -/* - * setjmp.h - */ - -#ifndef _SETJMP_H -#define _SETJMP_H - -#include -#include -#include -#include - -#include - -__extern int setjmp(jmp_buf); -__extern __noreturn longjmp(jmp_buf, int); - -/* - Whose bright idea was it to add unrelated functionality to just about - the only function in the standard C library (setjmp) which cannot be - wrapped by an ordinary function wrapper? Anyway, the damage is done, - and therefore, this wrapper *must* be inline. However, gcc will - complain if this is an inline function for unknown reason, and - therefore sigsetjmp() needs to be a macro. -*/ - -struct __sigjmp_buf { - jmp_buf __jmpbuf; - sigset_t __sigs; -}; - -typedef struct __sigjmp_buf sigjmp_buf[1]; - -#define sigsetjmp(__env, __save) \ -({ \ - struct __sigjmp_buf *__e = (__env); \ - sigprocmask(0, NULL, &__e->__sigs); \ - setjmp(__e->__jmpbuf); \ -}) - -__extern __noreturn siglongjmp(sigjmp_buf, int); - -#endif /* _SETJMP_H */ +/* + * setjmp.h + */ + +#ifndef _SETJMP_H +#define _SETJMP_H + +#include +#include +#include + +#include + +__extern int setjmp(jmp_buf); +__extern __noreturn longjmp(jmp_buf, int); + +typedef jmp_buf sigjmp_buf; + +#define sigsetjmp(__env, __save) setjmp(__env) +#define siglongjmp(__env, __val) longjmp(__env, __val) + +#endif /* _SETJMP_H */ diff --git a/com32/include/string.h b/com32/include/string.h index 3bbb217e..65923723 100644 --- a/com32/include/string.h +++ b/com32/include/string.h @@ -12,6 +12,7 @@ __extern void *memccpy(void *, const void *, int, size_t); __extern void *memchr(const void *, int, size_t); __extern int memcmp(const void *, const void *, size_t); __extern void *memcpy(void *, const void *, size_t); +__extern void *mempcpy(void *, const void *, size_t); __extern void *memmove(void *, const void *, size_t); __extern void *memset(void *, int, size_t); __extern void *memmem(const void *, size_t, const void *, size_t); @@ -32,6 +33,7 @@ __extern char *strncat(char *, const char *, size_t); __extern size_t strlcat(char *, const char *, size_t); __extern int strncmp(const char *, const char *, size_t); __extern char *strncpy(char *, const char *, size_t); +__extern char *stpncpy(char *, const char *, size_t); __extern size_t strlcpy(char *, const char *, size_t); __extern char *strpbrk(const char *, const char *); __extern char *strrchr(const char *, int); diff --git a/com32/include/sys/pci.h b/com32/include/sys/pci.h index b511477b..3f9b0d97 100644 --- a/com32/include/sys/pci.h +++ b/com32/include/sys/pci.h @@ -4,36 +4,43 @@ #include #include -#define MAX_VENDOR_NAME_SIZE 255 -#define MAX_PRODUCT_NAME_SIZE 255 #define MAX_PCI_DEVICES 32 #define MAX_PCI_BUSES 255 typedef uint32_t pciaddr_t; -typedef struct { +/* a structure for extended pci information */ +struct pci_dev_info { + char *vendor_name; + char *product_name; + char *linux_kernel_module; +}; + +/* a struct to represent a pci device */ +struct pci_device { uint16_t vendor; uint16_t product; uint16_t sub_vendor; uint16_t sub_product; uint8_t revision; -} s_pci_device; + struct pci_dev_info *pci_dev_info; +}; -typedef struct { +struct pci_bus { uint16_t id; - s_pci_device *pci_device[MAX_PCI_DEVICES]; + struct pci_device *pci_device[MAX_PCI_DEVICES]; uint8_t pci_device_count; -} s_pci_bus; +}; -typedef struct { - s_pci_device pci_device[MAX_PCI_DEVICES]; +struct pci_device_list { + struct pci_device pci_device[MAX_PCI_DEVICES]; uint8_t count; -} s_pci_device_list; +}; -typedef struct { - s_pci_bus pci_bus[MAX_PCI_BUSES]; +struct pci_bus_list { + struct pci_bus pci_bus[MAX_PCI_BUSES]; uint8_t count; -} s_pci_bus_list; +}; struct match { struct match *next; @@ -69,6 +76,8 @@ void pci_writeb(uint8_t, pciaddr_t); void pci_writew(uint16_t, pciaddr_t); void pci_writel(uint32_t, pciaddr_t); -extern int pci_scan(s_pci_bus_list *pci_bus_list, s_pci_device_list *pci_device_list); -extern struct match * find_pci_device(s_pci_device_list *pci_device_list, struct match *list); +extern int pci_scan(struct pci_bus_list *pci_bus_list, struct pci_device_list *pci_device_list); +extern struct match * find_pci_device(struct pci_device_list *pci_device_list, struct match *list); +extern void get_name_from_pci_ids(struct pci_device_list *pci_device_list); +extern void get_module_name_from_pci_ids(struct pci_device_list *pci_device_list); #endif /* _SYS_PCI_H */ diff --git a/com32/include/sys/time.h b/com32/include/sys/time.h new file mode 100644 index 00000000..c5bff0da --- /dev/null +++ b/com32/include/sys/time.h @@ -0,0 +1,6 @@ +#ifndef _SYS_TIME_H +#define _SYS_TIME_H + +/* empty */ + +#endif diff --git a/com32/include/syslinux/config.h b/com32/include/syslinux/config.h index d0cb4c26..8b2ed4c9 100644 --- a/com32/include/syslinux/config.h +++ b/com32/include/syslinux/config.h @@ -68,6 +68,7 @@ union syslinux_derivative_info { uint16_t ax; uint16_t cx; uint16_t dx; + uint16_t _pad; const void *esbx; const void *fssi; const void *gsdi; @@ -79,13 +80,16 @@ union syslinux_derivative_info { uint8_t ch; uint8_t drive_number; uint8_t dh; + uint16_t _pad; const void *ptab_ptr; + const uint32_t *esdi_ptr; } disk; /* syslinux/extlinux */ struct { uint8_t filesystem; uint8_t ah; uint16_t cx; uint16_t apiver; + uint16_t _pad; const void *pxenvptr; const void *stack; } pxe; /* pxelinux */ @@ -96,7 +100,9 @@ union syslinux_derivative_info { uint8_t ch; uint8_t drive_number; uint8_t dh; + uint16_t _pad; const void *spec_packet; + const uint32_t *esdi_ptr; } iso; /* isolinux */ }; diff --git a/com32/include/time.h b/com32/include/time.h index e69de29b..259386a6 100644 --- a/com32/include/time.h +++ b/com32/include/time.h @@ -0,0 +1,6 @@ +#ifndef _TIME_H +#define _TIME_H + +/* empty */ + +#endif diff --git a/com32/lib/Makefile b/com32/lib/Makefile index e94bafc6..991d5882 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -7,11 +7,12 @@ LIBOBJS = \ putchar.o setjmp.o \ fputs.o fread2.o fread.o free.o fwrite2.o fwrite.o getopt.o \ lrand48.o malloc.o stack.o memccpy.o memchr.o memcmp.o \ - memcpy.o memmem.o memmove.o memset.o memswap.o exit.o onexit.o \ + memcpy.o mempcpy.o memmem.o memmove.o memset.o memswap.o \ + exit.o onexit.o \ perror.o printf.o puts.o qsort.o realloc.o seed48.o snprintf.o \ sprintf.o srand48.o sscanf.o stack.o strcasecmp.o strcat.o \ strchr.o strcmp.o strcpy.o strdup.o strerror.o strlen.o \ - strncasecmp.o strncat.o strncmp.o strncpy.o strndup.o \ + strncasecmp.o strncat.o strncmp.o strncpy.o stpncpy.o strndup.o \ strntoimax.o strntoumax.o strrchr.o strsep.o strspn.o strstr.o \ strtoimax.o strtok.o strtol.o strtoll.o strtoul.o strtoull.o \ strtoumax.o vfprintf.o vprintf.o vsnprintf.o vsprintf.o \ diff --git a/com32/lib/libcom32.a b/com32/lib/libcom32.a index 0b1ada4ab297b6a981c08638246d133b2c70de26..3e441da46c859629f938281511d0856395987a59 100644 GIT binary patch delta 276301 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%0A`esH2hh}g{O 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%0DV0Ei9K|F$CrwqOpC^M)tX=QmQb$wK+2KI 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

j;U-&?_aT69Bv7G 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


Z(0YUydj0Ry+4`y&7aV34=Y& z8H`z~TW(?3z@Vo%4C>V_Fz6``gAVN$81xi9{;%&A81M`?i|;wTzQ*m((JPH!KRe%l z#54K;AOceG9Y-bw-|L+3CuJqS&rE)=#PekK0tLlhr}g*3^JI&A;aPIxyPy1yXUHsW z0UjW;7tMD(JPy87I9~I;@&Rg5RLJ|ZlFFKt1pXZB=<)$oIsr!uvGX{C@7C&$IHfA^ z-?`+!wN-)t&ei_Y<^OwC;J|Z9)^?36A4e^mPp{NIuL_2f739#8?$C7$bYUUN26F~I z7wbNEMfX70AkyXc2y_jix~l9Es2W77hWF58cO|uoAymdzeM8SGuKxCFq#}MNI$kAb zYqaDY`g2Z?Kzap9e<~rpf~0?xkX}L3(|W?tmD(moA(7WI1~CWeUevW`AWAWax~gX& zN->DqtZ}xHrRX>28#|LkSn(cKxQxL4k$ZD9wY zMNMK18kgvPQrIidI+3)#)+^9Dk+go@D=5H3Qkvg8Xv&ir1oBliJ!zggiZ1JgLuH&M zDuWN!w^!n6B%4Bur^�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 seM(ht2w2aRAJ_rqjLR+(d(gsWR7@~ diff --git a/com32/lib/mempcpy.S b/com32/lib/mempcpy.S new file mode 100644 index 00000000..3788ab5c --- /dev/null +++ b/com32/lib/mempcpy.S @@ -0,0 +1,37 @@ +# +# mempcpy.S +# + + .text + .globl memcpy + .type memcpy, @function +memcpy: + pushl %esi + pushl %edi +#ifdef REGPARM + movl %edx, %esi +#else + movl 12(%esp), %eax + movl 16(%esp), %esi + movl 20(%esp), %ecx +#endif + movl %eax, %edi + movl %ecx, %edx + + shrl $2, %ecx + cld + rep ; movsl + + jnc 1f # The shrl had carry out if odd word count + movsw +1: + testb $1, %dl + jz 2f + movsb +2: + movl %edi, %eax + popl %edi + popl %esi + ret + + .size memcpy, .-memcpy diff --git a/com32/lib/pci/scan.c b/com32/lib/pci/scan.c index 2b41fdf7..0add9f9c 100644 --- a/com32/lib/pci/scan.c +++ b/com32/lib/pci/scan.c @@ -47,6 +47,8 @@ #endif #define MAX_LINE 512 + +/* searching the next char that is not a space */ static char *skipspace(char *p) { while (*p && *p <= ' ') @@ -55,20 +57,262 @@ static char *skipspace(char *p) return p; } -struct match *find_pci_device(s_pci_device_list * pci_device_list, +/* removing any \n found in a string */ +static void remove_eol(char *string) +{ + int j = strlen(string); + int i = 0; + for(i = 0; i < j; i++) if(string[i] == '\n') string[i] = 0; +} + +/* converting a hexa string into its numerical value*/ +static int hex_to_int(char *hexa) +{ + return strtoul(hexa, NULL, 16); +} + +/* Try to match any pci device to the appropriate kernel module */ +/* it uses the modules.pcimap from the boot device*/ +void get_module_name_from_pci_ids(struct pci_device_list *pci_device_list) +{ + char line[MAX_LINE]; + char module_name[21]; // the module name field is 21 char long + char delims[]=" "; // colums are separated by spaces + char vendor_id[16]; + char product_id[16]; + char sub_vendor_id[16]; + char sub_product_id[16]; + FILE *f; + int pci_dev; + + /* Intializing the linux_kernel_module for each pci device to "unknow" */ + /* adding a pci_dev_info member if needed*/ + for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { + struct pci_device *pci_device = &(pci_device_list->pci_device[pci_dev]); + + /* initialize the pci_dev_info structure if it doesn't exist yet. */ + if (! pci_device->pci_dev_info) { + pci_device->pci_dev_info = calloc(1,sizeof (struct pci_device)); + if (!pci_device->pci_dev_info) { + printf("Can't allocate memory\n"); + return; + } + } + pci_device->pci_dev_info->linux_kernel_module=strdup("unknown"); + } + + /* Opening the modules.pcimap (ofa linux kernel) from the boot device*/ + f=fopen("modules.pcimap","r"); + if (!f) + return; + + strcpy(vendor_id,"0000"); + strcpy(product_id,"0000"); + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + + /* for each line we found in the modules.pcimap*/ + while ( fgets(line, sizeof line, f) ) { + /*skipping unecessary lines */ + if ((line[0] == '#') || (line[0] == ' ') || (line[0] == 10)) + continue; + + char *result = NULL; + int field=0; + + /* looking for the next field */ + result = strtok(line, delims); + while( result != NULL ) { + /* if the column is larger than 1 char */ + /* multiple spaces generates some empty fields*/ + if (strlen(result)>1) { + switch (field) { + case 0:strcpy(module_name,result); break; + case 1:strcpy(vendor_id,result); break; + case 2:strcpy(product_id,result); break; + case 3:strcpy(sub_vendor_id,result); break; + case 4:strcpy(sub_product_id,result); break; + } + field++; + } + /* Searching the next field*/ + result = strtok( NULL, delims ); + } + /* if a pci_device match an entry, fill the linux_kernel_module with + the appropriate kernel module */ + for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { + struct pci_device *pci_device = + &pci_device_list->pci_device[pci_dev]; + + if (hex_to_int(vendor_id) == pci_device->vendor && + hex_to_int(product_id) == pci_device->product && + (hex_to_int(sub_product_id) & pci_device->sub_product) + == pci_device->sub_product && + (hex_to_int(sub_vendor_id) & pci_device->sub_vendor) + == pci_device->sub_vendor) + strcpy(pci_device->pci_dev_info->linux_kernel_module, + module_name); + } + } + fclose(f); +} + +/* Try to match any pci device to the appropriate vendor and product name */ +/* it uses the pci.ids from the boot device*/ +void get_name_from_pci_ids(struct pci_device_list *pci_device_list) +{ + char line[MAX_LINE]; + char *vendor=NULL; + char vendor_id[5]; + char *product=NULL; + char product_id[5]; + char sub_product_id[5]; + char sub_vendor_id[5]; + FILE *f; + int pci_dev; + + /* Intializing the vendor/product name for each pci device to "unknow" */ + /* adding a pci_dev_info member if needed*/ + for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { + struct pci_device *pci_device = &pci_device_list->pci_device[pci_dev]; + + /* initialize the pci_dev_info structure if it doesn't exist yet. */ + if (! pci_device->pci_dev_info) { + pci_device->pci_dev_info = calloc(1,sizeof (struct pci_device)); + + if (!pci_device->pci_dev_info) { + printf("Can't allocate memory\n"); + return; + } + } + + pci_device->pci_dev_info->vendor_name=strdup("unknown"); + pci_device->pci_dev_info->product_name=strdup("unknown"); + } + + /* Opening the pci.ids from the boot device*/ + f=fopen("pci.ids","r"); + if (!f) + return; + + strcpy(vendor_id,"0000"); + strcpy(product_id,"0000"); + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + + + /* for each line we found in the pci.ids*/ + while ( fgets(line, sizeof line, f) ) { + + /* Skipping uncessary lines */ + if ((line[0] == '#') || (line[0] == ' ') || (line[0] == 'C') || + (line[0] == 10)) + continue; + /* If the line doesn't start with a tab, it means that's a vendor id */ + if (line[0] != '\t') { + + /* the 4th first chars are the vendor_id */ + strncpy(vendor_id,line,4); + + /* the vendor name is the next field*/ + vendor_id[4]=0; + vendor=strdup(skipspace(strstr(line," "))); + remove_eol(vendor); + + /* init product_id, sub_product and sub_vendor */ + strcpy(product_id,"0000"); + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + + /* ffff is an invalid vendor id */ + if (strstr(vendor_id,"ffff")) break; + + /* assign the vendor_name to any matching pci device*/ + for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { + struct pci_device *pci_device = + &pci_device_list->pci_device[pci_dev]; + + if (hex_to_int(vendor_id) == pci_device->vendor) + pci_device->pci_dev_info->vendor_name=strdup(vendor); + } + /* if we have a tab + a char, it means this is a product id */ + } else if ((line[0] == '\t') && (line[1] != '\t')) { + + /* the product name the second field */ + product=strdup(skipspace(strstr(line," "))); + remove_eol(product); + + /* the product id is first field */ + strncpy(product_id,&line[1],4); + product_id[4]=0; + + /* init sub_product and sub_vendor */ + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + + /* assign the product_name to any matching pci device*/ + for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { + struct pci_device *pci_device = + &pci_device_list->pci_device[pci_dev]; + if (hex_to_int(vendor_id) == pci_device->vendor && + hex_to_int(product_id) == pci_device->product) + pci_device->pci_dev_info->product_name=strdup(product); + } + + /* if we have two tabs, it means this is a sub product */ + } else if ((line[0] == '\t') && (line[1] == '\t')) { + + /* the product name is last field */ + product=skipspace(strstr(line," ")); + product=strdup(skipspace(strstr(product," "))); + remove_eol(product); + + /* the sub_vendor id is first field */ + strncpy(sub_vendor_id,&line[2],4); + sub_vendor_id[4]=0; + + /* the sub_vendor id is second field */ + strncpy(sub_product_id,&line[7],4); + sub_product_id[4]=0; + + /* assign the product_name to any matching pci device*/ + for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { + struct pci_device *pci_device = + &pci_device_list->pci_device[pci_dev]; + + if (hex_to_int(vendor_id) == pci_device->vendor && + hex_to_int(product_id) == pci_device->product && + hex_to_int(sub_product_id) == pci_device->sub_product && + hex_to_int(sub_vendor_id) == pci_device->sub_vendor) + pci_device->pci_dev_info->product_name=strdup(product); + } + } + } + fclose(f); +} + +/* searching if any pcidevice match our query */ +struct match *find_pci_device(struct pci_device_list * pci_device_list, struct match *list) { int pci_dev; uint32_t did, sid; struct match *m; + /* for all matches we have to search */ for (m = list; m; m = m->next) { + /* for each pci device we know */ for (pci_dev = 0; pci_dev < pci_device_list->count; pci_dev++) { - s_pci_device *pci_device = + struct pci_device *pci_device = &pci_device_list->pci_device[pci_dev]; + + /* sid & did are the easiest way to compare devices */ + /* they are made of vendor/product subvendor/subproduct ids */ sid = ((pci_device->sub_product) << 16 | (pci_device-> sub_vendor)); did = ((pci_device->product << 16) | (pci_device->vendor)); + + /*if the current device match */ if (((did ^ m->did) & m->did_mask) == 0 && ((sid ^ m->sid) & m->sid_mask) == 0 && pci_device->revision >= m->rid_min @@ -78,6 +322,7 @@ struct match *find_pci_device(s_pci_device_list * pci_device_list, pci_device->sub_vendor, pci_device->sub_product, pci_device->revision); + /* returning the matched pci device */ return m; } } @@ -85,7 +330,8 @@ struct match *find_pci_device(s_pci_device_list * pci_device_list, return NULL; } -int pci_scan(s_pci_bus_list * pci_bus_list, s_pci_device_list * pci_device_list) +/* scanning the pci bus to find pci devices */ +int pci_scan(struct pci_bus_list * pci_bus_list, struct pci_device_list * pci_device_list) { unsigned int bus, dev, func, maxfunc; uint32_t did, sid; @@ -105,9 +351,10 @@ int pci_scan(s_pci_bus_list * pci_bus_list, s_pci_device_list * pci_device_list) (void)cfgtype; dprintf("PCI configuration type %d\n", cfgtype); - printf("Scanning PCI Buses\n"); + dprintf("Scanning PCI Buses\n"); - for (bus = 0; bus <= 0xff; bus++) { + /* We try to detect 255 buses */ + for (bus = 0; bus <= MAX_PCI_BUSES; bus++) { dprintf("Probing bus 0x%02x... \n", bus); @@ -133,7 +380,7 @@ int pci_scan(s_pci_bus_list * pci_bus_list, s_pci_device_list * pci_device_list) rid = pci_readb(a + 0x08); sid = pci_readl(a + 0x2c); - s_pci_device *pci_device = + struct pci_device *pci_device = &pci_device_list-> pci_device[pci_device_list->count]; pci_device->product = did >> 16; diff --git a/com32/lib/stpncpy.c b/com32/lib/stpncpy.c new file mode 100644 index 00000000..27f6003b --- /dev/null +++ b/com32/lib/stpncpy.c @@ -0,0 +1,23 @@ +/* + * stpncpy.c + * + * stpncpy() + */ + +#include + +char *stpncpy(char *dst, const char *src, size_t n) +{ + char *q = dst; + const char *p = src; + char ch; + + while ( n-- ) { + *q = ch = *p++; + if ( !ch ) + break; + q++; + } + + return q; +} diff --git a/com32/lib/sys/entry.S b/com32/lib/sys/entry.S index 4df2f06d..be42c8b2 100644 --- a/com32/lib/sys/entry.S +++ b/com32/lib/sys/entry.S @@ -49,12 +49,13 @@ _start: # Copy COM32 invocation parameters leal 4(%esp),%esi # Argument list movl $__com32,%edi - movl $6,%ecx + movl $5,%ecx movl %esp,-4(%edi) # Save the initial stack ptr cmpl (%esi),%ecx jbe 1f movl (%esi),%ecx -1: rep ; movsl +1: inc %ecx # Copy the argument count, too + rep ; movsl # Parse the command line (assumes REGPARM) movl __com32+4,%edx # Command line diff --git a/com32/lib/syslinux/load_linux.c b/com32/lib/syslinux/load_linux.c index 13a0fa0d..74a52e66 100644 --- a/com32/lib/syslinux/load_linux.c +++ b/com32/lib/syslinux/load_linux.c @@ -38,6 +38,16 @@ #include #include +#ifndef DEBUG +# define DEBUG 0 +#endif +#if DEBUG +# include +# define dprintf printf +#else +# define dprintf(f, ...) ((void)0) +#endif + struct linux_header { uint8_t boot_sector_1[0x0020]; uint16_t old_cmd_line_magic; @@ -225,6 +235,11 @@ int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, if (!mmap || !amap) goto bail; +#if DEBUG + dprintf("Initial memory map:\n"); + syslinux_dump_memmap(stdout, mmap); +#endif + /* If the user has specified a memory limit, mark that as unavailable. Question: should we mark this off-limit in the mmap as well (meaning it's unavailable to the boot loader, which probably has already touched @@ -301,6 +316,17 @@ int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, /* regs.ip = 0; */ regs.esp.w[0] = cmdline_offset; +#if DEBUG + dprintf("Final memory map:\n"); + syslinux_dump_memmap(stdout, mmap); + + dprintf("Final available map:\n"); + syslinux_dump_memmap(stdout, amap); + + dprintf("Initial movelist:\n"); + syslinux_dump_movelist(stdout, fraglist); +#endif + syslinux_shuffle_boot_rm(fraglist, mmap, 0, ®s); bail: diff --git a/com32/lib/syslinux/shuffle.c b/com32/lib/syslinux/shuffle.c index 47ef51cb..774346ae 100644 --- a/com32/lib/syslinux/shuffle.c +++ b/com32/lib/syslinux/shuffle.c @@ -38,6 +38,16 @@ #include #include +#ifndef DEBUG +# define DEBUG 0 +#endif +#if DEBUG +# include +# define dprintf printf +#else +# define dprintf(f, ...) ((void)0) +#endif + struct shuffle_descriptor { uint32_t dst, src, len; }; @@ -53,6 +63,11 @@ int syslinux_prepare_shuffle(struct syslinux_movelist *fraglist, if (syslinux_compute_movelist(&moves, fraglist, memmap)) goto bail; +#if DEBUG + dprintf("Final movelist:\n"); + syslinux_dump_movelist(stdout, moves); +#endif + dp = __com32.cs_bounce; np = 0; diff --git a/com32/libutil/Makefile b/com32/libutil/Makefile index 1e5c7bcf..cc093e29 100644 --- a/com32/libutil/Makefile +++ b/com32/libutil/Makefile @@ -1,6 +1,6 @@ ## ----------------------------------------------------------------------- ## -## Copyright 2001-2004 H. Peter Anvin - All Rights Reserved +## Copyright 2001-2007 H. Peter Anvin - All Rights Reserved ## ## Permission is hereby granted, free of charge, to any person ## obtaining a copy of this software and associated documentation @@ -40,6 +40,7 @@ CC = gcc LD = ld -m elf_i386 AR = ar NASM = nasm +NASMOPT = -O9999 RANLIB = ranlib CFLAGS = $(M32) -mregparm=3 -DREGPARM=3 -D__COM32__ -W -Wall -march=i386 -Os -fomit-frame-pointer -I./include -I../include SFLAGS = $(M32) -D__COM32__ -march=i386 @@ -49,7 +50,7 @@ LNXSFLAGS = -g LNXLDFLAGS = -g OBJCOPY = objcopy LIBOBJS = ansiline.o ansiraw.o get_key.o sha1hash.o unbase64.o \ - md5.o crypt-md5.o base64.o + md5.o crypt-md5.o sha256crypt.o sha512crypt.o base64.o LNXLIBOBJS = $(patsubst %.o,%.lo,$(LIBOBJS)) .SUFFIXES: .lss .c .lo .o .elf .c32 .lnx diff --git a/com32/libutil/crypt-md5.c b/com32/libutil/crypt-md5.c index 7804e4d5..c5034432 100644 --- a/com32/libutil/crypt-md5.c +++ b/com32/libutil/crypt-md5.c @@ -32,8 +32,6 @@ * UNIX password */ -#include "crypt.h" - static char itoa64[] = /* 0 ... 63 => ascii - 64 */ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; diff --git a/com32/libutil/libutil_com.a b/com32/libutil/libutil_com.a index b6e84536950dd596e1a29a0fac82542412b05ec0..6954b48e47fbc9a557d632e596c6862ec6c1f576 100644 GIT binary patch delta 13471 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 Mk;&9@^1sO{02v;fGXMYp diff --git a/com32/libutil/libutil_lnx.a b/com32/libutil/libutil_lnx.a index e974c0ef7ad4b8e80bae2ec3cd8fc8cb8d6a5375..4b08069b51958114c1646ac0dcb41834600b7f06 100644 GIT binary patch literal 114282 zcwX$i4PX_;)i*wS?@h8vF62T21c(|WNK}M;fuLAINE8t?d<0Rk5R&jwAw-g30wH2U zY_>O7!IHPMg-R>!Lo01*8!alf1Smv`ZD^@Rr7c?2D5<4N1(A<;erL|y-Fpcd+dlpG zdH>JC&F`Fc416-RTw||ZPC)w@}-MQ z<`kBeFPc+cQ7l3NmK8oA7L-)Xxv!*JOrJPD{npY&6=F&Cyu$L5QCSo+W0@43zjWCW z;tI-&3oA;9ym?V+;bKu)%Cb{(N7Bg>Sx8b!rf6ApS;d?s#Un-e!orM^qvlWmn33rj z%q%F;2?=Cu@uJd_;ft4!2(ehEq|-7+*?-eUjgnRzIVNMYw%CJtlW#T*L+Ha0Zeepm z9P}#8qQ9vkN%R*5)|+*m=KkCi55o3)QUD!iFI>3r!X6nny{>bHj{Fw>Se_J$?S5e3 z-d)!06pu4$f8MUu$Ig3KTY0P%#oe z>4X@40^$V6g=>6akNAYc=w1jFiH-eS ztPnCyx2ed8I1wu$5&)^Fc*BT?98MF$?4eSKxHW#X%wx1pP>7fw!L$(*E2}mh33vyI zTjNJafgZzIV5qm3(c8$DO{C{=DKyR-9vqh?v!jx7$)tQ)!IZ)Fve|Lov2c=J(lRb8 zGnr5L*o_9sK;tRN+#?BBk_?G_DNX)$$ICEJlsg{rrn^jXt|)h^3cL=ci*(-PXe=E^D?(&`!MS>Z-BDC z%qEz>2HTI>L^B6TB{G|2J_EKtv&rTz2oGd7#XJW^NzA62d%<4D>@YI|>=nk7Fwo#M zvk#IQWc--eEVB{pU@p;U^S_YtP-e%PuOjwpV+FC<<}blsXMB#>T=OxcJlvQ}?9Jw2 z#Evk2Mk(K7eho=w8vBWzXugHmu|^{aPc{$X+&tr(#Lh6=!QRa5Eb~ubZ((+}`5w-l z$n0G6EyUhx3?a7I{1Fu0#(7?7{spm9j2B7oViA1=(Lau&@=Ma|`B}_&A+keRM8xDn z;2C8QPYis-^SnyT6p@|^$wzvAAo*An1)kyks=yKHfosJ6!5KPKxYolx`(KX)CW0IQ z7k1Tw90)RMrF4Ylk{Ii{BIa=fCx5^>X#_Xu1J22G;FXFqW0Da!SaIH%6W~(*K%6h8 zCvXVTbq($nGave{>QEINa|)6}6*pSM`lS#~qugF0di-62aT7JbB%zL;ty0Fo)y}xp zK;VA)8zz5o6^oV%W72tfx_jM@2Stw_5X>u>Mq~|7AD$5uw{L<)$X`XtvL%a_mJeSDRq`gj zXsIM+mSlpOtf($4u?31t=1ZE&hNdNpFxFUL-sFxMUS-}U|4lK|esG&v=^7I6{=)nP z63idCTteMA2i}vmWZ*p+X$ynYVzRF6iU@gwxL^pQ#`JnT4N^Km*avE1d{499mD3|4 z(Gm8fBRsdx9XtnV-s*@$7&71z6?DmUE828(IxbOZI(1#fvcM}?_6kndDGR=pWq}7+ z76^}U$_}PD9DU^V|8c4MqW+Usuf#n1%-{_I$DBD!=g*&0A?DnA$DCy)g~fBqDwc^k zMGFfTm5TC3D@qVmzHsTXig}guWx#^clHz0;yG$%zTDl+^_XnIQBj=z~q(bRWWhqNT zrfANh^0JbWVpRCj$_niz4sl9p{-VVtrAzI+l#~`_JXNN)ba62XS6%{|aZXubaaJ(RMd$`1p(TaO?kibF{#q)+a=sY)#KmR8 zc@HdGR8c}EqvDaVV5p_b7A-)Bat;@Cj#OT;s8nW~Y#EwRMG-X2fv%;btEdPGEnZr5 z9}Gu9s?Zr?&XT3F%{iJJa#3EmyhNGb&J&qMa!7@%_vTwC=b=3EM5s~~GN(*d1DC&C z1{W3C<)?bS<@SQ)3CYyvlQYuNu1_12F)}%Inv9-USfRqN%eek(E|@YI6-bO&xO7R$ zh=pZ^Bg(7G)um%u$>I{3&tSlHnZrkBjwo8XBr^k-oXUzti^ZJf6@~L;<#3fzCgzlu zR8=Tn9hK$u)?lg022^NNak_#G1(^y)iaC{~mE|QeSXOk&vSrGL3XATmEK><-zbKNq zEUhean3JN#EfXf(ken(la&yS%kM1R7W z1mxaz@H#FhOm31(U4_Ht(6e)vBT?Q^w!2h0U;|x_X(BYeIWqEf2e0F97oq93_EqO2 zJ?cC&&J&?_$&PYf{%!j6A~d}=M|v^BPH&M=>1D87ZdB;~lzSGUMuh5}bqT#yB2;g? zLvIgZ>-~}lwaaXo-dqQ-)2kDq=^gE>>JsV22|GPJQ8?4vDbriy;C0*+VRG3fx}q1$ zJuX7^`uf@B=q+r$KNF$pEii4L6OOo_iZFlar}{ET5BApS?c;OOSnf+QaF{l_um}^E)pA|651`8tK1`n2W~g>e4@^Rp3uSetcUBth z%MRX|C+Fb|_lUn;aK^dA&T@xn0Pplj@DX8rq;MW?X>lHk;m(vH`ZJGfh;dPRF=4z{ zWD2_v>AEO?J;M07Fuqq9-#d(VwnXrK!}vtuJlvw6nBd@14^xEQ|LraF_xZ5+;xOKM z$p^nIjIR#k>%w?v2PUL1cIkdo_^r93XhBIuVTHUcUDQETy*PO$by-!1lW+JHMdf_f ze7dg-b)7S06~bz+KI+NL=%?;YE@`^);QMpkNq#2y0qWWb{(e4h15i5nCYIj;lXY{xf#xq{Yn9i8Zcn9O>8A}=eLuJ zu6Gz?N7Z+GjQuHjqGOCbNw#&z7<(p^*<%;@g(7>5eGgcB zj2#Z&?J@SvNZB4^$Nk4K#@-Cp9%EmJlrK5P{uq+7$Jl?5SbL1U4d>cp>@S10$JlYb zcZ{)P{M9kW{w8AWG4`!cWRJ0TBGxg+{u-jy82iUUjj?|RBEd2CTOkk}W4{3IpBZBh zz&+I%J8r)`#$E&R;xYCO2o8?1*Mkd=u}=dA$JqNLE;z>iS8%~G_8!1XjIn}|4MqFZy-3!4S1Mz6XG{$}h&U22jM;hW1W9)xNLVAq-kI1!vqyIa` z*l`mqLiYZ9hS+c8LH32=gY2T~aduenA021^spxu~9clh|jI;kHOcs0_%L0GPvOsvn zXBcP4vIMPOiP?{X`X+(nKYpD3Up=gDyX^nK0rrck_*+2?k1oc&lg$JuvvbDTZ5o8#;W-5h7XubboSN!=W0_shU*wb6xLAK~NdPj_>i z{a820*^hN|oIS0ZUB`g{xJp!3g(SG|+RCH#uT@Ntfi4{wm>B)+g8B33Tdk+w zZ8_tzT3b$EarN%H-Nu-gYOk&P*oa$$MZ+?Gq9W`Kwjz3r3~GE- z2CaoYO7WfBkkinD#66vNydn3p&bmFu{=D|NRD@2e;D~=pyMMfAOnc?!{>mf%YV+)v z*Q{4Q_-@=+cgH=pYxM5QtNjJ-e%J8{WA>~f2`PS&P~4hV&tJIk(5iL}oK+;$<+Xc{ z|JM!-&#XNjBNcZZ_uy~c-eLEAe$Ksn{w-toR|yEk*hBcSp+opyJ%ryw58?Oh5geF@ zKwRkX{jKqO0N)p358z9-SA;!)FWKIq)?TkpEgtb~X?XD~tvyL%f?66-Nv0UOV(Y5oPm3Cw!UWP_4dtk1+{ z-QAbj1QSWR`!Snn{vNT3%qE$)AhtiV$tG?+?t#pv&`gFqiP==sjo8bW9cJR0$bE%z z5G5L%X0AudgN)x2n`O2j)}AxiidcKj0JAu5d(Hrlj&6I-0K>d)d(I#g>Gm)$>(f<(DI$?N`E>`qAUP{t9lc)P>>jIxaL;;+_i&CLPJ@oX!BQn5y-WfVnxNv2Rya`hsQQ7jY^$o}v*TrIGpD~=BDE3~s z^$5jzdX|^mFO0N0m(m&cciik=fP6I-5QlC=zWKtaf&hAqy$(UB3OPW1^qwyN7%OnE zbge6nFD(+rN}Rt~{t^~36TfUZQxD2tpZlaxO)Oe$<*dG#UNKf7u20cIVbszbNacOK zUC8Z&P~)nc+Yi}D^dsoY2-?cVz!DEHQo3FnBT9y1sxUfQ=E!>$C^tuq61_h{-bY>U z!92rUfvHVN_8$f%>rfen(f~P`Edg|?j_xPTFNjM_HhhNp1%2}`Lc#Quf?-c7 z81|HcD|AYsV$qTkB@mokI4ul!%-VYMbFM4n&Bx7n*LCranF;1STi!CO%nvHfbMB?) zeD`JZZ*!S?is43j#=D6|a%4w3n;r*p1Qsgg3Q z7oT##s+we4=AB+(0gb+pn`t~Ndzi+xJ%VXGEk-geyJI4XX*_3}Oruv5%`~3DW0<~N zV76M(gXAxnY4i;SF^zGLE1AAVsQx-=OctjwjeExsrm?2%DyB!_e5Nr+oXRvV1XnYS z=M&f=_!Mm@8{nzj;P7as5ia`!WFLh0W*XsW3~mk|$TY%}g|ZvMQezGCx@j}@UH0}p6OyhYfmTA;?GV8rdC>w&t^YoQW7Yb!V(0Bk%;k+$k z8sViv*%RT*m_|6Jbgts?l}saiwNQ3O_!_1WZaHW?zooLwI;Ii+e}t+FgnwONPVJuY zV&EP5AaW!z6~qKdOaqZCiRmEn98vRYDznSzm3x8$0ND_%4 z#e3-VnesOZL;=nRF;V_V{${D{W}FQsTmEEPUC!<4=~f)LJnMP7o9iMT_I$}r;WAis zHD3pL=e!z@+bDh=VOQ}(RJ>=19q)C<;nhXMZv7ZKfIAo>f1XgaD@hExy`@O!xjpIJ znW&O9McyXieno0Q3<#zI-ADxdwLFvW~44LjTk;*6PzT{n)L)?$n1}v#tfZU3Y|kLEL~c$ zkTV*bODdu%H=2N=*|)IyppYrke{{CXo`VdV3k{vv)3cmBp5>h7$_h?z&Czzy&VZXB zi907$?R#oanPgGca+!SLGCc#?h4~#*tZI}kIIkEwX{hEx!{$j#?w55FoNsoDcQG}( zxUiz6w4}UTPepSM1t|;8i8|+j!>0)KTwloa^nctGo|?PsdJgYjF>&|bGL3i9JYKd4 zy}tgT%Nj`$7^<^C4_w$3!lfklw9~c9^{;JgPP0(_Cn#a2{N{BZdyp9W>#~V99osaaon#a?9M7-~DQZqvJZE%Fo;2^ zy=rbsA3E-9VREl{RUb86u1SRI^(NW&gMO{|2O>1RQ(oI^$;N=hC1#5(|Uexgp_;3QE%GLzZaqD_40K+KljHlxp6)ba_G45`8mkF*M*$Z zr*JI9{Dq;q74bq`a(>S27y3*S(snKp{_mQfn=3Fz1l{5DZx_$Uh4P;^{}yWOPoID5 z6UO%o)|ZO;BHv|Sm-UmeCfeFXftF#eV>-f_v<9RP1&wKfJ-pj}H zUOv9I`gq>U$Mar3p7-+cyqAyXy?i|H(5{*m!7jAt2RT?z*zLol_$-J2mhmW1 zHt9E+|0~N4^(a0QDE;py<|i@!g#B(I`)LK^YQ{#!4UAhDw=?c!Y-K#mc$Be|@ie1{ z+kuZUi7}Nii!qyVGUF`9Vn%xQl$X33#so$=U5p1A+Zm5Bp3wP%U1RO}$4kvGmM<(! zUszbau)BL@Wu%SFNbBbOVr#BKJ-^srUi%BIH~o3$eqjvGTd+UdV?FueU-xI5=Z`$Q zVSl!F`HT$T{%qfg*MGZbe>U|j_Gi=0f?k-RxyWRHf$4Wyd4KZfc&xlX`*Tby?`?mM z*UCHY&+%D#f8Ce&fe2K-@e7<5_w>!@T8{eSo}PKWOS^VzFxQAQ@79k&;^*VvUy(wy7Tn@ps3rMOp|pg zQxA16HZc$Cwd%*7y>I~;>}@rrf}CRdZ}nJ#VW9I&f3|7Wr?JR1uho>LWqk5%zp(0e zp1N>heoL#_(&__P_1PrtwOsysB-qkAFtEn>TJ;z2w(3(5RgWYxDbd08!-z(Rn_{i{ zWTLZ)K6zfsQ&w7Da9M#Yu+oP0JHmD5LR`kQ>U2|sI{cL7z#5mzLK0;G3CoPRiM8qz zNhc*z-+T@_Q?<^sWCt(Vp*dXbL@sKMDN7}jOm7`bNoNx052TT1E_?!MM)IUNfwcKZ z^F*RoJF@1o>Q5sHn0z~_Jz%yR@Byr*$y5hkYpT~zQknH_XKP}N}+7hmBme!Z(C&5h8I+&7Gw7&^j1C6ZjtSXz)Vg*dpTVNLH+({lI zv@Jc_mPuCq=5Sli*0xN7Eyt2A&ysG+Y5-aT>)Dn&xqQ2=CJ*#A;cTm^f&ApGE+fWP zsf@{1)5h>J&edg1_LE>{y@zbN^PHyrP0$={AA%BZILlrt$Uo;&MP^eDcj|KP(&bFC z>NkX!vsjli1?7b1!IY??{bZzI%Q*WnbY|-|3D!+1SoP*PJ3F$hjpRJ3R@3_Mf-ckr zP4$yhX8kTIX!dzc`V>4*Lm8!9p}4u{xwylu`nBQ3U95{c z48?6EH!{h@lw-10u(&5kGmY78%QnJ#pipQJMD zbIGGT7c}i}LI#3`?jY5Bb)h>*^)XUiMyl6Rb}4Ttw0VIGon_TGgcrI(7di`t_L8~x zQZ6XRWU*kOkCNuK+OLk1&I-~w@w}ZWS=?5foHIH^RTTttM*Ar;v)&|sT68j*u=&qTWY2qimpj>s1l_Ib%cA)sVWeC{`;KYa)3O<&10+ELJDgeQ|Dc`s-hN)Db2D%n7O;?;iQqe?)DrMG0}%Lcj^1|um-IPlHHP)mARU&yWR;p%@yC{WF0aXbXf~pRa zqa9_qg7%$6x_@mUYmT*=R+AA^tfm?wlB}jGwr10M_-lTWKL90xMmA_7 z`Hs>KO-8F#Uq*U2>#I!}>78}n&Wto|JIXs{4NNN=-eNLnsufuHF}KZPZP~-tq-0e* z+3cays-H{gx06n#AG+KWE^qP_J4;`GW>a7?S(~y1Yi~JAnK{qRQg&)*k)7q;Wd;%Q zuA0vV&ug~Er^uSR;IQ@U2o;5`UCCf9M+yq^{ccev$eBGZ<4;DWs%+^=j_Z#Yp0O450fLyhM7iI zmL5Hf2-$d3+1!C+@UBV2R1t#~Paz#CR9=+_=yOxJG%m#+(Iro&z^&9$DO<33GTqCX z$=tG=n?zQYj-E(Fn(Uynx$C#U&&H?uo1iFY@nouJl>=yk#l56=tM)T5>77g0c*+bc zeiS7ySWo7b-CmQdEFIlLM3&Vg*xXGO7vSGn{y>V;;zvoN(hg0q_~|pyJ6C%cSgStu zoShkI@om)1j_K=Tq7^tP#o+5FfRjdBfzC5*^JcR7XjRCd%{xfTHmYlt3utsxxa>Ai zY^t{TF$zqf8v$huHZP_ox8)prx$F@ig>Ja}5hBLQc6f%(UPWdf>u-XtpxKM5vQ;Kh z+3ankIz>BNo5~Ng1X8uxhf#a0xWJAsJI4p15gy+PLSCl#o?*kcqWJPc4J|>t52F$* z^-u-7??beVUO;_YYc+(^5pQiE&Oc2AM_C9=2l`eq{J)Ae?3_y&}Dl1CLYX!vc) zv{dCP8&K({aOu|+yInioRtj85?V551!*`G`RB6MfN~b1!OUK_#gzV*PWW(omSmRB9 z(=eyiJ4ma_0W`tt>q+lI?R4u&ZyH&ByS_U%Q=5Z5$?C(brnO{s>G+LA$miJxHhV#< zmG6}`cEMrvW~yhU9hzYD)ucB~8+|qD9d^Oaj5PXUYI6dcWkH*}!5W|7Z-SP4X+&D?1<5Hkur0hjyTyC~83i$|hTAE|o~$ zlCpIf$7<(kxAK$yWD4m#M|KW;R3=5$gtTMpkP9bV(G`jh>-n~RGotzR(^^Tq#s+4v<6c?{7ncM+=LL7 zgRBd|9Gs-`QD)Pj=H9&U?$d3CR)iQ1yzPBS1Y-s2v){w+a)JbWwdISJV=#SqboyR z25LyREPs_YNCju2ppzc4vz;zkMmbnbE_sk#QWa}8x#Yp1OHQKq)Td%JK}#B9pJM5>52WCK;EiBu75f;Pyt9nwP;F;Q2&0rNY*apZaH*C{x zc$lt?+w{|V;zxW}Owg9_=^SjNh9IBTCpz8GOF3vD8yqG#q%t)%kPQw8-7w#F!^z}^ z4cZ2cWP?WTA$UIGo1)ORID49F;0W~)OlJ+8J`L^pKDl6Hu>6y47xYpM zh~_IBC6J5Tcsu;VnB`j{^4M(PScN1!=IDfg0*^U2XD+f80F za{dLSJknp^ZhP8VDyLUl*+(TjqI&^HPU{=rY3>CaX3b5V=eZXE9f6&!yq$c^M>bXk zX(u1^oma}E{Pkq)Q51N6BmTt2r^?2HSXgRK;pKwd%FLT7t6xmPFU!%L%X zTcF#Jk8MDVS8PNc(B0k%!;c^BZ-OfMjitF^ghQ=Uy$mhL`_2uz5wxeHF#8Bk55(p#@j1+4fZ{ ziIShI-Kv<}s!bPfn0$<*Qpv~C$-0~qxp?Efelka3BNwcgDpV)gV2o)Hy?%-?GKI^H?XmXk)d7mXhHsCb&8jOr1(ZG5`=}D%-C~ZjJ*zK?1%thKQ`!(bo9ojiM zsf4sp0+T1BGsh>(rb(`Fl-i)Y%_6P9dQ&CeN!6m1AXy~8@LVwYV!G;V*2UODbw$bN z_%d_kGxjhPAV)f3DiQJ-J4O56X82x?ysIMhpu#PrN~wh+C@j7ZRG30`Q#rt3$vInL zLM9AJYErHGBqEY!lVp8)N3EP>KUqLN&?{w&sd|)3D1qyxoDaI*39?qP_J@V!4@W5n zP)S#m1o8xV7x57x`ww32>$~Ww8mR|1vR5pmdQxhk2o8ASY|sI>QraonoT*>~n}cPf z>xfA%ktTbTM5M}2J^RL#&DNw;Rj5ESyGJUOO{s+Yq$Pg2b(wOiTm%gzNAE~aY-IC%Q4%tZrdI+bKJ)5?lQ+G&8J$U)pMyizBGQNB)wl5#U$R*44<)eaH^JZN_ zdDS>Z1(U9NR2TIKmvDTRpDYq|mkO#krEoF3%P`wrPLsPV*6vb9?sCH6F7m?B4kfaf zhjlUAbm?}T=SSaNbjG&xjz(Ta^{3Pi<5qb3Y_L&mr!rDbP{uS$0M^pQOp;f9Sw#Npz6!64a6)7g>?H&7F_*a?O zNZK09`%2$DZcLtU`4#?qy~YR5h`N2*b$hZ^^aF2UA+3-~1GzCtGGkZ2FK;f!-(j?=%PRod!u!6Q?Xt%^FUx6524G83QT2fL=QGTqpmJXLAC!RWF zB!e=NQ2BabWzyMae0oXU2T$&&h4A|)codilyb62@5){zVz`DIjWD4=`+3)%v*fRqO z>g3|O-tgMz*dRkD((6+DYV;1>NFzRUBMrTCMuc%_v*$=3A|T#t^BR`TxVkcx(IvU4SdZo!rrSJyK_X?dv(u1 zti4zFTCnzB-CH1R@728#DcgH>50trzu=nc5#upLxUflk*l}4aY>h25H-mCjEu=ZZvSYaJu@4Hcr zltdc$;6j6afI?7LC!;(a$FJ+%7$iA#vZ>t3$t1;ix@FM>aEaS|TkUEt&m;eEiVVw`Y2C^O=U zf#SIDWAXo&q^$7+YJ#JMI(+SL`fZ4ItwV{BMlX65;3#4~Cbxq0i$cBf()(JZat0#U zt2>@v4>+IiK>~MTiw{9H)8`AC!k%~uW!NhN=k&Q>7%ocGFMoaKEf!9@euct#0E&;w(0=onX^_8uMax5@xF2Aq(J=b$U@CGWw5()XVrjABqNK3b~td(99eunUGge- zRVB@tQ^l+paF3M3F7W>qF1I&St}a5Y=D*w(Cf6D&_oS3tDP@|%w)ij z;fuk`Mw|?VBgaL^R%W2TYwR@8er_2mL{7A9?{tND7FUQ;u=M)OvuH$*NcM8P+HO3H zWY1%Y5mmT8s`r(` zxAPg^;;2Imh?zweearfEwe?Bl5Jolz+Nc@{G zJY!~=A2uBOlDX+&v+_-|{B83`W=X>bt}EkTqg{qpi+|=ApEDsh@8(-3-a6^F$y08> zBY*0&=`#vu-Z|^8y9?(PNz*J?xabS_EnZT(wCw(6Hck(Qp3nKg3M^`pmJ zI|pg_#3z3%0XIFppGuM=tVvwF&x(%6&F8yA?D$*5;?b}Uf5Q1_7uZwhv+UzCnrM5U z7Vu+O7I-7e-pKh2mt8_(>j=Z+5r+PxV^5bQ{4>OzfGQ%VeM!Qv6sZM~)~|)i2e3`i zw8t9k;M9XH>u?uyi^{E4Ag~FjWX@KDzl}y755N%P!G_C-# z+azY~3L;{NS-%3ram8#{0b-Jun2jqy+}eYf%_~4`>q*R(6(F9CQ+ZnfVo)z)wygkh zO>bhhuK+PGo|xtpAns2fX2%K;9es$|xdOzwzQpWW0b*q$F?&~lc%(lutt&uaQ(Va$ zTmhn25;1KnKrFb7n8PbTlwD3t`w9@RTtUo{6(IH}6LWM0hz|!5b8H2O-(N{g#|jXA zQi$nX0U~k;F(+1lKs8C`*p7z#&$XE5$S_7gnT9vp4#A;PfZ8abc#;Ow6fHbtz89TrmCm)t3ceP>S@C&5Ra&O+PDftv8t!d zt3YfSOw5*5AevOAZCwT8HC1WbR=s9d+V)kt(y-arVpUJut3XUs^|ZPg#Cp}Z)>MOd zR8?9-HHZ_c(i*El{7F^X+G-Gqs-D(YgXqoesT#x#RZknMLENS4X>&D*ovLwdsRr?! zs6rs`>XHHe2*JvCQ@xL?)Nj%pCcRO8xN4dRrlv|ZI8%2hq>tp@RB z)wo)#K^Ur@4pxKcrRu4z8pIM+Plu~PELZi^UJc?k)wqsSgXmC|cC;GAU~W&_0(AnB1P5HiE0q@R6U)no@dw7>1th1y<|PTuNqf#6^OUFajgWAqUveKN)Q9N zajgVV$&G6zh;nXRD?$8}8`nw@-{8iz62uX1Tq{Am#*J$wh#OQrwXXy*fg9IK5KnUB zS_xtYH?EZ+2C91MSV@Gcr_Pli=Bau*u@XcjH?EZ+-s8r#5=4Zmr?V?TJjji!2E?P> zxN1PSR6RA+fcS_TR}F|lRZnYcK$LLfssXWs8&?g8P29L@Kja)zh(B5D%+* z>Zk>AzpAIs+WYN#I#H|Z2>}&Xson^1xuVVG{HWvXjX?JCt5mP(@k_*?QSlz&u}XJlCJP;{Jvd)!$v=+9RnXev^?j$)_kSR^oUs456>lA_H?{7B`@ zC}cmcGDLVsDk%bdf~W_0JBd!e-4+e*9&?Y3{u*U!+HqFu==R+yAdO>#O#F+o5lo*r zKK)jFWNj3H(8ZNuOecJ?!<-Z+rA3Y00MIP)Q{68)qvPGQ4B$1Z_TG-tw$ zS(Mk&bDZA`yLj6`+WoDYn*bIqEu|gjg1!T#D;!@y3*Q~_lApo~ZW&m-XhBJN*#3ZO zXTM+`=Fw(=kCz|aQJ%`F0XXTbkgHUkXX08sA>_^;Xs@L#g^ zUsvDna$b4#^(cJbzs-}>{!0D$e8}OFJA`>R%QZOC65`VP{z1;UXO@=3_@3bihun7^ z0h-JSlN)}Gx=e@5h41_4yG=epc~m)I16_{regF1lsQq{Jp~>)l|90G=&PRGco!;m9 z9KBCpPL{sntHa>m5~0UK)G;?p?Jum4WX5U{n!mkLZkvPG_QU@A&iw7VL+#gy{CS0) zzlTL=dSxSJw>ZY;bzD=J+`w#k+jQ_c4*L;@*g4;}i}U+k-xHzfEzh>gC>(L$5uxcN z=Bsfoq=!B7bb34ZoHUmEKiNX0Y9|x6o%e`Py+5DO^*((E!{j%0ah40e`xg%Z3 zIqMe3_K8AZJ{8mdpR`Y3wrp>69K176&chl0@7SkL_nl}@CV4)}ku3NdOTn*fX?cf3 z5g#5OzK>teF#glNqZJ>4?(>F}mW1rx$SGXSQ1dr<0W1HY_cch1U z!rpj#Y!mU$E{N)L49^@ndZfCsgUqz=qQSd<=*`m6U0PDIq^PXg*;&MtFTUMF6Qi-} z`(EImV{Bpk6ME*dal8kVW{4W9@W!DkJb-Sltd1t|^7*HEs7h}q^KUSs#{Vbm;rCyR zdJn&68DC&*XMCISLq_^`m5;w&<>PNxNz7mz&zR3Rhq07#6=NggHyFRq_zYt!p+|2kx#=kP2VZ6+(@LI+(j8%*c zjE@3cVc(>ZkK!9S{%OV*j{ha&3oQ3*j&EoF56quu9^a(^rg~I(7Et=(80PbU@;9IP zB_5Uj{fw1-{tAw7VEiVBKgqa*@t2IhWqhCI&oTNURJsX_qZ!9C&SflSY+!6;+|Jm{ z*v@!_5e*9HVN7Kl#+c7IgRzRShH*3F7RFY_gN!E_PckM(DNJI_X3S+QW?ableW0|% zkC}gp@fo1B*Uve=mH8K$f0_BW7(ZadO&J(#D!JaKO0O^D0FJ+c70jgeuMf)aUb?pW9bINWpXoV=hFwREzFULe_1 zFOU?AjNniX)#*E2r!S*mKCWgLt)Ws&0GOW65JBfB5??@(tWX17Q5Eu; z*GRqAP@mwXuV@+9Afvwoi>-f+YZ3To`HQ9^YgX<8e!gw7*s^N|{lg$HQ>_y`bcK{f(X@%`RXhOukA8lgz7EsY1c=ru=PG5Lerb&QO}+F(B#8m za$k;6z7Z~mi=$I-g`>O}Nzr=0E<)483ejW-ujB9?F=u);j&cBXdU^~mjpbgD>D>@k z4*Z%$s9twe*JEzahsmW!iI79bg^#&G?!_+ToOO$1SFG|Y=hz|26F%m4!W;UX24|j} zhco=&Ipzi*{q%2RgpaZH2;;-Y*nGlyeEPRB;_15)IB;#k7}%ALcuLK2UkJJF1n+=L zN|s=vN$|HPq{>MWyZsG`o;?24lgFQW^7vCv9)Ie|<4-+#{HZ68KlSACr=I*g*ptVf zdh+;FPkuh^$!%3)E#sFNn>Zg|W84IkCjU0aZ)5()%so9WR@ zv3L8dP4tE_UiYT=s_#y;HqkricoTd!g(O>>W>H9rMf)B2?@qNg(WVsGc#^gkxjW6; zL|dWYMRMBr=I+tfCfcKC+E|OWEAmrj+=>2t&#B)Idfz|MGw7q}1A&e4Ra?IBa?7v! zyJvaSeuIJLjF~^%-(kHf#m+$NmFNS;OD(@nF#hPL_ge!y$GldSoMOFy>bHaQJ=Why z;N_Oz#2KgjO;oIjp1}H;_kR6+i$xn|S!ZNYuUa1s`djn?H-)quh%wGsO*IgvSF8gY z`~N7e=I@j<+DZYLGk%ABZ6Yap>s)5-ntflog|nvQoVlB;au>uzC??aLQ^sclWOLH_cF4`_ZXfKW9x!IP;aS z^7Z3;q#op}V71CrAfaE&fjHxRt6;6#T1B21*ctQlmuFl4g0;wyf67|qhy-KY1#7K> zHGbM^C$MwCmA%&9=Py{Jvb1LKl(njq{oSk9s4ag28`HmX|AuoY+F+?+${MQig!q;N z2`Jh6Q@^zew)>wVHz`;f*x2`x3Dw{A7i=Fal}uT$%NXarcfIw>sYBM3t!m>dnNXlP zW{}x@tG{3?3cFqxHbxd!`OwZA<_)?0Lw~_~jRCwvVWSrOKk^e zok3BzD&wb-@%tf*83bFA>y4sf6qUqVepjA{({XaZzML*UC>|^Y*Uv5 z|EkS_<}s(A`0H8gkjmQNf(91s=PuZ06>L$hF3>#S71z=Q{wZ4qPigQMG(d2hvPW-s zQxm3DYxC>3Q>Oue}wfXROk5y5`$ggy~WDh8s#|ZrdBCr;6=%<<%$QAJHXt)ycnN)23C0tYMan}zod?xcGrrZ!yj`oN94fsFmEJGb zPCwO!UcR`FeE){$yU@!O`rL0{zNQPkeAip|yN8c!y~az1X`OMSQ_%84tZ~4~_ZU^C zG0W@NcEJBUI!7No`OseUnZmYK$n#oxCuq|M-=#K<@TpBB5}cbxB<#qRX<7TP{te9q zj9KMdHk%8@< zKd-anvJb;Hjp%S}8j;AGMx5ws(}*NpGW7{1+B3pG!H42aPp}G3wsg3y-F0t_t2=Z3 z1JOIs|G&EJc+`$6BCOmLGkhBed*6o>&V3*JZY$D1!DHR*@lPvq*v%HOz+THnDD(I@HE%QsX7^tKoJgG^viNEiO$^|`d?~QVcu2~UJd|8U1fGxjyF;gN-sVSYdX~au!&DjUqE$?43I`8qo+$Ts z5pTNj`FdBBo4&vvr297EoWj8-4Q7NJgB50!8{<1NkW=Y{C%H)1F(gbc*hlP^ ze`dL^jKuhaYw&LRD+iGf_@%SvpP&ASH`qZq|FD%oC(N+kzj z4FB|4r6T3uWXbkiB#il}f^1@ntC*cG+1`VYHnBC5jiGaD*D3KxxA3hD%P?U(qv=`NfvBf}H;FOOd%UFSA zJb~!vqIL0}fReW)+kcWw=JQhYC-P@}cfg&J9jN)Fc`nNBWq9Yg7n%TGRZdafuBPbX z7a+N-;6A)jfqJzVbAzAh)#A@E6Ne!QnuG(<)honmW{$GMGjoT8vG5hVBJ6%u41aE+ zYlG3>H8|eeC z)Ogp`L|oP1d_j`tx=a51s`&!_dlRX=V7@F>aESi5aKxK8jWb8M57usbY|-D%wA*%m z<#F?e2h6)RxuebD=1KPzUv!tg^n9Ipn>o%MXU;e8F)LkBYId=!c|qrh92#NxyS)g@ zi@x-`yJ#M-I?fA!cNgyVRY!bYo#$aaiitdRHQ$&nLMIWyXRs_Vi)FJ|f4FQ>G}6v@ z2B}Xg2WR$9%iqToG#zkWk$}|(kyuvw6-5HRrbxgb7m>qVyuM0I2V^M{uv?LUUlMsI zpjDB8-z)N7S=71IFz*D+QzYPZMgC2~NksxaR3xCvLnPKK`4tHWC=xIvf=ECrk<*4t zxIO}QuH5$EbCUQug--?SQY7G-NFp;Nj8r7xdPM>rQ{>kp)s`Wt3I+U4k$_W5piI_uxv5T*uw0RV8dIep;kXI~yr)RO zNhP3tU?FZORIk$jOB7jdsBf9#{j^#Taa3E=0KF8MAmJNIWc7m}zNx|iTNDZSz7kpU z;7zi|vZ?ZB0&)}y*rmwdxcU3EVkY3QA^~?&mCnQhwnd5r+^0yudx|^{P!$buD>72T zCROJR4}#dN+yd}zMFM7^q0VWr_q;DRQ-hIz^$%LI;v2~arU4#NBtCF`xranHJP2YiRq`~z z5Jh4=>{Ci);b)2jJflcJ0@d$ytTMeqk%J_xR-|9TBgz*5>l6w2suGBn zb?a4C4Tw`DfR=@d>5oWQr$Pbi6$$vd62P-jwDJXjSCN3;Lw@pDq)l& zwcsyg?Clg3^mrscHAWQ;I9<`^bbeZJW*xE*#HgYH-&EOn^OHqAz+)sj{g^EpEbvmv ze}kffy|h}%uBM>;F9lMXr$`M>4Tk9VJY}}> z3yT5jb<&UpUNY2v3FM-cUl%Xr3cffS5~>Z@#iBAwjF*3v6)v;07@h!IUA-r(-WL4_ zm%9CDt@HXHu)fRb#M-sP*LTfIQEP4b@cEEKa~;CGo8>S_mhCt%nK68Q*WA!0B9~m> z1-U9mfF^UoU^XJ)alI=q3Koh zQVUb{q05VPV9xY9u2S|xdNIOI52JU^^sq!G$5C%Ot~N|ACrRyJ6)uNOh@5&;huY=9 zY8|cjF%g>H$|So^g(L0}5t?4wP&ICV^qlWrev8l1>$bij(`yK`Gk)7dsNTVscfD@w zsW7>zmy3`?$Az!kg4{2=kOR6L;oGm2K4_@*XP>lg%P0LR&%uY()g{9J9qYDaXD2uo zUHIL`;GNoD1NLXwM`kxSM&YCAG)VJ&6})U~KV-xXKX|7Rmi|v% zBUaD2f$_VH&5R!~x($UfhRSbGModp&tye#ePh-5E<8Ndf$8xzGe>?NjnZK9$FEBp9 zxQ1~Z;{ldG#OeN?@fD8$Bgc0z{~_bY9FDFJ60Bw5+NE%e#?vEykF?RlbRdOuhWBQ%3tMz1GN$Aa25$ zXP?19G)+0b|HD&<0(V`oW~Z3nqC_!&nx$q$>vvU}0ng=6(20HUm)DH+LA!{1+O=j^ z#muoO71Qc=n`0=Z{1$(JBxvPQ9eo zKcPzcxYwCX;NFeF8QoQ;MRVjoM**xeXRW^lOHucZVNFgkX)arf(_7?H$a?t`#YpwF zs%*4u2y@oo+NjOJVu4LqPGFyed~_r2OQzS&6!4LT0Dbl|I7Q#ZiLwssU#lG!cpid* z%8gcg-N(M#2<(IgrKVM5*K6HzU;S$j{$W2QiUju4S2PthHb`YNC5;~DFxIc?jvEy@ zQq6~ZjEW@vbq3C*!-I|w&~fT3%Feh$$17V@1);S2Jt@hOROM5Pxh6Yo=8XOYsIVN( z-~SN$zH>t^%;Nsov00g~=GcLuVilpPh6 z9qW+IamXGbS+A76J}7&WLw15g_B$jiCDg)OlKq@Rc8o)|nq(8C>^K?vj0<5U6xR0% zm|)+8zO=8OcxW%KxcZIQi;u3>hSD$Hoxz5P`h$eYnja@T=u^6{ zDn}~ERThc?5z(Hr2>TPxii{aAi-=;=H%IK3l48q+F%&Q3Vo8Q~xn$^d-f6L=lFSt9 zEep{j75yK)3}d7lAM)w2BDBVqJs^xUNIWjoTSUyhE~&VpiYj4bAkXe~>mT$DLM*d8 zYkMsgMrMa(dX-Bm3;KGOY04`z+Ix{OMj}TTiuchQ5Ti0(IC)!bTzQ!=u7{!sH!gZ{ zB{q+nyN{O1jGo}qpHzsG@uQJ@wNAkohxjqmUBQJ5(H_kA#=~q;IBmROE60f_h@I8^ z10o)Jq82&>vxN_@s2hW;gBs(}Z>5c4Tr?EX^()AFS%bYe!qM+5LdJrt8w|bVf!vvw zHVie^J!i%j-+sG0_Shm&0nNuZXuciyyIzoJi#}Ly1 zV_ZrUc)JP)bd|yi(y-10q!)$6OaO}p2NH(J)7QB|3I#S-%~=9wC=!#J+dLtH_5eI~ zpuzQryn2pw;IMdmoJ3!lag-M>#(sZvPQ_BZ1Wg0=b|Ui9lHTp1dc7}W=s3Ln=5cTc zzw43re|WIHi$QkUVKQW>{o=&bz`FA?u%vLoq9RdNSYG}>u~<~Gv`|{)|A`^@usslE z^nd2t)?JOoJN@-iWAV*>)R=f8pMR;b_|DMb!ArhtjSOsd$R#s|kHteS#u1>&oG`hV zDAhv4Hx}Uud-6xI3ThVGSEq&-X+yI^F?MzhXBR%I>eE2?yg)t&zB$e--;(np8 z)9Sz+VxdDWnGqd2r{28|y|`#=y=sRD`#8qqHTuwbz`lyk^bRH}T}aP47XM`tn%-!s zY+@Jn@wG6y)m}UAPC2|s>eSomC2-2XnH3TRXRuyZ}jT)cJeuT z4q%r|@9wa2;J06d>K!1vg2NrWj%y2(o7hu?96Bz14ghjTyO4AG0FKeJ%YQ-!;+BE^P=ivzjkbYNWr)EC$AC6zITO6P9o zD-9+05c7|+{L{?;lH(6Cf0{7{Jx$qx!`gB1&5Uh~uey|;H(l!dcM*P>TJ=Qvax09M z=(=1!H8P*Vc%xgTf4f`d2OW2$`)$TOEcYAc2YM8Kj`2RmRUVZNwjYB0R>sF8m}l(P z{7@gRpFTW4)Q3k9BwojOBV!KZ6vi2h_b|?9T*6qx_+`coj6Y-iBjY=aCm7E$V(1e{ zkF+ws@r*PtB%5Fg<5~#b2vdu?bdvyCXKy3bZ+5ldSqy(yij%$4S{0*IN6P zUDzT|ArsanRsJ2p^1ssyLnUgD#pgSN`84Xu( zf41+zX+5Xz&rWDu81aq$*@;iSQg_Av?4}LMsdaCRv+`4=u&nf>yWDvvD4pCC4_=T>P)WHf zJFi{US$APv+`~VVc{sHX-O9K%SdvtCAv^Bj|J&Y|z*kXZ?{?pNlXTXbkN|-s5cVAs z2nqrkmH?&%$+_l)xNj@ElddwR#}J!3t+QHiP1#|!mK zgH&QIYwam-Z2iJZH%)CVvXX93N?F}0QT051;=LjCs*%34cy#+#gr_Fz6yNR2j(>KU8YD>wGwFDQjG7l|Tbr_H2M|`FN0?O{ZTePge0{5H`DE!nUu6ilRjS3 z!Y8L>y;jsy>T<7f-2f&&Ze`LBB6$3;drc^|BSkw3hIqV^8Bz3+y9gUE{j_`Ir|yj( zb^h30be=M9@4UxdgpYNr*1njvZ*dpFC>=`CQOdr#-RSbMV5Db> zUGx}bKY-$N3hvOojRn2)p8T1<0=bf|prTFr?NC^0e)G;-@*8(91~or+-L`9M|)6>&F&&xjL0IW zvJ_H1O8{~XifVU2M%abrJTO6fe6KkQcN;xg8$I-e;v3k5oj-LK?V)bj-T9!q2+!#% z7q*%TGX~{G6!xMyJD23Q@lI8a@9~WX4W1st<3UP}2bpR;8xnlOV0*~!?er^- zwXV$jiPivTezK<+35A;)79Ks-Vym}T<3=J-xXI;Nf_N;pp4GHmSk`Er)W~I|v^d$P zvbCWyscMzfRn~u_i=_Cetz=D5|URy@m zsx|#*dP`-8sG7GJsbz7Zdfs9*w=7sBdRJ4+Pup_!{Fz>t=uDNL_N8~gDpBKO=aDW) zyPkDu^x|H~N;5?4OD@!(+FJ^qg_Mx8N_Tit*6KZ6o|N@^56zRZN$(NjN!hCR2=}CH z*Ly^HQg-P*qCF|Q^&YW>o8t@1e!YEDvB&FM?cNwPLa9%X(1=;jn|NR{LJnIf(8iFVNB zJykaT9OhWz7pneYeob?H(4%F~iL~Qx{WJ}}m;_~yoU7v1ok+7cQ1P;H=YIc{oyZC$ zbw({NibW~HQd(maUykYPl{G@zP`A+NztsvPdv1H@U2GM zJhQaIADnYH(D^vOgNHPTH3a77Ly!Y|1T53~c~aNly!HJcbz6&4PS7tk*wTfT{i*(P z`KOhLW`#A2*qC2v@oDi6_ro}oY*QM02dQGUbFUd7P6#RD)I6&UiMUVgUh@&XU9*Ya z1=26M*K84BeSfjH>K*D3x$zF;HoxOBm0oTXX`RpJ2a5FK9R*(;A1#V07sY(yUQ=)c z#fIjU}+3IV^`&!qRL{t_qvY9+0y*IL#dcc`N1MxKP(D5a{O*l&{0v)ccP$u zC}=~a_WVvkg0;r5ij=7QD%`$b7#xYuMKuezkl{l;~sZmU>~*=@dJ zZj;5F5XBr24f?X`0s12vbizp`eI-izUNng2$q{FD8Z_I|Ao~CXcyqWxG(bmafJTW@ z4vJEaiT0dCDRV28a+UVnd)4-k(*se^5p%+g6vg}?iup`5=4%uaUya6ag)!TvRcs8G z-}z_Rm`l_cl=6)z<&-GpbCj~hQJqqz87(QT)|^I{9TKH{E4u77N?G$qP61z+jSxkg z6-AvX-Z6WiR4fXqG~V5>=pUCH_b=WwyFK2@v@QwVe=YegL?qO)uN4k&mebq)m*P!x zYST(osx(xvoy3AD0?KjcHizQd$qfI&*j)@gEkd(aU49GC&uE8s_GQm%I`!sT7S;_| zll88A*+i!~+rmqyGUF_SRTZDvR5T|g&y&Cq`dtv0xpf5U;Z})el7pu7nFb@^5*?$To)If zh}N^u>$5ILwatY$Diy`wc(F1dl3uJd-pJJWjZ8oJMrNRV!!gLvt0=+t zS2jb8S2jb9S2n}&%)%Y&dr=as@T%V4jIh6kS;PJ^XQcgA%P6~buA26jG;0~Av})Vm z<&3tPzRle4bS|4i_Cn}K` zIly1Ww)SJwV{L-f0Rq|@rpVeQ5j_D)402+{#v4s&?`Nx32ebQc3h9dbJ4-`-?_{a? z_exF0_fzo@2M>=Ou-V0S&E5euzzLHTs=pI=LrfE9cz0Rzb7D`ZYR)t~iVJY;5*hr+ zXqmI4iZ^AQpE&8I)p`Q7F7%3RS3%Y0uCIvOcjmPiVyp}tI_OM`ndaZpK7)3%991VphIqV)l}CX3-( zyeK!I7K>3DN(`vYVzjm#snIOPYIu<&pbm@i+80n2!(wAC7X`(#*j(ESF^LC*QYWW~{RUapEs)o>MSyE~K|)-?)NdL@!{2)T;?aaC7JH!lE65RzYPb zPFjd9gub)Z*k&RY52eEbaF^$9@wY;aboW)%D99*{%<$B@m8AG!`T(u=a5;#?SXpYt?U|O^TrDi z9XSjly;0o*d2#nIGG9@9;c!B~N73`yltV80(lObVQ+p$)vtZ?{$l;3G2lc^Zi@Z}& z`$E7?(8v*rdNYJV2)T-S3k2Mhj?7ckeh}c1BXXporb4LcAiHnstq|~zbL3r$`WFZf z3ZWM6G~>yC?SYCqq|Bv|>!;{nMDx@;K#C^AI@uKb2fBAC1!sehL&1h145J_!#2QY) zyV0CGDL5C|Mj%*gnc&iU+x-(2brz!V^1abWCX1+7eT8j6VF!g6(H1q|0M>aS))}p+?_jb-(Fd9(=z-dT5jkwyy_diuKk03gC zIjP>x_?(<6igTxva{r8!olfLv0CP9a_njaq^-7Qr$F+06E#E$wZymV%C|~_|&9KyQ zfOSN`UJO3xbRM(m_|l@|ON$N;FG7y5Ec(8d`Wkk@X%T(hS*67q9sO5vR_rVKsnM9c z>5AHk`Xpb-ji1E?l`=MwjcHzVqI@4f9wF0F3QT%6q0e`3P*H|sL28paNbX7^OjtIh zvAj{m+;uLPJG%*a4!w!xy)&B>qh86fl?AJ2HgQAl&hpxs%|?jxu-b!UyztU&DL zsLgfQvEaiCwHL|Gg7q_-;0BYL!t$n>u`bM=-XuREE@WcKL1-V6H$cYA;i_EWk3e3E z;%`y=iR#18M9d2!@_kVdjDR&CUocKl2T<2EAxleHT+o4;u_I8>K$>TbM8+1F-^h60 zpW<7>PF>5U_@}Nv1|?=zpw#*{iXDJrhpAXtVg4(2uqnR@ImeWL5^}2u@lOirq4?Ih zBAhICLoEkkdxbYm+D;UqIrJu6t6qYQ`JBM)WymS^lC2kuz)d31az3)9iP(0lNNWP7 z@kFMh2|DN}MBrrvU`6d5^6f=Fyy(-;6+o4VNezU}=`MNl790CQT7?tE1ec zO_nCT7-BRDFXOhGNOfx!86=x?%F>+ALby5Ns(_mVFND_S(0AqBoHn7{oPMF)ocvIu zIfGP7b4H4?JmPPs_-md&ZX)cgzDy~2Rrj#?s~2pfjOUcaBKBKxrBv4~=Brpm%jjU) zi?C(dC_Xt7PAy!?Gv z$VqDzZ&GUBfoe6q5&{O^0|-QAYxh&smXVj!HH zPmn>8(Fo>GpO`nL!iQ{|#c^=cD}`UvuY7+$=fqo_Q6rr(TD+rmWM}OI$Mq48knOd=d5skrJU&oi@)MGb$@}gW!rPF zX;Ipa^@D$0ukGrV>aIFx+gEH-cYY+)5DBShE8%T0AQ-%D1-+UomoI%6~{05P*g2G)Xe7__; zasx?@CaNrZu)S=p-xQK%`fru4HJmJqZzGF;lJsu3l%8)X{T3NMFj$)ZWt) zw0@3O(Gu$H)H-M#c4~>@zxK~)1)m(ylC=f}TB>$u`lnhgtutev`C!O_=IhsY@^{As=WV=L1Vq|L3D5txt zV^pMLbfn|%NCd>cBPlS_2;31lRlB>#j;GFQUyJ_=v>gky1v{LlXNyj825V1#`r$Lq zi;Ck;^^i00n08~4*6z_!qqPD@5I${GnoMajqoA?!8^6XK8!MA16pYWE(yhw$|LOOQ zi`xCQ$AVthPx|oErq$1Xwz_=C=B&=ABTnDG^!}S3`DAG9%ZpwLIG_$Gtg*2;vGJB! zAp`QWH%|WbUx(+u=>Pc>`KO;KDH;95u?PBW{9)UY68ElWLK;tKUEb!UqWoJvU%v8= zgYzy-%}Bp-(YS4i%eFUjt}LB%`#WcYk8bO;;KfhUN4)1hszr;a;-EL1b!rgP_VT#a zw?>9`%IrTSC~sZR-Ba7{*nD4c>&cHiQ})iY{YKVZHqp~>^K5Y)s&bPdD;4inmw|K}|u?n2L|8MydMm&E{ z)IHmaG)L(}7q4ube|&7((x0EZu<^`2leW#RvRAAB!}}|^&3mO3oPZ{{GbzN?&*gGzN&9hv*=u4|0Y%X z^-Ke7q+lj&j!K)vnZ40C8MNlvL_{)9>Y&sN5VK^^N^C&HbO2IeIdqnhwvqotLBXCGy%(G5U`bkX}B3c27r__vjsjI znAe%QPLM9-6hhf71YRW-8Q43lcGy~;V&*$W`Gz}4I64b~hlrg1xPTHFH1hQ~^L9B01Tl#1BdvsXIQhJCSv+&vl_WZGOTdd^Ru-Wl%amI z6~JLKtO2nCSX%+^Bw1eoF4HWN6{$01b!M2E#~R7wMcih4*|@v(u&a$=}g&cx*$xFlG~&k{KUa9EO8%)}KQlULZti;0}R z*x#4F%$EKc9+xQ#2ysCuIt6g6TUHV{)=esKf%aSkF>vJ+QiFnzii?#eBdPYU3V2fn zKM?S-41O)(90k)4ieW?_m7fIDI9$RdV+aKS zPf;)(7vmRY5LXuX69im6jFv&bcnYTD;$VjiekR~MNr)AV|DO6G6W7L#sO_1k`Kc%h zb}=h%RBN%X)QmAcr5Oi=mVT5y3y>{?fFh~%2?0xG@C5;H%3uj!d5fS!^mu4EWdqcs zU}j4JU1e~LfP6{7=)53fKN9en4B~Q`{*)|0C>Ng3PCH^3Qy zUKGp(+)Tl&emq}AY=(e=GWK=>LuD)`a9+hpoCz2!W5@b}S>pv1NCIG*Bmibgf-%V+ z6B7*65GSme9c%gy=dHfOc|@p>v3+I_ld;{$s1+dE6Clq#Gyf9cW9;%V;!MWJGY6QA zk9~}W%n*k*(uc~Rk$Q&^ZwRD{!!^${GPqs9F&S(xR;)LID2N5_EjpUBa8Rey5tQ|< zfI4&pW#PE}LI(dO4yFTiSY~|}WsHxnZ|(~)%$ldYFQAr2!43i*l)+~;!)$%pX#wXo zTc!7kJclWJI`WL6)O0gXI`X)w{^@AdU>Sq~&XLp<-%9X=(DJ_2gnOn(t}%Oo$U1|v zXT0pwlmVOU9Y|Bg3<1x|AoM#(QwEfdl0o$JXEKPM?o0YJaHI1b8APZ1Q>SO(oY6`K zjS5^2FpB!O>VMLgJrmiJh?t2ylVlLpJ0OFo-g3&Gi8?iw%etXy5;qi^-kH$F^Khwe z9uD($#s9Rd446bWdL@{AnsEqh1)vdv`EoplxC*lT>GS*I9Q02 zWE4)cesr45xY>86@DWP{>3}5S+&e)M(|qR=Zk(tq@aWREn8u zo^;Lm=sP=S0RAOUzJSuJ=D{KW6O-6h1HCe=0k71wZ>zywO>qlc!1MAXd)}mm7}QsU zd`X^ojVKtQp_`@3GBL+8LW~=<(ry7IRApDm`W{cQSPcIjV4f3xFaCfCmj{?@Fc#Ab z*O1;-#NDcyOD7h{yEM7HWoy^YyR1p)fyQFctW7L&|vYHa}DVqiSUs?b6LRx zawbr&56AxvUUe;2@xaPkj5!l0=ZzeFkCH?7r0y&j`S03(%DMSA7*HCMldp`=o0h`{ zsK^)r%fK6pGPTG+q@bvVdCh#+#G4MYvkDBqox>9c*2u2 zVQg;Bgpng*y*p>z@X2HHCQq@L+!C2`Cg)8l5P3xj6O}xnXKJ33GjYNcJUy6DkbgCs zTii#Z$B)j>!PD}QqsNX#=TK9Ij~G)hQNR?T$|zhA^2Se4a&jgP&rMXOO_-cJMH!nn zGCya+RMApY1ZvnBNY2#!;dhSBGcwzbG?XwoZ+I^27ZU0$`%YH>&guDiQ;bX#Cr=oW zH)TqWHPU#f0%KYe#6^96-nfZIKgdxRoi!mhuaXXOw_%QouLe|~iTPw!4DX|X z7#m|6jh8LYfn}@_Qznkj8IdT2$$59@jmYo7me+(rIaDHLJha+Pr&;p0w+bE1&Y+4J zZ8p@~x-n<6BIZX9Dx1UY$eC0iTH&LO6k|K(E*cdYwDuA@NJx^<5!w^*4>dz@dQ6xw z)>jhc#mo|o$mKpkXUJl?$9)}$A>@N@M8TB&3F8z?n`Il!&Jsn@XjCyZ@d%8x_P#ka zMHwl}9WG%acZ%J}T+S3@?#h8heMRjMIX*8hH!oKdE9N3P$7-6cvW2-RJbm&fR(-q#Md~wt;H`3)vXR!K z0uT1Xuqmm?t7u0K2A<%u5A8r7812YV?D`frRmgLu@iWpY+L7CxRXsa$ms{BLsr)yN z(P(0POGSCwQjvJZ>59F6n?#51vdBjN6)5&{4v6{=`oyYl(=CcpuZs3o{8{7w6L#d>9G1@qrSFzuh*0r=Fxjp$ zo^v7{55|n=n~=qF<9nV7IUD&^xn8N2?7{^pd5Zab6a0Kmb20xx#hf#c@s)kNV(NRw z#&?k&LzhLi{wmw03sI~;r(!oMcs7_=%H6;z;cACQlwe z0cZK)`J*R{H~aCJ~yP{&+%>u@W^Acl6O(I^0CEq>*9Szt~v53zKl=vPaxp53*-$sJBE=ZP( zR~CUkg-CoiRN~e!Sr5D<=x8XeKUw}IOzNqD<58S2Qrt3qfm^1(%6NgXX1K&V8D}%@ zVEme~LxjZJ82`z*hS6C=VtvL@jD?KvGnO-67b!7=@vn?a88Hbcjt) zKgJP^_c1PI+{5^q$P1fuZ!>Nd=xC-WAG7=^<6*{c8L^`Nu1&xgwh0)+uSLYLO~4p7 z1|Gw<>SEYuR1Dh$jA5IAF>LEDhJ8lG@O~tQeFMcv`<1{47#A=uVtkJAb;b>h?=tRX z{EG1mBiU7(w>9%CEE zu8jQ{2Q!XlEMoi{oT{#>tG+fr2}W@jhT}X@e5!^I3k1@m0ok zjGLJE9?KuH{0+-z8F5MjhBDS=Y{r;azL!{D&FOD3Zs7D?jC+{(8O!A?pJf?eO;W%6%lH_^W{e#e`!VJ*PGT%%T*A1V zaW!Kp;}?wIGhSfy3y@fg5f3iWj;4$)17!VfV7!TWx3GL0%Y#|YVfk*BC$K!5@kz#4 z88YV##!yXSv?kNzSZ>a88PbFET?O-Jp&j=a{5%p`94KlJRXAuVYN+ zbU1dVerFuRIDxU4QD=Od^FPD#^NeqBd@0L289(Lt?^!<0c!lF5gQZ-Xu}QFu@62*H z#(o^1!}18mNgQ9yvd;K8$G^<-Ym6H>eh31=XW!_v)_pm&lm- z$8s9W*(^_ExrpV5S$=|Xk9FTttAZ`vTBa@CG?x3bJdx#mmglql7|SbJUd1x)oBXS^ z#oIBl{WaL)y}o0oglgL2J;qN}f6o^0SaI&vy(?ijVoyoAQ}?dF45M?1@YM56b?Hmu zVMJneW7v>bLec#+&yWz^s~~=f%Mu^%84{&?!zn(>5+Cgu603XfqWH0v_;}Bd#=19w z;*%`#%{@a}>)v4$pKFOv@C-@Py=fHR-xA-+Go-8TO{Vx>_;(*ZiC6SJ`X$doP@K0U zM-J|#-;%5k?$!CoNpQWd>;?PZw!K)V%paXYcrmk;xYNs!A>p6HqG z(k~=_1|yVb$nZtUm(hVGfgkIq$QC7A!zlSuGa^MS*&K8)-5gC;D>+)ZVnl0Xz!K5! z73VcG$rl%GYN5DaOHOL{eS_j;!?p*W@+>@$F)R9HA{u-k@Vp4-{{qjCsJ2FSCc!AY z7%pvD6~2OY&h>haB7^rw8fN-8%rn&G>AlF4wOB8H8cG)~MRe~2o~+NEz2`?}J*F2g zqxcp0ce{Sjz4U<7z4Se&Uc89n7vtX#^ds&Sha=r9K8*BGe4?l%QW7t^SA6PUa@;?0 zd*VSSsfv`Uisw`I$50#gSVsQb~=}yNB!PQH3R%Y_m7zXy+1lu?qV#G_^f6we=;Nz+JtSs)DKQS%|5v7i;); zVF<-wYJ0p<6cbI|7)vpC(PSJ;G25YM$u6o~0_jg8{kuv3UeZ5|wB?fiL8R>tib*4F z{VAp|X-lP;WYSMl+k2GsAG-`2gsU#I`NJg$d0dBvL5Mn(E5KQF2vZ~Su|t>^&f=rg zFUKl%`)=y?y+*g!5ZzwG(x zf4Y*MO{6E9^lT+PG$O?mPh;m|AY#@d>bbpO?uPBYJIR9;|)9$6e)^RWW zuukGBk>Z_4{fW}ll8BF;UbH-N3ANnYoMukzUvOAsgjLUyzBHv$DS@WKY7D7|rjduH zkzRZN@e4nv>d|m*plL@_)EMl!=Os(6RXTVh=-~A%q?UP65tRUHlOq(6=H(|L(1?xBjSbnr&d!CUwWPBLOWevgh>bM^5Q z(+N0QpXl-|q{YW;o>%ouP45@tDW=6|p{zf})57LiLW|Gpv8I|qLQkw`AuT@MB#WMS zy3@QZ(b=)ZY<50H?KeT##W`tt)&(7gfSbsUn)&blE%zCO>ZzevNXA?v}xWKrI#kB zN=TN_OG26iY~&QSg4IdS{!uT0AuK)Rn7&W{(9=E5lipw76Idec-RdbP)?#bbD&>TJ zw)3{B4t$(K(buay_@6P(RggJzDt1T<5K)$bWEZV;2l$vwk)ESc}7jzs{Lj zTR&U)l~4s!TgS>;|3pcJ-^?lgDL>njlja>bNFPw9@0NDGVUj%6YHqw<;iWlKTj>|x zMzvsV{P;PTzntrR5O?K$*2YuHeC^6fEA2xa=gI!jQ(zeNGR%&r>M2L{0iS#Nrg;YS z*SC3+lRa6z)a?-m_1?*PRRd84*pqU!Fj;K9(o&VeOUg9A!V43o2CqG( zkS+2Ljt8!t$U)D5qlKGA8;@*PFPjn7P$Y<*p=!jYxM!^1Gnob+XD~k19ny1p?YrJ9$2E^y4{n#OXSbq zRdKgkF&&0wt7z#l&#hu!1sM%>>F*V84#zl(i9F)0SVdA`uw6{F6JoY_@(-N%%sg=U z|KawY@Z9>j-fPc!Zt$MV*q#qKQFt-XU0fT-*7m}!sWyZ4i*Z?2{1BaAX;0!Uy8N34 z>p^mQX#Y}egY`HYNrUysW;0liB-3F1JX+bYahC?`U%PBISdVz0!FmYNU_FswupUv; zU_GKL8mxzIyTSUKRK;$v9u&5m4tG3OgY~zlR+I9QC{4;=P<+Wx6 z?fp$Q(!nhsW$X2UwqEbfU1Zp+PgG&^6WOS$6cT$=x&T)k`MX zt3RSBHhc9SQm2r;`mIV;h4Iw}7e@B#pEpPRpNh0sk8bwat1rm03`zb(i@Ew-X|6t7 znyb&MT-pXIjk|=*)pwER>XXEHBy=trIX}PU@sCVvqBI&lYxT$sYxRa!&xVICS8c5x z7f+?Ml}7YWv;YLav^)|DH#N1Jme)K>5HGFO(^_G(R!`e^Qc+sG*r#%yp>lrJDygZ` zT0OPGX02Xs?-B1^5-kmx))5;I7?qb-lPIlhDMwMK5xZ=`Psl>o3kS-+Iaevmq{>-_ zR#w~(S_Z5XDvHU?7QFOe&BwZYov4` zB^Hwsho?9n*h4Jr_fSCd6wjnUh$m$(*?TV{d++ne-upv(k62I2e7#4!C*?7{M`KUQ zBE3g*Ps(CA(Mfq)?~&k1S*rI)@}w-&dvx-otk8ROE!>=3Se`6uG3~EjS!yMV_p<$G z$>RM=tHpbxH!Nd4`A5Uz{Yt~)J#`3cdHfuh^Q-CZFhn5|Rf@w)WCtWyd%EW2F6 zZaz&~{e0O+XRff_{15VLit7W*O|i26XUT59oYrDOmi0VarQQ4sMxUbHW%bTh$8Ns8 zr0-CRGh{d4EbWssWH;Z=+;m1Bis#ENo@KlFXxs1D&BrFjw=R}?3bewL&bb?CTL8QH z&`_n_{8Q3y{weBAHV>_qw%EoA`dQe`N84dHf40CqL=EYtG1iJQcS&f-D?UC zUd3+y*~+%R`>5U=hhbv8ns)QINi*gJ|3Wcu2UgScw_z>aJEdA?*CPbg?dp1gsNTr< zW^)i#e8AVDn02DhcK>;YCtlJMC9M}F?GX+7=1*$S&9az}*r&mUKd(XGxTvHuQPM`y zppXBg2F;VjyaVq$qCw?-sNewD>QZdIxF(udRN#&Xvlq*XTRZiJ2 z8g$}MYLLGy=798XQn01!6VD&fpywP^(n(R$R>PBu{)aWlx4d;0`hO_iF+0({W_N|^ zcE1829NsA^{N(x@@jc<6qmmB}Y_3E=IqurlTUC4)X!n#E7fos3;VKCm)5~w+-T+;D z!Vd>sQ`r1)&~sp)ACCEQA7$~wK@VgtemG#}w6Y%#Y~CxS`uuRvWo|`39E&VF#KH}9 z+3GHWvu1N&XZqow%TdD*2ioqtX44Or)hojj3pA~~wcM=o<=M^UmTS?$-wHuqd>trj zS6;1)ukt{#<<*ar|B5TrOXWj+UugE>%rCm&<~2qzymAHQO8^6_8o zt!hui7Chhzd-Q`Cs>GGqs-Q`Cc!{tX?>GGqU;qoIvy8KAAy8LK=HJ2Y9>@Gi& zD!Kgl3w^GGpLF>#s38gRwXGcv`JJER6_Lg+KXCGK1vuN|HDP}zJkFagKOS|E%a4nA z#aVOSC@78q2VRu+>oOL3;b&e8aN?C|SAYYC;MwH|%+9mR4;YuXyZn$P`dohe4KQy8H+eux{3t*{rpu3G5KWgK{t!)qhkD3rommjeZO_v`qXJ0*+ANaJAU4Go> zsLJJs2Fd601CLDp0GA)`8=cbq#UOF)gu~|tB2e7znA^4fLQ-;Y7eO|BexwECzPlPd zl+p$%As`JmR0k*_L!EY?ALE^tqOT|s2ZZW0D7=%7HoO##Uky?_-0=AkNiHOYqbCPI zBu@atk@qekM&&E&2po%e2vc*RP^9J_7HKaDvDVE{o`;;yg7wp*hAZkw)Mpp+-KnUf zAY6hlLQ(I6&{E`&%2m|S5XM5tQ`Ea5JPcu^qK<*E0m3Ln9Sh+Kgu4`V90VL~wHt_- zd~rD(Jy20+l#9wZ7nIGYa~uo7y&%=0&pl>RkbHiSr;a+^K_E9Bb>PTFokKzTWMVD_ zd!RY@QILFo+>c=G_nq>4tZ4ZBSUj8>TQAQ`Eg9-l0H8!xGY0+n-Wpq zPcqd~6~o{Plp_;EoxKg6t)?jvEByFV(_d6DU@&Q>!x*s37_emyW56z>+c8V!fL(?T zI6{eCAe6Kexi^ZxICA6QkcUaZ*m~smgMC%t$xZFUg49J6Q=f<(DWwlR(}@ogEBbg; z><}GvsLbP`ijwCviu@c!E)ZgkSkOKPYo!qDj#kvem@+lbL+MfU19~}%Jb!$FBJhAy zY0w*ADf}upKF=QwVcV2Fe>Cjmq%c?wPs#Wc+1psw8WbUSo{0B({%BZXx9r>O?>V8{3>G`9f2VCjxqv1j`EOoHwj|S2BZsAqvIA+uFrA5b=79AX( zj2vHC^s(oUCSQlL--992^9MTms|Mm!COWn$*{vT;eUd2TW|$Hz4~0y#V=(3OK<*;b zQOe6gj;jO3cc>`CxnS9xIDe!MWw~s2a~jNH?CN9w%(&;lAI|dH>2ZCXw1mjReE#$} zxS>%;u>9EcdgS^em*jLY_v(%Cd0!|KV%!g?-bnVqv1oc+DdbTsFP>ii4AkF6G7Om2 z-w*YpNyg`j^=m*LL+bB=JPQ1=>N!#Ue+oJFRdGC>5yA|yA#OpgKc-RN#NpaTy~pr5 zGQEB}X6baAXzNABmYCqk7#BwItvU<2RU7=%0PmA4vBiN>>tV5Nsox02-cNoo4x$>( zO&KP;>bEiFzX`c@9YIPZJrv(&jKBPxp;ZpHS$HwN-82!34hErhs$gS6Couap5&nlr zYV({391ww4k0Tr2vPxJ-S`#skCo=sCjuElLYI9ZudLi(w2s|tTtv*9Oe7~0v96*(c z?H?qKdd-Xw)6mi^Ym?p&u{SA1^i%6HZqg=8lafP?CgJU-glSZ_)-ge{Ij1bmf#(it z4h%QQ=HPQcYjfxj;O1-#<>nj<<>rKj8O^~}udg}dMOm+irhG5{T9AW}2c?6L*m-yv zqlTzs4I^bfrz{mIkJb`}h`)M1Hx}dYA$RP1xXh`oC{x5=y=jWtgj`U}rP&3E)}Yu^ zL6Y$~vzij?NoF-=R;^&k=p8Lt&4{(0Sza=4P#a-X6+4@j6QWGt2ME7X0>M4#bC*J zm04|w^&+#{Fe^SpGNNK6t1Yp1GpjALdWT5Hz07JytP9L)$1Hpm1IE|PN+4F7aLGzw z)*~U3ks2#miNwlcRwA?3hDgR5X0<2QUzydOS@6{XMqHd^bs*M8W_4heD^xNbWL6Tf z&M+&9SuH~)<0P{>602#1WOZZ~zPJHnP(8`Ij#z`4bse){zZZ;mm~}m|9%k0{%vu~O z87=BdRwrV;$*fMy+8inwUS@SB)^TQamaN)HeTNx05F@IFWZWPbN(ffwOvUGM#MvIp zh@<^HEVJZy?GEXj1t&OM0m5W%2Rg|OF`To=bDR{1*1+nEwR;4WpbI&6gisbH@?IzY z8W$-zV@T&Ladb8uZgI{MN9V&kDX-z2Wl@-=igT1&k6F{?>D@(ys1V`ax{r{{HR7aK2f6`pR2XCmCgdkcPgB<6gyN~<^pFQE#J9G z*bvAai zQVl0AyV!}#D(Na^7dvrTC7rnJCpRj~W!ipnqq3absO)DaF3Z`8%P|+cs4SMmV?IY1ykZ)B#}qhP-46dTg~whP4<9mnFLmDlKQgN`BMRY5=H(+JPr{!} zc>7gt;8W(N2A3AWugtNqA2!0b%;vu>>jwWaO;~x0J>k=4^2?{5fnS>wopbBLw@veUBO1ZKP5FlV55vbz z&FR}-ho75PnUlYQubaign|}Afjm_Q**u1Gh>DmYO)H{Ck{e80zes|BF@h9ipHtXEm z6KYR>Y1AqI7Zz=Q_T5<{f?f^1u+g>Xrihq6v5_5vC&d)aay2?P?X%{OHZD!R_vQE6 zuiv<%X3)kbyQYSQFWx#TuIHK_H}2fH_ubT%v-2)5ZZYTf6Bqa0@bZM6IkgA%x#gic zy~fV1a#sK6equZJo4$H*f97hwdXV;{QrTAz?$+SEY{aKN=zPFc=;zamnbU_M10@Z%;vWs5U_XtmC770>@%x$-`-~3bN498` zbO18ICC79l4R_@52VXPO5n#r7AH!`j)>;{teT*c<$9Q^%Md7j;7WyV1J=LVowbJKV z>5F{yT$4VZ7~%esF{73U%<;!JAQXO6(;?tm409bZaKDcp$b`#x&}V#I^!oUy8TVr(6H6iu-mF(yS2arz5+it>6@&K zqdo>AMrm?B0Y}TQHk$8QTIUmFzd*?a2FS1$z;`Yya^nJNmc^OLxz^-(O3nauhjjBiD<1KxbKBh{Q$UcA|}8?({b|zToSD0QX*#na4Q7| z*mT@aVe&j1xrE5+C856bB3t@{wNRS{gt+}88UeUaOI8vXU7J+kcF2R##K7H*0d**d zn-Sm1;Bs*d`g(n8$Tk5xW$=)IlN3zf7cVAK16dvre z`cMW@-4pQ?yuqxkQLT4;rDp8)Da|MnS%0SN0|Q03B~aI8_7N~b2FLMjED?N5z-oLk4FHD3d|JX$lTJE5JoPJ}|6~yt5>NQNCbis(^tq2)IiU^7#&w2m&6E zgx3XpAcF_$$XiPySf{R{;7@QH3+PC}%>9pX#KFxJ9C%W| zpg4+skZ%ET@KFj5d`CcwdK8O0HiOJyE(Hh97jRL=;xv7Vx5seO16}84Gw*#%>hwu8akg z%GeJCd?I6wV+roLaI|5cF+Hh)Z>f6Pw^Z$l@-dc9?`|@d`WRip#JMp{ZcnC93G*?Q z`4~M+#%t4On2gtaj6Tc|%NEiLWza~yPl!XqX@sW?7pGqSR4$z@mszlk@di*NaRL6rK2tjHMwUC1d&+8_b1 z$lx{spUWU@IL3zCDvi5dPD)Kjo&_>!=1E7M4wNSyt(q-^lSTdKQB!;i-X@{x3{@l@ zPhXtj*OvXCBI{F>J!7{|Q$|~%X%JN;<7olgWDxqBlBNtO^~fN4`d1l5Pv1@YGw{gd z3mHVGOP^mEI3M0BgGL1!_=@_s>L2OLo{8*(h?t2y3uO@1yCj3C-cHJ%i8}R`XD>t3 zSPzI5w8xhmYfk;E2d1cVZj^11(dlY%1Wsf4yoe@{-=j#M7*oLFEYE1EwzgfGh`I@BVXE6pAq6(8MW3-#fGF`T^msoVtpBfEy(Nk)JZ~|C!^+> zsn~x+$JmIUh?EmD6~L)@)-}gY>>|Vr8I@tCV#87{gE+T7WbcUQMap`aiYH!av~kG* zX`!7MB2pU3)J7%|o1M315d6jVJX1xASEhPRBA$jdp#4t<_|Mz(91^4-B@w_x?3p|= z2>uFto<1UFs7xJd67i($j0}Rm+MefCk@Bugeb*#n>vae1w=%$AZ_g7gQrgMXb|w)| z(YDAS`0v{D%n>Pnm#NscwW%+Q6r^2tV!0qGG8NC$7RjJ_9g_k6C-yvPB4w0J9aUu> zgSg0yGB1aGsaXDxHINsJz;9$&1L9$v^KThC0k`o_%o|t>>u)ARphFH+VCo-^6zRLV#ay?7P>Qq}b*bbr$vA5ay0T{@TgPdJ9MJ-n{uChBT_q1biTH9Ld)V?03FmdmQ#LBS&$ zxk6=k>M_x(pL zvglG2a~se~vHOn#&-x(C;3X(hpYa24i^G(Sv>p|BLz>84Nkv{o|53TarT<*C1ASn$ zBSW$4dnHM1RGp@5r2R#)>+3qEdj6ws?_|%X^4~Z{qlt3`ZiLiI+*UpRQNiie^B=WyK=u4bT^OL)enuMVY8g)AeOCp~ItTFkad7qgN9AY#cl(c$ z&#X=VQD~FlKgxLaZupNfp1B+Tql{UwIc{@gHT~oma6lu5xE&^B;A6LMNa9sOuB1|1oFToe#JTa z8J3sVl6p2GUYs~ib9%ShGJP=P^Nb~oVbKy>G8Ql{U_8QjiLqxLi8+kR8Q*0LuPd=N z<8;P_jE5L6F!qdLeT=U#?qH0Hm6*UdoAIBFUo)aFfwwV^VO+!b5o3HkiCq~VWPFbC zG-GIeiGvvP8J}ic%UCK9{;rydIRQUbeHe2XXE8p__&%eCTRvjBi)4(!ZJ}nO-&k(X zcs*k>BhCQ->+kCSKYv$IPKgZ}6Bws3&HxJTY{vV6;uwCA(-*M(G~;WG>lsU!x0B`F zEPu=LkBpdOz%a%b#^#J28GA7Hamo7hW6X9*y>~HAVVupVGd{-n6yr;bt69%mjK6Zc zpP!Ti8AJVK`HlT#dMl1^$Jl|>J8^msmeU!BF^*>bIL67$e~8l`;rPEZKEdfPaQeSk zUeD>97`Jlz$BYM<_a)1xSiZ<|pufZ@e;MD9u`S~bj2Vn$8Si2IE8|kem5l2dKVU3l z{E<;%KT;u#af~ejWINh0CbIvj?u@;em(Fq)%fne7$?_zYr?UJ2;|q*y7`HKg!TeK< z=Q!R^lUS26UX$rfSWaNMBg@Gwr?8yH^6i>zPd4LtPM^)FGw%^j|2yLwjBhfoXMQR3 zcd@*m<-R9@ zqk*y>Pcgp4{MT51o8?l@|1rylSU%183&;BhNemB?@$rnUIld#~jf{Oc{q`VPpKQh{ zjMEssj0+f_;{3~5euZ%z$A8H3$BbWa{5h5{Fa`w6_?TcR*Jo_Q@!eTYVa(+CQ7n&P zoX+uHmKQKS#qn>j{3heO9RDfHhZv7@{1uj+Ard1(WPB5rTQFYF@%>o7jWL_!C$U_> zSjh2@v-||(a*p4?atY&y9RC%|-!h)#_`pyphcd>5%J_CHcVO(!@dH@CopBV$-^=nG zMlZ)d!}9ZtZ*cq;mP;8w;rO3`V%|E!B!-2_^csw{!X&RHr*~xe29{G;{tNRn7zc8C zF5@JiIQL9txsc_5u>3qw?El_k{Fvj9vV4){0JoI!;0$tGmOHVW!nnt}f2*bZ$Nhfc z{_k~3!*$nRCz-$R_bXPDm_+|JS87+d?l$~2M0sX~yVs;dJ&T)(o|LGP z^V+jFQBc!Ujuu~;o$o0KDZJvCQ_sD|e_qOI+>=s-T;OuA>8;L7IkPS0tl}*=EhL9~ zO|6nI!vlA_*JPy`-#$G-?KMo}+NHTJnWI%%ELz6?{>c za?~Y?^DEruJpQ-BE5GK~FT8T4AnE56dhcU?exN7i=(gl5-HtaX9CuWmf4nZI;4B*|;*zS~*R#RxYdMD?f`t zBAX#5f4hyT0K0i8&2D2V&~9TY$ZlgQ*f5|Kf@_da!wgoKVFt@BEoX(RDnPl1ZcO1P zEghZWPMU^B;=^@%Iv#{=y1(NX!hTL^*T{imNb_^;5a3M2R}K!mfum}UT!aH$mynQ@ z2jMA&Y#ZU~L<^w1PL6#@@awF~<5N*X$=-pr3jQY%9|B5ih^U|%(p#0ERQT5-5t;6R zxPr(X6nRY)fcq$F_^oK&g3;RDV!)7uDXdLY)Ec=WVJC!1iW-R$4pXM7iW)T-iqZq= zNUe!Xnn(^h2Qh4d>iaY|*aeF_jw6Wo4|d@KDI_#o{M%i`gk@8=a=U|FxLk50Asm?~ zHCb#56p+w@s=tY?{ztF2PiT$B1@~jjZ(LQ&H?B0`{0VD_y6DCQ&d?RkX(RjIbo(eR z@*eH3*R*aoIP>3j2HxTf9Q5>4kKD81z4Q$ZO;ixQ@>|~|VeBe?JEX`qDOG*@bBeItB`KC>Xc&s_))rV z!11u%qT=6tslonCwTh>s)qTCf{@MV&&v2D@3h;!ulW2+kskxp|Bw>spZRFPNldFka4X~YHXKpzNKO?Q;b4&2vt%3)1SmIX&%X_3^YftTQDOEqW+!`W} zE#p^VdRH0$pLlK=#NqA=%C4v{NU{DZKlcl*AYbcqzZx|D_+gE~b2amnMXPz+#H7R| z>$wjaRVQDU37o}9*HM1Ib3ZD0&$1I;@yu^q-D3DB~30@QcLn;2%FcB8uIAdJ&TrvTZc|N_u>1j7)Ydi2% zyvy23$QTVB)J{nW(ekm=m-H_41~ewAIj$i2qa1>4_`*3@Hc20J#J=fzY@)YJ4+MRdLtg%;2 zZ`S2mIe8iQMRGFku+&8~&1rbJ*lZA{%F8a0k^=99Oo+lKQj=r;ZP(taPMC>3q1!NPV+<}0ON9=!q&x7PunzFxyzojm zjk~D4h!$%LT)|5Y2fk!=!c{DFI`EoxJUDT5L?zj-jmU)I=*~z{-m#!{ODxXKuqszA zc;#?9TSq#e91mtVl;|kmvdC0ZA5I&I(}h?MPPpj1ZX2o$TF!+2f>!PPKM^`aC-iMN zHGZP2nUw0PhJai(nv9zm)&@u(rjr~`#%EiX_N90p#uFX?OcZxz|FJKp-|EZhWqmpA zlAJz(dlFo5pX788S`rhJ*7W6cM_*2F#*vAM55CfuyYKep?rZK1$tbq6wa6LH(XICvl58JME{LBY!d`yufgI*D_W z_WTeMxBq_<*tIbhFQlcyuZY0=A)m;biQlBBQk>is?!ZwFCwxjIcHnc4@$eN9xe{&= ziCe%$1a{yDPA9cl8{tr&(S#T#iF`OfTnG09*9rw>In z@`4#v!$|5tQw>j(P%|sly!EBi*?QFz;vYm}% z*w0K#4-cKak0fRu_bzrBC0iTICZT?A3e8Q%hDg{dp;5bnIr*-#Sxkgjzc5W zNKsfsCj`|{MdF}Xs>Tgx!xg+t0C9E9tTx~3qEjlaDVys04_#7BYiwx3x(zmrykjkX zvciFu!EW}(^!~ijUEMH0FV|gHJ7Ym}ZJn=Va1MN*U!EJ{!|aV#d}*jNsFA*DJWW3i z8#X54wV@ppq1Fzogz5jMFIqo~@<vv>kvN{Of^gHqm*0LkF>Yl9fzyVKYuTle^9Lm~&Cp)-tUr$!uaKP`$4{_T(zhhTu zpRo3JSSF3fXusoG29olL(ToFG`4q#zN%I23z)ABnhJkE7jA0;KXP|qL-NP|j-EQXZ z<_Hp^c3R?i`dz*LFu+M&?ba8g`HSP6FEXR9%Z*{pVR~HjL=NK? z*G5tJV1h-(;46zqMebnZ8*?-cFLoANFnEb8)WXa1)>NJ-00=F7T8#gS7MqbZ@^zgLn87{yVmX@WSV#5=_ zMt3`fums~a7d4qZX~ml|;w8O8ZH;Zd>8-~@gQm$-#f$~B zuw!{MZrTtL`|rb@FKWej_#xqKMq5lj;SE=wdB{81L&0n8suA++ylGV`bm75O`zdbW z>PmPQ&#qnvC-5*GxF&6Oc;zU?R2&p&haer5U+p;{29t+Y%`P#@e#+i&;u1h ztRxE?Zwxj>#={g}>9emxNS>&kGyUPk*?9%UIjgq2d>-%1YTtWeUQs^IhYYa!9KZNI zv>xT5WYT9E@nDJ`^(F}!;G9B6Ju55BhC*HV7a^lw2MfQAddr23dNcTCHvEZz%Cz-3j4%VnZ5JA-SK-*Hk;Zo`k%J z_(qDe-{U7vI+NZn1!m*(zgkVZUqVO6*&FxM4adEy66-gI;M1Gx@C|w^o9kd1Hf*kh zcHF%=6DHuL%_(pThHr5w6=r#+tiWko97L3#lSm8oZQJsdqTT#?fj3gk@puY7GJ&P~ zE^j>=QkKO_@c08OST25fPaIe0VDR{jrS@RoKV_LT(oP)fQ z`X2X{Vl~ad`@6>}6@Xj2$H5xB*6j&fNX{KrBVgy_Wb<<@?kR44iZ^&BJVMSqp8WJh ziXNeDJVFic?jHz7)YcQ?Q_7!N`4e49Wel|ms}(Sdr(7UG%|bt{;NZ}}eM|Td!Khen zIh#Y8vY=5|jGX=Oa*qcR(7wx^^f=jsGW%cyr<83$H)pbeXYwJ|@5%}`(G(Loro{O+ z?y?*3-8br0rz%7?7VlnWH4{;1nAs60%%@i){(korJi6y+Shcray@w=|dRI%&$*;AOCkKs7a(BePYcl=AG=i-V8Q*^34oA~r~$)y>v_k(0Br)Wd!>wZS&0)GBMBI`mw^wg9{>MAwNdNs(%#|kBj z8Dk0_%Gp^)4H;AOh5l!0qA>Ke(1T9MBLp~#z}*%iXht4YN3m6?lQ)vj-H?atKa6e7 zWx+Zjf4(E3glDK0UfoP|%|A(1!>aaH>mb(pVeit2IspY22}Cqet&qEqY`j_HUnwGq z`b9i}Bm!0k&%8KK;l?j74R2}`P{ISLhSKMGteFA9e-XCwoeypsuG~!4;iSKfzm2(1 z`l+lh#fLr`W17p=G~D-5BV_pUPcBrj^VHM*5YT&OCk(*))06&h78)oEcyrtkjb~4f z`W`y^R-PFKradu2ECjDT2a@sH|8_tzu02}`2k_F_7Rr#-=PD`i`Oal3Wq_xLCo2m= zaQxv|yrtXeZBVXE{!;j}9v}RbL6VfpF|MlyJ$EV(3(lQJJ}Mh> zObkRy)^*+-D`xR@bcVah;Q-*|L)uD9nJKdzJ@P641EilD9uLmlj z%DbxvG9gz6C@7. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Structure to save state of computation between the single steps. */ +struct sha256_ctx +{ + uint32_t H[8]; + + uint32_t total[2]; + uint32_t buflen; + char buffer[128]; /* NB: always correctly aligned for uint32_t. */ +}; + + +#if __BYTE_ORDER == __LITTLE_ENDIAN +# define SWAP(n) \ + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (FIPS 180-2:5.1.1) */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Constants for SHA256 from FIPS 180-2:4.2.2. */ +static const uint32_t K[64] = + { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + }; + + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 64 == 0. */ +static void +sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx) +{ + unsigned int t; + const uint32_t *words = buffer; + size_t nwords = len / sizeof (uint32_t); + uint32_t a = ctx->H[0]; + uint32_t b = ctx->H[1]; + uint32_t c = ctx->H[2]; + uint32_t d = ctx->H[3]; + uint32_t e = ctx->H[4]; + uint32_t f = ctx->H[5]; + uint32_t g = ctx->H[6]; + uint32_t h = ctx->H[7]; + + /* First increment the byte count. FIPS 180-2 specifies the possible + length of the file up to 2^64 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) + ++ctx->total[1]; + + /* Process all bytes in the buffer with 64 bytes in each round of + the loop. */ + while (nwords > 0) + { + uint32_t W[64]; + uint32_t a_save = a; + uint32_t b_save = b; + uint32_t c_save = c; + uint32_t d_save = d; + uint32_t e_save = e; + uint32_t f_save = f; + uint32_t g_save = g; + uint32_t h_save = h; + + /* Operators defined in FIPS 180-2:4.1.2. */ +#define Ch(x, y, z) ((x & y) ^ (~x & z)) +#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) +#define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22)) +#define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25)) +#define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3)) +#define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10)) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) ((w >> s) | (w << (32 - s))) + + /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ + for (t = 0; t < 16; ++t) + { + W[t] = SWAP (*words); + ++words; + } + for (t = 16; t < 64; ++t) + W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; + + /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ + for (t = 0; t < 64; ++t) + { + uint32_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; + uint32_t T2 = S0 (a) + Maj (a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + /* Add the starting values of the context according to FIPS 180-2:6.2.2 + step 4. */ + a += a_save; + b += b_save; + c += c_save; + d += d_save; + e += e_save; + f += f_save; + g += g_save; + h += h_save; + + /* Prepare for the next round. */ + nwords -= 16; + } + + /* Put checksum in context given as argument. */ + ctx->H[0] = a; + ctx->H[1] = b; + ctx->H[2] = c; + ctx->H[3] = d; + ctx->H[4] = e; + ctx->H[5] = f; + ctx->H[6] = g; + ctx->H[7] = h; +} + + +/* Initialize structure containing state of computation. + (FIPS 180-2:5.3.2) */ +static void +sha256_init_ctx (struct sha256_ctx *ctx) +{ + ctx->H[0] = 0x6a09e667; + ctx->H[1] = 0xbb67ae85; + ctx->H[2] = 0x3c6ef372; + ctx->H[3] = 0xa54ff53a; + ctx->H[4] = 0x510e527f; + ctx->H[5] = 0x9b05688c; + ctx->H[6] = 0x1f83d9ab; + ctx->H[7] = 0x5be0cd19; + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +static void * +sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf) +{ + unsigned int i; + /* Take yet unprocessed bytes into account. */ + uint32_t bytes = ctx->buflen; + size_t pad; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) + ++ctx->total[1]; + + pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; + memcpy (&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); + *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 29)); + + /* Process last bytes. */ + sha256_process_block (ctx->buffer, bytes + pad + 8, ctx); + + /* Put result from CTX in first 32 bytes following RESBUF. */ + for (i = 0; i < 8; ++i) + ((uint32_t *) resbuf)[i] = SWAP (ctx->H[i]); + + return resbuf; +} + + +static void +sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx) +{ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) + { + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + + memcpy (&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (ctx->buflen > 64) + { + sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx); + + ctx->buflen &= 63; + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], + ctx->buflen); + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len >= 64) + { +/* To check alignment gcc has an appropriate operator. Other + compilers don't. */ +#if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0) +#else +# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0) +#endif + if (UNALIGNED_P (buffer)) + while (len > 64) + { + sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); + buffer = (const char *) buffer + 64; + len -= 64; + } + else + { + sha256_process_block (buffer, len & ~63, ctx); + buffer = (const char *) buffer + (len & ~63); + len &= 63; + } + } + + /* Move remaining bytes into internal buffer. */ + if (len > 0) + { + size_t left_over = ctx->buflen; + + memcpy (&ctx->buffer[left_over], buffer, len); + left_over += len; + if (left_over >= 64) + { + sha256_process_block (ctx->buffer, 64, ctx); + left_over -= 64; + memcpy (ctx->buffer, &ctx->buffer[64], left_over); + } + ctx->buflen = left_over; + } +} + + +/* Define our magic string to mark salt for SHA256 "encryption" + replacement. */ +static const char sha256_salt_prefix[] = "$5$"; + +/* Prefix for optional rounds specification. */ +static const char sha256_rounds_prefix[] = "rounds="; + +/* Maximum salt string length. */ +#define SALT_LEN_MAX 16 +/* Default number of rounds if not explicitly specified. */ +#define ROUNDS_DEFAULT 5000 +/* Minimum number of rounds. */ +#define ROUNDS_MIN 1000 +/* Maximum number of rounds. */ +#define ROUNDS_MAX 999999999 + +/* Table with characters for base64 transformation. */ +static const char b64t[64] = +"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + +static char * +sha256_crypt_r (const char *key, const char *salt, char *buffer, int buflen) +{ + unsigned char alt_result[32] + __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); + unsigned char temp_result[32] + __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); + struct sha256_ctx ctx; + struct sha256_ctx alt_ctx; + size_t salt_len; + size_t key_len; + size_t cnt; + char *cp; + char *copied_key = NULL; + char *copied_salt = NULL; + char *p_bytes; + char *s_bytes; + /* Default number of rounds. */ + size_t rounds = ROUNDS_DEFAULT; + bool rounds_custom = false; + + /* Find beginning of salt string. The prefix should normally always + be present. Just in case it is not. */ + if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0) + /* Skip salt prefix. */ + salt += sizeof (sha256_salt_prefix) - 1; + + if (strncmp (salt, sha256_rounds_prefix, sizeof (sha256_rounds_prefix) - 1) + == 0) + { + const char *num = salt + sizeof (sha256_rounds_prefix) - 1; + char *endp; + unsigned long int srounds = strtoul (num, &endp, 10); + if (*endp == '$') + { + salt = endp + 1; + rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); + rounds_custom = true; + } + } + + salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); + key_len = strlen (key); + + if ((key - (char *) 0) % __alignof__ (uint32_t) != 0) + { + char *tmp = (char *) alloca (key_len + __alignof__ (uint32_t)); + key = copied_key = + memcpy (tmp + __alignof__ (uint32_t) + - (tmp - (char *) 0) % __alignof__ (uint32_t), + key, key_len); + } + + if ((salt - (char *) 0) % __alignof__ (uint32_t) != 0) + { + char *tmp = (char *) alloca (salt_len + __alignof__ (uint32_t)); + salt = copied_salt = + memcpy (tmp + __alignof__ (uint32_t) + - (tmp - (char *) 0) % __alignof__ (uint32_t), + salt, salt_len); + } + + /* Prepare for the real work. */ + sha256_init_ctx (&ctx); + + /* Add the key string. */ + sha256_process_bytes (key, key_len, &ctx); + + /* The last part is the salt string. This must be at most 8 + characters and it ends at the first `$' character (for + compatibility with existing implementations). */ + sha256_process_bytes (salt, salt_len, &ctx); + + + /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The + final result will be added to the first context. */ + sha256_init_ctx (&alt_ctx); + + /* Add key. */ + sha256_process_bytes (key, key_len, &alt_ctx); + + /* Add salt. */ + sha256_process_bytes (salt, salt_len, &alt_ctx); + + /* Add key again. */ + sha256_process_bytes (key, key_len, &alt_ctx); + + /* Now get result of this (32 bytes) and add it to the other + context. */ + sha256_finish_ctx (&alt_ctx, alt_result); + + /* Add for any character in the key one byte of the alternate sum. */ + for (cnt = key_len; cnt > 32; cnt -= 32) + sha256_process_bytes (alt_result, 32, &ctx); + sha256_process_bytes (alt_result, cnt, &ctx); + + /* Take the binary representation of the length of the key and for every + 1 add the alternate sum, for every 0 the key. */ + for (cnt = key_len; cnt > 0; cnt >>= 1) + if ((cnt & 1) != 0) + sha256_process_bytes (alt_result, 32, &ctx); + else + sha256_process_bytes (key, key_len, &ctx); + + /* Create intermediate result. */ + sha256_finish_ctx (&ctx, alt_result); + + /* Start computation of P byte sequence. */ + sha256_init_ctx (&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < key_len; ++cnt) + sha256_process_bytes (key, key_len, &alt_ctx); + + /* Finish the digest. */ + sha256_finish_ctx (&alt_ctx, temp_result); + + /* Create byte sequence P. */ + cp = p_bytes = alloca (key_len); + for (cnt = key_len; cnt >= 32; cnt -= 32) + cp = mempcpy (cp, temp_result, 32); + memcpy (cp, temp_result, cnt); + + /* Start computation of S byte sequence. */ + sha256_init_ctx (&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) + sha256_process_bytes (salt, salt_len, &alt_ctx); + + /* Finish the digest. */ + sha256_finish_ctx (&alt_ctx, temp_result); + + /* Create byte sequence S. */ + cp = s_bytes = alloca (salt_len); + for (cnt = salt_len; cnt >= 32; cnt -= 32) + cp = mempcpy (cp, temp_result, 32); + memcpy (cp, temp_result, cnt); + + /* Repeatedly run the collected hash value through SHA256 to burn + CPU cycles. */ + for (cnt = 0; cnt < rounds; ++cnt) + { + /* New context. */ + sha256_init_ctx (&ctx); + + /* Add key or last result. */ + if ((cnt & 1) != 0) + sha256_process_bytes (p_bytes, key_len, &ctx); + else + sha256_process_bytes (alt_result, 32, &ctx); + + /* Add salt for numbers not divisible by 3. */ + if (cnt % 3 != 0) + sha256_process_bytes (s_bytes, salt_len, &ctx); + + /* Add key for numbers not divisible by 7. */ + if (cnt % 7 != 0) + sha256_process_bytes (p_bytes, key_len, &ctx); + + /* Add key or last result. */ + if ((cnt & 1) != 0) + sha256_process_bytes (alt_result, 32, &ctx); + else + sha256_process_bytes (p_bytes, key_len, &ctx); + + /* Create intermediate result. */ + sha256_finish_ctx (&ctx, alt_result); + } + + /* Now we can construct the result string. It consists of three + parts. */ + cp = stpncpy (buffer, sha256_salt_prefix, MAX (0, buflen)); + buflen -= sizeof (sha256_salt_prefix) - 1; + + if (rounds_custom) + { + int n = snprintf (cp, MAX (0, buflen), "%s%zu$", + sha256_rounds_prefix, rounds); + cp += n; + buflen -= n; + } + + cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); + buflen -= MIN ((size_t) MAX (0, buflen), salt_len); + + if (buflen > 0) + { + *cp++ = '$'; + --buflen; + } + +#define b64_from_24bit(B2, B1, B0, N) \ + do { \ + unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ + int n = (N); \ + while (n-- > 0 && buflen > 0) \ + { \ + *cp++ = b64t[w & 0x3f]; \ + --buflen; \ + w >>= 6; \ + } \ + } while (0) + + b64_from_24bit (alt_result[0], alt_result[10], alt_result[20], 4); + b64_from_24bit (alt_result[21], alt_result[1], alt_result[11], 4); + b64_from_24bit (alt_result[12], alt_result[22], alt_result[2], 4); + b64_from_24bit (alt_result[3], alt_result[13], alt_result[23], 4); + b64_from_24bit (alt_result[24], alt_result[4], alt_result[14], 4); + b64_from_24bit (alt_result[15], alt_result[25], alt_result[5], 4); + b64_from_24bit (alt_result[6], alt_result[16], alt_result[26], 4); + b64_from_24bit (alt_result[27], alt_result[7], alt_result[17], 4); + b64_from_24bit (alt_result[18], alt_result[28], alt_result[8], 4); + b64_from_24bit (alt_result[9], alt_result[19], alt_result[29], 4); + b64_from_24bit (0, alt_result[31], alt_result[30], 3); + if (buflen <= 0) + { + errno = ERANGE; + buffer = NULL; + } + else + *cp = '\0'; /* Terminate the string. */ + + /* Clear the buffer for the intermediate result so that people + attaching to processes or reading core dumps cannot get any + information. We do it in this way to clear correct_words[] + inside the SHA256 implementation as well. */ + sha256_init_ctx (&ctx); + sha256_finish_ctx (&ctx, alt_result); + memset (temp_result, '\0', sizeof (temp_result)); + memset (p_bytes, '\0', key_len); + memset (s_bytes, '\0', salt_len); + memset (&ctx, '\0', sizeof (ctx)); + memset (&alt_ctx, '\0', sizeof (alt_ctx)); + if (copied_key != NULL) + memset (copied_key, '\0', key_len); + if (copied_salt != NULL) + memset (copied_salt, '\0', salt_len); + + return buffer; +} + + +/* This entry point is equivalent to the `crypt' function in Unix + libcs. */ +char * +sha256_crypt (const char *key, const char *salt) +{ + /* We don't want to have an arbitrary limit in the size of the + password. We can compute an upper bound for the size of the + result in advance and so we can prepare the buffer we pass to + `sha256_crypt_r'. */ + static char *buffer; + static int buflen; + int needed = (sizeof (sha256_salt_prefix) - 1 + + sizeof (sha256_rounds_prefix) + 9 + 1 + + strlen (salt) + 1 + 43 + 1); + + if (buflen < needed) + { + char *new_buffer = (char *) realloc (buffer, needed); + if (new_buffer == NULL) + return NULL; + + buffer = new_buffer; + buflen = needed; + } + + return sha256_crypt_r (key, salt, buffer, buflen); +} + + +#ifdef TEST +static const struct +{ + const char *input; + const char result[32]; +} tests[] = + { + /* Test vectors from FIPS 180-2: appendix B.1. */ + { "abc", + "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23" + "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" }, + /* Test vectors from FIPS 180-2: appendix B.2. */ + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39" + "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" }, + /* Test vectors from the NESSIE project. */ + { "", + "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24" + "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" }, + { "a", + "\xca\x97\x81\x12\xca\x1b\xbd\xca\xfa\xc2\x31\xb3\x9a\x23\xdc\x4d" + "\xa7\x86\xef\xf8\x14\x7c\x4e\x72\xb9\x80\x77\x85\xaf\xee\x48\xbb" }, + { "message digest", + "\xf7\x84\x6f\x55\xcf\x23\xe1\x4e\xeb\xea\xb5\xb4\xe1\x55\x0c\xad" + "\x5b\x50\x9e\x33\x48\xfb\xc4\xef\xa3\xa1\x41\x3d\x39\x3c\xb6\x50" }, + { "abcdefghijklmnopqrstuvwxyz", + "\x71\xc4\x80\xdf\x93\xd6\xae\x2f\x1e\xfa\xd1\x44\x7c\x66\xc9\x52" + "\x5e\x31\x62\x18\xcf\x51\xfc\x8d\x9e\xd8\x32\xf2\xda\xf1\x8b\x73" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39" + "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "\xdb\x4b\xfc\xbd\x4d\xa0\xcd\x85\xa6\x0c\x3c\x37\xd3\xfb\xd8\x80" + "\x5c\x77\xf1\x5f\xc6\xb1\xfd\xfe\x61\x4e\xe0\xa7\xc8\xfd\xb4\xc0" }, + { "123456789012345678901234567890123456789012345678901234567890" + "12345678901234567890", + "\xf3\x71\xbc\x4a\x31\x1f\x2b\x00\x9e\xef\x95\x2d\xd8\x3c\xa8\x0e" + "\x2b\x60\x02\x6c\x8e\x93\x55\x92\xd0\xf9\xc3\x08\x45\x3c\x81\x3e" } + }; +#define ntests (sizeof (tests) / sizeof (tests[0])) + + +static const struct +{ + const char *salt; + const char *input; + const char *expected; +} tests2[] = +{ + { "$5$saltstring", "Hello world!", + "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5" }, + { "$5$rounds=10000$saltstringsaltstring", "Hello world!", + "$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2." + "opqey6IcA" }, + { "$5$rounds=5000$toolongsaltstring", "This is just a test", + "$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07guHPvOW8" + "mGRcvxa5" }, + { "$5$rounds=1400$anotherlongsaltstring", + "a very much longer text to encrypt. This one even stretches over more" + "than one line.", + "$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIUnzyxf12" + "oP84Bnq1" }, + { "$5$rounds=77777$short", + "we have a short salt string but not a short password", + "$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0KQRd/" }, + { "$5$rounds=123456$asaltof16chars..", "a short string", + "$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/" + "cZKmF/wJvD" }, + { "$5$rounds=10$roundstoolow", "the minimum number is still observed", + "$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY9l/gL97" + "2bIC" }, +}; +#define ntests2 (sizeof (tests2) / sizeof (tests2[0])) + + +int +main (void) +{ + struct sha256_ctx ctx; + char sum[32]; + int result = 0; + int cnt; + + for (cnt = 0; cnt < (int) ntests; ++cnt) + { + sha256_init_ctx (&ctx); + sha256_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx); + sha256_finish_ctx (&ctx, sum); + if (memcmp (tests[cnt].result, sum, 32) != 0) + { + printf ("test %d run %d failed\n", cnt, 1); + result = 1; + } + + sha256_init_ctx (&ctx); + for (int i = 0; tests[cnt].input[i] != '\0'; ++i) + sha256_process_bytes (&tests[cnt].input[i], 1, &ctx); + sha256_finish_ctx (&ctx, sum); + if (memcmp (tests[cnt].result, sum, 32) != 0) + { + printf ("test %d run %d failed\n", cnt, 2); + result = 1; + } + } + + /* Test vector from FIPS 180-2: appendix B.3. */ + char buf[1000]; + memset (buf, 'a', sizeof (buf)); + sha256_init_ctx (&ctx); + for (int i = 0; i < 1000; ++i) + sha256_process_bytes (buf, sizeof (buf), &ctx); + sha256_finish_ctx (&ctx, sum); + static const char expected[32] = + "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67" + "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0"; + if (memcmp (expected, sum, 32) != 0) + { + printf ("test %d failed\n", cnt); + result = 1; + } + + for (cnt = 0; cnt < ntests2; ++cnt) + { + char *cp = sha256_crypt (tests2[cnt].input, tests2[cnt].salt); + + if (strcmp (cp, tests2[cnt].expected) != 0) + { + printf ("test %d: expected \"%s\", got \"%s\"\n", + cnt, tests2[cnt].expected, cp); + result = 1; + } + } + + if (result == 0) + puts ("all tests OK"); + + return result; +} +#endif diff --git a/com32/libutil/sha512crypt.c b/com32/libutil/sha512crypt.c new file mode 100644 index 00000000..0c3a918a --- /dev/null +++ b/com32/libutil/sha512crypt.c @@ -0,0 +1,790 @@ +/* SHA512-based Unix crypt implementation. + Released into the Public Domain by Ulrich Drepper . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Structure to save state of computation between the single steps. */ +struct sha512_ctx +{ + uint64_t H[8]; + + uint64_t total[2]; + uint64_t buflen; + char buffer[256]; /* NB: always correctly aligned for uint64_t. */ +}; + + +#if __BYTE_ORDER == __LITTLE_ENDIAN +# define SWAP(n) \ + (((n) << 56) \ + | (((n) & 0xff00) << 40) \ + | (((n) & 0xff0000) << 24) \ + | (((n) & 0xff000000) << 8) \ + | (((n) >> 8) & 0xff000000) \ + | (((n) >> 24) & 0xff0000) \ + | (((n) >> 40) & 0xff00) \ + | ((n) >> 56)) +#else +# define SWAP(n) (n) +#endif + + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (FIPS 180-2:5.1.2) */ +static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Constants for SHA512 from FIPS 180-2:4.2.3. */ +static const uint64_t K[80] = + { + UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd), + UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc), + UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019), + UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118), + UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe), + UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2), + UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1), + UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694), + UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3), + UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65), + UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483), + UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5), + UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210), + UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4), + UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725), + UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70), + UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926), + UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df), + UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8), + UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b), + UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001), + UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30), + UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910), + UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8), + UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53), + UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8), + UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb), + UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3), + UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60), + UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec), + UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9), + UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b), + UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207), + UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178), + UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6), + UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b), + UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493), + UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c), + UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a), + UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817) + }; + + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 128 == 0. */ +static void +sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx) +{ + unsigned int t; + const uint64_t *words = buffer; + size_t nwords = len / sizeof (uint64_t); + uint64_t a = ctx->H[0]; + uint64_t b = ctx->H[1]; + uint64_t c = ctx->H[2]; + uint64_t d = ctx->H[3]; + uint64_t e = ctx->H[4]; + uint64_t f = ctx->H[5]; + uint64_t g = ctx->H[6]; + uint64_t h = ctx->H[7]; + + /* First increment the byte count. FIPS 180-2 specifies the possible + length of the file up to 2^128 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) + ++ctx->total[1]; + + /* Process all bytes in the buffer with 128 bytes in each round of + the loop. */ + while (nwords > 0) + { + uint64_t W[80]; + uint64_t a_save = a; + uint64_t b_save = b; + uint64_t c_save = c; + uint64_t d_save = d; + uint64_t e_save = e; + uint64_t f_save = f; + uint64_t g_save = g; + uint64_t h_save = h; + + /* Operators defined in FIPS 180-2:4.1.2. */ +#define Ch(x, y, z) ((x & y) ^ (~x & z)) +#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) +#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39)) +#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41)) +#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7)) +#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6)) + + /* It is unfortunate that C does not provide an operator for + cyclic rotation. Hope the C compiler is smart enough. */ +#define CYCLIC(w, s) ((w >> s) | (w << (64 - s))) + + /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ + for (t = 0; t < 16; ++t) + { + W[t] = SWAP (*words); + ++words; + } + for (t = 16; t < 80; ++t) + W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; + + /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ + for (t = 0; t < 80; ++t) + { + uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; + uint64_t T2 = S0 (a) + Maj (a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + /* Add the starting values of the context according to FIPS 180-2:6.3.2 + step 4. */ + a += a_save; + b += b_save; + c += c_save; + d += d_save; + e += e_save; + f += f_save; + g += g_save; + h += h_save; + + /* Prepare for the next round. */ + nwords -= 16; + } + + /* Put checksum in context given as argument. */ + ctx->H[0] = a; + ctx->H[1] = b; + ctx->H[2] = c; + ctx->H[3] = d; + ctx->H[4] = e; + ctx->H[5] = f; + ctx->H[6] = g; + ctx->H[7] = h; +} + + +/* Initialize structure containing state of computation. + (FIPS 180-2:5.3.3) */ +static void +sha512_init_ctx (struct sha512_ctx *ctx) +{ + ctx->H[0] = UINT64_C (0x6a09e667f3bcc908); + ctx->H[1] = UINT64_C (0xbb67ae8584caa73b); + ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b); + ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1); + ctx->H[4] = UINT64_C (0x510e527fade682d1); + ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f); + ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b); + ctx->H[7] = UINT64_C (0x5be0cd19137e2179); + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +static void * +sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) +{ + unsigned int i; + /* Take yet unprocessed bytes into account. */ + uint64_t bytes = ctx->buflen; + size_t pad; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) + ++ctx->total[1]; + + pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; + memcpy (&ctx->buffer[bytes], fillbuf, pad); + + /* Put the 128-bit file length in *bits* at the end of the buffer. */ + *(uint64_t *) &ctx->buffer[bytes + pad + 8] = SWAP (ctx->total[0] << 3); + *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 61)); + + /* Process last bytes. */ + sha512_process_block (ctx->buffer, bytes + pad + 16, ctx); + + /* Put result from CTX in first 64 bytes following RESBUF. */ + for (i = 0; i < 8; ++i) + ((uint64_t *) resbuf)[i] = SWAP (ctx->H[i]); + + return resbuf; +} + + +static void +sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx) +{ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) + { + size_t left_over = ctx->buflen; + size_t add = 256 - left_over > len ? len : 256 - left_over; + + memcpy (&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + + if (ctx->buflen > 128) + { + sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx); + + ctx->buflen &= 127; + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127], + ctx->buflen); + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len >= 128) + { +#if !_STRING_ARCH_unaligned +/* To check alignment gcc has an appropriate operator. Other + compilers don't. */ +# if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0) +# else +# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint64_t) != 0) +# endif + if (UNALIGNED_P (buffer)) + while (len > 128) + { + sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, + ctx); + buffer = (const char *) buffer + 128; + len -= 128; + } + else +#endif + { + sha512_process_block (buffer, len & ~127, ctx); + buffer = (const char *) buffer + (len & ~127); + len &= 127; + } + } + + /* Move remaining bytes into internal buffer. */ + if (len > 0) + { + size_t left_over = ctx->buflen; + + memcpy (&ctx->buffer[left_over], buffer, len); + left_over += len; + if (left_over >= 128) + { + sha512_process_block (ctx->buffer, 128, ctx); + left_over -= 128; + memcpy (ctx->buffer, &ctx->buffer[128], left_over); + } + ctx->buflen = left_over; + } +} + + +/* Define our magic string to mark salt for SHA512 "encryption" + replacement. */ +static const char sha512_salt_prefix[] = "$6$"; + +/* Prefix for optional rounds specification. */ +static const char sha512_rounds_prefix[] = "rounds="; + +/* Maximum salt string length. */ +#define SALT_LEN_MAX 16 +/* Default number of rounds if not explicitly specified. */ +#define ROUNDS_DEFAULT 5000 +/* Minimum number of rounds. */ +#define ROUNDS_MIN 1000 +/* Maximum number of rounds. */ +#define ROUNDS_MAX 999999999 + +/* Table with characters for base64 transformation. */ +static const char b64t[64] = +"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + +static char * +sha512_crypt_r (const char *key, const char *salt, char *buffer, int buflen) +{ + unsigned char alt_result[64] + __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); + unsigned char temp_result[64] + __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); + struct sha512_ctx ctx; + struct sha512_ctx alt_ctx; + size_t salt_len; + size_t key_len; + size_t cnt; + char *cp; + char *copied_key = NULL; + char *copied_salt = NULL; + char *p_bytes; + char *s_bytes; + /* Default number of rounds. */ + size_t rounds = ROUNDS_DEFAULT; + bool rounds_custom = false; + + /* Find beginning of salt string. The prefix should normally always + be present. Just in case it is not. */ + if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0) + /* Skip salt prefix. */ + salt += sizeof (sha512_salt_prefix) - 1; + + if (strncmp (salt, sha512_rounds_prefix, sizeof (sha512_rounds_prefix) - 1) + == 0) + { + const char *num = salt + sizeof (sha512_rounds_prefix) - 1; + char *endp; + unsigned long int srounds = strtoul (num, &endp, 10); + if (*endp == '$') + { + salt = endp + 1; + rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); + rounds_custom = true; + } + } + + salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); + key_len = strlen (key); + + if ((key - (char *) 0) % __alignof__ (uint64_t) != 0) + { + char *tmp = (char *) alloca (key_len + __alignof__ (uint64_t)); + key = copied_key = + memcpy (tmp + __alignof__ (uint64_t) + - (tmp - (char *) 0) % __alignof__ (uint64_t), + key, key_len); + } + + if ((salt - (char *) 0) % __alignof__ (uint64_t) != 0) + { + char *tmp = (char *) alloca (salt_len + __alignof__ (uint64_t)); + salt = copied_salt = + memcpy (tmp + __alignof__ (uint64_t) + - (tmp - (char *) 0) % __alignof__ (uint64_t), + salt, salt_len); + } + + /* Prepare for the real work. */ + sha512_init_ctx (&ctx); + + /* Add the key string. */ + sha512_process_bytes (key, key_len, &ctx); + + /* The last part is the salt string. This must be at most 8 + characters and it ends at the first `$' character (for + compatibility with existing implementations). */ + sha512_process_bytes (salt, salt_len, &ctx); + + + /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The + final result will be added to the first context. */ + sha512_init_ctx (&alt_ctx); + + /* Add key. */ + sha512_process_bytes (key, key_len, &alt_ctx); + + /* Add salt. */ + sha512_process_bytes (salt, salt_len, &alt_ctx); + + /* Add key again. */ + sha512_process_bytes (key, key_len, &alt_ctx); + + /* Now get result of this (64 bytes) and add it to the other + context. */ + sha512_finish_ctx (&alt_ctx, alt_result); + + /* Add for any character in the key one byte of the alternate sum. */ + for (cnt = key_len; cnt > 64; cnt -= 64) + sha512_process_bytes (alt_result, 64, &ctx); + sha512_process_bytes (alt_result, cnt, &ctx); + + /* Take the binary representation of the length of the key and for every + 1 add the alternate sum, for every 0 the key. */ + for (cnt = key_len; cnt > 0; cnt >>= 1) + if ((cnt & 1) != 0) + sha512_process_bytes (alt_result, 64, &ctx); + else + sha512_process_bytes (key, key_len, &ctx); + + /* Create intermediate result. */ + sha512_finish_ctx (&ctx, alt_result); + + /* Start computation of P byte sequence. */ + sha512_init_ctx (&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < key_len; ++cnt) + sha512_process_bytes (key, key_len, &alt_ctx); + + /* Finish the digest. */ + sha512_finish_ctx (&alt_ctx, temp_result); + + /* Create byte sequence P. */ + cp = p_bytes = alloca (key_len); + for (cnt = key_len; cnt >= 64; cnt -= 64) + cp = mempcpy (cp, temp_result, 64); + memcpy (cp, temp_result, cnt); + + /* Start computation of S byte sequence. */ + sha512_init_ctx (&alt_ctx); + + /* For every character in the password add the entire password. */ + for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) + sha512_process_bytes (salt, salt_len, &alt_ctx); + + /* Finish the digest. */ + sha512_finish_ctx (&alt_ctx, temp_result); + + /* Create byte sequence S. */ + cp = s_bytes = alloca (salt_len); + for (cnt = salt_len; cnt >= 64; cnt -= 64) + cp = mempcpy (cp, temp_result, 64); + memcpy (cp, temp_result, cnt); + + /* Repeatedly run the collected hash value through SHA512 to burn + CPU cycles. */ + for (cnt = 0; cnt < rounds; ++cnt) + { + /* New context. */ + sha512_init_ctx (&ctx); + + /* Add key or last result. */ + if ((cnt & 1) != 0) + sha512_process_bytes (p_bytes, key_len, &ctx); + else + sha512_process_bytes (alt_result, 64, &ctx); + + /* Add salt for numbers not divisible by 3. */ + if (cnt % 3 != 0) + sha512_process_bytes (s_bytes, salt_len, &ctx); + + /* Add key for numbers not divisible by 7. */ + if (cnt % 7 != 0) + sha512_process_bytes (p_bytes, key_len, &ctx); + + /* Add key or last result. */ + if ((cnt & 1) != 0) + sha512_process_bytes (alt_result, 64, &ctx); + else + sha512_process_bytes (p_bytes, key_len, &ctx); + + /* Create intermediate result. */ + sha512_finish_ctx (&ctx, alt_result); + } + + /* Now we can construct the result string. It consists of three + parts. */ + cp = stpncpy (buffer, sha512_salt_prefix, MAX (0, buflen)); + buflen -= sizeof (sha512_salt_prefix) - 1; + + if (rounds_custom) + { + int n = snprintf (cp, MAX (0, buflen), "%s%zu$", + sha512_rounds_prefix, rounds); + cp += n; + buflen -= n; + } + + cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); + buflen -= MIN ((size_t) MAX (0, buflen), salt_len); + + if (buflen > 0) + { + *cp++ = '$'; + --buflen; + } + +#define b64_from_24bit(B2, B1, B0, N) \ + do { \ + unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ + int n = (N); \ + while (n-- > 0 && buflen > 0) \ + { \ + *cp++ = b64t[w & 0x3f]; \ + --buflen; \ + w >>= 6; \ + } \ + } while (0) + + b64_from_24bit (alt_result[0], alt_result[21], alt_result[42], 4); + b64_from_24bit (alt_result[22], alt_result[43], alt_result[1], 4); + b64_from_24bit (alt_result[44], alt_result[2], alt_result[23], 4); + b64_from_24bit (alt_result[3], alt_result[24], alt_result[45], 4); + b64_from_24bit (alt_result[25], alt_result[46], alt_result[4], 4); + b64_from_24bit (alt_result[47], alt_result[5], alt_result[26], 4); + b64_from_24bit (alt_result[6], alt_result[27], alt_result[48], 4); + b64_from_24bit (alt_result[28], alt_result[49], alt_result[7], 4); + b64_from_24bit (alt_result[50], alt_result[8], alt_result[29], 4); + b64_from_24bit (alt_result[9], alt_result[30], alt_result[51], 4); + b64_from_24bit (alt_result[31], alt_result[52], alt_result[10], 4); + b64_from_24bit (alt_result[53], alt_result[11], alt_result[32], 4); + b64_from_24bit (alt_result[12], alt_result[33], alt_result[54], 4); + b64_from_24bit (alt_result[34], alt_result[55], alt_result[13], 4); + b64_from_24bit (alt_result[56], alt_result[14], alt_result[35], 4); + b64_from_24bit (alt_result[15], alt_result[36], alt_result[57], 4); + b64_from_24bit (alt_result[37], alt_result[58], alt_result[16], 4); + b64_from_24bit (alt_result[59], alt_result[17], alt_result[38], 4); + b64_from_24bit (alt_result[18], alt_result[39], alt_result[60], 4); + b64_from_24bit (alt_result[40], alt_result[61], alt_result[19], 4); + b64_from_24bit (alt_result[62], alt_result[20], alt_result[41], 4); + b64_from_24bit (0, 0, alt_result[63], 2); + + if (buflen <= 0) + { + errno = ERANGE; + buffer = NULL; + } + else + *cp = '\0'; /* Terminate the string. */ + + /* Clear the buffer for the intermediate result so that people + attaching to processes or reading core dumps cannot get any + information. We do it in this way to clear correct_words[] + inside the SHA512 implementation as well. */ + sha512_init_ctx (&ctx); + sha512_finish_ctx (&ctx, alt_result); + memset (temp_result, '\0', sizeof (temp_result)); + memset (p_bytes, '\0', key_len); + memset (s_bytes, '\0', salt_len); + memset (&ctx, '\0', sizeof (ctx)); + memset (&alt_ctx, '\0', sizeof (alt_ctx)); + if (copied_key != NULL) + memset (copied_key, '\0', key_len); + if (copied_salt != NULL) + memset (copied_salt, '\0', salt_len); + + return buffer; +} + + +/* This entry point is equivalent to the `crypt' function in Unix + libcs. */ +char * +sha512_crypt (const char *key, const char *salt) +{ + /* We don't want to have an arbitrary limit in the size of the + password. We can compute an upper bound for the size of the + result in advance and so we can prepare the buffer we pass to + `sha512_crypt_r'. */ + static char *buffer; + static int buflen; + int needed = (sizeof (sha512_salt_prefix) - 1 + + sizeof (sha512_rounds_prefix) + 9 + 1 + + strlen (salt) + 1 + 86 + 1); + + if (buflen < needed) + { + char *new_buffer = (char *) realloc (buffer, needed); + if (new_buffer == NULL) + return NULL; + + buffer = new_buffer; + buflen = needed; + } + + return sha512_crypt_r (key, salt, buffer, buflen); +} + + +#ifdef TEST +static const struct +{ + const char *input; + const char result[64]; +} tests[] = + { + /* Test vectors from FIPS 180-2: appendix C.1. */ + { "abc", + "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41\x31" + "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a" + "\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3\xfe\xeb\xbd" + "\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f" }, + /* Test vectors from FIPS 180-2: appendix C.2. */ + { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" + "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", + "\x8e\x95\x9b\x75\xda\xe3\x13\xda\x8c\xf4\xf7\x28\x14\xfc\x14\x3f" + "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1\x72\x99\xae\xad\xb6\x88\x90\x18" + "\x50\x1d\x28\x9e\x49\x00\xf7\xe4\x33\x1b\x99\xde\xc4\xb5\x43\x3a" + "\xc7\xd3\x29\xee\xb6\xdd\x26\x54\x5e\x96\xe5\x5b\x87\x4b\xe9\x09" }, + /* Test vectors from the NESSIE project. */ + { "", + "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80\x07" + "\xd6\x20\xe4\x05\x0b\x57\x15\xdc\x83\xf4\xa9\x21\xd3\x6c\xe9\xce" + "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0\xff\x83\x18\xd2\x87\x7e\xec\x2f" + "\x63\xb9\x31\xbd\x47\x41\x7a\x81\xa5\x38\x32\x7a\xf9\x27\xda\x3e" }, + { "a", + "\x1f\x40\xfc\x92\xda\x24\x16\x94\x75\x09\x79\xee\x6c\xf5\x82\xf2" + "\xd5\xd7\xd2\x8e\x18\x33\x5d\xe0\x5a\xbc\x54\xd0\x56\x0e\x0f\x53" + "\x02\x86\x0c\x65\x2b\xf0\x8d\x56\x02\x52\xaa\x5e\x74\x21\x05\x46" + "\xf3\x69\xfb\xbb\xce\x8c\x12\xcf\xc7\x95\x7b\x26\x52\xfe\x9a\x75" }, + { "message digest", + "\x10\x7d\xbf\x38\x9d\x9e\x9f\x71\xa3\xa9\x5f\x6c\x05\x5b\x92\x51" + "\xbc\x52\x68\xc2\xbe\x16\xd6\xc1\x34\x92\xea\x45\xb0\x19\x9f\x33" + "\x09\xe1\x64\x55\xab\x1e\x96\x11\x8e\x8a\x90\x5d\x55\x97\xb7\x20" + "\x38\xdd\xb3\x72\xa8\x98\x26\x04\x6d\xe6\x66\x87\xbb\x42\x0e\x7c" }, + { "abcdefghijklmnopqrstuvwxyz", + "\x4d\xbf\xf8\x6c\xc2\xca\x1b\xae\x1e\x16\x46\x8a\x05\xcb\x98\x81" + "\xc9\x7f\x17\x53\xbc\xe3\x61\x90\x34\x89\x8f\xaa\x1a\xab\xe4\x29" + "\x95\x5a\x1b\xf8\xec\x48\x3d\x74\x21\xfe\x3c\x16\x46\x61\x3a\x59" + "\xed\x54\x41\xfb\x0f\x32\x13\x89\xf7\x7f\x48\xa8\x79\xc7\xb1\xf1" }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a\x0c\xed\x7b\xeb\x8e\x08\xa4\x16" + "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8\x27\x9b\xe3\x31\xa7\x03\xc3\x35" + "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9\xaa\x1d\x3b\xea\x57\x78\x9c\xa0" + "\x31\xad\x85\xc7\xa7\x1d\xd7\x03\x54\xec\x63\x12\x38\xca\x34\x45" }, + { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "\x1e\x07\xbe\x23\xc2\x6a\x86\xea\x37\xea\x81\x0c\x8e\xc7\x80\x93" + "\x52\x51\x5a\x97\x0e\x92\x53\xc2\x6f\x53\x6c\xfc\x7a\x99\x96\xc4" + "\x5c\x83\x70\x58\x3e\x0a\x78\xfa\x4a\x90\x04\x1d\x71\xa4\xce\xab" + "\x74\x23\xf1\x9c\x71\xb9\xd5\xa3\xe0\x12\x49\xf0\xbe\xbd\x58\x94" }, + { "123456789012345678901234567890123456789012345678901234567890" + "12345678901234567890", + "\x72\xec\x1e\xf1\x12\x4a\x45\xb0\x47\xe8\xb7\xc7\x5a\x93\x21\x95" + "\x13\x5b\xb6\x1d\xe2\x4e\xc0\xd1\x91\x40\x42\x24\x6e\x0a\xec\x3a" + "\x23\x54\xe0\x93\xd7\x6f\x30\x48\xb4\x56\x76\x43\x46\x90\x0c\xb1" + "\x30\xd2\xa4\xfd\x5d\xd1\x6a\xbb\x5e\x30\xbc\xb8\x50\xde\xe8\x43" } + }; +#define ntests (sizeof (tests) / sizeof (tests[0])) + + +static const struct +{ + const char *salt; + const char *input; + const char *expected; +} tests2[] = +{ + { "$6$saltstring", "Hello world!", + "$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" + "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1" }, + { "$6$rounds=10000$saltstringsaltstring", "Hello world!", + "$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3Oeqh0sb" + "HbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v." }, + { "$6$rounds=5000$toolongsaltstring", "This is just a test", + "$6$rounds=5000$toolongsaltstrin$lQ8jolhgVRVhY4b5pZKaysCLi0QBxGoNeKQ" + "zQ3glMhwllF7oGDZxUhx1yxdYcz/e1JSbq3y6JMxxl8audkUEm0" }, + { "$6$rounds=1400$anotherlongsaltstring", + "a very much longer text to encrypt. This one even stretches over more" + "than one line.", + "$6$rounds=1400$anotherlongsalts$POfYwTEok97VWcjxIiSOjiykti.o/pQs.wP" + "vMxQ6Fm7I6IoYN3CmLs66x9t0oSwbtEW7o7UmJEiDwGqd8p4ur1" }, + { "$6$rounds=77777$short", + "we have a short salt string but not a short password", + "$6$rounds=77777$short$WuQyW2YR.hBNpjjRhpYD/ifIw05xdfeEyQoMxIXbkvr0g" + "ge1a1x3yRULJ5CCaUeOxFmtlcGZelFl5CxtgfiAc0" }, + { "$6$rounds=123456$asaltof16chars..", "a short string", + "$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ4oPwc" + "elCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1" }, + { "$6$rounds=10$roundstoolow", "the minimum number is still observed", + "$6$rounds=1000$roundstoolow$kUMsbe306n21p9R.FRkW3IGn.S9NPN0x50YhH1x" + "hLsPuWGsUSklZt58jaTfF4ZEQpyUNGc0dqbpBYYBaHHrsX." }, +}; +#define ntests2 (sizeof (tests2) / sizeof (tests2[0])) + + +int +main (void) +{ + struct sha512_ctx ctx; + char sum[64]; + int result = 0; + int cnt; + + for (cnt = 0; cnt < (int) ntests; ++cnt) + { + sha512_init_ctx (&ctx); + sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx); + sha512_finish_ctx (&ctx, sum); + if (memcmp (tests[cnt].result, sum, 64) != 0) + { + printf ("test %d run %d failed\n", cnt, 1); + result = 1; + } + + sha512_init_ctx (&ctx); + for (int i = 0; tests[cnt].input[i] != '\0'; ++i) + sha512_process_bytes (&tests[cnt].input[i], 1, &ctx); + sha512_finish_ctx (&ctx, sum); + if (memcmp (tests[cnt].result, sum, 64) != 0) + { + printf ("test %d run %d failed\n", cnt, 2); + result = 1; + } + } + + /* Test vector from FIPS 180-2: appendix C.3. */ + char buf[1000]; + memset (buf, 'a', sizeof (buf)); + sha512_init_ctx (&ctx); + for (int i = 0; i < 1000; ++i) + sha512_process_bytes (buf, sizeof (buf), &ctx); + sha512_finish_ctx (&ctx, sum); + static const char expected[64] = + "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63" + "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb" + "\xde\x0f\xf2\x44\x87\x7e\xa6\x0a\x4c\xb0\x43\x2c\xe5\x77\xc3\x1b" + "\xeb\x00\x9c\x5c\x2c\x49\xaa\x2e\x4e\xad\xb2\x17\xad\x8c\xc0\x9b"; + if (memcmp (expected, sum, 64) != 0) + { + printf ("test %d failed\n", cnt); + result = 1; + } + + for (cnt = 0; cnt < ntests2; ++cnt) + { + char *cp = sha512_crypt (tests2[cnt].input, tests2[cnt].salt); + + if (strcmp (cp, tests2[cnt].expected) != 0) + { + printf ("test %d: expected \"%s\", got \"%s\"\n", + cnt, tests2[cnt].expected, cp); + result = 1; + } + } + + if (result == 0) + puts ("all tests OK"); + + return result; +} +#endif diff --git a/com32/modules/Makefile b/com32/modules/Makefile index b83a65cb..7910020e 100644 --- a/com32/modules/Makefile +++ b/com32/modules/Makefile @@ -1,6 +1,6 @@ ## ----------------------------------------------------------------------- ## -## Copyright 2001-2006 H. Peter Anvin - All Rights Reserved +## Copyright 2001-2007 H. Peter Anvin - All Rights Reserved ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ CC = gcc LD = ld -m elf_i386 AR = ar NASM = nasm +NASMOPT = -O9999 RANLIB = ranlib CFLAGS = $(M32) -mregparm=3 -DREGPARM=3 -W -Wall -march=i386 -Os -fomit-frame-pointer -I../libutil/include -I../include -D__COM32__ LNXCFLAGS = -W -Wall -O -g -I../libutil/include @@ -47,7 +48,8 @@ INCDIR = /usr/include COM32DIR = $(AUXDIR)/com32 MODULES = chain.c32 menu.c32 vesamenu.c32 ethersel.c32 mboot.c32 \ - dmitest.c32 cpuidtest.c32 pcitest.c32 elf.c32 linux.c32 + dmitest.c32 cpuidtest.c32 pcitest.c32 elf.c32 linux.c32 \ + reboot.c32 TESTFILES = all: $(MODULES) $(TESTFILES) diff --git a/com32/modules/chain.c32 b/com32/modules/chain.c32 index 23b01531b138b9f92254ef448c08b0a65e36e58e..5c1a9701cd20ab5b59d9adedaf0b36f5d8f07fea 100755 GIT binary patch delta 53 zcwXy}>yVqEEX~Tmz|fig$C|HEyVqEEXBsaz|fig$C|H diff --git a/com32/modules/cpuidtest.c32 b/com32/modules/cpuidtest.c32 index 2dcd50d1f7c59def5a30e898a63800be8c3f9c7e..a7101debc2beeec41cc6968a1c97fa4822cc2f98 100755 GIT binary patch delta 2343 zcwTK*Z%i9y7{5CXD5cxoX88}J8OL-CHi*nY=uE*XsGYEhOB1_{DQXr`QF@ysj4NK7 zal3Wd(!~Yi%)XfU!7qk6$rcBgr40SDxhaw9WRnHzv1Dcov~jNf-s@FBZSvgvyzlco zzvs{UzRz2Ki@)V)NkJ+_QOX++>Q?S!)Rp!3K2@_^H9WOLnVRK}Z7o=z4skpyx`n6i z2VDXyPv4Ed`{2dxeRIblIOne5sUasmv!O3OIANy8Liw35(@%x=WuBG#<_;5Rr;w|( z3Rd-uaEeS_LLrtq$DBe3rWD3DV{A9Za%1!uqdSftMmw2Djv%18Qz(@GWVwSfnFuEj zm-Cb_Rw|Y)wXXd?^Yb*p*akDzDOhU}L|3NTDs=Xn8xUkCfIA|aLN_frlAVcIp(eWo zI~y?@oGC&X93PoaOK`TxoWaqNTj1iz@H|7@T*E9_f7za~KkLm_!DHqwj0Rho%W&k0 z3_<3Lm5D{cXIS+K#VdFM^W7N>9>GJ980EEaKP@REJLIr86ZobszX1osBo9-!BT07;_C&vm#V9kM}AM$t6d(s2}TCPL?%-8 z;+4x$rZ;tnNo+A@4-c4#{X@9%#op%p4WT_N^QCTRNA6Q3tai@t*O|Rs;1w)u-M&~C z=iiJ_B;FT$$GgTC>*NBBM6}r#6TJn#*!x^y3qd%S*vo1YiSA2dVkVQ%@aaRze3Y>r zYFgFzh^P$(X_uuiOL8|E7Cf=IYG^w2EJheP%I?pN3xR2zBJM)Aa(Un%bKN@O=OjMd zaJDw3rV;Ugb|b+kqoc86oa%P%ikhbGWEX8s+BbcY5n0mt5|=G-86_^yW<$SCOXt3N zQt1)ek~cxiSF@|eiAYDcEXym*YP_1QzQ88saHqO(qFqAAduBkmbO?*2_6XJuJwgYN zU2twM^(8i}NhDg%DqLNS?3>dDZXOB_Z>ija2)ftcUbF$TePL3*LM{9RPd0cGz9uI` zTMe)_XtV>%29Z#82f8-Z11_!=Kw3Q@&zYnhEy^Wja&`hoSH8$AqsrArWisPi@mFZt z<=<>x9^R@=Vn(o$uES0pU}5U69Xr4(V;ToYArr7->M-$2;xmb9$fZ?VRW(8^dG7d# zJd%PaT7!-8fdz=@C}xhp9dX6HQxfb}k?fOK%Rng{jj;6wu6r%It(b}Sws*%&=s%;f& zx-2MHOPIFRBcvAemKqW@DGTE@BQLL>*A)QP(0C_k(ve>RsG8RA7Y>rE8)k!_>s)Aj zb*bczd(9|;yO#y78|UBCYuC}l&E&kxQ?wk_3wT!^At7231Zny`X!_~oIOt6uF?fir z^b1rvluKI9p3_|P_%xNgS@fCZ`E}~Qh3PhA4k)T#^cE*(M7I9XE>eGtk@ze_j~YJ>n?_F8a$m{LDPkUKjaKEgQxQ6Xz8Ouo|*wQ6!Fvv&@E6lsM;Xg z5}uIdUvtJ7qlJrWWuWq6o_Y?{4040^f<6JA1`UD2powCBH8otqQ{$j(pc^IRFGx|* zrmUWIq|YXPGxt*|^5RX0_7vshH9fj0G1*Lznkdp$ETLmXkE9fq@u5{~whm4gS delta 2302 zcwS{ze{2(V6u-N6Ti2D{!G4dHHSisbv5i$gwyfy3RJO$83Kp}(5ocTw6%}2}TvB$$ zTf>fXI#Los)Pz4Y@gM)t0U|`~loZee7^u;qZpIIyK|0<(sW4n5JC16 zn{t#4Q8!+akE7zV9@2>|gVkrOeq*&8tJ7FLN&K)@(7ig4g=jn^U;5X~@7qH+4Ek0y^ilrDWFjG9lR*xXMa}+-*9s5cDGss5GX#0pmZ6>JihKE+Yb7cwdKC3kjD!7F~^ zwDPA%2L0S6_;#wFLl#a{1|5SN&B~*4fH)(!db4Lch*Nhi$JHTSqbAr!uccqdL_vG+ z1NF>&VsZ#dD-_phePLOAhyU`aT!i;px>(YkOV7+4%myv0Xc z)c9no?u53hdd%2Z>E;tW_9BI0#;A{y>AH*veMq}sikoRFEQWzV4X)skO*I?ot)dRT z*mjRDi8k?h4Zg$L?@FeQGBT1VLtp!~Q6*D(#ypQ~(Y{IhO=IhT@9_nqPs`%JcuWov zU%K_RQl-#!9+o~G%=SQ(nxGUaPnpwlpetUqu$OecX$3@`4q;P5#I`C#Isse%Q5X;r$kY^0*91$pR-Tn*TC(_jYrwTpwGLX@tXf@=_U z7lwedZzUZ92*3$fUe|d9R@ZHgbI#@_^t{(l^Y#hawfhw#Gl3jkxgyS0YfGtrvvE=w z=T>O~JrRtP6d&8XL zS6rx-%p2VooOs>jCsnA7+vLUSC9U#BWhZHruV^oAlKx8u^Pg;MKv#5|;-=@4B6O&9 zlX19IFW~0QTYO-4;F3G1PIGz1ZKk?uf?uZVZlA8uYCi8ZOR#cJW-2LE)vhcMr>Xea3N9qygfR{RYr zo$@)YX#X~*0osOUnXdUnb893PyvE}7qRRZcA291v{mAkC2bg=lA2!+%w6f_BNZLW) ztJ;|Ux__EiBz6v1v>J>DyqeqPI&B$PK+6`bBz1^0K7Dq!k&a?U{s}_7&d3kF1#&ZB zX{6sy>cn*wZu9qB`_J={9dpTKdKPrkwl9unFU_>ZEmxoFH`8$MDx&5DQY0y7DE+#xUrLF1r2kjo&)Jv^oC2lh#O zYW>GPf3^a&vP@uFKwi*R(00)KppQVuK;MFXC=(Vj$Cn9A4D>zdN6>iG;aFX;YdIaD zso(XR8B8-iTt7#jcNCSlSIkQ+P79&=dccuq5-Nr0!X+DqCms1#8!5+Mg$>2J F_N=7IFE|Etc4oil%^Lx?|HtR^ea~}# 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 T;d{Kd$r4j-#$9@Qs?_=)5fgv` delta 5511 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, ph->p_memsz); if (syslinux_memmap_type(amap, ph->p_paddr, ph->p_memsz) != SMT_FREE) { - dprintf("Region not free!\n"); + printf("Memory segment at 0x%08x (len 0x%08x) is unavailable\n", + ph->p_paddr, ph->p_memsz); goto bail; /* Memory region unavailable */ } diff --git a/com32/modules/elf.c32 b/com32/modules/elf.c32 dissimilarity index 81% index 04bfa909b4be5f3d26bbc0c324f833bb48526dd0..d515b976f5873981a0b657614414f6987c15aa6c 100755 GIT binary patch delta 5171 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 MNxcX9AGyi@11b*8L;wH) delta 2381 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 A@Bjb+ diff --git a/com32/modules/linux.c32 b/com32/modules/linux.c32 dissimilarity index 66% index d9b318fb7ba29e243b2ef6049d6ff4aafaea1574..8060359c0f8abd0e9de79bfed478c343c5ac895a 100755 GIT binary patch delta 4509 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 delta 4432 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 KnCmSXv;P84>d>VC diff --git a/com32/modules/mboot.c b/com32/modules/mboot.c index 23638b4f..d1657ea1 100644 --- a/com32/modules/mboot.c +++ b/com32/modules/mboot.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/com32/modules/mboot.c32 b/com32/modules/mboot.c32 index c96c1eb8888f9cf9e95642f585fbb68543c348fd..7e25212ee4e1ca3d1dd8703e384443865e048c3a 100755 GIT binary patch delta 5394 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 Dque4p delta 5278 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 diff --git a/com32/modules/menu.c32 b/com32/modules/menu.c32 index d7614cdad79617d1d0d9b2e714f283b367ea6bda..c8ecfff75fcf031760128d58bb29da76e3f2e8cf 100755 GIT binary patch delta 13103 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 diff --git a/com32/modules/menumain.c b/com32/modules/menumain.c index 5bd0eb2b..b28371ef 100644 --- a/com32/modules/menumain.c +++ b/com32/modules/menumain.c @@ -756,19 +756,65 @@ print_timeout_message(int tol, int row, const char *msg) char *tq = buf; while ((size_t)(tq-buf) < (sizeof buf-16) && (tc = *tp)) { + tp++; if (tc == '#') { nnc = sprintf(tq, "\2#15%d\2#14", tol); tq += nnc; nc += nnc-8; /* 8 formatting characters */ + } else if (tc == '{') { + /* Deal with {singular[,dual],plural} constructs */ + struct { + const char *s, *e; + } tx[3]; + const char *tpp; + int n = 0; + + memset(tx, 0, sizeof tx); + + tx[0].s = tp; + + while (*tp && *tp != '}') { + if (*tp == ',' && n < 2) { + tx[n].e = tp; + n++; + tx[n].s = tp+1; + } + tp++; + } + tx[n].e = tp; + + if (*tp) + tp++; /* Skip final bracket */ + + if (!tx[1].s) + tx[1] = tx[0]; + if (!tx[2].s) + tx[2] = tx[1]; + + /* Now [0] is singular, [1] is dual, and [2] is plural, + even if the user only specified some of them. */ + + switch (tol) { + case 1: n = 0; break; + case 2: n = 1; break; + default: n = 2; break; + } + + for (tpp = tx[n].s; tpp < tx[n].e; tpp++) { + if ((size_t)(tq-buf) < (sizeof buf)) { + *tq++ = *tpp; + nc++; + } + } } else { *tq++ = tc; nc++; } - tp++; } *tq = '\0'; - printf("\033[%d;%dH\2#14 %s ", row, HSHIFT+1+((WIDTH-nc-2)>>1), buf); + /* Let's hope 4 spaces on each side is enough... */ + printf("\033[%d;%dH\2#14 %s ", row, HSHIFT+1+((WIDTH-nc-8)>>1), buf); } static const char * diff --git a/com32/modules/pcitest.c b/com32/modules/pcitest.c index c5e72e34..267934c7 100644 --- a/com32/modules/pcitest.c +++ b/com32/modules/pcitest.c @@ -37,49 +37,65 @@ char display_line; if (display_line == 24) { \ char tempbuf[10]; \ display_line=0; \ - printf("Press enter to continue\n"); \ + printf("Press Enter to continue\n"); \ fgets(tempbuf, sizeof tempbuf, stdin); \ } \ printf ( __VA_ARGS__); \ } while (0); -void display_pci_devices(s_pci_device_list *pci_device_list) { +void display_pci_devices(struct pci_device_list *pci_device_list) { int pci_dev; for (pci_dev=0; pci_dev < pci_device_list->count; pci_dev++) { - s_pci_device *pci_device = &pci_device_list->pci_device[pci_dev]; - printf("PCI: Vendor=%04x Product=%04x Sub_vendor=%04x Sub_Product=%04x Release=%02x\n", - pci_device->vendor, pci_device->product, + struct pci_device *pci_device = &pci_device_list->pci_device[pci_dev]; + printf("PCI: Vendor=%04x(%s) Product=%04x(%s) " + "Sub_vendor=%04x Sub_Product=%04x Release=%02x\n", + pci_device->vendor, pci_device->pci_dev_info->vendor_name, + pci_device->product, pci_device->pci_dev_info->product_name, pci_device->sub_vendor, pci_device->sub_product, pci_device->revision); } printf("PCI: %d devices found\n",pci_device_list->count); } -void display_pci_bus(s_pci_bus_list *pci_bus_list, bool display_pci_devices) { +void display_pci_bus(struct pci_bus_list *pci_bus_list, bool display_pci_devices) { int bus; for (bus=0; buscount;bus++) { - s_pci_bus pci_bus = pci_bus_list->pci_bus[bus]; + struct pci_bus pci_bus = pci_bus_list->pci_bus[bus]; printf("\nPCI BUS No %d:\n", pci_bus.id); if (display_pci_devices) { int pci_dev; for (pci_dev=0; pci_dev < pci_bus.pci_device_count; pci_dev++) { - s_pci_device pci_device=*(pci_bus.pci_device[pci_dev]); - printf("#(%04x:%04x[%04x:%04x])\n", + struct pci_device pci_device=*(pci_bus.pci_device[pci_dev]); + printf("%s :%04x:%04x[%04x:%04x]) %s:%s\n", + pci_device.pci_dev_info->linux_kernel_module, pci_device.vendor, pci_device.product, - pci_device.sub_vendor, pci_device.sub_product); + pci_device.sub_vendor, pci_device.sub_product, + pci_device.pci_dev_info->vendor_name, + pci_device.pci_dev_info->product_name); } } } - printf("PCI: %d buses found\n",pci_bus_list->count); + printf("PCI: %d bus%s found\n", + pci_bus_list->count, + pci_bus_list->count == 1 ? "es" : ""); } int main(int argc, char *argv[]) { - s_pci_device_list pci_device_list; - s_pci_bus_list pci_bus_list; + struct pci_device_list pci_device_list; + struct pci_bus_list pci_bus_list; openconsole(&dev_null_r, &dev_stdcon_w); + + /* Scanning to detect pci buses and devices */ pci_scan(&pci_bus_list,&pci_device_list); -// display_pci_devices(&pci_device_list); + + /* Assigning product & vendor name for each device*/ + get_name_from_pci_ids(&pci_device_list); + + /* Detecting which kernel module should match each device */ + get_module_name_from_pci_ids(&pci_device_list); + + /* display the pci devices we found */ display_pci_bus(&pci_bus_list,true); return 1; } diff --git a/com32/modules/pcitest.c32 b/com32/modules/pcitest.c32 dissimilarity index 96% index 0bd6620e0082ec8e1a5848cf04061ca4ab48d96b..a8c3465a045339c966ad7a1772685200a2b714c1 100755 GIT binary patch literal 10148 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 +#include + +int main(int argc, char *argv[]) +{ + int warm = 0; + int i; + + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-w") || + !strcmp(argv[i], "--warm")) + warm = 1; + } + + syslinux_reboot(warm); +} diff --git a/com32/modules/reboot.c32 b/com32/modules/reboot.c32 new file mode 100755 index 0000000000000000000000000000000000000000..4f3577083d0c96e01f5eb74c949233ce565b78ac GIT binary patch literal 520 zcwTK#%}d*07=MzyTO&#vb@kMPgA5exp|HWK9&D9?;K3?7scd7H31efdHhK|MUIbr5 zAb-L@Jb4^wtzfJ11C&YU#X(^cagdQ9brzgh7oS(JUViZVcs?^;&$q{wNIoamDX{Vh zq4{$Ck9fXlq*anrx%dD8*hr<#KPKw_*!hAUY(lw@9oc*6^sWK2>Hi!@eO?3ICeGPV z()OX}1-V)_dQ?JBO5W$nz{|n@1a)P$#SVA6RDu~;6A+vhJ+z!H*DAn%*exi`1N0>!{ZPRkH1ZQ!~$1Q-~$>r+)KS( literal 0 HcwPel00001 diff --git a/com32/modules/vesamenu.c32 b/com32/modules/vesamenu.c32 index 2e55f35b2c2d39fbf1559ab012a970f1cd1b983e..99539ade4ad8e808aba5e7d83d3b90101d5853f7 100755 GIT binary patch delta 26930 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 ? z0FH9O-+c}~iz^VGeT+MG6vjV|ShQ2N3gX{(!H8eBQ??M|m%CuZTX)LVLi{@}81ZX& z%9ca?dKat$c+*bViYok(z?Pk|8L{HCow6Ab-nCOUBf{V8l+B3n!JV=h5iZ*)n-Srv zow60N;gdUMD!r3XC7x90& zV8pj{nHuqb@04N0KWqa3Yo|N}NJGAqVan_Ir92*3;qztj+>K;4@yOe%Ll+GZ4Ihy~ z=4JD=%xOrSj9SJF>3c{GP!2ZANo{-zWBPku^YRT>xvmM`50ZYqmgxqmC!`ceqaZDZ z^bVv#NMAzwZobx^`E;?C`3lk@NR^PP7mJTRB3*~{GHaP(x%6M2nLqv}bT3OJg2o2L|TYoc{buP!>~=X1q#HUk&@$PO!Xz!T(3QKB^_lXs3G1!@XqktQDpfir?tz@U)3o~LzL{f zbj=K~5%6vUl>SxhQ%)`t^LqmzlpLsI-WUXXAf&*-5Y$1cf)qYP$GineHB`s+g|rsZ zW=Jm#(=la`;)jDJAtj{4rUU7d(K_ZHBsN3Gi@D`DVI~xeTcuQpPJV36|@afsnc`m*JkSatfp!M?3bsy&9&sO~*`ye60P18D-3FG2p>I#`piaMOkSzoviI z$qC^G$h};6Z4;W-|6_`Q9s&>#ssH~cp|DY+_~&lJneKBnZ3rRS|H`&7TKWwh_=#G+rwi?BMLJFa8! zKV4sgPyk=jn+7>99J3+E7e-8wWAtuz<$GM=#!3t`pu7%p{4>%b$nh&H?f~}uDrCAH`=Fgrw)>i=UgH#Hs z3erJHCn24IbOF+3NY^1bKBKE%fN1!Y432{1%+w|ce2KZ11B)G;kyhQ6<7WIv&}HSt z@BK=`JX-rh$omfrGfby?m{v8ABuK_y;`i4`x5z;-I;9)H7LW%+p0(kb=&uJH*?|B5 E0UgFJI*GknkWa0YPYO2^%iqa-y{a{6c8)iDnk z>i~n2yI$j*{e1Y)!F)M?#x`cBj@cIvUvEi4GlBbWe2o+s#4vA+9%p^)c`0{W!>1Y4 zxy2?A$vBr`98I$mB28K=;G~gF8Aj@aNR?Cu53Wp8YEwXK`?5dNG4`XQ7)H*nz^rZ5 zn(AH#kRt95Z!fVcd5Np`u#7RNBSUgiw&@uD2lhWaWqScGzFy(%lsB7hf2-IG7KrTW_dj3%Crt;o?B|~Ue*kQhOdgQ zO#TamnD4&AJ*U`otlW(mV(}kSqhop$DB(N$F()ZbJtl{SIE@Bv<`2M4>NAE3W0sbM zK%=9_y*U<@(1w8w_qg%=nNCA)_UFRuZs~sC`7+YPDCoXuYYZ(|l)q$uCw$}PZw9ue zrh^B&sU`uGo_P{^el(h44j$d2V;sIihSZjv$CB*Ps5-4BbO7MoLb1frG0Ds9nbi2b z)=8eGV268Bu*u({PfbrBnt21Oye?O9c(DhIsfs1HkqpxdduUX5X%m_OJeK?*EB`FC zDJ4R&Lzg;uu#170%%BTU3Uid*qC9;VX*G;jIky==Ci)q>^U|qjR+{6V@b{$Gpm5)2 zPvN{W2D@hsQ77IvdhDwKW)9W92k=NQK&85=H1M4Qt%F|Y)wJ`YAxKQ4J zqKxJ|pIRDZ&CBix;tntbS@vaj6uwk-3g0!HVc3Ii*2P3-K47@ZCN02N`ap21LVTJ5 zZeZ?16JLNrc2R}Y2yNVh1DXPFt}Fx%z^(^Fg!W>6wg}_g1454slkJkb9Rfyq4qEiH z&>mWnq4FB{9%ibEF;o);ljtKe0=vn>I9NilfGbtt2x{d)nvKH61KU)pq*K+hnxYR; zrS>6}iKR<^0d?8H3YmiKfRj@GaXQl}b%U0;VnuqUITjlW9ZBcpf1+_q&+LyRPe=R@ z@_e3w^2no#()6+TQ{k>fqd4be%8|(C=L}>+S(hpu0qMdik3d-ma&yYW(yXcx4FnmQ zIT~xe^FImT^S=?`U1XC4lw6j%hA6&DI%!}Smn4s< zB>X+Vs)5S7$FQDpdE|A%yNwJ9;c3v4UoEaLm`iRkySA9!TkLp4mS71;0M*-%z#>x* z>rgi!{75+5sF^}BLXaADBw8WNvnz=b#(FkQyg@mb8e7n>K9)F`gHCYlJuQAas-dU3 zr%mS_dhQ=$YBCwDKi-dtI~sQy80v&wo`cBI4;lwVfr1;WF2c9Tk1hIjADSna9Gx^C z5n!rSI4k@wdJA0}w;s`A0xE?qI!EcGADf|5k1LkE0Y5pq$`VScJ0d%_s50(o;z_fA zmNN0oe3sh%zRge|ok$1&bf(Eko>KEbEtE8F)3NBG(Z{9tWi{dzR@4b>L}sKLO40t$fjE

43g}ZM<7L~&1UZa|nBRFd?!}Le7 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 VaJ=x0g=g0KSE9a-uu+5h{}0y^C{h3b diff --git a/com32/samples/Makefile b/com32/samples/Makefile index 6d0815c5..e14e08f1 100644 --- a/com32/samples/Makefile +++ b/com32/samples/Makefile @@ -1,6 +1,6 @@ ## ----------------------------------------------------------------------- ## -## Copyright 2001-2004 H. Peter Anvin - All Rights Reserved +## Copyright 2001-2007 H. Peter Anvin - All Rights Reserved ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ CC = gcc LD = ld -m elf_i386 AR = ar NASM = nasm +NASMOPT = -O9999 RANLIB = ranlib CFLAGS = $(M32) -mregparm=3 -DREGPARM=3 -W -Wall -march=i386 -Os -fomit-frame-pointer -I../libutil/include -I../include -D__COM32__ LNXCFLAGS = -W -Wall -O -g -I../libutil/include @@ -41,6 +42,7 @@ LNXLIBS = ../libutil/libutil_lnx.a .SUFFIXES: .lss .c .o .elf .c32 .lnx all: hello.c32 cat.c32 resolv.c32 vesainfo.c32 serialinfo.c32 \ + localboot.c32 \ fancyhello.c32 fancyhello.lnx \ keytest.c32 keytest.lnx \ diff --git a/com32/samples/cat.c32 b/com32/samples/cat.c32 dissimilarity index 76% index 9f314be54e00a7c02c53a1e85fffa766e229618a..3a23b0043e800cb868f08ffc5a67abd24018fcfa 100755 GIT binary patch delta 2345 zcwTK)eQXnD7{9w-yRIwrU~L)OggS17j}A5+x@FaLOLY*63{pw|sG-rRAx>S~oj5ag zU9Jtg9W^W^h9wgH!!Hv4F`y6;=m_aR|6yW8N7RWSquz)bmTiqn{k_+#Y|$o9-{*Zk ze$U7IzRw-<9`YVuQ)Q+oN_p|GmZh&V>eAM`AE>T%YdLDSGI{&A;m4}VN}$fWD2Qf; zJ3Vyca3Vq1q{`^SjM<(#M)%Plr7D^2bPE3urH(R!G%$ULAO`pfCB!?`Q~Y~m8|14Y z>K+U5UD#4sqsH24tX^Y{7;89>A66gPXWv2|`2b%n|H(QI%4EYI^YR=O%hie-7J4`T zpZi&wVC;aK8sMGHNTR1q4e{NBwl*Z$4dAZq=G3TZh2&$hPMFC--p6Kb24~Gu2FGP* zEd|b#oi;c+dlOt96`o~Cm~XI4wqEs>?svTu;v+W4`O##Exr#uM>>21{xeek2$tPL$ z5k=r5iP_%LxdrcC*t)P+PnNP2ny)wLu30zpW`8y7-S%dG1|x%Eve(Ue^Stsr({Db*6pk3X zdk3t<{~p4`a<4ezZK+msrPK@S>U6~8I%QEiFkM4>8{d&7}UH2};Ifg&S1-CY-T8Mf?`?0_% zqocXixYeE7xN1@Nu=jnf+Qk9M$gCKALC6k-JW4`-=7xP#D{-8DT zM5UwK7uA(vHBNP_Pq9Tk!l^;r=pf(qnhg*^9l|cDeY|sHAKwM!AcFg9V}%3TDiW)} zI10e8@RwG|EJaPt&=i>$o)qmW uuN(9fq{UxRJH0?YHDlFf(NwEzh3Uu|F7=6PTk3sR#LiW7lz(G|uKfpBqUUb_ delta 2304 zcwS{yeQXnD7{9xItnCVSuy%|wS%G(0U>h4S-Ll4XONAMVE2Po=G2#*%ML;pGbuN}& z&8?xwQ8Q9C5+yNF6BGZE55EY|8B)MMfJroQs4NlOF2@oQ7DiF1zxR3#11@>)ectEe z_dM_OJony#`UCYNE2^yw!^p4x*FOJkPMLq}OU3P7DKOjQiK%M`pIPFxL0fP$5X~?L zBOca!Fqvd4Gv(|EmoLv8X5;K9nQCq`yASVmnUA@sDBXz50V2p@;#7{25sDrpE{Lkm z21p;a4AzjbhK;qxSUtuXDB!{BrF%71h9m;SCH-sW_wA({a=4xdOd?+wTm6W)_?Y_% zmSSvzn-U<-HYCwsu7pWd%F&4=s{q`mu7Wn*G2s&iHuB$Q3nb|Wyc8r}PMr@G<;<$t z;B4w$YmpPwn+E4m|0!~!msS4&Tfm`Da5VA-E5*L#vk$m;g^9<(pBhbvxl4%cQI9~E z$ghq)k=|%lo|2=)le|4>pY0_cJ-D1xM|6wEST{YEejF189efBh@Bnl@38>o*)S41% z0I0|0T&XguuauyfVl`$?n;XO$J=wdKVn6hnOqsa>MQHJ`+IHF|31Pb@^A3NKG=!t68V?;;VpPQ6 zU*Yv0N|<1b{wUVwUyxx4We-a^GcAS9a1f}&WxVXv(oav7xo4?z&aow#W!8%J&>`(F z#j2x>j^=AI*I{i;u_`Z^A0XSbpGt8{*gD`It6L0dW&C%~$Z--XjlNc`R5qW7XGjNg zK9Z#-D3!|d=8_)hN)RI)BzU_DUvHc!L0N9hGu z(3U_;4oNp`+d}d=d3@>u22(mC$fNS*P4c+?=h#&kdZoWTQ31h-EhgI2-E4c11ooN% z6KJ~_ufW<{4#=ok&TEz*XjGb?EoMa)er-W>mbwc32U#g=LKgmXN8!+HocP&u*wrVe zWAmuJD@MB#(d;Ni{U+2QlDrai>aH;h<~71W;T5GxQ*1r5j^GmT46UM<021&ZRIvFx z5^L=@=QvMi2WCEKm<5Lf?fS!p$?0ghZtTr*4cc-V-)u-KbKDwDpc2856akS) zK2s2DkaWoxmEFWIU)EmRBHb&*T${VwF%|u$oav>42pg*1VhES(4cxkQTL{b!9CG*6 zDNgSp_@@14E@diEm&dH8*kY%RsX+Smj5wmvVQOs)ldgUzs^!bEo(`ns!^P1>lfK=E zx^Phk&K1$mH3q;g7C#1-Ucub}RjjE18NlGDcawq45qq5&C`27}WQK|(gC-35Xnna@ z3mtW7f|c&*rMoF*n-JfL`1F2{<9;urlc3-42=Af3;-4_-lh0|3_HSp}VQpB}>Xy%T zb|tg1>nuJmYRtd?Df4u39yxyaAT#Ix;iMBmJ6rmJlmZOBu8r%Td)l!`>`U3SMqCg0 zG+&WhwH06iE!(ukMImH-Np{vxuVP024N82@s1H2_YLl}0>A#Z(X}*H6uKkYT^L%p0 zokF2>7xdGyugaA%nhULPGSPW(6cirk%LRl2O}kGz6F=HgzRbc-9DPxcO_`l;XJ(=z zC=OHz%o$LvOJJg))1X_}FK`v<-W;Bi`pEvOvHx|BybNTo6qqML^`I8eM$o&UVbF)5 z&q2p3g@w#V)dKSw=xfk%(CN%c*IIXIslY^P>E+2VlQS$sF9uhJbyqaRJw<8hDQPF> k$R}rPx-6XOa4#~YRtTAI+|OmcaQ8aRH3H*bQ>APF2iLmGKL7v# diff --git a/com32/samples/fancyhello.c32 b/com32/samples/fancyhello.c32 dissimilarity index 77% index b2e59fd774f42785661a6138a333f4e348b8ee37..2f425b9c48a0af29852a6089903022cb1e7836cc 100755 GIT binary patch delta 4092 zcwUuP4RBLc7Je^%Nz)(tUQ7A|{fqS>AO-t}wnK2!T7E`@Myc45iW%*)AYB(|A~IY0 z!n|b2YY0<(jw7?W)0W*CcXdWwS!@v@m6C#@mUTy69CxdWW8y0_D2_D3n*Gj8G8Wev zXESr|J@?%6f6ux1Wuj%`4rw^yc;|*|wc!&JwE{D8qN#*g7$1!pF25LZi`YtKHvo7`rnQMRJ7GzG{CknhB{yp%>I| zLJpCWFI-A&ySDb;-BTRLFwtLPci6R9$YG*eScZ|OayRww@4K=1_lpHa`6#-HXk&su z>@ILR*KRtvf6O}n&=P?e4q%AxgW017(r^gu@>p)Hok>%UsyS>qdq`c#x^rI4hL-7s zCx39S`U2a@j;XT@d!*e{dnuq+u|#PTEy2U$04*J28Aw~lTg5Ic8O*NK+?krIQ*%dZ zZcpHc*+%QwKE#`770cwS9KT1Vh4}mgyz|EAd2XI5E&Y`E>n!P51F>MMXla5I-8sQF zacdyE1x{{-;;z^&*bOyL+Jqe|`6JV z?C^iPGwVu+*r6L&BC%(5jwPOZC@ejk3{omxr?fq#^j6Z^9(y#UwJfc*9a;}7k#uHa zEolci($%20a*L&E-C4$zJP$o*myJ4Gb?i%{egM_6Pl3ol46zT5dOoY=X+y7Z*pNJR ztiIo6Ci(AS#v6Z}_qBjes`JJl<$Y^lO`7eEJKc|YOTF0TD*W^ zHxlV(Ql}I&)&32Bx{#($G!rGnoD`561d@0^#c9`L3mfEVZbu2~VF7xBKVGCv9JpRQ zY3F$i{D~rMGH9ah1KK~6h%!1FuSEHGYUhHc;5zOHS+n+L+A-21Fj6X=Ns~^Pw2{dp zMc{X7nfz{wOX@2o?qJ=Fdf{~F{-Sgxgc(Ahq4djB(&MW8TbIg^0 zz>*b~#5bsJv;sup0!JrwS+OP7UIec-*a0k|m14KyfIMZs bN&PPAYp!-M?lu_mV zRm%CSw>r%nF1)h)nUgV~c6TE#BIQSIU&+TJw2i&Mrm9xBBgsP!06kX7=}>@gvj zHZ8w4Op*fsbXX2&z>Bufs>FdS*kY%#vimQ3W)Z)|L&xOSvVuL5XkP_cxBp{zt}g2_ zqR`z2B*`X!k>RO_X*Vv9j^2fIdBAuF0giELd}#7M>l0>wR(fOP_j4m zh&58aHs=SX>zt9k$Y>MoI0jcdCj@wFA7=aLI`arjeYcEEwF`NW5DQ>m2kovUopOx~cDn&Y&sa6ZcT3M!3*R;+_Ja zBYNeP2AAM$jc-I$dsdOuo^WR)BkjE$?6jl&J9=%pcF$7iw8@jKJk8Dt%afPnFnMf& zQ}j6W;Bm;LYS14C_|!qN(kEc)Qci2deGf6qz@6f()HzqQtoDaJpR?#OV&?ZfM=h;e z<9+*?8IMmcl?9z{`t?a0=>4^Je#RZ}aA+NeYru)#3!3_%H(=J5;2J^4Zd4kz8-aqT zn6)`cB4~V?Hg3no=|VGqfL*jX5=ns}i2<{n-eR&_`!PHz>&y0?!JRvuNTlzG?ktKc zlF4Wm9GQi2&w^kH(2y4`9JpX zASJ7VW+Qn&PR!Ca?m`IX3JPQjz~V`S45{T%`t8Uem>+!)p^4LpbAT|M*$ z76Su1dMp{@fI3*PyxdQY1qyd!3Y71{s9YNANiw+V)T;&aq!sl7lNBg$#We5;ig~E1 zp17hP;mcyEv0gW2ucwG9Z$O60?E3W^VxN7NNNhxAjkGI2S;KfThpkqm%CvFtED0WD z>UB$#bt$RX%Mb}Y!BDAk%KOT@8^E~ZF z-ihQLq$5Zg+=%a;i18FyGm?270h&@eYMCujhWgsX1%oeuJ0JjEm_(iIASqB}EBbSA zKu2+(GYKQPi3fMAaXl(pp0dfy59tBl0JXwV>n$){1rMXM;<#gQmtUE{&3lk|F89l0 zwv+u2p!rX@&=}W7mgi6>hcCZ~czg{M@Ca=vZyl>bF>Ex$?qy27H`%eP8~*#dJ9;Lm^r;7*Ic^kRN41%Vkjf%`}6$5OLv2JI=p(}e=_ z7r<+PFyI`(RD_cPSOH4_zbFz4nE7*&Re%k!65v#uD{f&gsM{)LmpjUn-AunPzA-ZN zJs$?mQYA18)WM3`x4mSY$&ssb9GgL#DS7F}l%y!A+pJBhSXm|&-y|?K^9AM|Kw^== zlvm@Hz}y5_0XPe|8}L91ccte47dEGW@a=%#Ch-Ru-wdYE&%gn|p8z921ElMeI>$QB zwyB?5D^;(x^{L7-=d+~(a|~59fIO4{x&UtEBV2WTz9v!UfmF{OOU({ccN>8IRuK=~ Gw*Lin6Crm1 delta 3999 zcwUuPe^gub6@M?hK!B9@DB(vXp^-i+ZJ`oC2dC)_7=>xHQDbG6TILwy+RYy%)^3#0 zJ#yrc#ld<0v2J!N;I{6lvuEon)U^$Yp>?y;d5&}K+&EjE$zFTbStm`0%|7=fS?Sz4 zp5>hTzV~~-_xHWuADO**w%I?CaJ_l$f-QX1Z4;Qun;J`)Rq?5q?!xmSugD$kBw{AR zF!DnS>++t^1@kWaC|KAH>fQ2ObXzXNxR1=$2+Xd_XYlRGN)$;EPW?yQ{ZRvi5`_#n zKVm{Ik(17xPdv78&t1FDavZ}%zk=lnN41d4M7OdGBb_yNKRPnBqPVYGVB~kB-9(!f z0%7k`xBH%MX=K`Z-SAq0ndrtR`YqT!q$3T(V3($iu{I`6`JR%?TG;25RjfDnhdI!4 zG2zP}H7fhqPEeQVp7Kj)du696$R5!cJRlBJa4yjVQpt={?7)=4=uVBE)M!qP*3{@s z;D@o2=CQ#n1nU${(!V(Vshui?4Ve@grnmUOg0Ea()Cjc}qTH|P;d z26LL>WC;{^#8zQ7)HG)ow%^Jh3@60EG)3+bD|N9vED^@VxD;lHUCK;iLhO7Bv&R0K z#Qc?P><>T_2>KODS?ok6>7KP`Z!g^H5v@7=k*SbJHw)X=*w3-nA7AaWgl^@6H_Beo z8u)le_I$f&)r`xL*s#X2*0+Je(!$9gr8}-t>b#<~PISgLr?i^WTAk2(K#rs{6SJos z8Fj=(PfvW2b>gKy7uSrKS8pxHoLsj zK=PMira%65e!#B$hP%e!1Mb*I47t_G4-9C?!+f9}WOYY>yoVpS9{`e!_vi|s^ ze4vSzZs?Euyruo|C;5PlG#pCSS)}fd{W3Mlp~*gcb|Gc`OsXEiOxthaksE3DNd5>% zu^Unn0!h4`;&f!G}Luq|OC1X?eH$$0Q<8 zO~sd^(LL(PU}kV5cSY8qzPihw@+@t9kx4g9n#ttBBJjJ_EdJ%s%e|sIy*botf!(7mXCU=P)kLN%|gQmjh5B7@2HN9d7G&jI_Wkr9oVD&!Y zs<{^qs8qKaC$Nvf;P6&Rz3^a18McZWIz98Jq?642?_sG8mf8@vp2*P79eGNAyG1^g{f6&P;H;GXV)Y8JCK`O% zp$+Uhm+0KdL5;KVt=a`kpCqf~pTU<2FC1#VEliRE|4dj4XTS?bs41~~ zzE^ax$1tl3obxUD*y$H5O+Knqr<#paRJ9-voq^L{qbBRqqoq4_Sg4df$ne#{>rNaK z*1lDAOuzvvOu1~w;aEct7tvXpo3JZfDK=N1puT@KW8j=OS7WY>=&IFn%|4eR6-9Jw zRDnVeQk0}dcvGG9W@VaM(;RAI*P)0#l%0BZSy-C0O5wIaU9&W$+u*C9P#Swhmp@-! zc17qa=lmaJc*H6{N@LG(iB<5gRemeDO?1d_s}J8HeUk8*Zr`vDUD1;f$=CwPDq6fF zMJv||c-LKbyMc5g$ZgRhI<17jYlb-8V1_30DXwVpf=PFUAO2S{{$Z86siDy$w)Pm2 zE_;NvHo+x3&X!j4n$n{4<{++4Ev}PL*vjJSVCj(F0HwjqL8rJKjUU=3Zr8d2UA7ig z)*t>c9oZ3XK{}qWh2_70__O(wUw~a_!kgo#p6W~X6spu`*9`e?psgUyvC>5?x96pB z4g530Ke{4%aYbZNr)XCM+_RFb|2?pD$j8*;q0P)XaHlwzYn-<^v;fScgz6@p#LGPeJU5g_Io4HGF zP*(s2Q8uW{l0?w>G;PK~=Q|_6^F^%U1VBzHFywR4;Gi3s?AlJl6Vp)6z;Qm%eKC

vPsj{?L;ljq8ClqU*eEj`=+PZ0>$qSRU33*$$
zXfsQU+Qo^w#D(*9iv;z$>HmL7n(~-ZA4(&f&5iM`{7|Z>j6x_y_;+p$E&fwMln|UZ
zlO}(4JRc=I1x@mI#miB`^UxIks~}3K%9|-8|1oe_IFUC?b_`m_gumy_@-6;Mswj>@
ks85jP$H>T^7?XrK`A<+uLT>&O;S=i+`aAmHKh$IVUxw}IY5)KL

diff --git a/unix/syslinux-nomtools b/unix/syslinux-nomtools
dissimilarity index 71%
index 40add33f37dcbafea3191b231f46b86634698cbc..f94ff40805320ec1a8529f23af0c4c8323ac257d 100755
GIT binary patch
delta 8681
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
LME~c9dXE1IRY{K%

delta 8434
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
vPsj{?L;ljq8ClqU*eEj`=+PZ0>$qSRU33*$$
zXfsQU+Qo^w#D(*9iv;z$>HmL7n(~-ZA4(&f&5iM`{7|Z>j6x_y_;+p$E&fwMln|UZ
zlO}(4JRc=I1x@mI#miB`^UxIks~}3K%9|-8|1oe_IFUC?b_`m_gumy_@-6;Mswj>@
ks85jP$H>T^7?XrK`A<+uLT>&O;S=i+`aAmHKh$IVUxw}IY5)KL

diff --git a/version b/version
index 8b7a5667..6272cba2 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-3.52
+3.53
diff --git a/version.gen b/version.gen
index b9d7ce02..2b8b6029 100644
--- a/version.gen
+++ b/version.gen
@@ -1,3 +1,3 @@
-%define VERSION "3.52"
+%define VERSION "3.53"
 %define VER_MAJOR 3
-%define VER_MINOR 52
+%define VER_MINOR 53
diff --git a/version.h b/version.h
index de818142..05971e23 100644
--- a/version.h
+++ b/version.h
@@ -1,3 +1,3 @@
-#define VERSION "3.52"
+#define VERSION "3.53"
 #define VER_MAJOR 3
-#define VER_MINOR 52
+#define VER_MINOR 53
diff --git a/win32/hello.exe b/win32/hello.exe
index fe35c8e72e1ec23505011a95c5e1fbf39db5ce58..41a6ff5bac595ca6abbc8a6f35eace33ed37d6af 100755
GIT binary patch
delta 21
ccwTGJY0#O_!Sdyyz5B!-A0{1*jknZ90bn)=RR910

delta 21
dcwTGJY0#O_!Lt47GPj96K1^ZS8*izJ0svy@2(JJD

diff --git a/win32/syslinux.exe b/win32/syslinux.exe
index e040541827a5dff71e71483b611b43ead3765084..68565917b0d625e44556d705d9f4100b9053036f 100755
GIT binary patch
delta 6437
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 RLACChXw&A80<%UZ|1Y@ng4F;3 delta 6266 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 vtZVkHX

f!^6Y( z-na1{>8v2XzV~?qf%5Ue8#v|7+{ai>xyfkBv(_WDHZE}5$Is}E%2$p1S;sF*ml#-< zo)xQ=JM*&HZAx37Bi{(lB07Z!@v)tI#j5-?ugpZ$5^99@nT!`;VdiEotennkf%po3 zO}?i7yYx+4*uq~|tWhP68un&NeH@cq+rwM*M14Uy%FCvGP$x$d9?_t_bo(S-yodHF z?LuSgbJgjEPzx(fn>RhMWiw)h2FU&mcb{}D@jvDf{p&~yH})%hZO0GowJGljrOWE^ zDrEQpJ-S)`oqQtpA?yqlj}F?D{CrE^Ab6?I`Gc>H57-oY{_>lNL^tk?zTZaI2{IB) za)jKo(xq(w6I->F9QIYYkdV;A1>zN`tW6=l!t8gV(qM(de8x`krvp;vGz=+og%oO0l8iC2L5}3=Y1*RH! zBOnZD2Hc*)J*n~kh0Q4-ybJJ162G5$auL(6&wvnM58%bm0Ma$7G+JlS2JE%V-QO-n quF*TsAOS`|2cR2?I8c6dqB_u8hSa{Zr^YI@bUlFn{16Wvp8p2R!`pBG diff --git a/com32/samples/fancyhello.lnx b/com32/samples/fancyhello.lnx dissimilarity index 82% index 4cb1246c4f8fabbb9faaf959fe641a01e84e13f2..e6f6c7fba38ccec541c162ab4a9fc6eb899f1d79 100755 GIT binary patch delta 4530 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 O+;lZQ@=U+~1NtA+A0nmz diff --git a/com32/samples/hello.c32 b/com32/samples/hello.c32 dissimilarity index 71% index ce4b038a7f81b245ebe666a89560ddf9d683d488..cd8dbce6923012e2e5effba4d27796a6e642acb0 100755 GIT binary patch delta 2352 zcwU87e{2&~9DjGaZe1z#80~%w6>fyV23y=@%c^#>I-*4i6l`L}MJ5KFI9yL$GIpKU z#vR89STR{53C5TZqy7Ubfe4*09jGxNMs%P~l(2du!9cb(BK7mGR~h<;O}>5K_ulvW z`Tl(0+r4=A;=PN?OoR~S*_%ysUS`!f&DY;m9ZMGRWSufLeqrBzWtDljPCE#WZVY$@ zPX6s$di%}wYx^cRj*w%%g*-Xx!r%C^eXsU1z8J#W~}YTT4k(3V-2M7!|I~@ zvx*c;(Q*DTd9boN_X;AAI& zJCZA6AFxG|i%r@gCVK@Jm$Vq1IY|tTPfq4$IA?Og;F#nkaA`z%oTX;I#crVaj4OYK z<9WXjwAfAz4fxqJFceH4#a%eHRJ?28VNShQ2?@dIWOx2lPzX{aR(U3od{Y-$F0P?L z=+5U*ROt@XzzoztarQztSVLWnY3;sutFsrdK+;^^Uj_oW`q#>SJ8?9_CapI@&9A zykr4{SBJ1lYL8%F)+2NP*$d;Yig2c2t3)d0sl-bEWQ z+owk5vt;TASaQOW@G0#OtpH$ckZ1>%6IVj*RmeKkAh@(vhTFP9dBQBM^C_p4(ed+W zU3r*ShLm%y%4q%<;?IzD$-g>7Jgn83#r%O*rU{kW$w4*HII@#dMl>5Bg;{_VO(&^U z>YrK6MJ#@8Zf%@u^0qhPay$oK_y=0kgHyO-rm=HJuZpuLJ(A$Ei?mK5Egz|Hw?a1* zy%4hMx}pg!9b$3elCR{5_rP=rGa=YpNoN9#2N7^h?dc}3;O*iPth1#VucF2ftLf#n z%XbP!uZCvn!b=itwYE^V&lyLB33i#r(-3&$B!dWVsx#g!&Ysq^3^dbhc)MtJRxu@U zdCV!t1O04^JjAXMD`+Tz``h&?7 z+USZP{C5*+uSUDc+vpb>x~xc-FTpsQ;gS!trGa`))53-hJ6>s)NVxk3u0Ll&eU(8~cgfc_8mx^y(Lp7y&u#>mrp0Y^P^ z(4pUhp`S86^)CR89Xv7Y}@k|S()id z))v`EW_(nvv@d9RvtO00f!-IiQ91--o%uylN55HHj;Vq7xkYKv7J&t{V%ADBhd8rk z&qmyIWE15(T;fe5OEd~(sNd|SA5?0j_5#e7@3KTrW5Q0S)7gp8MSH(9kw-K;>R~6L z*-$K23lLwz!>6g+9eu;}Ykk;Zsbrb4!w*;;rdZotLE2Kllf$4n^LVlu^daaH_GDg$ zCT8%IzW>+$Yhyn=<9rhQw4En~4xW^O1W-NbIZziU0(u?vj)N~CY6(yFgARh;109Ju z3RYCx%jq=D{I1+E5&B*0nQ@jmX9%4dW3lZ8MMYmZXKGk=jf+k`_IAO8u}cN>tv5?~ K;$Bj$Yy1r@vFOwQ delta 2362 zcwU87eQZ-z6up{_g9m4E@6A z`KTaY8BcG!zh+hcbwMEHsDF+~jx^$LY}TF~eVjMWaUEPid>vQLb;WzREz<1*Li$e# z5kg*C_uUIGwylw`hZQdsl>oJ?hv{w>+((Nba-Q_kPHYKQzqtm?wZdFo=ITx3htJQ+Lr=EcYzw9&cXa96tD#n* zU9lS3uFx)kk-_lVh}B45g*?IcS&uMV#n?UEZe#Wj5hjw_;uvU**9zrQH?*}|gu&`^ z3=9~|CP%abV!bz#>UIn)0u)J%q}~Y5jHI?YqD|~*NhB2t&WNPmc0}u#hohNVQr4l` z=jJA#Z9c_cKT;MUW;xWHx*vhakAwtdDJihK+e{0QS)4O9J;p5(ygVWFIMXzG5nbds zUZM=|{m0y}&cxY=KgTyE`eikT9q-kD%P`8&P-+&sI-rlJIcl5m$kwKR+b@~OvcV^X z^dsar3;9I}^!<9SQ1vG!@K>ldnE;3R7=$7h3q-PsXlbHk9NM9 z4;S@@3%jI-seM71cEWQ#g1ajtnSw12F|FDvyk?!%t=0+d4ir4WN;wP!y)*GH{O}pL zJ1UQmyT2e(J0f*_%{oLcgfl-h0`S$2qmH^8&}~;cz@_yWIHh~#>o#e%Upb|Wj-5g4 z$|po+NIAD$8O{4XbP1Yn`43l6L^Ns(<;7aL1|Riq7vRRb^lW%K){X+W3<^q0w|>Q< zGJLjB4p4aXX>|!^DLURy$O#Kjcw$ZIy?4XZ!=1veI(j2C<&IaP?xGN@QMth$+clymx~ zmGXmhsAxrN1G=KylC-RcWi>loY0Bmp1zfdiwI9qzTypc+ao#8)_}ZNUKWH&b{-ZU< zWeRO}MH}!}6KS{3x~YC?fVOnok*>xh=V}6^M$DELhMJ{?59Z@uUB;oIx+`LF30Z)1LT8wo1vH4(79#>C3bXiqO|+_z5jxoi1PIcIFS9c0@N$q|@2)(9Ir# zGnq^DA{56?f>U6~%4$z~#WcG}r+gxOXm)-T&z(QC!d`5RA1t)TJEu|UBS;(f@XuB1Z@Cq1@(j81ASa97Lpxh zBH0D{0JI-;AYNR!sK!>oMr-DG?Ut1^<0H3qk}MO;|yj&z6x6`or8#X5GMgRZ+ diff --git a/com32/samples/keytest.c32 b/com32/samples/keytest.c32 index 879d4fa3846126a12f87c8c1e4344eb674247a9a..f6d3152ec0ca95aa0b32e042e5ed5b45d5005e2e 100755 GIT binary patch delta 2657 zcwUuNe{2(V6#w4s+I8Kq2kFMx2CM9b%7&~mbjyl%OLaqwOj1ovYMeSSYSqQviA%<= zIn&CMb?UL1ug6!_mY3o@z~()FE)@}KwUFTId5wYEOuL?7s+b!6X~yTiYYrji9)Eh~j6TVn zV@t~Qee8|Q5BjU@ReEd5L3#73$7$e@P_0G;ueMj%Nw;C44x)jnkPyd~VC}QletT`U z*O0XU8u%k`JI`Er0YyiilZLVz>eHs>;k&GE*0XP)yJr)-Wfz5$m*hHtPm z%qQ5TI;R6=8!I1(2r;+kt;tk`okpOTu^(rN>{4lA>IP1`S`~#@^88TQg_sbdo>+B# z#@KGDTq&)kNm$@Zs8{(SuhAl}QR5!lYhA%>6khkLnL-(it^z=gx@y&TJC;S8EwIFy zFTPcvvkptG+4$aJRlC_Z4n_gP8b=&f@tT!ccEqut&9@l4-!{3Z{ci}9$Ufv5?b7|u z8hHrX#yLV^^?OD~E#^K?@@|ODp+t7jGrAH`WImC7SX`9I4tSE?^k`)wD~Yv<>|>tf zHPplF`ChiVD7shdjhk+E;cqiamLPUJG^hU~AnHRw`V~3D(cE3O1y3zLwl#xR7HL+Q z?GxCmP=Dr9X~@HPz#ad-|Rc%U(nZ&;5+wL-@Mz@&W(O@liRg`n7| z3x6R3 zC9msM52{CJj^OGl@AB%T`f;~cmK z^uVQ14!4ryZ5oy0b4gC*5;5oc)6|mpJe5|`B|s5Lb>}87;E0*UE|@$m%{d>Eg@9M0 zeG<(wlp@#-TQT{$SYg>p4qR!G#X&$hSt6}KXc03ZHgW}>2?!oT!Y%$o9bq9n$Yoex zS0`RYi>=l&!kgb-te8A4mRrh~XV_)tVkfkglgZN*cw3V92sF#`XqFVDEnTTj zT8;1^txgZKAgvtpDe34K+oephYo$h-O8caq92m)W5 zdPMy|i=%e;txN#3k}16tmO*;7#+EI%8hFbs>w3YoAj#I5Db{Ks_|R64 z9V@j={-*UKlW(+rD`LPOB=VCcy-nfvh|o4zfpYa`7+)tK^etj^;!+N)R34;5Ul<9~%i+-lUcEzAMKV zW!5U-86{02dI5qC{b3CKQhFV%p$`l(YAb&UmAHD)oWJ!B(gAH-v)2ny!loHd67I}#{2Zq(OKA8}oqlv^fze~U0dlppu%o)q ze10BzqLwEUpyxm@g7)hlUb?*g@kMm9=6@&8ISBp6k$RqZ7sH*v>xUbz&_j!PdAF}v zufozhP$Vn1KhyAsy(RBozu_(^E|L~o??fYDF9Dj%c=ACLPYlqfOL^kJIv4Z|s0P$v z^UY1XY%%|rR@y}QYeC&M-&>?}`+v}SkkkaE$)TFyeYM5etdZ%#RLb8x22LjcE U&fcAc77zC&2?J7gp)VE_OC delta 2617 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 delta 5701 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 ZwqX^|pO%t2HV~|1!$ixzIn#D&{{nPzmm>fG diff --git a/com32/samples/localboot.c b/com32/samples/localboot.c new file mode 100644 index 00000000..579c7b03 --- /dev/null +++ b/com32/samples/localboot.c @@ -0,0 +1,9 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + syslinux_local_boot(argc > 1 ? atoi(argv[1]) : 0); + + return 0; +} diff --git a/com32/samples/localboot.c32 b/com32/samples/localboot.c32 new file mode 100755 index 0000000000000000000000000000000000000000..ef0d7ca7c931d49e6dd67cb1c2055d0666020f0c GIT binary patch literal 1160 zcwU84T}TvB6uz@Nt6Q$l(5|(?MryYQ?FSbMR^6AK6bkl1O-t<`!ytM|cg%+kM{dH7 z!@$1wlwd(o;X~k0fxG^$3jNSSP!>fPtjtoGk!DNNxwD#-3;R9XbIR$FXnif2QXo-aZ4yXwa*ng6O^P1cZv^=K#Sj%qoIz{c%xh8v8= zo1u<7+SJ&nUPz9I!zAIntPgJm(*4q?Lnd4h4%eSNahxQuJSo>~W~tKs*h7NY zg961p^@tl7`yu)4JmSSq(&_<`Gx%5~b}&#z%ad03iA)vs5iJ|UHY7IFbf$febRCt7 zxTlKob_7^&gXkq!u*XCuO>o@C({#=d5_i!6y&YI5N?8}R3tg}nW!_O)s$;X##8*^_ z7oVq;ri~+G8%l%gO4>ttN{)@{yA{a1DYIDdV;9#yt(?YAuKx}5T4C|>MeGEInS~~> z=0n&X#H<{ESP;7m)l@eQawGLf6<&~)E$vQKh>(??*DR_qqvfc=E$ZZ|!oBWjM^*($ z1w)X;qd=BI8(RX70|j!IL6y|O(_rI*8##e>kqLb2?71`J>Bp|@?FD~hR=hmfTL9w- zRboy#d;>Un@d+J8gf2ZMZ$YQ6drq`ZG069b(Q?QyhP>B9jL$tMm7{=J(B{+{Gx?a5 z;W1D{HmObQv9f1vS#m3@Hd*CwFw=4*T2+CO&19Sv%4SJhfjP+TDsym9B2 zm}MRU4%E{37OZ>baTLr@5gncJ9};{`EjJLY*7F|#L4O^}2x$#r1JWjxp8ps7|6(mr rY@jd=QhbSlqBNlFX2A^l|0A6+)n2pdbPetGO{V^2fM*+z642~F@U>(I literal 0 HcwPel00001 diff --git a/com32/samples/resolv.c32 b/com32/samples/resolv.c32 dissimilarity index 94% index c24909ec795ce5a09c994be42321d17476e283b3..3e0f0657249747f88bc7cbf7ff1e0b923d4cddfa 100755 GIT binary patch literal 4232 zcwWUtsM*_0MpL&AeD88qZAEuCJy&^plhCEEY-EpYVw^K-I%7 zxhJg<(DmLTK(??I$K;*HM_a{5Y7E1m-Tt6_XLWTblH;KRp@^7o0P7KshcUW6#sPlU z$Bg?`K-FHSKF?#qzGko&O_=BkKDv2JVEc5>hK;rBX_)?*_D!oF8m=LFp?%=mTlCE2 z(9dX;j&9zv^|2^e2%}R+GU+*bmWEx1UJzJm&T_YFoeOh)OMCpo$^e~Gdo!81o=(V#N4>KX>pX-+qHZZitC5^t7Ut|i)5yFY;MXHY zp$G~6OY#8PhfFsx$1!h9%=L-6ATfIra~%X5 zn9JBc`cfK-s!GaJzvYD&RJM^`nMUY+v3%u@|Hb_-OLlY(xKJ^U64=m~fw=5zw^zc( zeURG_{Ryyvic4kU!BxWXpdtB16p!kb$}CX_P;A9V?TM8wN)jtEI*}S*Iin+q6&L*i zD+4aS%K{($IF*SWC`&)M;O8}x*Dibz3e;EzpxPVl0?rq^L%Aieir4O?vgGwo97><` zN?ubp4M%@%QY=%}GOtW;SS3eWW(lpEA+#>~L_%m@QfM87zC**wxI`SfJNH$iKNDpW=3`_#S~W%{U*iC zQbF{uSg4FPdOpRBdVxA+LE%{9rGee|&)XRP_b|s7+at79g0AImU+f8?Z4InyneU5v zCPksOUIhM%D{$ZRTRP;C~!o{g5x#D6}nS9HK9_S6<|c?GyZ~847+V@-*-xp8eg9;<6dJXz@mdUD4tZ+A%mCN~R6AU=C z2uExiMAlDUR0qlA1t@Ytk@P;R8GRmvZ39I;WI5S=@45n7r{=}V&=&$*bXXm+t@F^+ z^kU?^)x3jfh@M+bFQ%VSJ_li$`ZuR6LRpbbNe`^%N|C1L*`rWb()T=1`*Z;kr3^?_ zQcf|Y%siWt3Ri0MELV_mio&mgYS0QJY67c`!;?U9Q`nXJuPAdEy+dI+lJ#^1qI@-2 zW&g08X|gIQC~?^WM45Wos@wz3GAvR27wo|H66g)Lcn?scYFwzXWg)=1?@i^uB5?3Rk@dHSK&fWYlu zqkd;7jpeIYX^Uz-}{>S6#i%!yah3SQP2AnEAuHs)M(*r3za%qWu1r=lEceN$D=EMEY5n4i+hJ>< zmd6Frgk!0tc0g>qO<#ul1!s9DE!Ka8C4khX=f;762}xLAIeQog{RBvye}t8}g^;$} z%Goo{)VhXYNM47%tshtMlwl+SK@`E1Ki*@!qE%dpiVzaKdW4T)k}z+ z4y8+IA$^wDcnQk+WTT~yIMG`n(3ZEcj`*tCzL*zSho#Kfl8MG|ewZT_Z*zKv`Yoq^ zZlIBK4g2mVvb9nl4pdv!FQ(}R)@=*a64=B)RPs?{D&5ZqHrePkeJ%(UTcDDoR<(z( zEIG6P?|rPLAb}P9>!wCDm7?h@46>#8tp)ZAXrs*tQrw!d| ztha4?bTjjVdBG!V=Ul-^Czm*B^deftx3EBs7a!vy2N}YWM7+$TOmWJhW0uHcvoOz@ z7>mLe26ZbGZ9OPUG89oe;DA+M z9ZS(uXd|x+uQSm!5)oMZ&KflG!_S0xeppiTc7MtY3A}A)Rb^kuOI4eBa$|Z+HBY8# z$f#*ZL7z#@Ohyc5o8?$n9oUSjytkzQI9(G}v(Ceq+37cnK-}Fr-_A<3qc< zIsB<#Tj>R@Oqw1$La&bf4o7hlOV5VJ?N9Ew-?@KBkvsL=52}Lp0Q@5_=f$m z#4OE#)ne2w5Xk|I=P=qZUdA|saSr24jB6OyY;;VyBKao+XAsmfw3{ zaY;qximH{XW&pN7{zUzborvb;@f5;(_xJKxD|r3y^0-LYF>~G`&VboWSi_>3uuPM` TY0+%{|Ht3Hg(3;&=a7E`5-qp< delta 2709 zcwTK*e{2)i9e;N|JC0*=M@UQp0WRHTGEJbdTBe|QofF)Ws&3;_L$fKU`6Jq>$~HFp znxdJUvx_w!Cs)b5X+>(K_K!+Plcs9@F(?9@LY+`)Eg4m%g>B7#wDIi{m92=x9mV^+ z^Ld1JmfpSZ`@Zjw&-cfB&zZK2sGKTCe&2R8kU#Gh1#)^%do$Tynl{+aew|H7+7K-6ILZasgR^zwmH(pcrsRhpb*Wh=GN1#-0qTK7` z33aJkd;8@sEQ%S1kZf4;YGH}HdAe>&*}!y7<=U9%r{37!d~%yWPUZ0_4#V`rO3Pag zm^t<8)QxX8&29zzB`np8qS+9QmY?Ac&FA`={dJ=rFjvd+`j>;blgti=2sS&K^nXojBCBYoE=a@aW+OufS;WB=h{d8?)Y7kRcYE=Kj@jp98 z7t)K@04r5$m+$_Pw(=GAGYqw{7iv1<-whD)Iz1*eXFPoX*$l(O#&+yxdl!Pj=!5*5 z`LdMekPI~<`B|eLTa@Aq&ZgYP=dKDR7}sn{G(M?Nik~t51hR~v&#=_FJmxdiZnG*%*5nzD47=*h`h}mbYXdrv#zEU^Yt?EPR$tc&)yx>dDnO3f+L^24b_}*!U_WS5(<*=dQj z8vk%w1!y&{f>1%Q#+=j2XREr(jyX?JUCmnEI_9SOx8NpK`T;)?%uRBelsKe~>x9A@ z;U^|6;we5o1h#oJRf_Wy_W+6_q)I` zy~z#o7piZsVmrNGhH-L{56HLlo_AuEbJtFCgR&8U1oD$k$u zX_rs@PurZ@`;tC6k=wv>P#=o>u!V<$=@i`I*pjMNJZyf<;rT%RgtcdA=!i(2z}K(6uOF5|+75u10HRlvs{+ZP3K2tgh$o@1>Ng6=xbu^ES@@)fBfQz^9F z6$My+l@m+eHAoo9=95wLMny;Kh5wNL;3o0YkT;5S@Ocof=GW0jslmBxaW zBY77+3hDx*u3EXhrslhV&kKC?iAds!sG*%=JrRH>QeEZG5E<5H&5g$ok{(FglG`lF z2m1QcdHG`o=Z^~W&%I#vE9%ek6H{c(6Xc~WLn~i>gQ^b3zHiR2xgVa)9^i0A9KpHN zUB_WJ<2HBVios$2uGVdS4J4SF+ia;Y!Q-pEnGn6-iT2^Qv5Ol3Ii-OipBZHy>+UUtg)$9fSiP9cje9=1zY~8j z)QhbbCjbAR61`o-`oiSoEVKU0+&v*mK(&-s2ein~*JxXEDYx zevUDNaT(*U7@uMgpU^=5)*_H4j1>%K69DA0{5{O8xwHJnP~#T*uvC7F*WH93jp40p Wd0x_oXaC3=9{r7M7Dx#HKK~03K4Mt_ diff --git a/com32/samples/serialinfo.c32 b/com32/samples/serialinfo.c32 dissimilarity index 82% index 57299b2b3446745008a16d54408b21deab7d815f..5cf52538a060a326a53815efe0958cb6043aa760 100755 GIT binary patch delta 2501 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 diff --git a/com32/samples/vesainfo.c32 b/com32/samples/vesainfo.c32 dissimilarity index 80% index aad58f304d4f3cbb4aadf96e031a773138273d0c..81ca71fe298ec18d1e043b490138e2657bc75a16 100755 GIT binary patch delta 2528 zcwU88eQXnD7{9ySx~`kt4ZAXAO2wN&7_jNkkyY)+a3mHfIHA!hQzw2+9qvxRj9uro zVaHj5sWDzWP448!OTPc_YWhBIa~|MrGa`PDp;S*wpt94up)@ZtHG^jH^f#?rac8sa8GL}mcSF3jj4El%o7{lCi-$#^M z|EcGx)>f%XZ*2pT&q;A z{lN>{HJV6!s!+Nb%ho6h{?Gj&C2p>Qo6#zHmm!IsGNWDU9`Ljv$!-95nMW+@jaX7chftELK)i zS#~)^1ga8f+ux{>X{ZtNK?k+EfEoenK0Q- z(pXlJ=ftvGgv3n*aUj3w4Q|T$U1#E<$(#7}qmePjStP?%{{`~wK$|*o&Zr^oyo1^x zlE;^hWzeoI&1sYT<|^!mZtMr)uumV^eW`ms&K`V(4}8{`;Ue{J>xVp}A32hpi|yZO z9Wz|UI{qJDxAkEmF+#y!cG{T_8AixBh1~CheTP*dymyPEr zby=d}Gw$FEdW17V*!m%<>uC=lLN-LX(JOfu_DWp<4jC#=OHC}lj4KtgYCVJmELzRh zx51ruh$J1NePhi;B^|Kn1ePBvss1!<{YDgA z&YA;l!*1=Adu>?%SRb7@jt#91siJ;F|FTUVE&W9K5tae%XTK~WT7z3DO}4R3SgLJ2 zTqDbdxAFS0B>++?1FTZ~0Y#guv|APRY4Q|>7t>n02wAiz+j6@vK*dgC7EGL0 zE+c!dLdzsurADtR1>4{&C%%=-ZC|Ar8(rqmq<}VFq}+heGA@s3-*t3(Ab1o7*VP|w z3Q3_JKEwH2nsHX@9J9JU(fZ|5!^CO1%r>5%;TBo*C_e8QVhg_cMn(GlelkPD!Cy0bF1#$Blfm-R|@YK1lXAEQf>QOAqgr65)!Tol3>k{b2n`lm)0 zTJ`8E?a!RzU445~6s|>?k_~VSl4_MBn`f`rnl)>~VCqm)!^AL0OD2ME-NADMYKiUh zAG5QpZC2O?NH@r+yDZu~p=Iq-V^2A{6V9;yW~3Cx1=C1LQx`bdgT~8tS;v6a$m0EA z>88F5n1*X0E^Viin&FdgOWS9Hec#@BbBx7U+u}n)s=L&uMsl(T9f|buh!er~kM;#@ zbY&?p1KJp?O|rAo+SnN_O&NQU6g>{TcpOS-H`tE@a*C3#`aMj#^pCAsJMLwgVC`7W zwJle)tW2bpUs#+mG8T5eN=Mp`Cd6N0raeC8v@K|L3$IThK;IMA=(IavLvkIDYv5&^ zJ;SvFxC3r$F|HAu*o}Ilbq!bub+4=?A%)cA}a*{Qw5!U|Ts{&L)Lpi$5gugE+LdI$Vx4h>G@ ziC+KL{1s>1HBI&*XsA+TPJqTiXF#k^WNrlA3JQbn13l#vXEN)r5SjZyU7%+`vDBW5 vC2Vc#^NLvucU?)BfBrXq&dtzXnwmRZR?g6yS?(886*C`le>VrZ`BltceMLA1 delta 2536 zcwU88e{2&~9DjGcbzN7vV~jFj%7HgCb-)(Kx$%0H0mEF8jVpwoEV_fr7-`{O$;cYED>avV{s@lib(yu>s5ySVUzE@?|bk2 z08(GN=r3GA=Ltmg{-hKh4; zCBqr#+8!NsKq)sphSl>V>6bX=)Oc>w<%b?_eQ7>(7N=&#;~)ml`cPu<+a)pZY95G2s98_wM*5Dxf->OJ-%o8~o8a?Agze@;>B%b=$DB-dhq2$gC}y&?$B?>ZnAO2 zBXr%%?@8yRxCrx#U#e#HDcGVMr*jtP&@b8ZoS@6&7Axw%SRA9D0GC71pVOr2U)!ne zAx}xy^e2Oo=;ZhJCxh$|e2e_YDV8~N-T)9 z(6G#KY}Du$%cw7J)i=qiPhV|Wtt?pe!Rl@`Q^<_&DFEcCtp%wrZhl*(3HDM^z8+@I z#)?d_O8r!kS%6CYI2Z*Cs}C2M`K(kfvfV{}R97`;SGGE+{uQ{1WuM}EJ*mswEI9;e z{XC(tI{DsSlUdKl+p%nHiDg54??OP4g;@6K@C~u-Gkm;}ZrvWsM#8gW+0A^sj#}88 zFRw%ohW?2)ani{<`1BxUF=CZNv)6qKL;)lusK^)6*HwYa zccSwAez!Wb^B;9nJMZUpeE0)yV??vl?VZL?c}DH;&(1-k2aRFPuC;PkbsfeRJ+g(Y z;CzzH09(;2$0n7DpUR@Q-7wonOm8$&+01R5U+Bd;nfPgn#r9^>X%MCax z0oV*q98-qL#1HV)22bt#XonbOFcyGB5VqQ|)m}FS**2{mT+Wz{U1_Is)*-J9sE5>J zqhF(Ul>tHRR}U{!kCl8CISI*XGR&!2 zqv$j0mEv_Fi)rq-pYrog|FR?;@0@Fp8`J13%&mpO!4O?)hJ-36a4RhLI-ojQ#Y zq@rdS^3WMS9(I|!ks`EoCyR}0<%}(|2&g-8O^Dq$(`y0%M7Z+T4FXtwh|92IQzK4= z-xBk83&!bd1>z6Bk{;ZD^>=;tV56+M)$L33BlKH)K zo(_gy(k(Em*%Lmg3yq)LAa$ADfG%5rDi`gu(JMQ{T~-Ejb!qk2-#(Zaz7KwVxv*2F zJ=LA>DO9Q3V>*i5PLF~z!YCKb+>R^hTHtd5AAKUCcp{2vrLFvs zw$-Eo(w5{LQ*vojb37e6&EWh|VgBXU%zj1vS-y7%ne+s?Xv@&b7v7+PgYJ#Su}SyC znq(`7E8-;tr`fl`Zo*+Kz!ihTyjHC@ZUl=()nUxcFJg@^tR3{y`<Fed0OXVg zhI}R*Uiu-yO_%r?vD^XDHWMwVw59`E)u>DinQ*oj8DkXKsuCx zXll%PuGsqbk~&>FmpQtt*ma6^j05k%B^;OfeacB@eAi)qDI+hOCXguTD5$1fAYGvM zzz^`_2Eoi<~9jxcG*MVjb8IZ;T>EnAbSEh}>j&BlIp G1^F8nTQmg# diff --git a/comboot.doc b/comboot.doc index c8546b25..3c806c3b 100644 --- a/comboot.doc +++ b/comboot.doc @@ -367,9 +367,19 @@ AX=000Ah [2.00] Get Derivative-Specific Information DL drive number CL sector size as a power of 2 (9 = 512 bytes) [3.35] ES:BX pointer to partition table entry (if DL >= 80h) + FS:SI pointer to initial ES:DI value [3.53] Note: This function was broken in EXTLINUX 3.00-3.02. + On boot, ES:DI is supposed to point to the BIOS $PnP + structure, although in practice most operating systems + will search for it in memory. However, preserving + this while chainloading is probably a good idea. + + Note that FS:SI is a pointer to a memory location + containing the original ES:DI value, not the value + itself. + [PXELINUX] Input: AX 000Ah @@ -417,6 +427,7 @@ AX=000Ah [2.00] Get Derivative-Specific Information DL drive number CL 11 (sector size as a power of 2) [3.35] ES:BX pointer to El Torito spec packet + FS:SI pointer to initial ES:DI value [3.53] Note: Some very broken El Torito implementations do not provide the spec packet information. If so, ES:BX diff --git a/comboot.inc b/comboot.inc index 3c9df5f2..2c1c8826 100644 --- a/comboot.inc +++ b/comboot.inc @@ -187,6 +187,7 @@ comboot_int21: cli clc call ax ; Call the invoked function comboot_resume: + mov bp,sp ; In case the function clobbers BP setc P_FLAGSL ; Propagate CF->error popad pop gs @@ -459,13 +460,7 @@ comapi_pxecall equ comapi_err ; Not available ; comapi_derinfo: mov P_AL,my_id -%if IS_SYSLINUX || IS_MDSLINUX || IS_EXTLINUX - mov al,[DriveNumber] - mov P_DL,al - mov P_ES,cs - mov P_BX,PartInfo - mov P_CL,SECTOR_SHIFT -%elif IS_PXELINUX +%if IS_PXELINUX mov ax,[APIVer] mov P_DX,ax mov ax,[StrucPtr] @@ -476,12 +471,21 @@ comapi_derinfo: mov P_SI,ax mov ax,[InitStack+2] mov P_FS,ax -%elif IS_ISOLINUX - mov al,[DriveNo] +%else + ; Physical medium... + + mov P_CL,SECTOR_SHIFT + mov al,[DriveNumber] mov P_DL,al + mov P_FS,cs + mov P_SI,OrigESDI +%if IS_SYSLINUX || IS_MDSLINUX || IS_EXTLINUX + mov P_ES,cs + mov P_BX,PartInfo +%elif IS_ISOLINUX mov P_ES,cs mov P_BX,spec_packet - mov P_CL,SECTOR_SHIFT +%endif %endif clc ret @@ -868,12 +872,12 @@ comapi_shufflerm: stosb ; MOV AX,imm16 opcode fs movsw ; imm16 mov ax,bx + add bh,8 stosw ; MOV xS,AX loop .segtramp - ; Clobber the MOV CS,AX instruction. This changes it - ; into [89 C8], a harmless "MOV AX,CX". - mov byte [di-22], 89h + ; Clobber the MOV CS,AX instruction. + mov word [di-22], 9090h ; NOP NOP ; Generate GPR-loading instructions mov ax,0B866h ; MOV EAX,imm32 @@ -966,5 +970,5 @@ feature_flags_len equ ($-feature_flags) err_notdos db ': attempted DOS system call', CR, LF, 0 err_comlarge db 'COMBOOT image too large.', CR, LF, 0 - section .latebss + section .bss1 ConfigName resb FILENAME_MAX diff --git a/dnsresolv.inc b/dnsresolv.inc index 166e11f3..a8f7dbd2 100644 --- a/dnsresolv.inc +++ b/dnsresolv.inc @@ -150,7 +150,7 @@ dns_skiplabel: .rdata: equ $ endstruc - section .latebss + section .bss alignb 2 DNSSendBuf resb DNS_MAX_PACKET DNSRecvBuf resb DNS_MAX_PACKET @@ -182,7 +182,9 @@ LastDNSServer dw DNSServers ; Points to a null-terminated or :-terminated string in DS:SI ; and returns the name in EAX if it exists and can be found. ; If EAX = 0 on exit, the lookup failed. - +; +; No segment assumptions permitted. +; section .text dns_resolv: push ds diff --git a/dos/inttypes.h b/dos/inttypes.h new file mode 100644 index 00000000..9a6118bd --- /dev/null +++ b/dos/inttypes.h @@ -0,0 +1 @@ +#include diff --git a/dos/stdint.h b/dos/stdint.h new file mode 100644 index 00000000..9a5553b9 --- /dev/null +++ b/dos/stdint.h @@ -0,0 +1,142 @@ +/* + * stdint.h + */ + +#ifndef _STDINT_H +#define _STDINT_H + +/* Exact types */ + +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed long long int64_t; + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +/* Small types */ + +typedef signed char int_least8_t; +typedef signed short int_least16_t; +typedef signed int int_least32_t; +typedef signed long long int_least64_t; + +typedef unsigned char uint_least8_t; +typedef unsigned short uint_least16_t; +typedef unsigned int uint_least32_t; +typedef unsigned long long uint_least64_t; + +/* Fast types */ + +typedef signed char int_fast8_t; +typedef signed short int_fast16_t; +typedef signed int int_fast32_t; +typedef signed long long int_fast64_t; + +typedef unsigned char uint_fast8_t; +typedef unsigned short uint_fast16_t; +typedef unsigned int uint_fast32_t; +typedef unsigned long long uint_fast64_t; + +/* Pointer types */ + +typedef int32_t intptr_t; +typedef uint32_t uintptr_t; + +/* Maximal types */ + +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + +/* + * To be strictly correct... + */ +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) + +# define INT8_MIN (-128) +# define INT16_MIN (-32767-1) +# define INT32_MIN (-2147483647-1) +# define INT64_MIN (-9223372036854775807LL-1) + +# define INT8_MAX (127) +# define INT16_MAX (32767) +# define INT32_MAX (2147483647) +# define INT64_MAX (9223372036854775807LL) + +# define UINT8_MAX (255U) +# define UINT16_MAX (65535U) +# define UINT32_MAX (4294967295U) +# define UINT64_MAX (18446744073709551615ULL) + +# define INT_LEAST8_MIN (-128) +# define INT_LEAST16_MIN (-32767-1) +# define INT_LEAST32_MIN (-2147483647-1) +# define INT_LEAST64_MIN (-9223372036854775807LL-1) + +# define INT_LEAST8_MAX (127) +# define INT_LEAST16_MAX (32767) +# define INT_LEAST32_MAX (2147483647) +# define INT_LEAST64_MAX (9223372036854775807LL) + +# define UINT_LEAST8_MAX (255U) +# define UINT_LEAST16_MAX (65535U) +# define UINT_LEAST32_MAX (4294967295U) +# define UINT_LEAST64_MAX (18446744073709551615ULL) + +# define INT_FAST8_MIN (-128) +# define INT_FAST16_MIN (-32767-1) +# define INT_FAST32_MIN (-2147483647-1) +# define INT_FAST64_MIN (-9223372036854775807LL-1) + +# define INT_FAST8_MAX (127) +# define INT_FAST16_MAX (32767) +# define INT_FAST32_MAX (2147483647) +# define INT_FAST64_MAX (9223372036854775807LL) + +# define UINT_FAST8_MAX (255U) +# define UINT_FAST16_MAX (65535U) +# define UINT_FAST32_MAX (4294967295U) +# define UINT_FAST64_MAX (18446744073709551615ULL) + +# define INTPTR_MIN (-2147483647-1) +# define INTPTR_MAX (2147483647) +# define UINTPTR_MAX (4294967295U) + +# define INTMAX_MIN (-9223372036854775807LL-1) +# define INTMAX_MAX (9223372036854775807LL) +# define UINTMAX_MAX (18446744073709551615ULL) + +/* ptrdiff_t limit */ +# define PTRDIFF_MIN (-2147483647-1) +# define PTRDIFF_MAX (2147483647) + +/* sig_atomic_t limit */ +# define SIG_ATOMIC_MIN (-2147483647-1) +# define SIG_ATOMIC_MAX (2147483647) + +/* size_t limit */ +# define SIZE_MAX (4294967295U) + +#endif /* STDC_LIMIT_MACROS */ + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) + +# define INT8_C(n) n +# define INT16_C(n) n +# define INT32_C(n) n +# define INT64_C(n) n ## LL + +# define UINT8_C(n) n ## U +# define UINT16_C(n) n ## U +# define UINT32_C(n) n ## U +# define UINT64_C(n) n ## ULL + +# define INTMAX_C(n) n ## LL +# define UINTMAX_C(n) n ## ULL + +#endif /* STDC_CONSTANT_MACROS */ + +#endif /* _STDINT_H */ diff --git a/dos/syslinux.com b/dos/syslinux.com index 23425ea1e4e628cd307731bb1f2ba7d6406ea468..54ef96a9576f9a2b949383fdeee55f3ea61b1107 100755 GIT binary patch delta 6840 zcwSvu3s_TEw%#X%lOULchY=AWv@~K>B#wd)jKC;bA{Mm*j+RG9w^aL>fdsvuwgH13 z4#BkbR0pf|k_4@Tv_++r04E8if=;zk+uqutOcAW^7{{tuL_l)a3GIAyuYP3hz1L%} z{aS1NNi9n`SxSb>Zwz@68pSH7!C~U6L`(x1FqtE~R?U zoS?5!)19k+mHXpk;29-HGH?re4#t{&9I`tQp-$S)ekhKXzqJ}6UC`E!J#Rvz45xa; ze4G72JR2sR5HMBt?@1-UPBcFt8Cb;uPeuQm70Rv0aw#_RB2r?jFO zB=_Y;V?+NvSXI-Rrm#RNtSMtFW>RHfBh_aNGm<9u>q)P}jK7yxP;F-}$VY@z=^T^O zCPt2?T?5BV*IIWXX;YH4HoH=Oy@l zR`e#3AzZGGeKT#(zWN;=;ajyaxMGg$#Xdc4 zuIy*~NB`8L|Dliop)ap5UBRA;2xrTtNg{ryn46H0G+U*btx8g$i4!8wnBcUUpMpI# z&C5C?0@%hVSrB-k^Rxe5&m@vI_EJ>Vr0}r@g;N{QBxx0)%QDXc7cL+xSXHz_Z?uvN z{4v-AcRNyAY%=uGYJ4)`20qz0h>h~HmYAzLe`qLnV@Cc>3pVGrV5_qQMrwXz#qP$^ zPvoz(V5$pSKL_>&p8cm5!#QdDZ6T<2jk7L+_6sdi?n0%cuVqbHdqAb6zeT@cCAR+1 zl7icN1F-cPh`=N>X^{PzoI-fXFH(exV^6Jv7CedKh$_&<=2^S3fe7%|z1WWzg&9wk zR!WNZHwiAwEr>fI)X6S~EJ>kC0_>=kxX0XMqxR}!j;@uq1~h<=kyBI2>d6k$Vk^@l zSo;7z>FfO3CI_Q%C;j;w?&?rvr|TSz8nP?O@yJSaAv&33)Jk3r(TN@Yb!1D3HV~U* zIc!yMBxZ_1{hkKt0tRWsZIo8TQU>)w4U+DiO4++>$t8IQO>xLkaH1*rvRq3y$u7%1 z5AjlSr3PDv+OW9-=)*RWB)|sc!#1RVtNRy}tk*71RuoU&L6>_APH3+Wf(=TSQSQyJ zFZrgPq{`WeF$yJc8lJcJ)sjrP$4VB<-P^pRIMTh@%TGypJP9`{l@!OWi&?BEpZ>LM z3DV9ZKS;E5vdQ<8^2nM{Pgsr}F6{S{jBsDb)k$`^6qhFPUUy8&&*|_-_JR|nbyB`t z>a}mKhb6#P!8Uq=$e~F-zuXDVdXRD4Y0f5INnS&;V#f&FH-Bi9K3dHrjFgW_N-=fX$;Y5+lvHcR)$;R1 zl@bBhLC>-wJ(x&v+7_b+AM2>+8TDve>nq3B!65l^;zsG-GYA_+#>CM!%m_P{36a4i zEFUR5R@!5fyrYS^sEYtE9kXpYf&-2)2|4% z_pn#;uuUrhGSsH)+d$4l*hwSUHA+md8uzC6LDGt!d|l`zNGrad;F(rnpKarx#7IOT8I_RtL)`~Q?Kf-5o1yO7 zQ3wg5B}gdUGdh;FHrrlgCR;=Kqr}p)PTbxn!vPQo#2ohbLLSP)?F1fu5J!F=h{06| z!;2+BTqy(BX=UX{}t&anq#pNaI8YxiL1`8~aoKpH3eV^j*eWTDS=fGF;AlUwAGr1Ft%>_Mp zHbRgj7Sm!*x@V^V_9#)#rMKS-EDVa1v(JGOiikfs+@l2sWt0Ii&R?Pg7(^fL&`Qe-0)`C;J3U zy~9R%1UE=Wa_n^F^HamPh3%yRrhW53U48j55)}I@8Fh%j$A4EDF9cU5^lwtL zDEi8o*wvXH8Hqa6!{_^TriZCe^=eslUTkN&5WU%%j*M3DB`?-kDkIZ=`K<{NkMuts zR#dddeS55E^&a<)G4j{YAy<@-E#%Mib2^$VquDvnDmIEr1gb%%ROkX03805u9qEy( zj`Z+=+UqTq>0#BYpMuF6cU7;3No7sDhFs>O8YVr=yoh7c!_CQ@xVK8F=A3tggLIjO z()pELDr3@RLoRG?U@gxsnvf$LS8dd=H=j+`%Y~0!;{$)Rz^W+Z+u3CC4g%Q-JXG=? zLPk04A5EtEODlGaF%Yb+ciI?;)lqaal8rCY5Jrr zDm#{Y6{2W9g>}+nZ7*5eCm$KpWm$$H>5d3XmDRX9+?XB4NP;pMxg_(17!EE0yngJe z-D!p78(3Rv_3g7PmE(^MgIhST6zM{+F+I$b9&5~#8D9%0Z?N}gJ{LAugOIA*{YdcG zRsLr9djB1{B#ZUVoW^dSB@Ha=6rb!H=v;pLop;#sS=00fK`MJ~78#`YXWI(_*O#L9 zYf@+2hu}dL29v8J5DsJz6ms(*GWowlA|$xAc^^W<{6l4w_cYb=2bxiGw+-Ch*49D$ zKgUQZdDluQ6?N1iRXBqv=~K?z@9$F}xa++pc=BD1aVFoR3TaG`qHD%y9)i!_{;fu3 zK@a=X>{$KVZ{72rjC+2JJ!v3fw(nt4y$PWrJ}4FOF|_D3-z_+S&^G@Oa<^QHaBGff zc$D!OQr);c9r$9@9FE4P@y$v_)$!iMj`7~4gTQ#4@$pW>D&VcnX&Z50dT>ONR)kG> z?H9Q91cQ`Kz@GvL-dRuuoV z{+?#5^la1vjp64+yp>Vk)3o;ssUMBn*jcKJrve9#oov>_1SgFv9zOG3kODC)9zqyy zecj{^gCqs2i9Q4L1C4QaY(jglkm`u>>IBTAaqX=J`kp4S@BCj3v=GZj>i-0P19} zW|2hI4YZS<$L&Apf;3DfQ56y}b)$n$FN)<$eOX@ z$-Y6M7#8l4@#9wyI%Z^gVthNn_y2ytl{`T^6$;H@qgtL>?%keQBC7OX!9d4F(nX#~ zItsvrT%Xw?MD`h(j_sM`)nRh?u}IraD*Ow4``~w3#=x2jJs-!4EGeAl!$H_%p>`%8 zH;hq7H8I`VsaaLZCEUIo|2roX+M%>Nirxjix_f{5I+wh2nvXWFag_-?;`b-#y`Dip z`#k8>MH}T{VZl}HWWzbornJ&DKJ)o3NDny2F2FPK2|o4fR1bW!P}u7^4Hyg+v%2C(A#wR_Seac4m50TIz z9hK`MreUqnOCQm=$o7$9(K@nfq(lJkM>Rq=j&#z=974r2@H#Soq*zQMM@TxbRo!K` zq|RHyO0}A+{IR^>?;aDC%&{LQP17&pvJ76o9rRbXj2sd&>Z6){>-`!HWLIM@GfZ@i zX_dX?^~OfOv@}xGcqiFUwRJu+6*XK8SG87SM`A$h3ei9v6vTHdMDi0WS=c%`vd;D_ z!XM#8HH#v}5f59D7{Uho`XZ&i)app(Y)A}uri0#T zrTEJ=3YSX=@B_Nq6fPAWYN<7$o99s4Xw}8a$7V_9;Qh*TD=iDT=9u8iGILO7JMmj- zS-`n$h*Di`mcd{`ce5Xmg4zn9f=6QEAl)RrEE~I2sa(Jnx&Y#3(rnn`r}eVT7O|o^ zM5gM71aVmg08e3*ms+W=m4gpdSNZ5t>|eW(8@o{1(Inubk$1dkX@E_@cRJRG$^x7&`Xiw zCmr-24P;orLbzbON~x`49m(NoRaV6FM8x$37XqHa1&#S0A$%&z)L=t5p(&tMgnR)Q z0sv@ZRW}&k)PvAHFTmm49(Kx-srqF-mnW5oa7?#uqvv(JBr7#@oo*{Os8{x&9hY#6 zuSA$BU)EDH1qNT}p|of5qkrJV@=ZM@A7KWF=lEkh#R<$T&=6wtsvbO}tMuJ*X&r;D zxjh~OHs|)>7^ik3;Nnd^r3Z6%D@U!H zuVcm^Y6nJ7Gb4shao;`HnsqsLlwi7Rf2D_wQHQ2%>%okO`DeN3m7ex~SS6Xw8#8Va z8h6vY+KWPCR8bGJNyzM=nZ%-=&SmuGp7OgOeUr}LxWRR%RQ(baxa@7s+socAuV|`F zVEdQWuQfA*PZ;4@M(kh$K4${IV-h^fs%eb3ltJsOa;kP#8LAFc9j>aaa#j7KYJF8- zmB2W|xX@T+To1is<4zxKG&+oN)vKyssxGU(!v2_&&8DTr3W74(qO`-T@b`6kgg%{; zgbEh5L#A~(iZTo_Q1C_O{eA}&*5)t zM1o(A*J!?|$!ZSmS`Xuwnu@v*s;#+}_zO(|eeYBP5&#W-i$Z=tw_Ks1R<5l%BK~l- zKhWw^z2UST8f)j$vm107B=&`ZMmG(r~-X&1?Fy$2I)aPmJbJUO)LL{TqXoSG-9 zYvE-uesOO9Hx-(un!k0e`MDCPEwBF@gr2Wq&KE@>lvg9`St)-XVCHcxax5*WqlOgV!7xFVu(07s!WCs=vnZ z;~3>Pc(UL*zzZ@TUT6&GF@dSehfP#YDPrGR{%7huJG5Li`Ato{_xLtVd&SQMQYuSHShCAt3zcE7#X?<4=r|C)bh z{`ntA2Tz%KN`XtRjd&26z*>jhoZj~7eucrWp7GE{OHC^C{;GJ&yx;!i6lSAIXXf9f z=7XG#ilNL+ebl&!s&D#196Nl)0(NFWU!f@(+AM zLLKB+E9X2@1`;pfbIHa9*4ZF6*%{8 zipHf^2VqwSnwpi3zFs&n|>5BX6{$H;Dq_ z5?$<@Im?#4F5lxst|b1sh&dtRp&q9mvF%uuN<%&IHV+UrDjMu>4cif=o8XXEEC~UO*4bk;JSNJqEWvpQC%=|Ctc!6ZqomA7<5pE^b*hNlZD?LC96aE zz!j>KjKd%@mW#E+s}d9$ zh3QfGNF8lo+d`P>(R07bwq0NuS!LjwA9 zY-KILH&mCW?KO9`)ShA7no^xK1L?QW**SKUTy@UY-3F2-*+lx3SYEEATy}=(q60dS z5mdxG+E$^vpBSk1obC&z{q@6HfFw!LTjYD15H?9n312Xn6L+l@qf)21WW4fl(T^q> z%7{5{2nQ?eft@*IOQ20*CiNk?q%OopYF%Fj*t$={!DQ!b*pM@HByWrU+Xub--u6&- z-N~+}D6~)eaHwu#bDlAGsLu8Mq%F?ustF)HGdv0ZAtqhHhB=#7(f=XV4`Pq3nbAuC zv@(YN&E&)kTX#F?HOVGnH?IAYo5`7A@|PJ-Q$i#7Oao(5eZp*=vWlDwDETF@lhbuO zx8<-?8%>_tC^kJau_;gfxlVe9p*)_$&qC68Tw^3sTrwK>LSdo2%49l^p?VtI=Lcl0Z;9|VGK2K#y-59Q(x0+0RzLpDysU@C;+Rk90A5d;+g zcrN^CdvnQa0h$usB=y`;`JRs^vq^QB2`<$(X>OYaZUDxZWZll8x<>U;6ZjcxdJ`mtx~mMgj}I;-bbV_xaK;F}WF7 z&=H5ZsASgNCW|h)jrzERZy1OLos7rhS*C%IE)u0}FUXSb`GL|{Xp!|F44*P_ zpdzXEQv1(;CVooH=`J#@@D3aT>uyDz*ocRf<<2Xeogr7@0fLPOLIp%ZuoWlQ!*7R z;i|w0n|C8%BZWv3e@PQ(ToOK3>8$Flx?1I~y8OkxpG%$Ute4SWwT>0^6-H0n-Y~l= zq;N!Vf-ZKFjuH&IB9p|K;D)^6gV8$P5@)ka+^PgYpg3`XVJJ1*{&gpLS4!k4cT--u zua~y-+h~b1imvRgx&nLty3@YClQhbuCBLkPr|_jykjM__t7faDaN_CM(#h}*v%^Fe z8NO@woQ<7Kwhfy}rOXCmZ^?wqDVF8pO{Y9^;XK_zl4z&xQ!{zR%dkTxJa&`BcG2wG zBXQbxTgXP4t7rt=ekcif3U6lU5!YOlSFZo;V~kLAxRasS2+DW)}& zgS$P}n!>@)!V37&^QY#_G)4!v`6HX3rD0`iy<$6Zv+Q=u9CAMWCs#{V**E<6{$)x;}Lu< zV8lt%(TKAuRbwhrY8nz_^}b|0zrcuDG%Vc&5hdt;}G&jfZAb@mTR_J zCh2XK^3({Y8HTcL7WdFt6fHN)>+#l!%ATqptIl!**i!Wv)grTl2iweIHSB& zv2cT(zR~35bY448okbUlw8LDH*a;-^U(-jNU8xaTvn8`URawczo=a6U|EViA%x}bL zk!5hHN{fo+Qo}4^thBE}6V5triHGUIbjsjUe4&_2Rg5^XrIBx#x6(gVJSC2r_`!LJ zMqlx$a|-dI1+1r#_XHEAI|<|*uuLOZ26@9OjwT0G@-pKj2O-(oz;FCmK9R$G;^7?GFLD&=q&%!{0ORyAD{oUvH@yZ zZLjOPXw+HqX4rGSJD&x|^ji?g8y3hVP}+4pb(7=YUJz;IfFpY&OI(!j0{b9#db5ov zW6j(<5C_Op3eq@W!Zhm|bPk@YzAu?H$t<6=FxIGlYtVCS z&iYCISSgY6{rB?Uu0kkZ2r2nO1kA4%rpZkRz3e+q{C3L`ZcnTlo8Y{fwAXG109}e& z!_d?U!fIeeonS@mq+rE-V3>*$UfO41IJ}k4_HoyZy9Z?{`59Gs<6m+6K45dvo~dVt zx8V=sI1OR`8fSuEd=PJasAtynX|I@V(F$ z@aGrDCKYG8Gy&v}Tpycdin?A~>V^(YvA$qB2NP}?w@%FEK>p{}iOSdcCvS0*cDdHE z#hI0zLz{Hh`FTs0h!pGjyd`T?*K1A7$P#&}Qz3}vZgJ*h2^^mBY6Q5 zeFrJ?-ReCDpB@DVd*0^$Bvw)z!MZ;hhBFrH=L?V36eY`u>D9xDX=bqda(r*qtMwx( zx72;h`wWA7FK;3NO~Mm*PKo#nO|maJ>v0c5gDmuEhG>%tG%UZQpI&+fq$#~TMMxuF z4f6LKlihfm)64kSqowY8SE2Mby?lJ!vWOYo_V1nKHy(U2ZkVpIN}(9bq2q+xF2 z!Wdg`A53pkW!khg_tOQ}a>@GI7Jw=6V> zw4P8-*V!^9qYtRJB2k@^gpDqex`Mt{{ z1H#$zpG&U#402I`Xj~p?RIzNS$7d(~^$pW$B<6IojD64fG?tPFjhnbJa;Gt+ypOmW z8+}qz$hF2>i9Uvv>FMzfa-}h)ks_A><0$miI!Je8O3E#NI*cW@#$sKh73qVzXaGWw z+VD_lPLDhUua;#XRT^WN)gE-V4N1Why6Cs8l;AQG z;4)&U!(pmVJ{@$nLRV&u?-eMNK3aReeAMz7JA9}7Oj>Oy+Zq$pqp+yi4&swmt7M&R zh|*qaRRA)+x77#0R&$wHEwm(Iz}+nGQA}Pa*C^R-PA)+;K=Z1^$7cr*oRX?rgB9A| zHU)$j=ycR3RhgB#m^OS@dr62H1-|A`mfxDFT&f&EXoE=>JOI5niAUKsl*~Qw(FG5* znScGXg3MLtOgiPj>0%Li50%o&0siB}qA=A!%&#0?K~8btXsRyJJ}|2vJFS!a>h0}g^$0D z18pU!z0rj^U+#G^XQa9D(sR=OLFb0792<(Sx@~J65WZTi66<41yQKZYw7gzoiu!y2 za}w^S5_juB$5q%fS@096HvLv?+C>XWo)?>*ss%h zTQ)lpYARa&0yS;!+wpJDeY>Qrx%@HyYVy&IA9AAOocJUsJd{=(l+Icz*RV;Mqd;rsf(tO6*0-*ZLs=WErMtLxrh zaTcLhs{d#6h6@O#R40Go_ie#}%hk;%79-c6FIP)M_m4<3&R4UoAs4d%f1x@5B0`6% zuO!^3DS!t~#3K>Fkhdu018~Pz6jZc_st-y(VtfHsp6Cms(II2?#>F%(0mQoZx*Sq~ z7sPjHgwECISE_D^VS&vK;q(1?O=f+5A40dQA8N0J4W^&3KEL?tH}}#%tN!@nhF?Yi zw&h;^2BBxFxwHA<2>rHN@nf3GALM0zD3AttCjg;thppx=Kxv1qW(Z(f$3|PtJs6Y& z;=aHDa9ChCW2<=}FaR78=m19rIzYuC3Q3)|nn8gNU=YmH00sjr2gu)A8|9}!NR84K zp{>09sf8;si?eVx&cPcFPLwHX_3_pHZX%8B)CjJ})&=1mMlo z2w!YBkT{rL12mHZxL!vF4`GK@{wJ;Z< Qsei)%J^cG$1N1Wg3tjq$LjV8( diff --git a/extlinux.asm b/extlinux.asm index 18e9a480..6666f794 100644 --- a/extlinux.asm +++ b/extlinux.asm @@ -148,7 +148,8 @@ xbs_vgatmpbuf equ 2*trackbufsize StackBuf equ $-44-32 ; Start the stack here (grow down - 4K) PartInfo equ StackBuf ; Saved partition table entry FloppyTable equ PartInfo+16 ; Floppy info table (must follow PartInfo) -OrigFDCTabPtr equ StackBuf-4 ; The high dword on the stack +OrigFDCTabPtr equ StackBuf-8 ; The 2nd high dword on the stack +OrigESDI equ StackBuf-4 ; The high dword on the stack ; ; Primary entry point. Tempting as though it may be, we can't put the @@ -217,12 +218,14 @@ start: xor ax,ax mov ss,ax mov sp,StackBuf ; Just below BSS + push es ; Save initial ES:DI -> $PnP pointer + push di mov es,ax ; ; DS:SI may contain a partition table entry. Preserve it for us. ; mov cx,8 ; Save partition info - mov di,sp + mov di,PartInfo rep movsw mov ds,ax ; Now we can initialize DS... @@ -1571,9 +1574,7 @@ debug_magic dw 0D00Dh ; Debug code sentinel alignb 4, db 0 BufSafe dw trackbufsize/SECTOR_SIZE ; Clusters we can load into trackbuf -BufSafeSec dw trackbufsize/SECTOR_SIZE ; = how many sectors? BufSafeBytes dw trackbufsize ; = how many bytes? -EndOfGetCBuf dw getcbuf+trackbufsize ; = getcbuf+BufSafeBytes %ifndef DEPEND %if ( trackbufsize % SECTOR_SIZE ) != 0 %error trackbufsize must be a multiple of SECTOR_SIZE diff --git a/extlinux.bin b/extlinux.bin dissimilarity index 83% index 15c3390a7b40f1a47ba0d42ee12ecaf164ddc685..5a56d2f68937c0ed9cd522a3abc03e915e5f51da 100644 GIT binary patch delta 6484 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 delta 6273 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 delta 6143 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 diff --git a/extlinux/extlinux b/extlinux/extlinux dissimilarity index 63% index af23b2223c34716b68a32064be5b8b8d746e2604..9520630052bd38220de9268d3bfb51e8eeec59e9 100755 GIT binary patch delta 7658 zcwWspdt6gT)^kI06A+Uq7^5OY#jLi9gev&J6sbitpnw%{b@9=9rR_etkf{6Xwt+@h zF2UG(i-p#5n<}kPGzne}*oJzw#=2`C6m2_c+=^n5m)vhAxcl|n-}n3e{@|B6 zGv_sD&di)SC)xP{QS|}wx{8?f#*}A82jT!Y@CH3e)HoY}>u-FpP81ISh(8rhj1mx^ zGULMb67|fXuqTOr=7+Gyr!;j4B|^k72223+5N!O__#*_*oYDwg#2Abg#Q=cWMUya^ zAfX`rJQ@PSlTDFzLdk3iYFhgQdkT508{rqQ+v4^#s*w(0auarp;-hzArbp!M&?7p} zJRZJu`c*V8Zg>kZ%)=AF>S3OzW8&dA2(F=jFx{3T!l^gIZA6q8(NCtCv!i#p^@56X z6=SUJ%<@r*{Aev4c8g-5!nwa9z@5`~c>AVUFhgCd% z8_ABBE+#l;jdUT=z`QQqiP~|pr^Oogr^AAiT4s~%MdB*cA-lY;0h?H77fN#A(a!0sWQZxdo)gBJil@8A3daB$#P{Q60}p_`u&ZERZ7-%)O7b%6GYG&tIggkw!)sH4Ukm z5tR}dQd2x4$h;U;h|uSwes9E!PeXd!MA%y@)boFcn%oyc7N5aWl=peI^pMkB7gM@H{QY6FRRzmm!Rw~Tj0W-*WWw-x+LqW#edm=B}Jjpq=CK;*y-O>ZDx z;|{FO$-!3Mh}IH~%*1iABgRYK4auBZI<8erJaLMgJWNc+28W@~OT9dwilF-e&#y<2 zLvRN(CT`j@vk>JetbK`8vP+OYTJ-eagu9W55}~lfdc-LLzoMfqI@F*LeR2@(`CrqX zGKsJ>lN(ojQgxG5@w%@W{he7Wb4<$B8wAZtvK)#XYQueqp4O-5k>$pF>15OQuH=PcdtztBlL+u$`wgZs(}K zx>Vj~IXJ$OI+l2gI@Z7eHh$6!K8gt2Mpo8 zKGAcK*6!1Zk^TZ_^l`-3b8v&^MxEk>?H^n~ZPM20fPNjBU*H01mNuu-fh5h+D&2_K zh9Yr=^dFpuj5!aCNJXN%c@W$?VIWq~+N)fP^3ZC8gk7W8$#$Irlv!*}zRFRw(6dws zOsuecaMq!1-!w^ZOhi_?V$K)9yHaO&9R%Zw;83*lEt~%@kxpeJa!h_fZf-%( z;SKBbz6Uq&!)+X~ z3jR)7ekbNUtyQv{3UWpk3W(4`DRcHv;Re|!TFE~+g69v-wKAHSYU5WDs=Pm8b7`qQ zHPm_jkFuR#MNqB&M|dFH*&Z6AQKD?;nTWt-G}n22T>Ncv8Gx1EZcz1#sZK?BHYx5}3a}XJ0mMYnv zgAP@_8J#kCcA^t>YTWj2j!AlK+Qe3Svl#RoHjF{%P@F&~cXI(!<4(ZjKRuR^o+m50 zM8^&gfr}=O5H6LKv?fq=EDQ#krE%rIfKEF3HivHf*BsCDDQXll1%k}yN>&6Id_c^uf6Y?&BPrXBE|Aj-g!WCnkxmLJz zEMcC@b>VY*2r7IIDKu)8tm*JDiDZVsRrL=rG1-1&?ZUK|5^$A=g!odagYJ+7C$&oSp8 zUp47Ax1e>KfNp)R=U{#L01%Xj)ULG&!dt%=j|51xBgh74 z$X*u!1c39;p<6dZ0E1ZFMj|MH?@9)$Sj!E|O-sP?<(d26nON287r^Hl_X4t;)058M zS^b3)AATXDcMg$tx)9*Bmoz zwo(8&CS&%Dysx=@XNDDq$(=~*p$zZG16dJO_$e>LzTF%pj$@sBt*}dm8NQa`+r3uo zbXfhX#jJC)4PKP_tNYMN?^z7^(qHo7i;R1AR>HFpRc>Ssr@8e4_!)U9ZJ_vrvcP&* z8K9b8sX%A@Sd*;+HG65)Tw@j{Ofv3|YK{O-zqMgu#^mFj{e3(~{~+6!F^k$H`#@$D z$6Xp|UTVWy1e%NMG+4Xa!kwvqd2k4>i@G@qpQlbK{RO-slQFA;F0IQSjbqmD?bx zP^a03$tAXmj2N~Kb)`#efu4a_QdTEBN^Kmf>acucxj_E_KNxH3izyLk+zfGpe@kNX zkLCN>wv3n<(3YW`7uJ>$Jr`81lvfqSw`B;yt8E!znH||u6mQ-phpoYXby0|e@rC1x ze=7I?JY3vS?!Pq*BcuD+*brHW_jH#y4sIuz59h?Ke_v86(Dc&Vge;=LRI-otWW>z% zWGKVy8od=6(N!y_qS+iTSFJ>|${SzqW3BJ$=!|IVc^{pjw0eA!&PsK=&wX3iOP1*f zLs*%&jLwkvv6QuenVPsTVyX3;n zTu;Wql_J^B?ZY$*&-U{ijiPfb*#zVxtF*W^JiLug7&JZ%p+Ci!z;aI0iykcaWt7_U zG_MlJ;YX{DyvC*5{GUBAXUKC*eX{KnZ5ej+N~JkJnwEOAX~h@WMmjaugv7i%^(K-wXFjsTSoP00!_yrPYqCD#gjHA!s>^%#JwgAw|n+ z8KK}ZWkl?&HkryDNyw(Ue;%k(0d&|qE$GT~jv1EFts3h{l!5E!>5W+c@He-b)iB7| zlH!ebc6IZ|W~>@!j+vl@>AGJWVF92RM<~WxOYIBUhLUJ<$X@I zNYFg~{^5~(OKqawO`z3HS)V7EQA-`5Ha@yHEt@glX9{l+&<{qWx0*;tR`RBISu*q>;CB+gp|D=QDwI{R zllD=qo$`G+w4?2#wL%G1FtUaFBAKOgr$#iqOxbsUN?cpKGEwEp#AH5MymZVP7lc`~P!6w#OX=_0NEv%(v z@Ba*FFG%>CBRQ6AS86?6y)x6Y|D(yu98M7&_1p3; zo`5AX;@TFScHZ3aO+K81e^<76jv;JW zpsxi;R-2^C)pQl<(Tyi7vM62Va~^XHT;f~`Z$^^}>?YMUv5DoJlv$#^=pnvu<) zLR2%F`A-PESqwFQiK5zOPJv}ZCRUEfwxV@x!D_R%nmIdv=HxS3<^1ParLqE4Ol>HU z)Thoa{ROu0xS}|d#e^-mlcoFwWgEzgEQu3D`W%jxZV!3UC-#t^`NXh{pz_dNkw@zfziEFZ-TY!YiCUM!PWG_?b^XCluB7Gb&>*`YN@X zg^l6O1n7|0xqWF1$#cH#({1h$-mGx@8U-D4wn;42+(596bo#dLXVH@n#}PZFNYyP5 z>GpxTRxHW-wu@}7zQB3SMYH0ZuOhh>X?ac8M35cwz=zJaZLkyUG-9a_H5X~A+lRR- zwHJL&0CQO2^TQ=`+?~RZ;xOAqAD+&*pM|-@CF4U#p#&{FAjkM4`(6I*z?6_D@c8{| zHZ?*&3FWb4%-U<&<-C7osklP4j79?%W{3kZWGt#&t{JmELX=cwyZkF*^8jo>cd!-i z6m1OoA*@4Aqcv{|oQN0OKJx{R^dcV%^^fBaWsZGMH|2(YQck71&9|pObo;1E-sY86gzE;|NRN-PES?v!nYlcu=I4uIButg z85XWsk?4lI9qA4NmLrV2RHSjk?T+;H+Yx9M_y+L;MZE;fLr# zyoa&`HV3{4Ho)Km7VZWqsAO*zpoFjI7|aK_e*gA?hqUPkC&J^x9GBm?YOm7Kp~{_w za{&D82c}ZH;F;(K6uO1No_g2;N(bSkeqMS&XSipLK7mAtwq_uh*@`sRBV8^aL7Z?3 zFl*~{^krh81fAVFofAmNVxSWD97NgpQ5#(R12g`~7G=A=`7uBprxvjKDC&4u(Ai-N zh@9Ov=I1A$pT6ZdRYYx|@KZrtqGqwB~5}=En#R;O}N3L0JDoB`;gj%$}4K4V?#iQT2+}ggL#-famKA6 z0Np&Qy*q;zHXx!PsUUixKFwK@y&64)A4R*oLFUP)6q~sq*zTo14J9j&E4;zd z36x3ub&$}XrXKu*TBNuYEIm%q2m}uIQxn{XcpXUyDeKiBHIv)+#t658rtF=;fC-h? zL28OyKN{s2w}RW|Q`TES=JZpk0+eC~pPFvG9c(TKEw}qAT7)tj+DOuarZ!1eH=Db< zzzGs9zc}v)Q8q#?66&XzJd&WN9uj>Y!!Vgg?<0 zuQOp8^?3v>kkP{Nv?PuWkEcha(1|)a>y--rS_Sx+K22YzZ_+_}kOr00Di>CMOs7|F zuB0n#E89{3WBN+v^$?Vs_Q^6L7U#*dPK`eI7&@zK`!RG?*UH}`fYM!E+l|Kvj=|&B z>e{gwo~y1+cy_Zs;rTyo#owzXJo~3VBs}{>5_t3{2SAkqxJ=yV@$VIkNH;BKD_EZi zXmkg1sMSR3-f>>`y>GyfFUD9ARU)~ zd=9H5XA-H_YtnUmGGzZtaT{#1H?t4-*u?AjgDZDVb?toa5~Nfu(EF z<4@-1H1oWr6{XJ1&a4=5$OgTRIg<5)Q9Nv7BQp&@{;GoF6F?>k%_u7$q;lbp4^i|+ zscLg1PFo+`4V)f;Cx;V4UieQRT<03nlS!0PHyRecpJ2c!ud;9Vfy+wl*@8 YpZN{Z$UObbZ$x>k0QftzDJSZ`02mKf00000 delta 7392 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 delta 1573 zcwW6!Uuaup6#s5^Z<2eP+N8~z&_$Zs#-*DL$(GFq3YL+F3??L6WyRq(?6&)4D|RX< zxLUhEvW|4em-(PAdyqMB9SrQCN^7Ux@TGg}gUszgNMMM{#QC7t-|r@6VfgF^=R3dO z`Of+No$ovIPgUaO=-#mpb$?bVl@2JkWmR1HR8nnG9m?x+$O-sB?gCQ`hz{8V32TrE z-5;Jg-2G(MgtJ+5P(h_MRpZ$Um|$iuVirIOAcdLbh?&H25~0bNdu`1g zeSn}=NC#Irt^2uBNVTXu^w1|8JgQRA#YbE&d%hcvf_t@^-3ZkDjV3Gu?SuUpY7b6J zjqPWtF+o2yc0E9iV-HgMl*&{4v1hrpsq6hXn3L#1&+|D6&T11@?>cA+&Tez8y5@4O zVh72WT+Y?(DEYk0xvCu}pLID`x0B>$mva|(n*0QLYl7Rc`)L?+9SZWU-jz(Bf^`sG z>1F%alIzc_hcuW*O2Osu>oH}u4w1Kj=b=N1N$g}woF%MU%%`<=P{ zu;*6Z>YTpzH2o)+w2L%3;VC-Rhu^MzZyb>AMl6+wacXJ2b%D+R=BnO9o3nOnr962* z=-tF2Q1_MDuoNMTvQ1=yTpZxopi5F_mxrcAV9G4(% zE)&*vEMbQEfi@PugMnW-xM0QPM{7&_?j5`1$rp}{#0!VVDC%NsyU$h=$tx(ResmVsFK#-s|wG_6ahrQ1+U ztK@*vXE>i0jD)6Dt&XwSxphpgwnRc7H(2>W256PpmVm)ukY{9W7GvJJk6ZLm{MPC= zHa-m|@>0WGEMQS7A^OV(YYf(yg|ej{HN7rhHTdm=-#(c`^w;&dX=O1iB0Bt7G~2iJ T=#5sC--26>5tPgyn3sP6$+vaE diff --git a/graphics.inc b/graphics.inc index e80e04cd..e452a840 100644 --- a/graphics.inc +++ b/graphics.inc @@ -346,7 +346,7 @@ linear_color db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 ; of this byte. UsingVGA db 0 - section .latebss + section .bss1 alignb 2 GraphXSize resw 1 ; Width of splash screen file VGAPos resw 1 ; Pointer into VGA memory diff --git a/isolinux-debug.bin b/isolinux-debug.bin dissimilarity index 83% index 026cd84b17eb912f8c330fdda0f9b5dcc8e2a6ca..4701d8af0ae76c5097a82bbe703bd2582ff979b1 100644 GIT binary patch delta 7150 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 delta 7242 zcwTKd3s_S}x^oVPlK>$J4p+zT@z8XK6bTbEl7J3JZ-3Jsfg}wcUij>+&VGc76lQ)BX>^d{l4D&-F#op zKl9JbKmYvmKgU&ixb&?jO=V1az3Mqe>$dlNeErw-HqjO|!5BfL+9Sm{3#I&aZsC5s+Qy%(NCdNb8 zGD#k~hf#XyekLYBf6ufLd3EB#SDEe@#qK?XN$f3ERWgdb6v=zd=)XuuC4*iLLAfE& zqLb|e#z%O*1~DXb8W@=3HmLcL8nl9hZBYP#4j@GZcxa7OY^}kq`BK;{+XhcMbhMRv!OSN@FuuiYpg;9J{7piDv(zA=(F?MBOhc&FaKPc6m3 za6i}VH&=Zsk~I5kDpmZM-6&36^#FkY!6#Z!IPmrI-|t2w@J+Kt{ADw`2TIT#P%LD6 zv8WHhvR1jauUiSr;qQb`2*CF+)-6=MVBJDP>r>KamZyJesitiBYki3=M{6)r)#yVbP>NLGf7P*6JC46C7)Q-rW@66Xht>#lp zEgmTL34D{cC-=}%BbWq0%nKvaeC=HH{I zCcV*<{KyGcSx);AFbt1%(b=ZoCPAlkr>M|56VUm4tk4Vtn^!UXzgv)M0_~{nZ z=`TUICeXI8U={GC(%q1*3 zIu9uJ#uEJI!|1gMPaz$t2QJXs8r7{b(5=dDm2U(($8uparH9TD41pdkC!s|H^g!)a z?AZshOoruI>dJ&2bWH%X8on9DBnV?}O(5{6s_Q4wV_b4riUtpy*7MIDM&o{8GrHyX zZV#Y>+1{-Ik2u@s%eYyqiPUp2Y`IA)G@4fc!y+`1XqaDw_TrMTfT6FFG`n zU*z^z{?d(}P{4y$^oqaKs|xVcdCWP!FnkR@8DjiFe!Lm(lX#9xcBKg2m|Jo>OTA-4 z)C1h8zMpT+4A(ou^HSVKvX;`0F3(h&@~WOmssQR_7uAL`W0DtKDdJ^U+5w>%ZYeR4 zz8iD}$dI@|KQFytlT#Olk6LwPo&?k1$W!fj-tf^!@~MT<8pK_kNjR z(Mj`wVKZH{(FHQ>UA**TOvEOi%$=c7S|X{H%k>@;E$ac8T86uQ0^I$BkD zelgAe;jp(rhEC23WWGe9>vH4#;^p*9lwk-4Su876oY%?q zL?CeN`eE+<2#u*v3TwvGUwC<&V$Z8{#O8BVRfeo!6OmlfnrZ3$S9| z%ZD}!uBhHtzQVwD%Oc}99T!7Pi!llhO46;FX?h>6b*JNH+=wiF?PH0RSFA~X!gtBy zq0r9~D?4G04*(LRLu=A&tnUMPa?SUk-4+H{BG_XcTk~v!|*DLnA2#u2_ zn>Bjw#mISiO1;KIE6GQ&lhMHDL{j63B9F}1YZT|{JA`N|XQ}2?Jw6Jm9p&#FM!QF$ z^EDPO0zipHLdWVAyEl_qgqf*&t}k+KaSPAiJ&c|jMde{|Qwelpc`gEG0IH?h-i{}K zgRU!ZLXxO&!)D2J7XSo6M?cY6bdv-y zN;F+Gh9p{|;^c}srZl~Q=BEyO^QHLISSa3?r|Bed^RMKRbQ_j^(23-0-EUGwY<~Lk zOmTrZYoT#CyT~QGhAQKb0+bY&)`kYhcKjt-A|%oEpNkQTmtAwouA;g)Yy?-Wy6`LF zg2>s5J!W9N3Om11T00j8&j|~lO@*bJi&G&zeEec{2((^=t7`_p5M1!*AXu(S)N{Rx z`Grb-5&!LB^u!2{NiQD}@8q$O5?Fj8pb+JIEmD#!@QWQt9h?w9BKiWogl8SzwGx3R zok%j`ePaw8!|)0asQSJL<#UXZG1bhj7o%*C_U3kQ8%r$1UvXxS?^zcPiERh#vHG8C zE5jwtk5ch697>i~>Cm#Bb8w zF`+Iy7O8%O`=nz6$^~PBJzHa|j@6vbO2g59?2hl=m|)g@;{e7Go+h@7uDKmNCVS z_#>~k*z)6SMX^?SF>6&l%bt+pt4hU(8W$WDEjU<5IABXquu9o=4#gxAuW+HUYokx+ z0-){lo+ihInq6_vgznhDmBpq@P7REDp1y764#v(k>G4=mA&b0(XjJ{!*9OBBnfJtk zJ6ng3qQx>aFoFGn5_^T>66}sPa7Y;jJ7&KPfM2v&t7f6TUX`w&M3ZfptJm5TgsLn@ zK_n$P6>7JPP^7wV6K|`c?@|ERasF-pq%}xMd-L|2m?J4@ivu$| zh`V7f(nK!OrbRA};R!Q7COGy1W*nPKZrg-+=Wa_ahJ}}5hXn8Ar2{jjCua8P zR?VaO%jq`!6_ey2HNT@=ocHy#;=CIdRk0S>@d>w3^?+%iew*T>q;$RIhfKK5s#~b< z9HfYU*$in5wU^FC3?Dny_BH0?lx@w(yuZoRz`AAxyWWm3-^S(=2;ileK>~ET-nKI> zqqCnPJShPqX}v$QdYgq_sLw3_oj?bDpco;==!tX@`e2qNa9^raq4yuWn!vw$fw?_IIj;ikEc}LT(5O+ zB_&S|_%~w@@K=rX=Tc4m^VH^Ie|@L@Dh^z?yo!&|G13rOhAxp=2?jbV#6Xq{{DaO8 z?509G_Hh5J{6HUk7Z{w$y%c*xONPCPceq7~3CgWe9}tFzDm7?LRN+R{s^p3jvkIe> zJdnDi7jb~Xd8$B*X@>QpXi07ly`GhL=nbp{nF&~kHu=zr0$7OM zTD&2?s80TRi}@SkiGV7H<-Sc^ZQ8&Z7K^q{80Oa{t!L|W&rz*m?F8snI&#@n%V>t( zG4Duj5N}iEvbdU23T={Lc_(zyIqbam1RNF6EMkuwle+1lb6McX6IZTdcZ43vV||}$ zFWFQKTbr4Osoc$NBj|3W?~i=&JyAAY^hix$ z-n}YGZRi>+?g(g>#Ft1X;Z!)of&y!^Y6>PN)rItG`qCFYPxD?YmZtc6=Bt ze`l72&yjcr{^AtQK8wkb>ep_w?tmTnJ7~{c)?i z!CeT$?chA_MpB|ldhu@p&QkcDr(8q1?Xh_{bMcZ`JNTYsF6w+Ral{&v;hz5Nwu%UstQXbE(E11?Q7oWwnSlz> zvOEF(HL_B&9(@$Kq>9`uphJ(wod?M)yeZ3o(VZ?LEO1ws~Sj@^KVnwP~>?4;4{4lN|7@{K>NTlTqd@YI4u}Hg^GY!GuB0T=;%Cx$9S( zQk=}S2CGE@Ee7byEwAeqN2O$LpxUsADQfs6>IPL4XqhY^m*pAnI;jhI717lW$OWC4 z_(@F81*CW;N&z;VGS7OI@K<8BR_0-Mf=g1hWcVn~<@%1H)wei%%A3zMMHrr`9M5{d zP#{x7#rdzWLA2RabWRi{2mPK0r%QsI3W zM{QHV7NRF-^scs7bbFPdj&xhunJ{>A|9-= z-Vf2qM%o=eJ{Gxv!`@}n$wxjhljuEQ!An?$LsGJ7pi3gatKVkya+zt{;*=vPqlRcv zG95sT{E}d@hdJc_l=c|$I_FE9zwm{YHd5KG^oVl6rCTv;Ci@BGpYqUmb8*sv>k3#l z6ZIXhb1Ub?t$w`)h+`5YOu=%T_rtQYr9KLO)n*;0VGM5#>yUt8WWb&YuZG$_OxS?U zZYY4O#aCJG;JgIW7Pfm;^52?1WRdX=% zC6+LJ1n>U?S0o0u>I}4E;A|EMJQPfB-_xYa z7`8e*qj%b~EOQ;pUC|_`-_4zgRyY9tE2GzU&3v1v`mzoq%-<7LpJj~tI>AqVA1Z&g zfrvi1FTS?~Frwc<2EJx1Xlq@>$}OfTc@1Fa&G-xS|J& z-S3Of=J*B?N7m@3!^D?{1E8G(E5OU67n zB>n2hHw^4VQrJAiIA3F$5#y+0jtnyBEq@ze_Jpa@ zR+F{=tlL7E2Uji?aQiC(mH5-~MDUWf*ZvRtMSRZN{I6Tkzi(K^0*1x47c)i+v1eU* zqm5um%&zz#`pAuE{bK$Dc4E(l%|AW3(QU93fbKZ&8#k~$NMIKwUW$OVJHvfsJAs6~(t+}k8h#*I<%S3x-X$k%0xOxy z|I`EkQypf0Bam(k(fjUrLP04H7%nEhh`c(^y%?WBKHA6C#;3?HAG7$BH4{1d%GuVW z%iKrtDa2*&@9~ciIb3AIYSraqwk7D@DT|=QqsK}%3mezlbeFm36BZ;c)z<{p=&KYP z(b7O^rSxRhqN?vvM?ielT*{qHc!H$A=l+whipcrUv*2CA^rtyXuw345GW>Qqh80bL zuOz?8XN3-0YJlnRUe1_Me^>F#@2HWgLS`I(kLPCwMg?8HL`6n zJ&0S<_(f|)4*+E2SDE){0>gLDWnjf38)M!ia3w-EK7WM(6o!YS$MZumtUuQuM+4H- zSoknaOE6;1dmgtG!!M{iGyo4Z8J4MTQFwz*ZUQq_+Qgiw=m(&%aZ3AD+)(bK#!C+m zULVO-HNM|d@WU8}?InZP0cbj4{j4G$fa3?0H*!?rc)dIfMA8`Ek>OfLNNu_+!cSA1 zhDG?TijJ;1dt%nYN%hyR?#pp5%r;i6@bh3jDv+z1N}&6Grb^a-fH z2GeH>!2hZJI&yGPrVJKkVr_;iFFW_rqF)j#xvv*#GrrAD547~=rhDjbb4j!n7)ygq zs*OlH)IIBWs1O*}eL$eoz?dBz;8v#3B{3*TPo#2Myzg+k(icjCME;q}olD $PnP pointer + push di mov ds,ax mov es,ax mov fs,ax @@ -266,7 +271,7 @@ initial_csum: xor edi,edi loop .loop mov [FirstSecSum],edi - mov [DriveNo],dl + mov [DriveNumber],dl %ifdef DEBUG_MESSAGES mov si,startup_msg call writemsg @@ -295,11 +300,11 @@ initial_csum: xor edi,edi ; Note: use passed-in DL value rather than 7Fh because ; at least some BIOSes will get the wrong value otherwise mov ax,4B01h ; Get disk emulation status - mov dl,[DriveNo] + mov dl,[DriveNumber] mov si,spec_packet - int 13h + call int13 jc award_hack ; changed for BrokenAwardHack - mov dl,[DriveNo] + mov dl,[DriveNumber] cmp [sp_drive],dl ; Should contain the drive number jne spec_query_failed @@ -541,7 +546,7 @@ award_found: mov eax,[es:di+0eh] ; load possible int 13 addr call writestr ; %endif ; mov ax,4B01h ; try to read the spec packet - mov dl,[DriveNo] ; now ... it should not fail + mov dl,[DriveNumber] ; now ... it should not fail mov si,spec_packet ; any longer int 13h ; jc award_fail2 ; @@ -570,7 +575,7 @@ spec_query_failed: mov ax,4B01h mov si,spec_packet mov byte [si],13 ; Size of buffer - int 13h + call int13 popa jc .still_broken @@ -586,14 +591,14 @@ spec_query_failed: ; Okay, good enough... mov si,alright_msg call writemsg - mov [DriveNo],dl + mov [DriveNumber],dl .found_drive: jmp found_drive ; Award BIOS 4.51 apparently passes garbage in sp_drive, ; but if this was the drive number originally passed in ; DL then consider it "good enough" .maybe_broken: - cmp byte [DriveNo],dl + cmp byte [DriveNumber],dl je .found_drive .still_broken: dec dx @@ -605,7 +610,7 @@ spec_query_failed: ; 4B01h, so we can't query a spec packet no matter ; what. If we got a drive number in DL, then try to ; use it, and if it works, then well... - mov dl,[DriveNo] + mov dl,[DriveNumber] cmp dl,81h ; Should be 81-FF at least jb fatal_error ; If not, it's hopeless @@ -657,6 +662,23 @@ writechr_simple: ret ; +; int13: save all the segment registers and call INT 13h +; Some CD-ROM BIOSes have been found to corrupt segment registers. +; +int13: + + push ds + push es + push fs + push gs + int 13h + pop gs + pop fs + pop es + pop ds + ret + +; ; Get one sector. Convenience entry point. ; getonesec: @@ -689,7 +711,7 @@ getlinsec: .bp_ok: mov [si+2],bp push si - mov dl,[DriveNo] + mov dl,[DriveNumber] mov ah,42h ; Extended Read call xint13 pop si @@ -707,7 +729,7 @@ getlinsec: ; INT 13h with retry xint13: mov byte [RetryCount],retry_count .try: pushad - int 13h + call int13 jc .error add sp,byte 8*4 ; Clean up stack ret @@ -809,7 +831,6 @@ crlf_msg db CR, LF null_msg db 0 alignb 4, db 0 -StackPtr dw StackBuf, 0 ; SS:SP for stack reset MaxTransfer dw 32 ; Max sectors per transfer rl_checkpt equ $ ; Must be <= 800h @@ -1047,11 +1068,11 @@ is_disk_image: mov ax,4C00h ; Enable emulation and boot mov si,dspec_packet - mov dl,[DriveNo] + mov dl,[DriveNumber] lss sp,[InitStack] TRACER 'X' - int 13h + call int13 ; If this returns, we have problems .bad_image: @@ -1553,9 +1574,7 @@ img_table: ; alignb 4, db 0 BufSafe dw trackbufsize/SECTOR_SIZE ; Clusters we can load into trackbuf -BufSafeSec dw trackbufsize/SECTOR_SIZE ; = how many sectors? BufSafeBytes dw trackbufsize ; = how many bytes? -EndOfGetCBuf dw getcbuf+trackbufsize ; = getcbuf+BufSafeBytes %ifndef DEPEND %if ( trackbufsize % SECTOR_SIZE ) != 0 %error trackbufsize must be a multiple of SECTOR_SIZE diff --git a/isolinux.bin b/isolinux.bin dissimilarity index 85% index 6dc9eaeddb860837ac828ecde4b5d272db2e41db..c4480ae74f85a6bcd0b0679f37b5331a43a4d8ab 100644 GIT binary patch delta 7145 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 delta 7113 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 F{x9~X3VHwl diff --git a/layout.inc b/layout.inc index 1a9115bd..30703739 100644 --- a/layout.inc +++ b/layout.inc @@ -26,7 +26,7 @@ TEXT_START equ 7C00h ; The secondary BSS section, above the text; we really wish we could ; just make it follow .bcopy32 or hang off the end, ; but it doesn't seem to work that way. -LATEBSS_START equ 0B300h +LATEBSS_START equ 0B800h ; Reserve memory for the stack. This causes checkov to abort the ; compile if we violate this space. @@ -42,24 +42,31 @@ STACK_START equ TEXT_START-STACK_SIZE ; org TEXT_START - ; NASM BUG: refers to hacks to handle NASM 0.98.38 bugs; might need - ; conditional compilation + ; Use .earlybss for things that MUST be in low memory. + section .earlybss nobits start=BSS_START + section .bcopy32 align=4 valign=16 follows=.data vfollows=.earlybss + section .config align=4 valign=16 follows=.bcopy32 vfollows=.bcopy32 + section .config.end nobits valign=4 vfollows=.config - section .earlybss nobits start=BSS_START - section .bcopy32 align=4 valign=16 follows=.data vfollows=.earlybss - section .config align=4 valign=16 follows=.bcopy32 vfollows=.bcopy32 - section .config.end nobits align=4 follows=.config + ; Use .bss1 for things that doesn't have to be in low memory, + ; but are in order to offload .bss + section .bss1 nobits valign=16 vfollows=.config.end - ; NASM BUG: follows= here should be vfollows= - section .bss nobits align=256 follows=.config.end + section .text start=TEXT_START + ; NASM BUG: .data always follows .text; can't override + section .data align=16 ; follows=.text - section .text start=TEXT_START - ; NASM BUG: follows=.text not accepted here - section .data align=16 ; follows=.text + section .adv progbits align=1 follows=.config - ; NASM BUG: We would like to do follows=.bcopy32 - section .latebss nobits align=16 start=LATEBSS_START + ; .uibss contains bss data which is guaranteed to be + ; safe to clobber during the loading of the image. This + ; is because while loading the primary image we will clobber + ; the spillover from the last fractional sector load. + section .uibss nobits align=16 follows=.adv + + ; Normal bss... + section .bss nobits align=16 follows=.uibss ; Reserve space for stack - section .stack nobits align=16 start=STACK_START + section .stack nobits align=16 start=STACK_START Stack resb STACK_SIZE diff --git a/ldlinux.asm b/ldlinux.asm index b882d732..ff900435 100644 --- a/ldlinux.asm +++ b/ldlinux.asm @@ -154,7 +154,8 @@ xbs_vgatmpbuf equ 2*trackbufsize StackBuf equ $-44-32 ; Start the stack here (grow down - 4K) PartInfo equ StackBuf ; Saved partition table entry FloppyTable equ PartInfo+16 ; Floppy info table (must follow PartInfo) -OrigFDCTabPtr equ StackBuf-4 ; The high dword on the stack +OrigFDCTabPtr equ StackBuf-8 ; The 2nd high dword on the stack +OrigESDI equ StackBuf-4 ; The high dword on the stack ; ; Primary entry point. Tempting as though it may be, we can't put the @@ -224,12 +225,14 @@ start: xor ax,ax mov ss,ax mov sp,StackBuf ; Just below BSS + push es ; Save initial ES:DI -> $PnP pointer + push di mov es,ax ; ; DS:SI may contain a partition table entry. Preserve it for us. ; mov cx,8 ; Save partition info - mov di,sp + mov di,PartInfo rep movsw mov ds,ax ; Now we can initialize DS... @@ -1594,9 +1597,7 @@ debug_magic dw 0D00Dh ; Debug code sentinel alignb 4, db 0 BufSafe dw trackbufsize/SECTOR_SIZE ; Clusters we can load into trackbuf -BufSafeSec dw trackbufsize/SECTOR_SIZE ; = how many sectors? BufSafeBytes dw trackbufsize ; = how many bytes? -EndOfGetCBuf dw getcbuf+trackbufsize ; = getcbuf+BufSafeBytes %ifndef DEPEND %if ( trackbufsize % SECTOR_SIZE ) != 0 %error trackbufsize must be a multiple of SECTOR_SIZE diff --git a/ldlinux.bin b/ldlinux.bin dissimilarity index 83% index 2411fe76ec1b5a398d7882662d4708058e717e5b..511e0ad7a1e70ec054ca3a6d27825474a4b9a73b 100644 GIT binary patch delta 6384 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 diff --git a/ldlinux.bss b/ldlinux.bss dissimilarity index 81% index cafe4a653ccb2a778f5397b36c03b21822a5bd7e..eb20848f2cc2afe203fb1245e50af85b095f3c97 100644 GIT binary patch delta 134 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 gbvpEldA)hPb^WXByVkGFU74%Q)#b+U%kR> 8) & 0xFF; } static inline unsigned int -read32(le32_t *_p) +read32(le32_t *_pp) { + uint8_t *_p = *_pp; + uint32_t _v; + _v = _p[0]; _v |= _p[1] << 8; _v |= _p[2] << 16; @@ -101,8 +107,10 @@ read32(le32_t *_p) } static inline void -write32(le32_t *_p, uint32_t _v) +write32(le32_t *_pp, uint32_t _v) { + uint8_t *_p = *_pp; + _p[0] = _v & 0xFF; _p[1] = (_v >> 8) & 0xFF; _p[2] = (_v >> 16) & 0xFF; diff --git a/mbr/Makefile b/mbr/Makefile index 87744131..2db358ca 100644 --- a/mbr/Makefile +++ b/mbr/Makefile @@ -46,4 +46,6 @@ tidy: rm -f *.o *.elf *.lst clean: tidy + +spotless: clean rm -f *.bin diff --git a/mbr/mbr.S b/mbr/mbr.S index 2a318be3..63622d9e 100644 --- a/mbr/mbr.S +++ b/mbr/mbr.S @@ -207,8 +207,8 @@ scan_partition_table: jns too_many_active /* No active partitions found, look for extended partitions */ - popw %bx /* %bx <- ptab */ popw %cx /* %cx <- 4 */ + popw %bx /* %bx <- ptab */ 7: movb 4(%bx), %al cmpb $0x0f, %al /* 0x0f = Win9x extended */ diff --git a/mbr/mbr.bin b/mbr/mbr.bin index 00e541439f113e53f9c641758c0dcd31d864ed6c..ae43640708bb9e22b0b8f06647ff0ab65edb8c0b 100755 GIT binary patch delta 12 UcwU>uJd1h4W2VUHiBGoz03VuJd1h4W2WfHiBGoz03V_Sj{pDw diff --git a/mbr/mbr.elf b/mbr/mbr.elf deleted file mode 100755 index 98395b38238c80c21db8d8a14e06d8f5595529a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 3951 zcwX&SO=uHA6n@*pO)9O8)E2>tTM-nIXrL5?`d73nC~9LBe{kI-J9TT44ZBk@CZbZ5 zrhy7x#NxqAL5er4C@nSEs)!c+xp)#PwM2UmX=ye7#JAa`o%Z6vgO~kazBk{zeQ)+> zhS_&v$DRg`H>|0Cl`b-wF-)erH+7=O62Gxg)=Bj6tbH_`oBz%!un0c`8*Y4SYZF!g=7Tr0oy zqp7F0^z|pbm^|aJ^1b!r6-RrW!{u!wTMm@nf4X&gq;Ws-q{xkQGo)8>dlg+*!p(vj zku`}LJw2*ZIpi)~2;?O3yy=5DX(ao3ZwuGrN{o@|+R0dIly4tte{yZA_FJs|sdHr8 z1Foo}G84mDhFnA%Ob=xT2F^bka6A-XqI-~>OnmG^VFypjdtl0Ok=nK<-nR|9K1}SQ z$D-T`vPS4j zW1ax)Z4FW-5|jnWPn9#W5Ro*hP(=;vxhF_&cM@Ae6-jJ&rq^fj?QH&izNx3|vOU|M zi5(Rkne1qK1?-#m@Ip|P0)nh*s%B(4aYsnelHNrfn|=1Xj$zmMm*J(8W&hvuFjxj=4ZuU5uyrv-gFSDnu{j}E8kluL zNkNz>ge=Bp0|t2AT1Ik=Wx}DV6yPFf)+Lo-&TEt(#V|MD%|!rj89l$gnFHQ5GgVN$ zpo`|j+2L!}!T13+-VS79v$_KL8>5#aPcnKnvd=!NJ;(xI&>Ykv-)3|@@>ND3L>^?c zf_$9O6uHeYtIr|F82=UI0mh$1?q&S9kT)^@ZsaOP-$RxdokG6O=pn=8^SMyJFgo#q z#xEK2X>Kp*RPvvOfQIL9SOr{)RMm9D;<4(F2BCiUKCc*&nq>$Z3s#e*faq64AvJ9F z%?Q!&Q&bG|OJQ;56c=%w2W1GEe<>pRbEh&J2N7d0" - 1 /* ----------------------------------------------------------------------- - 0 - 0 - 2 * - 3 * Copyright 2007 H. Peter Anvin - All Rights Reserved - 4 * - 5 * Permission is hereby granted, free of charge, to any person - 6 * obtaining a copy of this software and associated documentation - 7 * files (the "Software"), to deal in the Software without - 8 * restriction, including without limitation the rights to use, - 9 * copy, modify, merge, publish, distribute, sublicense, and/or - 10 * sell copies of the Software, and to permit persons to whom - 11 * the Software is furnished to do so, subject to the following - 12 * conditions: - 13 * - 14 * The above copyright notice and this permission notice shall - 15 * be included in all copies or substantial portions of the Software. - 16 * - 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - 19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - 21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - 22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - 23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - 24 * OTHER DEALINGS IN THE SOFTWARE. - 25 * - 26 * ----------------------------------------------------------------------- */ - 27 - 28 .code16 - 29 .text - 30 - 31 .globl bootsec - 32 stack = 0x7c00 - 33 driveno = (stack-6) - 34 sectors = (stack-8) - 35 secpercyl = (stack-12) - 36 - 37 BIOS_page = 0x462 - 38 - 39 /* gas/ld has issues with doing this as absolute addresses... */ - 40 .section ".bootsec", "a", @nobits - 41 .globl bootsec - 42 bootsec: - 43 0000 00000000 .space 512 - 43 00000000 - 43 00000000 - 43 00000000 - 43 00000000 - 44 - 45 .text - 46 .globl _start - 47 _start: - 48 0000 FA cli - 49 0001 31C0 xorw %ax, %ax - GAS LISTING /tmp/ccFnMA3z.s page 2 - - - 50 0003 8ED8 movw %ax, %ds - 51 0005 8ED0 movw %ax, %ss - 52 0007 BC007C movw $stack, %sp - 53 000a 89E6 movw %sp, %si - 54 000c 06 pushw %es /* es:di -> $PnP header */ - 55 000d 57 pushw %di - 56 000e 52 pushw %dx /* dl -> drive number */ - 57 000f 8EC0 movw %ax, %es - 58 0011 FB sti - 59 0012 FC cld - 60 - 61 /* Copy down to 0:0x600 */ - 62 0013 BF0000 movw $_start, %di - 63 0016 B90001 movw $(512/2), %cx - 64 0019 F3A5 rep; movsw - 65 - 66 001b EA200000 ljmpw $0, $next - 66 00 - 67 - 68 next: - 69 /* Check to see if we have EBIOS */ - 70 0020 52 pushw %dx /* drive number */ - 71 0021 B80041 movw $0x4100, %ax - 72 0024 BBAA55 movw $0x55aa, %bx - 73 0027 31C9 xorw %cx, %cx - 74 0029 30F6 xorb %dh, %dh - 75 002b F9 stc - 76 002c CD13 int $0x13 - 77 002e 7213 jc 1f - 78 0030 81FB55AA cmpw $0xaa55, %bx - 79 0034 750D jne 1f - 80 0036 D1E9 shrw %cx /* Bit 0 = fixed disk subset */ - 81 0038 7309 jnc 1f - 82 - 83 /* We have EBIOS; patch in the following code at - 84 read_sector_cbios: movb $0x42, %ah ; jmp read_common */ - 85 003a 66C7068F movl $0xeb42b4+((read_common-read_sector_cbios-4) << 24), \ - 85 00B442EB - 85 15 - 86 (read_sector_cbios) - 87 - 88 1: - 89 0043 5A popw %dx - 90 - 91 /* Get (C)HS geometry */ - 92 0044 B408 movb $0x08, %ah - 93 0046 CD13 int $0x13 - 94 0048 83E13F andw $0x3f, %cx /* Sector count */ - 95 004b 51 pushw %cx /* Save sectors on the stack */ - 96 004c 0FB6C6 movzbw %dh, %ax /* dh = max head */ - 97 004f 40 incw %ax /* From 0-based max to count */ - 98 0050 F7E1 mulw %cx /* Heads*sectors -> sectors per cylinder */ - 99 - 100 /* Save sectors/cylinder on the stack */ - 101 0052 52 pushw %dx /* High word */ - 102 0053 50 pushw %ax /* Low word */ - 103 - GAS LISTING /tmp/ccFnMA3z.s page 3 - - - 104 0054 6631C0 xorl %eax, %eax /* Base */ - 105 0057 6699 cdq /* Root (%edx <- 0) */ - 106 0059 E86700 call scan_partition_table - 107 - 108 /* If we get here, we have no OS */ - 109 missing_os: - 110 005c E82401 call error - 111 005f 4D697373 .ascii "Missing operating system.\r\n" - 111 696E6720 - 111 6F706572 - 111 6174696E - 111 67207379 - 112 007a 00 .byte 0 - 113 - 114 /* - 115 * read_sector: read a single sector pointed to by %eax to 0x7c00. - 116 * CF is set on error. All registers saved. - 117 */ - 118 read_sector: - 119 007b 6660 pushal - 120 007d 6631D2 xorl %edx, %edx - 121 0080 BB0000 movw $bootsec, %bx - 122 0083 6652 pushl %edx /* MSW of LBA */ - 123 0085 6650 pushl %eax /* LSW of LBA */ - 124 0087 06 pushw %es /* Buffer segment */ - 125 0088 53 pushw %bx /* Buffer offset */ - 126 0089 6A01 pushw $1 /* Sector count */ - 127 008b 6A10 pushw $16 /* Size of packet */ - 128 008d 89E6 movw %sp, %si - 129 - 130 /* This chunk is skipped if we have ebios */ - 131 /* Do not clobber %eax before this chunk! */ - 132 /* This also relies on %bx and %edx as set up above. */ - 133 read_sector_cbios: - 134 008f 66F736F4 divl (secpercyl) - 134 7B - 135 0094 C0E406 shlb $6, %ah - 136 0097 88E1 movb %ah, %cl - 137 0099 88C5 movb %al, %ch - 138 009b 92 xchgw %dx, %ax - 139 009c F636F87B divb (sectors) - 140 00a0 88C6 movb %al, %dh - 141 00a2 08E1 orb %ah, %cl - 142 00a4 41 incw %cx /* Sectors are 1-based */ - 143 00a5 B80102 movw $0x0201, %ax - 144 - 145 read_common: - 146 00a8 8A16FA7B movb (driveno), %dl - 147 00ac CD13 int $0x13 - 148 00ae 83C410 addw $16, %sp /* Drop DAPA */ - 149 00b1 6661 popal - 150 00b3 C3 ret - 151 - 152 /* - 153 * read_partition_table: - 154 * Read a partition table (pointed to by %eax), and copy - 155 * the partition table into the ptab buffer. - GAS LISTING /tmp/ccFnMA3z.s page 4 - - - 156 * - 157 * Clobbers %si, %di, and %cx, other registers preserved. - 158 * %cx = 0 on exit. - 159 * - 160 * On error, CF is set and ptab is overwritten with junk. - 161 */ - 162 ptab = _start+446 - 163 - 164 read_partition_table: - 165 00b4 E8C4FF call read_sector - 166 00b7 BEBE01 movw $bootsec+446, %si - 167 00ba BFBE01 movw $ptab, %di - 168 00bd B92000 movw $(16*4/2), %cx - 169 00c0 F3A5 rep ; movsw - 170 00c2 C3 ret - 171 - 172 /* - 173 * scan_partition_table: - 174 * Scan a partition table currently loaded in the partition table - 175 * area. Preserve all registers. - 176 * - 177 * On entry: - 178 * %eax - base (location of this partition table) - 179 * %edx - root (offset from MBR, or 0 for MBR) - 180 * - 181 * These get pushed into stack slots: - 182 * 28(%bp) - %eax - base - 183 * 20(%bp) - %edx - root - 184 */ - 185 - 186 scan_partition_table: - 187 00c3 6660 pushal - 188 00c5 89E5 movw %sp, %bp - 189 - 190 /* Search for active partitions */ - 191 00c7 BBBE01 movw $ptab, %bx - 192 00ca B90400 movw $4, %cx - 193 00cd 31C0 xorw %ax, %ax - 194 00cf 53 push %bx - 195 00d0 51 push %cx - 196 5: - 197 00d1 F60780 testb $0x80, (%bx) - 198 00d4 7403 jz 6f - 199 00d6 40 incw %ax - 200 00d7 89DE movw %bx, %si - 201 6: - 202 00d9 83C310 addw $16, %bx - 203 00dc E2F3 loopw 5b - 204 - 205 00de 48 decw %ax /* Number of active partitions found */ - 206 00df 745C jz boot - 207 00e1 7939 jns too_many_active - 208 - 209 /* No active partitions found, look for extended partitions */ - 210 00e3 5B popw %bx /* %bx <- ptab */ - 211 00e4 59 popw %cx /* %cx <- 4 */ - 212 7: - GAS LISTING /tmp/ccFnMA3z.s page 5 - - - 213 00e5 8A4704 movb 4(%bx), %al - 214 00e8 3C0F cmpb $0x0f, %al /* 0x0f = Win9x extended */ - 215 00ea 7406 je 8f - 216 00ec 247F andb $~0x80, %al /* 0x85 = Linux extended */ - 217 00ee 3C05 cmpb $0x05, %al /* 0x05 = MS-DOS extended */ - 218 00f0 7522 jne 9f - 219 - 220 /* It is an extended partition. Read the extended partition and - 221 try to scan it. If the scan returns, re-load the current - 222 partition table and resume scan. */ - 223 8: - 224 00f2 668B4708 movl 8(%bx), %eax /* Partition table offset */ - 225 00f6 668B5614 movl 20(%bp), %edx /* "Root" */ - 226 00fa 6601D0 addl %edx, %eax /* Compute location of new ptab */ - 227 00fd 6621D2 andl %edx, %edx /* Is this the MBR? */ - 228 0100 7503 jnz 10f - 229 0102 6689C2 movl %eax, %edx /* Offset -> root if this was MBR */ - 230 10: - 231 0105 E8ACFF call read_partition_table - 232 0108 7203 jc 11f - 233 010a E8B6FF call scan_partition_table - 234 11: - 235 /* This returned, so we need to reload the current partition table */ - 236 010d 668B461C movl 28(%bp), %eax /* "Base" */ - 237 0111 E8A0FF call read_partition_table - 238 - 239 /* fall through */ - 240 9: - 241 /* Not an extended partition */ - 242 0114 83C310 addw $16, %bx - 243 0117 E2CC loopw 7b - 244 - 245 /* Nothing found, return */ - 246 0119 6661 popal - 247 011b C3 ret - 248 - 249 too_many_active: - 250 011c E86400 call error - 251 011f 4D756C74 .ascii "Multiple active partitions.\r\n" - 251 69706C65 - 251 20616374 - 251 69766520 - 251 70617274 - 252 013c 00 .byte 0 - 253 - 254 /* - 255 * boot: invoke the actual bootstrap. (%si) points to the partition - 256 * table entry, and 28(%bp) has the partition table base. - 257 */ - 258 boot: - 259 013d 668B4408 movl 8(%si), %eax - 260 0141 6603461C addl 28(%bp), %eax - 261 0145 66894408 movl %eax, 8(%si) /* Adjust in-memory partition table entry */ - 262 0149 E82FFF call read_sector - 263 014c 7213 jc disk_error - 264 014e 813EFE01 cmpw $0xaa55, (bootsec+510) - 264 55AA - GAS LISTING /tmp/ccFnMA3z.s page 6 - - - 265 0154 0F8504FF jne missing_os /* Not a valid boot sector */ - 266 0158 BCFA7B movw $driveno, %sp /* driveno == bootsec-6 */ - 267 015b 5A popw %dx /* dl -> drive number */ - 268 015c 5F popw %di /* es:di -> $PnP vector */ - 269 015d 07 popw %es - 270 015e FA cli - 271 015f FFE4 jmpw *%sp /* %sp == bootsec */ - 272 - 273 disk_error: - 274 0161 E81F00 call error - 275 0164 4F706572 .ascii "Operating system load error.\r\n" - 275 6174696E - 275 67207379 - 275 7374656D - 275 206C6F61 - 276 0182 00 .byte 0 - 277 - 278 /* - 279 * Print error messages. This is invoked with "call", with the - 280 * error message at the return address. - 281 */ - 282 error: - 283 0183 5E popw %si - 284 2: - 285 0184 AC lodsb - 286 0185 20C0 andb %al, %al - 287 0187 740C jz 3f - 288 0189 B40E movb $0x0e, %ah - 289 018b 8A3E6204 movb (BIOS_page), %bh - 290 018f B307 movb $0x07, %bl - 291 0191 CD10 int $0x10 - 292 0193 EBEF jmp 2b - 293 3: - 294 0195 CD18 int $0x18 /* Boot failure */ - 295 die: - 296 0197 F4 hlt - 297 0198 EBFD jmp die - GAS LISTING /tmp/ccFnMA3z.s page 7 - - -DEFINED SYMBOLS - *ABS*:0000000000000000 mbr.S - mbr.S:42 .bootsec:0000000000000000 bootsec - mbr.S:32 *ABS*:0000000000007c00 stack - mbr.S:33 *ABS*:0000000000007bfa driveno - mbr.S:34 *ABS*:0000000000007bf8 sectors - mbr.S:35 *ABS*:0000000000007bf4 secpercyl - mbr.S:37 *ABS*:0000000000000462 BIOS_page - mbr.S:47 .text:0000000000000000 _start - mbr.S:68 .text:0000000000000020 next - mbr.S:145 .text:00000000000000a8 read_common - mbr.S:133 .text:000000000000008f read_sector_cbios - mbr.S:186 .text:00000000000000c3 scan_partition_table - mbr.S:109 .text:000000000000005c missing_os - mbr.S:282 .text:0000000000000183 error - mbr.S:118 .text:000000000000007b read_sector - mbr.S:47 .text:00000000000001be ptab - mbr.S:164 .text:00000000000000b4 read_partition_table - mbr.S:258 .text:000000000000013d boot - mbr.S:249 .text:000000000000011c too_many_active - mbr.S:273 .text:0000000000000161 disk_error - mbr.S:295 .text:0000000000000197 die - -NO UNDEFINED SYMBOLS diff --git a/mbr/mbr.o b/mbr/mbr.o deleted file mode 100644 index 42a741da74b1792af7de41c3a7372d684981ad24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 1576 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 OOOfxUBZzv*vi}14NExR9 diff --git a/memdisk/memdisk.asm b/memdisk/memdisk.asm index fc46e844..1e27e1e9 100644 --- a/memdisk/memdisk.asm +++ b/memdisk/memdisk.asm @@ -91,7 +91,9 @@ Pointers: dw Int13Start dw Int15Start dw PatchArea dw TotalSize + dw IretPtr +IretPtr equ Int13Start.iret Int13Start: ; Swap stack mov [cs:Stack],esp @@ -139,7 +141,7 @@ Int13Start: pop ax pop bp lss esp,[cs:Stack] - iret +.iret: iret .our_drive: ; Set up standard entry frame @@ -464,10 +466,10 @@ edd_setup_regs: cmp dword [es:si+4],-1 je .linear_address - movzx esi,word [es:si+4] ; Offset + movzx ebx,word [es:si+4] ; Offset movzx edi,word [es:si+6] ; Segment shl edi,4 - add esi,edi + add ebx,edi jmp .got_address .linear_address: @@ -480,23 +482,24 @@ edd_setup_regs: ; no really better code available jne .error - mov esi,[es:si+16] + mov ebx,[es:si+16] .got_address: cmp dword [es:si+12],0 ; LBA too large? jne .overrun movzx ecx, word [es:si+2] ; Sectors to transfer - mov edi,[es:si+8] ; Starting sector - mov eax,edi + mov esi,[es:si+8] ; Starting sector + mov eax,esi add eax,ecx jc .overrun cmp eax,[DiskSize] ja .overrun shl ecx,SECTORSIZE_LG2-2 ; Convert to dwords - shl edi,SECTORSIZE_LG2 ; Convert to an offset - add edi,[DiskBuf] + shl esi,SECTORSIZE_LG2 ; Convert to an offset + add esi,[DiskBuf] + mov edi,ebx pop es ret diff --git a/memdisk/setup.c b/memdisk/setup.c index bacaba4d..bffaf7a8 100644 --- a/memdisk/setup.c +++ b/memdisk/setup.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2001-2006 H. Peter Anvin - All Rights Reserved + * Copyright 2001-2007 H. Peter Anvin - All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ struct memdisk_header { uint16_t int15_offs; uint16_t patch_offs; uint16_t total_size; + uint16_t iret_offs; }; /* The Disk Parameter Table may be required */ @@ -762,37 +763,46 @@ void setup(syscall_t cs_syscall, void *cs_bounce) ranges[--nranges].type = -1; } - /* Query drive parameters of this type */ - memset(®s, 0, sizeof regs); - regs.es = 0; - regs.eax.b[1] = 0x08; - regs.edx.b[0] = geometry->driveno & 0x80; - syscall(0x13, ®s, ®s); - - if ( regs.eflags.l & 1 ) { - printf("INT 13 08: Failure, assuming this is the only drive\n"); + if (getcmditem("nopass") != CMD_NOTFOUND) { + /* nopass specified - we're the only drive by definition */ + printf("nopass specified - we're the only drive\n"); + bios_drives = 0; pptr->drivecnt = 0; + pptr->oldint13 = driverptr+hptr->iret_offs; } else { - printf("INT 13 08: Success, count = %u, BPT = %04x:%04x\n", - regs.edx.b[0], regs.es, regs.edi.w[0]); - pptr->drivecnt = regs.edx.b[0]; - } - - /* Compare what INT 13h returned with the appropriate equipment byte */ - if ( geometry->driveno & 0x80 ) { - bios_drives = rdz_8(BIOS_HD_COUNT); - } else { - uint8_t equip = rdz_8(BIOS_EQUIP); - - if (equip & 1) - bios_drives = (equip >> 6)+1; - else - bios_drives = 0; - } - - if (pptr->drivecnt > bios_drives) { - printf("BIOS equipment byte says count = %d, go with that\n", bios_drives); - pptr->drivecnt = bios_drives; + /* Query drive parameters of this type */ + memset(®s, 0, sizeof regs); + regs.es = 0; + regs.eax.b[1] = 0x08; + regs.edx.b[0] = geometry->driveno & 0x80; + syscall(0x13, ®s, ®s); + + if ( regs.eflags.l & 1 ) { + printf("INT 13 08: Failure, assuming this is the only drive\n"); + pptr->drivecnt = 0; + } else { + printf("INT 13 08: Success, count = %u, BPT = %04x:%04x\n", + regs.edx.b[0], regs.es, regs.edi.w[0]); + pptr->drivecnt = regs.edx.b[0]; + } + + /* Compare what INT 13h returned with the appropriate equipment byte */ + if ( geometry->driveno & 0x80 ) { + bios_drives = rdz_8(BIOS_HD_COUNT); + } else { + uint8_t equip = rdz_8(BIOS_EQUIP); + + if (equip & 1) + bios_drives = (equip >> 6)+1; + else + bios_drives = 0; + } + + if (pptr->drivecnt > bios_drives) { + printf("BIOS equipment byte says count = %d, go with that\n", + bios_drives); + pptr->drivecnt = bios_drives; + } } /* Add ourselves to the drive count */ diff --git a/memdump/Makefile b/memdump/Makefile new file mode 100644 index 00000000..40497028 --- /dev/null +++ b/memdump/Makefile @@ -0,0 +1,64 @@ +TMPFILE = $(shell mktemp /tmp/gcc_ok.XXXXXX) + +gcc_ok = $(shell tmpf=$(TMPFILE); if gcc $(1) -c -x c /dev/null -o $$tmpf 2>/dev/null; \ + then echo $(1); else echo $(2); fi; rm -f $$tmpf) + +M32 := $(call gcc_ok,-m32,) $(call gcc_ok,-ffreestanding,) $(call gcc_ok,-fno-stack-protector,) + +CC = gcc +LD = ld -m elf_i386 +OBJCOPY = objcopy +OPTFLAGS = -g -Os -march=i386 -falign-functions=0 -falign-jumps=0 -falign-loops=0 -fomit-frame-pointer +INCLUDES = -include code16.h -I. +CFLAGS = $(M32) -mregparm=3 -DREGPARM=3 -W -Wall -msoft-float $(OPTFLAGS) $(INCLUDES) +LDFLAGS = -T com16.ld +AR = ar +RANLIB = ranlib +LIBGCC := $(shell $(CC) --print-libgcc) + +SRCS = main.c serial.c ymsend.c +OBJS = crt0.o $(patsubst %.c,%.o,$(notdir $(SRCS))) +LIBOBJS = conio.o memcpy.o memset.o skipatou.o strtoul.o \ + argv.o printf.o __divdi3.o __udivmoddi4.o + +.SUFFIXES: .c .o .i .s .S .elf .com + +VPATH = .:..:../libfat + +TARGETS = memdump.com + +all: $(TARGETS) + +tidy: + -rm -f *.o *.i *.s *.a .*.d *.elf + +clean: tidy + +spotless: clean + -rm -f *~ $(TARGETS) + +installer: + +memdump.elf: $(OBJS) libcom.a + $(LD) $(LDFLAGS) -o $@ $^ + +libcom.a: $(LIBOBJS) + -rm -f $@ + $(AR) cq $@ $^ + $(RANLIB) $@ + +memdump.com: memdump.elf + $(OBJCOPY) -O binary $< $@ + +%.o: %.c + $(CC) -Wp,-MT,$@,-MD,.$@.d $(CFLAGS) -c -o $@ $< +%.i: %.c + $(CC) $(CFLAGS) -E -o $@ $< +%.s: %.c + $(CC) $(CFLAGS) -S -o $@ $< +%.o: %.S + $(CC) -Wp,-MT,$@,-MD,.$@.d $(CFLAGS) -D__ASSEMBLY__ -c -o $@ $< +%.s: %.S + $(CC) $(CFLAGS) -E -o $@ $< + +-include .*.d diff --git a/memdump/README b/memdump/README new file mode 100644 index 00000000..2b825775 --- /dev/null +++ b/memdump/README @@ -0,0 +1,19 @@ +This is a very simple COMBOOT program which can be used to dump memory +regions over a serial port. To use it, type on the SYSLINUX command +line: + +memdump , ,... + +For example: + +memdump 0 funnysystem- 0,0x600 0x9fc00,0x400 0xf0000,0x10000 + +... dumps three memory ranges (the standard BIOS memory ranges, often +useful) onto serial port 0. The can either be in the range 0-3 +for the standard BIOS serial port, or the I/O address of the UART. + +The data is transferred using the YMODEM protocol; the Unix +implementation of this protocol is called "rb" and is part of the +"lrzsz" (or "rzsz") package. If one uses a terminal program like +Minicom, there is often a way to invoke it from inside the terminal +program; in Minicom, this is done with the Ctrl-A R control sequence. diff --git a/memdump/__divdi3.c b/memdump/__divdi3.c new file mode 100644 index 00000000..3641396f --- /dev/null +++ b/memdump/__divdi3.c @@ -0,0 +1,29 @@ +/* + * arch/i386/libgcc/__divdi3.c + */ + +#include +#include + +extern uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem); + +int64_t __divdi3(int64_t num, int64_t den) +{ + int minus = 0; + int64_t v; + + if ( num < 0 ) { + num = -num; + minus = 1; + } + if ( den < 0 ) { + den = -den; + minus ^= 1; + } + + v = __udivmoddi4(num, den, NULL); + if ( minus ) + v = -v; + + return v; +} diff --git a/memdump/__udivmoddi4.c b/memdump/__udivmoddi4.c new file mode 100644 index 00000000..8e7661f5 --- /dev/null +++ b/memdump/__udivmoddi4.c @@ -0,0 +1,31 @@ +#include + +uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p) +{ + uint64_t quot = 0, qbit = 1; + + if ( den == 0 ) { + asm volatile("int $0"); + return 0; /* If trap returns... */ + } + + /* Left-justify denominator and count shift */ + while ( (int64_t)den >= 0 ) { + den <<= 1; + qbit <<= 1; + } + + while ( qbit ) { + if ( den <= num ) { + num -= den; + quot += qbit; + } + den >>= 1; + qbit >>= 1; + } + + if ( rem_p ) + *rem_p = num; + + return quot; +} diff --git a/memdump/argv.c b/memdump/argv.c new file mode 100644 index 00000000..d83b0f6f --- /dev/null +++ b/memdump/argv.c @@ -0,0 +1,92 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2004 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * argv.c + * + * Parse a single C string into argc and argv (argc is return value.) + * memptr points to available memory. + */ + +#include +#include +#include + +#define ALIGN_UP(p,t) ((t *)(((uintptr_t)(p) + (sizeof(t)-1)) & ~(sizeof(t)-1))) + +extern char _end[]; /* Symbol created by linker */ +void *__mem_end = &_end; /* Global variable for use by malloc() */ + +int __parse_argv(char ***argv, const char *str) +{ + char *mem = __mem_end; + const char *p = str; + char *q = mem; + char *r; + char **arg; + int wasspace = 0; + int argc = 1; + + /* First copy the string, turning whitespace runs into nulls */ + for ( p = str ; ; p++ ) { + if ( *p <= ' ' ) { + if ( !wasspace ) { + wasspace = 1; + *q++ = '\0'; + } + } else { + if ( wasspace ) { + argc++; + wasspace = 0; + } + *q++ = *p; + } + + /* This test is AFTER we have processed the null byte; + we treat it as a whitespace character so it terminates + the last argument */ + if ( ! *p ) + break; + } + + /* Now create argv */ + arg = ALIGN_UP(q,char *); + *argv = arg; + *arg++ = mem; /* argv[0] */ + + q--; /* Point q to final null */ + for ( r = mem ; r < q ; r++ ) { + if ( *r == '\0' ) { + *arg++ = r+1; + } + } + + *arg++ = NULL; /* Null pointer at the end */ + __mem_end = arg; /* End of memory we used */ + + return argc; +} diff --git a/memdump/code16.h b/memdump/code16.h new file mode 100644 index 00000000..ca765651 --- /dev/null +++ b/memdump/code16.h @@ -0,0 +1,6 @@ +/* Must be included first of all */ +#ifdef __ASSEMBLY__ + .code16 +#else +__asm__ (".code16gcc"); +#endif diff --git a/memdump/com16.ld b/memdump/com16.ld new file mode 100644 index 00000000..08a1e95e --- /dev/null +++ b/memdump/com16.ld @@ -0,0 +1,127 @@ +/* + * Linker script for COM16 binaries + */ + +/* Script for -z combreloc: combine and sort reloc sections */ +OUTPUT_FORMAT("elf32-i386", "elf32-i386", + "elf32-i386") +OUTPUT_ARCH(i386) +EXTERN(_start) +ENTRY(_start) +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + . = 0x100; + PROVIDE (__executable_start = .); + + .init : + { + KEEP (*(.init)) + } =0x90909090 + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } =0x90909090 + .fini : + { + KEEP (*(.fini)) + } =0x90909090 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + . = ALIGN(4); + PROVIDE (__preinit_array_start = .); + .preinit_array : { *(.preinit_array) } + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + .init_array : { *(.init_array) } + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + .fini_array : { *(.fini_array) } + PROVIDE (__fini_array_end = .); + PROVIDE (__ctors_start = .); + .ctors : + { + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + PROVIDE (__ctors_end = .); + PROVIDE (__dtors_start = .); + .dtors : + { + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + PROVIDE (__dtors_end = .); + + /* Adjust the address for the data segment. Avoid mixing code and + data within same 128-byte chunk. */ + . = ALIGN(128); + + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + _end = .; + PROVIDE (end = .); + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/memdump/conio.c b/memdump/conio.c new file mode 100644 index 00000000..4d58dcbd --- /dev/null +++ b/memdump/conio.c @@ -0,0 +1,42 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2001-2004 H. Peter Anvin - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * conio.c + * + * Output to the screen + */ + +#include +#include "mystuff.h" + +int putchar(int ch) +{ + if ( ch == '\n' ) + putchar('\r'); + asm("movb $0x02,%%ah ; int $0x21" : : "d" (ch)); + return ch; +} + +/* Note: doesn't put '\n' like the stdc version does */ +int puts(const char *s) +{ + int count = 0; + + while ( *s ) { + putchar(*s); + count++; + s++; + } + + return count; +} diff --git a/memdump/crt0.S b/memdump/crt0.S new file mode 100644 index 00000000..92297ecf --- /dev/null +++ b/memdump/crt0.S @@ -0,0 +1,53 @@ + .code16 + +#ifndef REGPARM +# error "This file assumes -mregparm=3 -DREGPARM=3" +#endif + + .section ".init","ax" + .globl _start + .type _start,@function +_start: + # Align the stack and make sure the high half is zero + andl $0xfff8,%esp + + # Clear the .bss + cld + xorl %eax,%eax + movw $__bss_start,%di + movw $_end+3,%cx + subw %di,%cx + shrw $2,%cx + rep ; stosl + + # Compute argc and argv (assumes REGPARM) + xorl %edx,%edx + movzbw 0x80,%bx + movb %dl,0x81(%bx) # Zero-terminate string + movb $0x81,%dl + pushl %eax # Make space for argv + movl %esp,%eax + calll __parse_argv + pushl %eax # argc + + # Initialize malloc + # calll __init_memory_arena + + # Now call main... (NOTE: gcc forces main to be regparm 0) + popl %eax # argc + popl %edx # argv + calll main + + # Here %eax is the exit code, fall through into exit + + .size _start,.-_start + + .globl exit + .type exit,@function +exit: + # Exit code already in %eax + movb $0x4c,%ah # Terminate program + int $0x21 +1: hlt + jmp 1b + .size exit,.-exit diff --git a/memdump/errno.h b/memdump/errno.h new file mode 100644 index 00000000..30aa046f --- /dev/null +++ b/memdump/errno.h @@ -0,0 +1,7 @@ +#ifndef ERRNO_H +#define ERRNO_H + +int errno; +void perror(const char *); + +#endif /* ERRNO_H */ diff --git a/memdump/inttypes.h b/memdump/inttypes.h new file mode 100644 index 00000000..9a6118bd --- /dev/null +++ b/memdump/inttypes.h @@ -0,0 +1 @@ +#include diff --git a/memdump/io.h b/memdump/io.h new file mode 100644 index 00000000..a592402f --- /dev/null +++ b/memdump/io.h @@ -0,0 +1,40 @@ +#ifndef IO_H +#define IO_H + +static inline void outb(unsigned char v, unsigned short p) +{ + asm volatile("outb %1,%0" : : "d" (p), "a" (v)); +} + +static inline unsigned char inb(unsigned short p) +{ + unsigned char v; + asm volatile("inb %1,%0" : "=a" (v) : "d" (p)); + return v; +} + +static inline void outw(unsigned short v, unsigned short p) +{ + asm volatile("outw %1,%0" : : "d" (p), "a" (v)); +} + +static inline unsigned short inw(unsigned short p) +{ + unsigned short v; + asm volatile("inw %1,%0" : "=a" (v) : "d" (p)); + return v; +} + +static inline void outl(unsigned int v, unsigned short p) +{ + asm volatile("outl %1,%0" : : "d" (p), "a" (v)); +} + +static inline unsigned int inl(unsigned short p) +{ + unsigned int v; + asm volatile("inl %1,%0" : "=a" (v) : "d" (p)); + return v; +} + +#endif diff --git a/memdump/main.c b/memdump/main.c new file mode 100644 index 00000000..a70e315a --- /dev/null +++ b/memdump/main.c @@ -0,0 +1,141 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2007 H. Peter Anvin - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +#include +#include +#include +#include "mystuff.h" +#include "ymsend.h" +#include "io.h" + +const char *program = "memdump"; + +void __attribute__((noreturn)) die(const char *msg) +{ + puts(program); + puts(": "); + puts(msg); + putchar('\n'); + exit(1); +} + +#ifdef DEBUG +# define dprintf printf +#else +# define dprintf(...) ((void)0) +#endif + +static inline __attribute__((const)) uint16_t ds(void) +{ + uint16_t v; + asm("movw %%ds,%0" : "=rm" (v)); + return v; +} + +#define GDT_ENTRY(flags,base,limit) \ + (((uint64_t)(base & 0xff000000) << 32) | \ + ((uint64_t)flags << 40) | \ + ((uint64_t)(limit & 0x00ff0000) << 32) | \ + ((uint64_t)(base & 0x00ffff00) << 16) | \ + ((uint64_t)(limit & 0x0000ffff))) + +static void get_bytes(void *buf, size_t len, struct file_info *finfo, + size_t pos) +{ + size_t end; + static uint64_t gdt[6]; + size_t bufl; + + pos += (size_t)finfo->pvt; /* Add base */ + end = pos+len; + + if (end <= 0x100000) { + /* Can stay in real mode */ + asm volatile("movw %3,%%fs ; " + "fs; rep; movsl ; " + "movw %2,%%cx ; " + "rep; movsb" + : : "D" (buf), "c" (len >> 2), "r" ((uint16_t)(len & 3)), + "rm" ((uint16_t)(pos >> 4)), "S" (pos & 15) + : "memory"); + } else { + bufl = (ds() << 4)+(size_t)buf; + gdt[2] = GDT_ENTRY(0x0093, pos, 0xffff); + gdt[3] = GDT_ENTRY(0x0093, bufl, 0xffff); + asm volatile("pushal ; int $0x15 ; popal" + : : "a" (0x8700), "c" ((len+1) >> 1), "S" (&gdt) + : "memory"); + } +} + +int main(int argc, char *argv[]) +{ + uint16_t bios_ports[4]; + const char *prefix; + char filename[1024]; + int i; + static struct serial_if sif = + { + .read = serial_read, + .write = serial_write, + }; + struct file_info finfo; + const char serial_banner[] = "Now being Ymodem download...\r\n"; + + if (argc < 4) + die("usage: memdump port prefix start,len..."); + + finfo.pvt = (void *)0x400; + get_bytes(bios_ports, 8, &finfo, 0); /* Get BIOS serial ports */ + + for (i = 0; i < 4; i++) + printf("ttyS%i (COM%i) is at %#x\n", i, i+1, bios_ports[i]); + + sif.port = strtoul(argv[1], NULL, 0); + if (sif.port <= 3) { + sif.port = bios_ports[sif.port]; + } + + if (serial_init(&sif)) + die("failed to initialize serial port"); + + prefix = argv[2]; + + puts("Printing prefix...\n"); + sif.write(&sif, serial_banner, sizeof serial_banner-1); + + for (i = 3; i < argc; i++) { + uint32_t start, len; + char *ep; + + start = strtoul(argv[i], &ep, 0); + if (*ep != ',') + die("invalid range specification"); + len = strtoul(ep+1, NULL, 0); + + sprintf(filename, "%s%#x,%#x", prefix, start, len); + finfo.name = filename; + finfo.size = len; + finfo.pvt = (void *)start; + + puts("Sending "); + puts(filename); + puts("...\n"); + + send_ymodem(&sif, &finfo, get_bytes); + } + + puts("Sending closing signature...\n"); + end_ymodem(&sif); + + return 0; +} diff --git a/memdump/malloc.h b/memdump/malloc.h new file mode 100644 index 00000000..70d0e635 --- /dev/null +++ b/memdump/malloc.h @@ -0,0 +1,54 @@ +/* + * malloc.h + * + * Internals for the memory allocator + */ + +#include +#include + +/* + * This is the minimum chunk size we will ask the kernel for; this should + * be a multiple of the page size on all architectures. + */ +#define MALLOC_CHUNK_SIZE 65536 +#define MALLOC_CHUNK_MASK (MALLOC_CHUNK_SIZE-1) + +/* + * This structure should be a power of two. This becomes the + * alignment unit. + */ +struct free_arena_header; + +struct arena_header { + size_t type; + size_t size; /* Also gives the location of the next entry */ + struct free_arena_header *next, *prev; +}; + +#ifdef DEBUG_MALLOC +#define ARENA_TYPE_USED 0x64e69c70 +#define ARENA_TYPE_FREE 0x012d610a +#define ARENA_TYPE_HEAD 0x971676b5 +#define ARENA_TYPE_DEAD 0xeeeeeeee +#else +#define ARENA_TYPE_USED 0 +#define ARENA_TYPE_FREE 1 +#define ARENA_TYPE_HEAD 2 +#endif + +#define ARENA_SIZE_MASK (sizeof(struct arena_header)-1) + +#define ARENA_ALIGN_UP(p) ((char *)(((uintptr_t)(p) + ARENA_SIZE_MASK) & ~ARENA_SIZE_MASK)) +#define ARENA_ALIGN_DOWN(p) ((char *)((uintptr_t)(p) & ~ARENA_SIZE_MASK)) + +/* + * This structure should be no more than twice the size of the + * previous structure. + */ +struct free_arena_header { + struct arena_header a; + struct free_arena_header *next_free, *prev_free; +}; + +extern struct free_arena_header __malloc_head; diff --git a/memdump/memcpy.S b/memdump/memcpy.S new file mode 100644 index 00000000..76eef73c --- /dev/null +++ b/memdump/memcpy.S @@ -0,0 +1,23 @@ +# +# memcpy.S +# +# Simple 16-bit memcpy() implementation +# + + .text + .code16gcc + .globl memcpy + .type memcpy, @function +memcpy: + cld + pushw %di + pushw %si + movw %ax,%di + movw %dx,%si + # The third argument is already in cx + rep ; movsb + popw %si + popw %di + ret + + .size memcpy,.-memcpy diff --git a/memdump/memdump.com b/memdump/memdump.com new file mode 100755 index 0000000000000000000000000000000000000000..9e87440ad6b48a7c3a6626bbac5da87454ceae11 GIT binary patch literal 5656 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 + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +unsigned int skip_atou(const char **s); +unsigned long strtoul(const char *, char **, int); + +static inline int +isdigit(int ch) +{ + return (ch >= '0') && (ch <= '9'); +} + +#endif /* MYSTUFF_H */ diff --git a/memdump/printf.c b/memdump/printf.c new file mode 100644 index 00000000..99b389f6 --- /dev/null +++ b/memdump/printf.c @@ -0,0 +1,297 @@ +/* + * Oh, it's a waste of space, but oh-so-yummy for debugging. It's just + * initialization code anyway, so it doesn't take up space when we're + * actually running. This version of printf() does not include 64-bit + * support. "Live with it." + * + * Most of this code was shamelessly snarfed from the Linux kernel, then + * modified. It's therefore GPL. + * + * printf() isn't actually needed to build syslinux.com, but during + * debugging it's handy. + */ + +#include +#include +#include "mystuff.h" + +static int strnlen(const char *s, int maxlen) +{ + const char *es = s; + while ( *es && maxlen ) { + es++; maxlen--; + } + + return (es-s); +} + +#define ZEROPAD 1 /* pad with zero */ +#define SIGN 2 /* unsigned/signed long */ +#define PLUS 4 /* show plus */ +#define SPACE 8 /* space if plus */ +#define LEFT 16 /* left justified */ +#define SPECIAL 32 /* 0x */ +#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ + +#define do_div(n,base) ({ \ +int __res; \ +__res = ((unsigned long) n) % (unsigned) base; \ +n = ((unsigned long) n) / (unsigned) base; \ +__res; }) + +static char * number(char * str, long num, int base, int size, int precision + ,int type) +{ + char c,sign,tmp[66]; + const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; + int i; + + if (type & LARGE) + digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + if (type & LEFT) + type &= ~ZEROPAD; + if (base < 2 || base > 36) + return 0; + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) { + if (num < 0) { + sign = '-'; + num = -num; + size--; + } else if (type & PLUS) { + sign = '+'; + size--; + } else if (type & SPACE) { + sign = ' '; + size--; + } + } + if (type & SPECIAL) { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + i = 0; + if (num == 0) + tmp[i++]='0'; + else while (num != 0) + tmp[i++] = digits[do_div(num,base)]; + if (i > precision) + precision = i; + size -= precision; + if (!(type&(ZEROPAD+LEFT))) + while(size-->0) + *str++ = ' '; + if (sign) + *str++ = sign; + if (type & SPECIAL) { + if (base==8) + *str++ = '0'; + else if (base==16) { + *str++ = '0'; + *str++ = digits[33]; + } + } + if (!(type & LEFT)) + while (size-- > 0) + *str++ = c; + while (i < precision--) + *str++ = '0'; + while (i-- > 0) + *str++ = tmp[i]; + while (size-- > 0) + *str++ = ' '; + return str; +} + +/* Forward decl. needed for IP address printing stuff... */ +int sprintf(char * buf, const char *fmt, ...); + +int vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + unsigned long num; + int i, base; + char * str; + const char *s; + + int flags; /* flags to number() */ + + int field_width; /* width of output field */ + int precision; /* min. # of digits for integers; max + number of chars for from string */ + int qualifier; /* 'h', 'l', or 'L' for integer fields */ + + for (str=buf ; *fmt ; ++fmt) { + if (*fmt != '%') { + *str++ = *fmt; + continue; + } + + /* process flags */ + flags = 0; + repeat: + ++fmt; /* this also skips first '%' */ + switch (*fmt) { + case '-': flags |= LEFT; goto repeat; + case '+': flags |= PLUS; goto repeat; + case ' ': flags |= SPACE; goto repeat; + case '#': flags |= SPECIAL; goto repeat; + case '0': flags |= ZEROPAD; goto repeat; + } + + /* get field width */ + field_width = -1; + if (isdigit(*fmt)) + field_width = skip_atou(&fmt); + else if (*fmt == '*') { + ++fmt; + /* it's the next argument */ + field_width = va_arg(args, int); + if (field_width < 0) { + field_width = -field_width; + flags |= LEFT; + } + } + + /* get the precision */ + precision = -1; + if (*fmt == '.') { + ++fmt; + if (isdigit(*fmt)) + precision = skip_atou(&fmt); + else if (*fmt == '*') { + ++fmt; + /* it's the next argument */ + precision = va_arg(args, int); + } + if (precision < 0) + precision = 0; + } + + /* get the conversion qualifier */ + qualifier = -1; + if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') { + qualifier = *fmt; + ++fmt; + } + + /* default base */ + base = 10; + + switch (*fmt) { + case 'c': + if (!(flags & LEFT)) + while (--field_width > 0) + *str++ = ' '; + *str++ = (unsigned char) va_arg(args, int); + while (--field_width > 0) + *str++ = ' '; + continue; + + case 's': + s = va_arg(args, char *); + len = strnlen(s, precision); + + if (!(flags & LEFT)) + while (len < field_width--) + *str++ = ' '; + for (i = 0; i < len; ++i) + *str++ = *s++; + while (len < field_width--) + *str++ = ' '; + continue; + + case 'p': + if (field_width == -1) { + field_width = 2*sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, + (unsigned long) va_arg(args, void *), 16, + field_width, precision, flags); + continue; + + + case 'n': + if (qualifier == 'l') { + long * ip = va_arg(args, long *); + *ip = (str - buf); + } else { + int * ip = va_arg(args, int *); + *ip = (str - buf); + } + continue; + + case '%': + *str++ = '%'; + continue; + + /* integer number formats - set up the flags and "break" */ + case 'o': + base = 8; + break; + + case 'X': + flags |= LARGE; + case 'x': + base = 16; + break; + + case 'd': + case 'i': + flags |= SIGN; + case 'u': + break; + + default: + *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; + } + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (qualifier == 'h') { + num = (unsigned short) va_arg(args, int); + if (flags & SIGN) + num = (short) num; + } else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + str = number(str, num, base, field_width, precision, flags); + } + *str = '\0'; + return str-buf; +} + +int sprintf(char * buf, const char *fmt, ...) +{ + va_list args; + int i; + + va_start(args, fmt); + i=vsprintf(buf,fmt,args); + va_end(args); + return i; +} + +int printf(const char *fmt, ...) +{ + char printf_buf[1024]; + va_list args; + int printed; + + va_start(args, fmt); + printed = vsprintf(printf_buf, fmt, args); + va_end(args); + + puts(printf_buf); + + return printed; +} diff --git a/memdump/serial.c b/memdump/serial.c new file mode 100644 index 00000000..902dcc3d --- /dev/null +++ b/memdump/serial.c @@ -0,0 +1,80 @@ +#include "mystuff.h" +#include "ymsend.h" +#include "io.h" + +enum { + THR = 0, + RBR = 0, + DLL = 0, + DLM = 1, + IER = 1, + IIR = 2, + FCR = 2, + LCR = 3, + MCR = 4, + LSR = 5, + MSR = 6, + SCR = 7, +}; + +int serial_init(struct serial_if *sif) +{ + uint16_t port = sif->port; + uint8_t dll, dlm, lcr; + + /* Set 115200n81 */ + outb(0x83, port+LCR); + outb(0x01, port+DLL); + outb(0x00, port+DLM); + (void)inb(port+IER); /* Synchronize */ + dll = inb(port+DLL); + dlm = inb(port+DLM); + lcr = inb(port+LCR); + outb(0x03, port+LCR); + (void)inb(port+IER); /* Synchronize */ + + if (dll != 0x01 || dlm != 0x00 || lcr != 0x83) + return -1; /* This doesn't look like a serial port */ + + /* Disable interrupts */ + outb(port+IER, 0); + + /* Enable 16550A FIFOs if available */ + outb(port+FCR, 0x01); /* Enable FIFO */ + (void)inb(port+IER); /* Synchronize */ + if (inb(port+IIR) < 0xc0) + outb(port+FCR, 0x00); /* Disable FIFOs if non-functional */ + (void)inb(port+IER); /* Synchronize */ + + return 0; +} + +void serial_write(struct serial_if *sif, const void *data, size_t n) +{ + uint16_t port = sif->port; + const char *p = data; + uint8_t lsr; + + while (n--) { + do { + lsr = inb(port+LSR); + } while (!(lsr & 0x20)); + + outb(*p++, port+THR); + } +} + +void serial_read(struct serial_if *sif, void *data, size_t n) +{ + uint16_t port = sif->port; + char *p = data; + uint8_t lsr; + + while (n--) { + do { + lsr = inb(port+LSR); + } while (!(lsr & 0x01)); + + *p++ = inb(port+RBR); + } +} diff --git a/memdump/skipatou.c b/memdump/skipatou.c new file mode 100644 index 00000000..f71c5342 --- /dev/null +++ b/memdump/skipatou.c @@ -0,0 +1,10 @@ +#include "mystuff.h" + +unsigned int skip_atou(const char **s) +{ + int i=0; + + while (isdigit(**s)) + i = i*10 + *((*s)++) - '0'; + return i; +} diff --git a/memdump/stdint.h b/memdump/stdint.h new file mode 100644 index 00000000..9a5553b9 --- /dev/null +++ b/memdump/stdint.h @@ -0,0 +1,142 @@ +/* + * stdint.h + */ + +#ifndef _STDINT_H +#define _STDINT_H + +/* Exact types */ + +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed long long int64_t; + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +/* Small types */ + +typedef signed char int_least8_t; +typedef signed short int_least16_t; +typedef signed int int_least32_t; +typedef signed long long int_least64_t; + +typedef unsigned char uint_least8_t; +typedef unsigned short uint_least16_t; +typedef unsigned int uint_least32_t; +typedef unsigned long long uint_least64_t; + +/* Fast types */ + +typedef signed char int_fast8_t; +typedef signed short int_fast16_t; +typedef signed int int_fast32_t; +typedef signed long long int_fast64_t; + +typedef unsigned char uint_fast8_t; +typedef unsigned short uint_fast16_t; +typedef unsigned int uint_fast32_t; +typedef unsigned long long uint_fast64_t; + +/* Pointer types */ + +typedef int32_t intptr_t; +typedef uint32_t uintptr_t; + +/* Maximal types */ + +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + +/* + * To be strictly correct... + */ +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) + +# define INT8_MIN (-128) +# define INT16_MIN (-32767-1) +# define INT32_MIN (-2147483647-1) +# define INT64_MIN (-9223372036854775807LL-1) + +# define INT8_MAX (127) +# define INT16_MAX (32767) +# define INT32_MAX (2147483647) +# define INT64_MAX (9223372036854775807LL) + +# define UINT8_MAX (255U) +# define UINT16_MAX (65535U) +# define UINT32_MAX (4294967295U) +# define UINT64_MAX (18446744073709551615ULL) + +# define INT_LEAST8_MIN (-128) +# define INT_LEAST16_MIN (-32767-1) +# define INT_LEAST32_MIN (-2147483647-1) +# define INT_LEAST64_MIN (-9223372036854775807LL-1) + +# define INT_LEAST8_MAX (127) +# define INT_LEAST16_MAX (32767) +# define INT_LEAST32_MAX (2147483647) +# define INT_LEAST64_MAX (9223372036854775807LL) + +# define UINT_LEAST8_MAX (255U) +# define UINT_LEAST16_MAX (65535U) +# define UINT_LEAST32_MAX (4294967295U) +# define UINT_LEAST64_MAX (18446744073709551615ULL) + +# define INT_FAST8_MIN (-128) +# define INT_FAST16_MIN (-32767-1) +# define INT_FAST32_MIN (-2147483647-1) +# define INT_FAST64_MIN (-9223372036854775807LL-1) + +# define INT_FAST8_MAX (127) +# define INT_FAST16_MAX (32767) +# define INT_FAST32_MAX (2147483647) +# define INT_FAST64_MAX (9223372036854775807LL) + +# define UINT_FAST8_MAX (255U) +# define UINT_FAST16_MAX (65535U) +# define UINT_FAST32_MAX (4294967295U) +# define UINT_FAST64_MAX (18446744073709551615ULL) + +# define INTPTR_MIN (-2147483647-1) +# define INTPTR_MAX (2147483647) +# define UINTPTR_MAX (4294967295U) + +# define INTMAX_MIN (-9223372036854775807LL-1) +# define INTMAX_MAX (9223372036854775807LL) +# define UINTMAX_MAX (18446744073709551615ULL) + +/* ptrdiff_t limit */ +# define PTRDIFF_MIN (-2147483647-1) +# define PTRDIFF_MAX (2147483647) + +/* sig_atomic_t limit */ +# define SIG_ATOMIC_MIN (-2147483647-1) +# define SIG_ATOMIC_MAX (2147483647) + +/* size_t limit */ +# define SIZE_MAX (4294967295U) + +#endif /* STDC_LIMIT_MACROS */ + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) + +# define INT8_C(n) n +# define INT16_C(n) n +# define INT32_C(n) n +# define INT64_C(n) n ## LL + +# define UINT8_C(n) n ## U +# define UINT16_C(n) n ## U +# define UINT32_C(n) n ## U +# define UINT64_C(n) n ## ULL + +# define INTMAX_C(n) n ## LL +# define UINTMAX_C(n) n ## ULL + +#endif /* STDC_CONSTANT_MACROS */ + +#endif /* _STDINT_H */ diff --git a/memdump/stdio.h b/memdump/stdio.h new file mode 100644 index 00000000..97988c24 --- /dev/null +++ b/memdump/stdio.h @@ -0,0 +1,21 @@ +#ifndef STDIO_H +#define STDIO_H + +#include +#include + +typedef unsigned int off_t; + +int putchar(int); +int puts(const char *); +int sprintf(char * buf, const char *fmt, ...); +int vsprintf(char *buf, const char *fmt, va_list args); +int printf(const char *fmt, ...); + +#define stdin 0 +#define stdout 1 +#define stderr 2 + +#define fprintf(x, y, ...) printf(y, ## __VA_ARGS__) + +#endif /* STDIO_H */ diff --git a/memdump/stdlib.h b/memdump/stdlib.h new file mode 100644 index 00000000..6ead86af --- /dev/null +++ b/memdump/stdlib.h @@ -0,0 +1,14 @@ +#ifndef STDLIB_H +#define STDLIB_H + +#define NULL ((void *)0) + +typedef int ssize_t; +typedef unsigned int size_t; + +void __attribute__((noreturn)) exit(int); + +void *malloc(size_t); +void free(void *); + +#endif diff --git a/memdump/string.h b/memdump/string.h new file mode 100644 index 00000000..44f77dac --- /dev/null +++ b/memdump/string.h @@ -0,0 +1,23 @@ +/* + * string.h + */ + +#ifndef _STRING_H +#define _STRING_H + +/* Standard routines */ +#define memcpy(a,b,c) __builtin_memcpy(a,b,c) +#define memset(a,b,c) __builtin_memset(a,b,c) +#define strcpy(a,b) __builtin_strcpy(a,b) +#define strlen(a) __builtin_strlen(a) + +/* This only returns true or false */ +static inline int memcmp(const void *__m1, const void *__m2, unsigned int __n) +{ + _Bool rv; + asm volatile("cld ; repe ; cmpsb ; setne %0" + : "=abd" (rv), "+D" (__m1), "+S" (__m2), "+c" (__n)); + return rv; +} + +#endif /* _STRING_H */ diff --git a/memdump/strtoul.c b/memdump/strtoul.c new file mode 100644 index 00000000..cd09d3d0 --- /dev/null +++ b/memdump/strtoul.c @@ -0,0 +1,72 @@ +/* + * strtoul.c + * + */ + +#include "mystuff.h" + +static inline int isspace(int c) +{ + return (c <= ' '); /* Close enough */ +} + +static inline int digitval(int ch) +{ + if (ch >= '0' && ch <= '9') { + return ch - '0'; + } else if (ch >= 'A' && ch <= 'Z') { + return ch - 'A' + 10; + } else if (ch >= 'a' && ch <= 'z') { + return ch - 'a' + 10; + } else { + return -1; + } +} + +unsigned long strtoul(const char *nptr, char **endptr, int base) +{ + int minus = 0; + unsigned long v = 0; + int d; + + while (isspace((unsigned char)*nptr)) { + nptr++; + } + + /* Single optional + or - */ + { + char c = *nptr; + if (c == '-' || c == '+') { + minus = (c == '-'); + nptr++; + } + } + + if (base == 0) { + if (nptr[0] == '0' && + (nptr[1] == 'x' || nptr[1] == 'X')) { + nptr += 2; + base = 16; + } else if (nptr[0] == '0') { + nptr++; + base = 8; + } else { + base = 10; + } + } else if (base == 16) { + if (nptr[0] == '0' && + (nptr[1] == 'x' || nptr[1] == 'X')) { + nptr += 2; + } + } + + while ((d = digitval(*nptr)) >= 0 && d < base) { + v = v * base + d; + nptr++; + } + + if (endptr) + *endptr = (char *)nptr; + + return minus ? -v : v; +} diff --git a/memdump/ymodem.txt b/memdump/ymodem.txt new file mode 100644 index 00000000..24a65781 --- /dev/null +++ b/memdump/ymodem.txt @@ -0,0 +1,2112 @@ + + + + - 1 - + + + + XMODEM/YMODEM PROTOCOL REFERENCE + A compendium of documents describing the + + XMODEM and YMODEM + + File Transfer Protocols + + + + + This document was formatted 10-14-88. + + + + + + + + Edited by Chuck Forsberg + + + + + + + + + + This file may be redistributed without restriction + provided the text is not altered. + + Please distribute as widely as possible. + + Questions to Chuck Forsberg + + + + + + Omen Technology Inc + The High Reliability Software + 17505-V Sauvie Island Road + Portland Oregon 97231 + VOICE: 503-621-3406 :VOICE + TeleGodzilla BBS: 503-621-3746 Speed 19200(Telebit PEP),2400,1200,300 + CompuServe: 70007,2304 + GEnie: CAF + UUCP: ...!tektronix!reed!omen!caf + + + + + + + + + + + + + + + - 2 - + + + + 1. TOWER OF BABEL + + A "YMODEM Tower of Babel" has descended on the microcomputing community + bringing with it confusion, frustration, bloated phone bills, and wasted + man hours. Sadly, I (Chuck Forsberg) am partly to blame for this mess. + + As author of the early 1980s batch and 1k XMODEM extensions, I assumed + readers of earlier versions of this document would implement as much of + the YMODEM protocol as their programming skills and computing environments + would permit. This proved a rather naive assumption as programmers + motivated by competitive pressure implemented as little of YMODEM as + possible. Some have taken whatever parts of YMODEM that appealed to them, + applied them to MODEM7 Batch, Telink, XMODEM or whatever, and called the + result YMODEM. + + Jeff Garbers (Crosstalk package development director) said it all: "With + protocols in the public domain, anyone who wants to dink around with them + can go ahead." [1] + + Documents containing altered examples derived from YMODEM.DOC have added + to the confusion. In one instance, some self styled rewriter of history + altered the heading in YMODEM.DOC's Figure 1 from "1024 byte Packets" to + "YMODEM/CRC File Transfer Protocol". None of the XMODEM and YMODEM + examples shown in that document were correct. + + To put an end to this confusion, we must make "perfectly clear" what + YMODEM stands for, as Ward Christensen defined it in his 1985 coining of + the term. + + To the majority of you who read, understood, and respected Ward's + definition of YMODEM, I apologize for the inconvenience. + + 1.1 Definitions + + ARC ARC is a program that compresses one or more files into an archive + and extracts files from such archives. + + XMODEM refers to the file transfer etiquette introduced by Ward + Christensen's 1977 MODEM.ASM program. The name XMODEM comes from + Keith Petersen's XMODEM.ASM program, an adaptation of MODEM.ASM + for Remote CP/M (RCPM) systems. It's also called the MODEM or + MODEM2 protocol. Some who are unaware of MODEM7's unusual batch + file mode call it MODEM7. Other aliases include "CP/M Users' + Group" and "TERM II FTP 3". The name XMODEM caught on partly + because it is distinctive and partly because of media interest in + + + __________ + + 1. Page C/12, PC-WEEK July 12, 1987 + + + + + Chapter 1 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 3 + + + + bulletin board and RCPM systems where it was accessed with an + "XMODEM" command. This protocol is supported by every serious + communications program because of its universality, simplicity, + and reasonable performance. + + XMODEM/CRC replaces XMODEM's 1 byte checksum with a two byte Cyclical + Redundancy Check (CRC-16), giving modern error detection + protection. + + XMODEM-1k Refers to the XMODEM/CRC protocol with 1024 byte data blocks. + + YMODEM Refers to the XMODEM/CRC (optional 1k blocks) protocol with batch + transmission as described below. In a nutshell, YMODEM means + BATCH. + + YMODEM-g Refers to the streaming YMODEM variation described below. + + True YMODEM(TM) In an attempt to sort out the YMODEM Tower of Babel, Omen + Technology has trademarked the term True YMODEM(TM) to represent + the complete YMODEM protocol described in this document, including + pathname, length, and modification date transmitted in block 0. + Please contact Omen Technology about certifying programs for True + YMODEM(TM) compliance. + + ZMODEM uses familiar XMODEM/CRC and YMODEM technology in a new protocol + that provides reliability, throughput, file management, and user + amenities appropriate to contemporary data communications. + + ZOO Like ARC, ZOO is a program that compresses one or more files into + a "zoo archive". ZOO supports many different operating systems + including Unix and VMS. + + + + + + + + + + + + + + + + + + + + + + + + Chapter 1 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 4 + + + + 2. YMODEM MINIMUM REQUIREMENTS + + All programs claiming to support YMODEM must meet the following minimum + requirements: + + + The sending program shall send the pathname (file name) in block 0. + + + The pathname shall be a null terminated ASCII string as described + below. + + For those who are too lazy to read the entire document: + + + Unless specifically requested, only the file name portion is + sent. + + + No drive letter is sent. + + + Systems that do not distinguish between upper and lower case + letters in filenames shall send the pathname in lower case only. + + + + The receiving program shall use this pathname for the received file + name, unless explicitly overridden. + + + When the receiving program receives this block and successfully + opened the output file, it shall acknowledge this block with an ACK + character and then proceed with a normal XMODEM file transfer + beginning with a "C" or NAK tranmsitted by the receiver. + + + The sending program shall use CRC-16 in response to a "C" pathname + nak, otherwise use 8 bit checksum. + + + The receiving program must accept any mixture of 128 and 1024 byte + blocks within each file it receives. Sending programs may + arbitrarily switch between 1024 and 128 byte blocks. + + + The sending program must not change the length of an unacknowledged + block. + + + At the end of each file, the sending program shall send EOT up to ten + times until it receives an ACK character. (This is part of the + XMODEM spec.) + + + The end of a transfer session shall be signified by a null (empty) + pathname, this pathname block shall be acknowledged the same as other + pathname blocks. + + Programs not meeting all of these requirements are not YMODEM compatible, + and shall not be described as supporting YMODEM. + + Meeting these MINIMUM requirements does not guarantee reliable file + + + + Chapter 2 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 5 + + + + transfers under stress. Particular attention is called to XMODEM's single + character supervisory messages that are easily corrupted by transmission + errors. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chapter 2 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 6 + + + + 3. WHY YMODEM? + + Since its development half a decade ago, the Ward Christensen modem + protocol has enabled a wide variety of computer systems to interchange + data. There is hardly a communications program that doesn't at least + claim to support this protocol. + + Advances in computing, modems and networking have revealed a number of + weaknesses in the original protocol: + + + The short block length caused throughput to suffer when used with + timesharing systems, packet switched networks, satellite circuits, + and buffered (error correcting) modems. + + + The 8 bit arithmetic checksum and other aspects allowed line + impairments to interfere with dependable, accurate transfers. + + + Only one file could be sent per command. The file name had to be + given twice, first to the sending program and then again to the + receiving program. + + + The transmitted file could accumulate as many as 127 extraneous + bytes. + + + The modification date of the file was lost. + + A number of other protocols have been developed over the years, but none + have displaced XMODEM to date: + + + Lack of public domain documentation and example programs have kept + proprietary protocols such as Blast, Relay, and others tightly bound + to the fortunes of their suppliers. + + + Complexity discourages the widespread application of BISYNC, SDLC, + HDLC, X.25, and X.PC protocols. + + + Performance compromises and complexity have limited the popularity of + the Kermit protocol, which was developed to allow file transfers in + environments hostile to XMODEM. + + The XMODEM protocol extensions and YMODEM Batch address some of these + weaknesses while maintaining most of XMODEM's simplicity. + + YMODEM is supported by the public domain programs YAM (CP/M), + YAM(CP/M-86), YAM(CCPM-86), IMP (CP/M), KMD (CP/M), rz/sz (Unix, Xenix, + VMS, Berkeley Unix, Venix, Xenix, Coherent, IDRIS, Regulus). Commercial + implementations include MIRROR, and Professional-YAM.[1] Communications + + + + + + + + Chapter 3 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 7 + + + + programs supporting these extensions have been in use since 1981. + + The 1k block length (XMODEM-1k) described below may be used in conjunction + with YMODEM Batch Protocol, or with single file transfers identical to the + XMODEM/CRC protocol except for minimal changes to support 1k blocks. + + Another extension is the YMODEM-g protocol. YMODEM-g provides batch + transfers with maximum throughput when used with end to end error + correcting media, such as X.PC and error correcting modems, including 9600 + bps units by TeleBit, U.S.Robotics, Hayes, Electronic Vaults, Data Race, + and others. + + To complete this tome, edited versions of Ward Christensen's original + protocol document and John Byrns's CRC-16 document are included for + reference. + + References to the MODEM or MODEM7 protocol have been changed to XMODEM to + accommodate the vernacular. In Australia, it is properly called the + Christensen Protocol. + + + 3.1 Some Messages from the Pioneer + + #: 130940 S0/Communications 25-Apr-85 18:38:47 + Sb: my protocol + Fm: Ward Christensen 76703,302 [2] + To: all + + Be aware the article[3] DID quote me correctly in terms of the phrases + like "not robust", etc. + + It was a quick hack I threw together, very unplanned (like everything I + do), to satisfy a personal need to communicate with "some other" people. + + ONLY the fact that it was done in 8/77, and that I put it in the public + domain immediately, made it become the standard that it is. + + + + + + + + __________________________________________________________________________ + + 1. Available for IBM PC,XT,AT, Unix and Xenix + + 2. Edited for typesetting appearance + + 3. Infoworld April 29 p. 16 + + + + + Chapter 3 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 8 + + + + I think its time for me to + + (1) document it; (people call me and say "my product is going to include + it - what can I 'reference'", or "I'm writing a paper on it, what do I put + in the bibliography") and + + (2) propose an "incremental extension" to it, which might take "exactly" + the form of Chuck Forsberg's YAM protocol. He wrote YAM in C for CP/M and + put it in the public domain, and wrote a batch protocol for Unix[4] called + rb and sb (receive batch, send batch), which was basically XMODEM with + (a) a record 0 containing filename date time and size + (b) a 1K block size option + (c) CRC-16. + + He did some clever programming to detect false ACK or EOT, but basically + left them the same. + + People who suggest I make SIGNIFICANT changes to the protocol, such as + "full duplex", "multiple outstanding blocks", "multiple destinations", etc + etc don't understand that the incredible simplicity of the protocol is one + of the reasons it survived to this day in as many machines and programs as + it may be found in! + + Consider the PC-NET group back in '77 or so - documenting to beat the band + - THEY had a protocol, but it was "extremely complex", because it tried to + be "all things to all people" - i.e. send binary files on a 7-bit system, + etc. I was not that "benevolent". I (emphasize > I < ) had an 8-bit UART, + so "my protocol was an 8-bit protocol", and I would just say "sorry" to + people who were held back by 7-bit limitations. ... + + Block size: Chuck Forsberg created an extension of my protocol, called + YAM, which is also supported via his public domain programs for UNIX + called rb and sb - receive batch and send batch. They cleverly send a + "block 0" which contains the filename, date, time, and size. + Unfortunately, its UNIX style, and is a bit weird[5] - octal numbers, etc. + BUT, it is a nice way to overcome the kludgy "echo the chars of the name" + introduced with MODEM7. Further, chuck uses CRC-16 and optional 1K + blocks. Thus the record 0, 1K, and CRC, make it a "pretty slick new + protocol" which is not significantly different from my own. + + Also, there is a catchy name - YMODEM. That means to some that it is the + "next thing after XMODEM", and to others that it is the Y(am)MODEM + + + __________ + + 4. VAX/VMS versions of these programs are also available. + + 5. The file length, time, and file mode are optional. The pathname and + file length may be sent alone if desired. + + + + + Chapter 3 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 9 + + + + protocol. I don't want to emphasize that too much - out of fear that + other mfgrs might think it is a "competitive" protocol, rather than an + "unaffiliated" protocol. Chuck is currently selling a much-enhanced + version of his CP/M-80 C program YAM, calling it Professional Yam, and its + for the PC - I'm using it right now. VERY slick! 32K capture buffer, + script, scrolling, previously captured text search, plus built-in commands + for just about everything - directory (sorted every which way), XMODEM, + YMODEM, KERMIT, and ASCII file upload/download, etc. You can program it + to "behave" with most any system - for example when trying a number for + CIS it detects the "busy" string back from the modem and substitutes a + diff phone # into the dialing string and branches back to try it. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chapter 3 + + + + + + + + X/YMODEM Protocol Reference June 18 1988 10 + + + + 4. XMODEM PROTOCOL ENHANCEMENTS + + This chapter discusses the protocol extensions to Ward Christensen's 1982 + XMODEM protocol description document. + + The original document recommends the user be asked whether to continue + trying or abort after 10 retries. Most programs no longer ask the + operator whether he wishes to keep retrying. Virtually all correctable + errors are corrected within the first few retransmissions. If the line is + so bad that ten attempts are insufficient, there is a significant danger + of undetected errors. If the connection is that bad, it's better to + redial for a better connection, or mail a floppy disk. + + + 4.1 Graceful Abort + + The YAM and Professional-YAM X/YMODEM routines recognize a sequence of two + consecutive CAN (Hex 18) characters without modem errors (overrun, + framing, etc.) as a transfer abort command. This sequence is recognized + when is waiting for the beginning of a block or for an acknowledgement to + a block that has been sent. The check for two consecutive CAN characters + reduces the number of transfers aborted by line hits. YAM sends eight CAN + characters when it aborts an XMODEM, YMODEM, or ZMODEM protocol file + transfer. Pro-YAM then sends eight backspaces to delete the CAN + characters from the remote's keyboard input buffer, in case the remote had + already aborted the transfer and was awaiting a keyboarded command. + + + 4.2 CRC-16 Option + + The XMODEM protocol uses an optional two character CRC-16 instead of the + one character arithmetic checksum used by the original protocol and by + most commercial implementations. CRC-16 guarantees detection of all + single and double bit errors, all errors with an odd number of error + bits, all burst errors of length 16 or less, 99.9969% of all 17-bit error + bursts, and 99.9984 per cent of all possible longer error bursts. By + contrast, a double bit error, or a burst error of 9 bits or more can sneak + past the XMODEM protocol arithmetic checksum. + + The XMODEM/CRC protocol is similar to the XMODEM protocol, except that the + receiver specifies CRC-16 by sending C (Hex 43) instead of NAK when + requesting the FIRST block. A two byte CRC is sent in place of the one + byte arithmetic checksum. + + YAM's c option to the r command enables CRC-16 in single file reception, + corresponding to the original implementation in the MODEM7 series + programs. This remains the default because many commercial communications + programs and bulletin board systems still do not support CRC-16, + especially those written in Basic or Pascal. + + XMODEM protocol with CRC is accurate provided both sender and receiver + + + + Chapter 4 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 11 + + + + both report a successful transmission. The protocol is robust in the + presence of characters lost by buffer overloading on timesharing systems. + + The single character ACK/NAK responses generated by the receiving program + adapt well to split speed modems, where the reverse channel is limited to + ten per cent or less of the main channel's speed. + + XMODEM and YMODEM are half duplex protocols which do not attempt to + transmit information and control signals in both directions at the same + time. This avoids buffer overrun problems that have been reported by + users attempting to exploit full duplex asynchronous file transfer + protocols such as Blast. + + Professional-YAM adds several proprietary logic enhancements to XMODEM's + error detection and recovery. These compatible enhancements eliminate + most of the bad file transfers other programs make when using the XMODEM + protocol under less than ideal conditions. + + + 4.3 XMODEM-1k 1024 Byte Block + + Disappointing throughput downloading from Unix with YMODEM[1] lead to the + development of 1024 byte blocks in 1982. 1024 byte blocks reduce the + effect of delays from timesharing systems, modems, and packet switched + networks on throughput by 87.5 per cent in addition to decreasing XMODEM's + 3 per cent overhead (block number, CRC, etc.). + + Some environments cannot accept 1024 byte bursts, including some networks + and minicomputer ports. The longer block length should be an option. + + The choice to use 1024 byte blocks is expressed to the sending program on + its command line or selection menu.[2] 1024 byte blocks improve throughput + in many applications. + + An STX (02) replaces the SOH (01) at the beginning of the transmitted + block to notify the receiver of the longer block length. The transmitted + block contains 1024 bytes of data. The receiver should be able to accept + any mixture of 128 and 1024 byte blocks. The block number (in the second + and third bytes of the block) is incremented by one for each block + regardless of the block length. + + The sender must not change between 128 and 1024 byte block lengths if it + has not received a valid ACK for the current block. Failure to observe + + + __________ + + 1. The name hadn't been coined yet, but the protocol was the same. + + 2. See "KMD/IMP Exceptions to YMODEM" below. + + + + + Chapter 4 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 12 + + + + this restriction allows transmission errors to pass undetected. + + If 1024 byte blocks are being used, it is possible for a file to "grow" up + to the next multiple of 1024 bytes. This does not waste disk space if the + allocation granularity is 1k or greater. With YMODEM batch transmission, + the optional file length transmitted in the file name block allows the + receiver to discard the padding, preserving the exact file length and + contents. + + 1024 byte blocks may be used with batch file transmission or with single + file transmission. CRC-16 should be used with the k option to preserve + data integrity over phone lines. If a program wishes to enforce this + recommendation, it should cancel the transfer, then issue an informative + diagnostic message if the receiver requests checksum instead of CRC-16. + + Under no circumstances may a sending program use CRC-16 unless the + receiver commands CRC-16. + + Figure 1. XMODEM-1k Blocks + + SENDER RECEIVER + "sx -k foo.bar" + "foo.bar open x.x minutes" + C + STX 01 FE Data[1024] CRC CRC + ACK + STX 02 FD Data[1024] CRC CRC + ACK + STX 03 FC Data[1000] CPMEOF[24] CRC CRC + ACK + EOT + ACK + + Figure 2. Mixed 1024 and 128 byte Blocks + + SENDER RECEIVER + "sx -k foo.bar" + "foo.bar open x.x minutes" + C + STX 01 FE Data[1024] CRC CRC + ACK + STX 02 FD Data[1024] CRC CRC + ACK + SOH 03 FC Data[128] CRC CRC + ACK + SOH 04 FB Data[100] CPMEOF[28] CRC CRC + ACK + EOT + ACK + + + + + + Chapter 4 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 13 + + + + 5. YMODEM Batch File Transmission + + The YMODEM Batch protocol is an extension to the XMODEM/CRC protocol that + allows 0 or more files to be transmitted with a single command. (Zero + files may be sent if none of the requested files is accessible.) The + design approach of the YMODEM Batch protocol is to use the normal routines + for sending and receiving XMODEM blocks in a layered fashion similar to + packet switching methods. + + Why was it necessary to design a new batch protocol when one already + existed in MODEM7?[1] The batch file mode used by MODEM7 is unsuitable + because it does not permit full pathnames, file length, file date, or + other attribute information to be transmitted. Such a restrictive design, + hastily implemented with only CP/M in mind, would not have permitted + extensions to current areas of personal computing such as Unix, DOS, and + object oriented systems. In addition, the MODEM7 batch file mode is + somewhat susceptible to transmission impairments. + + As in the case of single a file transfer, the receiver initiates batch + file transmission by sending a "C" character (for CRC-16). + + The sender opens the first file and sends block number 0 with the + following information.[2] + + Only the pathname (file name) part is required for batch transfers. + + To maintain upwards compatibility, all unused bytes in block 0 must be set + to null. + + Pathname The pathname (conventionally, the file name) is sent as a null + terminated ASCII string. This is the filename format used by the + handle oriented MSDOS(TM) functions and C library fopen functions. + An assembly language example follows: + DB 'foo.bar',0 + No spaces are included in the pathname. Normally only the file name + stem (no directory prefix) is transmitted unless the sender has + selected YAM's f option to send the full pathname. The source drive + (A:, B:, etc.) is not sent. + + Filename Considerations: + + + + __________ + + 1. The MODEM7 batch protocol transmitted CP/M FCB bytes f1...f8 and + t1...t3 one character at a time. The receiver echoed these bytes as + received, one at a time. + + 2. Only the data part of the block is described here. + + + + + Chapter 5 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 14 + + + + + File names are forced to lower case unless the sending system + supports upper/lower case file names. This is a convenience for + users of systems (such as Unix) which store filenames in upper + and lower case. + + + The receiver should accommodate file names in lower and upper + case. + + + When transmitting files between different operating systems, + file names must be acceptable to both the sender and receiving + operating systems. + + If directories are included, they are delimited by /; i.e., + "subdir/foo" is acceptable, "subdir\foo" is not. + + Length The file length and each of the succeeding fields are optional.[3] + The length field is stored in the block as a decimal string counting + the number of data bytes in the file. The file length does not + include any CPMEOF (^Z) or other garbage characters used to pad the + last block. + + If the file being transmitted is growing during transmission, the + length field should be set to at least the final expected file + length, or not sent. + + The receiver stores the specified number of characters, discarding + any padding added by the sender to fill up the last block. + + Modification Date The mod date is optional, and the filename and length + may be sent without requiring the mod date to be sent. + + Iff the modification date is sent, a single space separates the + modification date from the file length. + + The mod date is sent as an octal number giving the time the contents + of the file were last changed, measured in seconds from Jan 1 1970 + Universal Coordinated Time (GMT). A date of 0 implies the + modification date is unknown and should be left as the date the file + is received. + + This standard format was chosen to eliminate ambiguities arising from + transfers between different time zones. + + + + + + __________ + + 3. Fields may not be skipped. + + + + + Chapter 5 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 15 + + + + Mode Iff the file mode is sent, a single space separates the file mode + from the modification date. The file mode is stored as an octal + string. Unless the file originated from a Unix system, the file mode + is set to 0. rb(1) checks the file mode for the 0x8000 bit which + indicates a Unix type regular file. Files with the 0x8000 bit set + are assumed to have been sent from another Unix (or similar) system + which uses the same file conventions. Such files are not translated + in any way. + + + Serial Number Iff the serial number is sent, a single space separates the + serial number from the file mode. The serial number of the + transmitting program is stored as an octal string. Programs which do + not have a serial number should omit this field, or set it to 0. The + receiver's use of this field is optional. + + + Other Fields YMODEM was designed to allow additional header fields to be + added as above without creating compatibility problems with older + YMODEM programs. Please contact Omen Technology if other fields are + needed for special application requirements. + + The rest of the block is set to nulls. This is essential to preserve + upward compatibility.[4] + + If the filename block is received with a CRC or other error, a + retransmission is requested. After the filename block has been received, + it is ACK'ed if the write open is successful. If the file cannot be + opened for writing, the receiver cancels the transfer with CAN characters + as described above. + + The receiver then initiates transfer of the file contents with a "C" + character, according to the standard XMODEM/CRC protocol. + + After the file contents and XMODEM EOT have been transmitted and + acknowledged, the receiver again asks for the next pathname. + + Transmission of a null pathname terminates batch file transmission. + + Note that transmission of no files is not necessarily an error. This is + possible if none of the files requested of the sender could be opened for + reading. + + + + __________ + + 4. If, perchance, this information extends beyond 128 bytes (possible + with Unix 4.2 BSD extended file names), the block should be sent as a + 1k block as described above. + + + + + Chapter 5 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 16 + + + + Most YMODEM receivers request CRC-16 by default. + + The Unix programs sz(1) and rz(1) included in the source code file + RZSZ.ZOO should answer other questions about YMODEM batch protocol. + + Figure 3. YMODEM Batch Transmission Session (1 file) + + SENDER RECEIVER + "sb foo.*" + "sending in batch mode etc." + C (command:rb) + SOH 00 FF foo.c NUL[123] CRC CRC + ACK + C + SOH 01 FE Data[128] CRC CRC + ACK + SOH 02 FC Data[128] CRC CRC + ACK + SOH 03 FB Data[100] CPMEOF[28] CRC CRC + ACK + EOT + NAK + EOT + ACK + C + SOH 00 FF NUL[128] CRC CRC + ACK + + Figure 7. YMODEM Header Information and Features + + _____________________________________________________________ + | Program | Length | Date | Mode | S/N | 1k-Blk | YMODEM-g | + |___________|________|______|______|_____|________|__________| + |Unix rz/sz | yes | yes | yes | no | yes | sb only | + |___________|________|______|______|_____|________|__________| + |VMS rb/sb | yes | no | no | no | yes | no | + |___________|________|______|______|_____|________|__________| + |Pro-YAM | yes | yes | no | yes | yes | yes | + |___________|________|______|______|_____|________|__________| + |CP/M YAM | no | no | no | no | yes | no | + |___________|________|______|______|_____|________|__________| + |KMD/IMP | ? | no | no | no | yes | no | + |___________|________|______|______|_____|________|__________| + + 5.1 KMD/IMP Exceptions to YMODEM + + KMD and IMP use a "CK" character sequence emitted by the receiver to + trigger the use of 1024 byte blocks as an alternative to specifying this + option to the sending program. This two character sequence generally + works well on single process micros in direct communication, provided the + programs rigorously adhere to all the XMODEM recommendations included + + + + Chapter 5 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 17 + + + + Figure 4. YMODEM Batch Transmission Session (2 files) + + SENDER RECEIVER + "sb foo.c baz.c" + "sending in batch mode etc." + C (command:rb) + SOH 00 FF foo.c NUL[123] CRC CRC + ACK + C + SOH 01 FE Data[128] CRC CRC + ACK + SOH 02 FC Data[128] CRC CRC + ACK + SOH 03 FB Data[100] CPMEOF[28] CRC CRC + ACK + EOT + NAK + EOT + ACK + C + SOH 00 FF baz.c NUL[123] CRC CRC + ACK + C + SOH 01 FB Data[100] CPMEOF[28] CRC CRC + ACK + EOT + NAK + EOT + ACK + C + SOH 00 FF NUL[128] CRC CRC + ACK + + Figure 5. YMODEM Batch Transmission Session-1k Blocks + + SENDER RECEIVER + "sb -k foo.*" + "sending in batch mode etc." + C (command:rb) + SOH 00 FF foo.c NUL[123] CRC CRC + ACK + C + STX 01 FD Data[1024] CRC CRC + ACK + SOH 02 FC Data[128] CRC CRC + ACK + SOH 03 FB Data[100] CPMEOF[28] CRC CRC + ACK + EOT + NAK + EOT + + + + Chapter 5 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 18 + + + + ACK + C + SOH 00 FF NUL[128] CRC CRC + ACK + + Figure 6. YMODEM Filename block transmitted by sz + + -rw-r--r-- 6347 Jun 17 1984 20:34 bbcsched.txt + + 00 0100FF62 62637363 6865642E 74787400 |...bbcsched.txt.| + 10 36333437 20333331 34373432 35313320 |6347 3314742513 | + 20 31303036 34340000 00000000 00000000 |100644..........| + 30 00000000 00000000 00000000 00000000 + 40 00000000 00000000 00000000 00000000 + 50 00000000 00000000 00000000 00000000 + 60 00000000 00000000 00000000 00000000 + 70 00000000 00000000 00000000 00000000 + 80 000000CA 56 + + herein. Programs with marginal XMODEM implementations do not fare so + well. Timesharing systems and packet switched networks can separate the + successive characters, rendering this method unreliable. + + Sending programs may detect the CK sequence if the operating enviornment + does not preclude reliable implementation. + + Instead of the standard YMODEM file length in decimal, KMD and IMP + transmit the CP/M record count in the last two bytes of the header block. + + + 6. YMODEM-g File Transmission + + Developing technology is providing phone line data transmission at ever + higher speeds using very specialized techniques. These high speed modems, + as well as session protocols such as X.PC, provide high speed, nearly + error free communications at the expense of considerably increased delay + time. + + This delay time is moderate compared to human interactions, but it + cripples the throughput of most error correcting protocols. + + The g option to YMODEM has proven effective under these circumstances. + The g option is driven by the receiver, which initiates the batch transfer + by transmitting a G instead of C. When the sender recognizes the G, it + bypasses the usual wait for an ACK to each transmitted block, sending + succeeding blocks at full speed, subject to XOFF/XON or other flow control + exerted by the medium. + + The sender expects an inital G to initiate the transmission of a + particular file, and also expects an ACK on the EOT sent at the end of + each file. This synchronization allows the receiver time to open and + + + + Chapter 6 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 19 + + + + close files as necessary. + + If an error is detected in a YMODEM-g transfer, the receiver aborts the + transfer with the multiple CAN abort sequence. The ZMODEM protocol should + be used in applications that require both streaming throughput and error + recovery. + + Figure 8. YMODEM-g Transmission Session + + SENDER RECEIVER + "sb foo.*" + "sending in batch mode etc..." + G (command:rb -g) + SOH 00 FF foo.c NUL[123] CRC CRC + G + SOH 01 FE Data[128] CRC CRC + STX 02 FD Data[1024] CRC CRC + SOH 03 FC Data[128] CRC CRC + SOH 04 FB Data[100] CPMEOF[28] CRC CRC + EOT + ACK + G + SOH 00 FF NUL[128] CRC CRC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chapter 6 XMODEM Protocol Enhancements + + + + + + + + X/YMODEM Protocol Reference June 18 1988 20 + + + + 7. XMODEM PROTOCOL OVERVIEW + + 8/9/82 by Ward Christensen. + + I will maintain a master copy of this. Please pass on changes or + suggestions via CBBS/Chicago at (312) 545-8086, CBBS/CPMUG (312) 849-1132 + or by voice at (312) 849-6279. + + 7.1 Definitions + + 01H + 04H + 06H + 15H + 18H + 43H + + + 7.2 Transmission Medium Level Protocol + + Asynchronous, 8 data bits, no parity, one stop bit. + + The protocol imposes no restrictions on the contents of the data being + transmitted. No control characters are looked for in the 128-byte data + messages. Absolutely any kind of data may be sent - binary, ASCII, etc. + The protocol has not formally been adopted to a 7-bit environment for the + transmission of ASCII-only (or unpacked-hex) data , although it could be + simply by having both ends agree to AND the protocol-dependent data with + 7F hex before validating it. I specifically am referring to the checksum, + and the block numbers and their ones- complement. + + Those wishing to maintain compatibility of the CP/M file structure, i.e. + to allow modemming ASCII files to or from CP/M systems should follow this + data format: + + + ASCII tabs used (09H); tabs set every 8. + + + Lines terminated by CR/LF (0DH 0AH) + + + End-of-file indicated by ^Z, 1AH. (one or more) + + + Data is variable length, i.e. should be considered a continuous + stream of data bytes, broken into 128-byte chunks purely for the + purpose of transmission. + + + A CP/M "peculiarity": If the data ends exactly on a 128-byte + boundary, i.e. CR in 127, and LF in 128, a subsequent sector + containing the ^Z EOF character(s) is optional, but is preferred. + Some utilities or user programs still do not handle EOF without ^Zs. + + + + + + Chapter 7 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 21 + + + + + The last block sent is no different from others, i.e. there is no + "short block". + Figure 9. XMODEM Message Block Level Protocol + + Each block of the transfer looks like: + <255-blk #><--128 data bytes--> + in which: + = 01 hex + = binary number, starts at 01 increments by 1, and + wraps 0FFH to 00H (not to 01) + <255-blk #> = blk # after going thru 8080 "CMA" instr, i.e. + each bit complemented in the 8-bit block number. + Formally, this is the "ones complement". + = the sum of the data bytes only. Toss any carry. + + 7.3 File Level Protocol + + 7.3.1 Common_to_Both_Sender_and_Receiver + All errors are retried 10 times. For versions running with an operator + (i.e. NOT with XMODEM), a message is typed after 10 errors asking the + operator whether to "retry or quit". + + Some versions of the protocol use , ASCII ^X, to cancel transmission. + This was never adopted as a standard, as having a single "abort" character + makes the transmission susceptible to false termination due to an + or being corrupted into a and aborting transmission. + + The protocol may be considered "receiver driven", that is, the sender need + not automatically re-transmit, although it does in the current + implementations. + + + 7.3.2 Receive_Program_Considerations + The receiver has a 10-second timeout. It sends a every time it + times out. The receiver's first timeout, which sends a , signals the + transmitter to start. Optionally, the receiver could send a + immediately, in case the sender was ready. This would save the initial 10 + second timeout. However, the receiver MUST continue to timeout every 10 + seconds in case the sender wasn't ready. + + Once into a receiving a block, the receiver goes into a one-second timeout + for each character and the checksum. If the receiver wishes to a + block for any reason (invalid header, timeout receiving data), it must + wait for the line to clear. See "programming tips" for ideas + + Synchronizing: If a valid block number is received, it will be: 1) the + expected one, in which case everything is fine; or 2) a repeat of the + previously received block. This should be considered OK, and only + indicates that the receivers got glitched, and the sender re- + transmitted; 3) any other block number indicates a fatal loss of + synchronization, such as the rare case of the sender getting a line-glitch + + + + Chapter 7 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 22 + + + + that looked like an . Abort the transmission, sending a + + + 7.3.3 Sending_program_considerations + While waiting for transmission to begin, the sender has only a single very + long timeout, say one minute. In the current protocol, the sender has a + 10 second timeout before retrying. I suggest NOT doing this, and letting + the protocol be completely receiver-driven. This will be compatible with + existing programs. + + When the sender has no more data, it sends an , and awaits an , + resending the if it doesn't get one. Again, the protocol could be + receiver-driven, with the sender only having the high-level 1-minute + timeout to abort. + + + Here is a sample of the data flow, sending a 3-block message. It includes + the two most common line hits - a garbaged block, and an reply + getting garbaged. represents the checksum byte. + + Figure 10. Data flow including Error Recovery + + SENDER RECEIVER + times out after 10 seconds, + <--- + 01 FE -data- ---> + <--- + 02 FD -data- xx ---> (data gets line hit) + <--- + 02 FD -data- xx ---> + <--- + 03 FC -data- xx ---> + (ack gets garbaged) <--- + 03 FC -data- xx ---> + ---> + <--- + ---> + <--- + (finished) + + 7.4 Programming Tips + + + The character-receive subroutine should be called with a parameter + specifying the number of seconds to wait. The receiver should first + call it with a time of 10, then and try again, 10 times. + + After receiving the , the receiver should call the character + receive subroutine with a 1-second timeout, for the remainder of the + message and the . Since they are sent as a continuous stream, + timing out of this implies a serious like glitch that caused, say, + 127 characters to be seen instead of 128. + + + + Chapter 7 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 23 + + + + + When the receiver wishes to , it should call a "PURGE" + subroutine, to wait for the line to clear. Recall the sender tosses + any characters in its UART buffer immediately upon completing sending + a block, to ensure no glitches were mis- interpreted. + + The most common technique is for "PURGE" to call the character + receive subroutine, specifying a 1-second timeout,[1] and looping + back to PURGE until a timeout occurs. The is then sent, + ensuring the other end will see it. + + + You may wish to add code recommended by John Mahr to your character + receive routine - to set an error flag if the UART shows framing + error, or overrun. This will help catch a few more glitches - the + most common of which is a hit in the high bits of the byte in two + consecutive bytes. The comes out OK since counting in 1-byte + produces the same result of adding 80H + 80H as with adding 00H + + 00H. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __________ + + 1. These times should be adjusted for use with timesharing systems. + + + + + Chapter 7 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 24 + + + + 8. XMODEM/CRC Overview + + Original 1/13/85 by John Byrns -- CRC option. + + Please pass on any reports of errors in this document or suggestions for + improvement to me via Ward's/CBBS at (312) 849-1132, or by voice at (312) + 885-1105. + + The CRC used in the Modem Protocol is an alternate form of block check + which provides more robust error detection than the original checksum. + Andrew S. Tanenbaum says in his book, Computer Networks, that the CRC- + CCITT used by the Modem Protocol will detect all single and double bit + errors, all errors with an odd number of bits, all burst errors of length + 16 or less, 99.997% of 17-bit error bursts, and 99.998% of 18-bit and + longer bursts.[1] + + The changes to the Modem Protocol to replace the checksum with the CRC are + straight forward. If that were all that we did we would not be able to + communicate between a program using the old checksum protocol and one + using the new CRC protocol. An initial handshake was added to solve this + problem. The handshake allows a receiving program with CRC capability to + determine whether the sending program supports the CRC option, and to + switch it to CRC mode if it does. This handshake is designed so that it + will work properly with programs which implement only the original + protocol. A description of this handshake is presented in section 10. + + Figure 11. Message Block Level Protocol, CRC mode + + Each block of the transfer in CRC mode looks like: + <255-blk #><--128 data bytes--> + in which: + = 01 hex + = binary number, starts at 01 increments by 1, and + wraps 0FFH to 00H (not to 01) + <255-blk #> = ones complement of blk #. + = byte containing the 8 hi order coefficients of the CRC. + = byte containing the 8 lo order coefficients of the CRC. + + 8.1 CRC Calculation + + 8.1.1 Formal_Definition + To calculate the 16 bit CRC the message bits are considered to be the + coefficients of a polynomial. This message polynomial is first multiplied + by X^16 and then divided by the generator polynomial (X^16 + X^12 + X^5 + + + + __________ + + 1. This reliability figure is misleading because XMODEM's critical + supervisory functions are not protected by this CRC. + + + + + Chapter 8 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 25 + + + + 1) using modulo two arithmetic. The remainder left after the division is + the desired CRC. Since a message block in the Modem Protocol is 128 bytes + or 1024 bits, the message polynomial will be of order X^1023. The hi order + bit of the first byte of the message block is the coefficient of X^1023 in + the message polynomial. The lo order bit of the last byte of the message + block is the coefficient of X^0 in the message polynomial. + + Figure 12. Example of CRC Calculation written in C + + The following XMODEM crc routine is taken from "rbsb.c". Please refer to + the source code for these programs (contained in RZSZ.ZOO) for usage. A + fast table driven version is also included in this file. + + /* update CRC */ + unsigned short + updcrc(c, crc) + register c; + register unsigned crc; + { + register count; + + for (count=8; --count>=0;) { + if (crc & 0x8000) { + crc <<= 1; + crc += (((c<<=1) & 0400) != 0); + crc ^= 0x1021; + } + else { + crc <<= 1; + crc += (((c<<=1) & 0400) != 0); + } + } + return crc; + } + + 8.2 CRC File Level Protocol Changes + + 8.2.1 Common_to_Both_Sender_and_Receiver + The only change to the File Level Protocol for the CRC option is the + initial handshake which is used to determine if both the sending and the + receiving programs support the CRC mode. All Modem Programs should support + the checksum mode for compatibility with older versions. A receiving + program that wishes to receive in CRC mode implements the mode setting + handshake by sending a in place of the initial . If the sending + program supports CRC mode it will recognize the and will set itself + into CRC mode, and respond by sending the first block as if a had + been received. If the sending program does not support CRC mode it will + not respond to the at all. After the receiver has sent the it will + wait up to 3 seconds for the that starts the first block. If it + receives a within 3 seconds it will assume the sender supports CRC + mode and will proceed with the file exchange in CRC mode. If no is + + + + Chapter 8 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 26 + + + + received within 3 seconds the receiver will switch to checksum mode, send + a , and proceed in checksum mode. If the receiver wishes to use + checksum mode it should send an initial and the sending program + should respond to the as defined in the original Modem Protocol. + After the mode has been set by the initial or the protocol + follows the original Modem Protocol and is identical whether the checksum + or CRC is being used. + + + 8.2.2 Receive_Program_Considerations + There are at least 4 things that can go wrong with the mode setting + handshake. + + 1. the initial can be garbled or lost. + + 2. the initial can be garbled. + + 3. the initial can be changed to a . + + 4. the initial from a receiver which wants to receive in checksum + can be changed to a . + + The first problem can be solved if the receiver sends a second after + it times out the first time. This process can be repeated several times. + It must not be repeated too many times before sending a and + switching to checksum mode or a sending program without CRC support may + time out and abort. Repeating the will also fix the second problem if + the sending program cooperates by responding as if a were received + instead of ignoring the extra . + + It is possible to fix problems 3 and 4 but probably not worth the trouble + since they will occur very infrequently. They could be fixed by switching + modes in either the sending or the receiving program after a large number + of successive s. This solution would risk other problems however. + + + 8.2.3 Sending_Program_Considerations + The sending program should start in the checksum mode. This will insure + compatibility with checksum only receiving programs. Anytime a is + received before the first or the sending program should set + itself into CRC mode and respond as if a were received. The sender + should respond to additional s as if they were s until the first + is received. This will assist the receiving program in determining + the correct mode when the is lost or garbled. After the first + is received the sending program should ignore s. + + + + + + + + + + Chapter 8 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 27 + + + + 8.3 Data Flow Examples with CRC Option + + Here is a data flow example for the case where the receiver requests + transmission in the CRC mode but the sender does not support the CRC + option. This example also includes various transmission errors. + represents the checksum byte. + + Figure 13. Data Flow: Receiver has CRC Option, Sender Doesn't + + SENDER RECEIVER + <--- + times out after 3 seconds, + <--- + times out after 3 seconds, + <--- + times out after 3 seconds, + <--- + times out after 3 seconds, + <--- + 01 FE -data- ---> + <--- + 02 FD -data- ---> (data gets line hit) + <--- + 02 FD -data- ---> + <--- + 03 FC -data- ---> + (ack gets garbaged) <--- + times out after 10 seconds, + <--- + 03 FC -data- ---> + <--- + ---> + <--- + + Here is a data flow example for the case where the receiver requests + transmission in the CRC mode and the sender supports the CRC option. This + example also includes various transmission errors. represents the + 2 CRC bytes. + + + + + + + + + + + + + + + + + Chapter 8 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 28 + + + + Figure 14. Receiver and Sender Both have CRC Option + + SENDER RECEIVER + <--- + 01 FE -data- ---> + <--- + 02 FD -data- ---> (data gets line hit) + <--- + 02 FD -data- ---> + <--- + 03 FC -data- ---> + (ack gets garbaged) <--- + times out after 10 seconds, + <--- + 03 FC -data- ---> + <--- + ---> + <--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chapter 8 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 29 + + + + 9. MORE INFORMATION + + Please contact Omen Technology for troff source files and typeset copies + of this document. + + + 9.1 TeleGodzilla Bulletin Board + + More information may be obtained by calling TeleGodzilla at 503-621-3746. + Speed detection is automatic for 1200, 2400 and 19200(Telebit PEP) bps. + TrailBlazer modem users may issue the TeleGodzilla trailblazer command to + swith to 19200 bps once they have logged in. + + Interesting files include RZSZ.ZOO (C source code), YZMODEM.ZOO (Official + XMODEM, YMODEM, and ZMODEM protocol descriptions), ZCOMMEXE.ARC, + ZCOMMDOC.ARC, and ZCOMMHLP.ARC (PC-DOS shareware comm program with XMODEM, + True YMODEM(TM), ZMODEM, Kermit Sliding Windows, Telink, MODEM7 Batch, + script language, etc.). + + + 9.2 Unix UUCP Access + + UUCP sites can obtain the current version of this file with + uucp omen!/u/caf/public/ymodem.doc /tmp + A continually updated list of available files is stored in + /usr/spool/uucppublic/FILES. When retrieving these files with uucp, + remember that the destination directory on your system must be writeable + by anyone, or the UUCP transfer will fail. + + The following L.sys line calls TeleGodzilla (Pro-YAM in host operation). + TeleGodzilla determines the incoming speed automatically. + + In response to "Name Please:" uucico gives the Pro-YAM "link" command as a + user name. The password (Giznoid) controls access to the Xenix system + connected to the IBM PC's other serial port. Communications between + Pro-YAM and Xenix use 9600 bps; YAM converts this to the caller's speed. + + Finally, the calling uucico logs in as uucp. + + omen Any ACU 2400 1-503-621-3746 se:--se: link ord: Giznoid in:--in: uucp + + + + 10. REVISIONS + + 6-18-88 Further revised for clarity. Corrected block numbering in two + examples. + 10-27-87 Optional fields added for number of files remaining to be sent + and total number of bytes remaining to be sent. + 10-18-87 Flow control discussion added to 1024 byte block descritpion, + minor revisions for clarity per user comments. + + + + Chapter 10 Xmodem Protocol Overview + + + + + + + + X/YMODEM Protocol Reference June 18 1988 30 + + + + 8-03-87 Revised for clarity. + 5-31-1987 emphasizes minimum requirements for YMODEM, and updates + information on accessing files. + 9-11-1986 clarifies nomenclature and some minor points. + The April 15 1986 edition clarifies some points concerning CRC + calculations and spaces in the header. + + + 11. YMODEM Programs + + ZCOMM, A shareware little brother to Professional-YAM, is available as + ZCOMMEXE.ARC on TeleGodzilla and other bulletin board systems. ZCOMM may + be used to test YMODEM amd ZMODEM implementations. + + Unix programs supporting YMODEM are available on TeleGodzilla in RZSZ.ZOO. + This ZOO archive includes a ZCOMM/Pro-YAM/PowerCom script ZUPL.T to upload + a bootstrap program MINIRB.C, compile it, and then upload the rest of the + files using the compiled MINIRB. Most Unix like systems are supported, + including V7, Xenix, Sys III, 4.2 BSD, SYS V, Idris, Coherent, and + Regulus. + + A version for VAX-VMS is available in VRBSB.SHQ. + + Irv Hoff has added 1k blocks and basic YMODEM batch transfers to the KMD + and IMP series programs, which replace the XMODEM and MODEM7/MDM7xx series + respectively. Overlays are available for a wide variety of CP/M systems. + + Questions about Professional-YAM communications software may be directed + to: + Chuck Forsberg + Omen Technology Inc + 17505-V Sauvie Island Road + Portland Oregon 97231 + VOICE: 503-621-3406 :VOICE + Modem: 503-621-3746 Speed: 19200(Telebit PEP),2400,1200,300 + Usenet: ...!tektronix!reed!omen!caf + CompuServe: 70007,2304 + GEnie: CAF + + Unlike ZMODEM and Kermit, XMODEM and YMODEM place obstacles in the path of + a reliable high performance implementation, evidenced by poor reliability + under stress of the industry leaders' XMODEM and YMODEM programs. Omen + Technology provides consulting and other services to those wishing to + implement XMODEM, YMODEM, and ZMODEM with state of the art features and + reliability. + + + + + + + + + + Chapter 11 Xmodem Protocol Overview + + + + + + + + + + + + CONTENTS + + + 1. TOWER OF BABEL................................................... 2 + 1.1 Definitions................................................. 2 + + 2. YMODEM MINIMUM REQUIREMENTS...................................... 4 + + 3. WHY YMODEM?...................................................... 6 + 3.1 Some Messages from the Pioneer.............................. 7 + + 4. XMODEM PROTOCOL ENHANCEMENTS..................................... 10 + 4.1 Graceful Abort.............................................. 10 + 4.2 CRC-16 Option............................................... 10 + 4.3 XMODEM-1k 1024 Byte Block................................... 11 + + 5. YMODEM Batch File Transmission................................... 13 + 5.1 KMD/IMP Exceptions to YMODEM................................ 16 + + 6. YMODEM-g File Transmission....................................... 18 + + 7. XMODEM PROTOCOL OVERVIEW......................................... 20 + 7.1 Definitions................................................. 20 + 7.2 Transmission Medium Level Protocol.......................... 20 + 7.3 File Level Protocol......................................... 21 + 7.4 Programming Tips............................................ 22 + + 8. XMODEM/CRC Overview.............................................. 24 + 8.1 CRC Calculation............................................. 24 + 8.2 CRC File Level Protocol Changes............................. 25 + 8.3 Data Flow Examples with CRC Option.......................... 27 + + 9. MORE INFORMATION................................................. 29 + 9.1 TeleGodzilla Bulletin Board................................. 29 + 9.2 Unix UUCP Access............................................ 29 + + 10. REVISIONS........................................................ 29 + + 11. YMODEM Programs.................................................. 30 + + + + + + + + + + + + + + + + - i - + + + + + + + + + + + + + + + LIST OF FIGURES + + + Figure 1. XMODEM-1k Blocks.......................................... 12 + + Figure 2. Mixed 1024 and 128 byte Blocks............................ 12 + + Figure 3. YMODEM Batch Transmission Session (1 file)................ 16 + + Figure 4. YMODEM Batch Transmission Session (2 files)............... 16 + + Figure 5. YMODEM Batch Transmission Session-1k Blocks............... 16 + + Figure 6. YMODEM Filename block transmitted by sz................... 16 + + Figure 7. YMODEM Header Information and Features.................... 16 + + Figure 8. YMODEM-g Transmission Session............................. 19 + + Figure 9. XMODEM Message Block Level Protocol....................... 21 + + Figure 10. Data flow including Error Recovery........................ 22 + + Figure 11. Message Block Level Protocol, CRC mode.................... 24 + + Figure 12. Example of CRC Calculation written in C................... 25 + + Figure 13. Data Flow: Receiver has CRC Option, Sender Doesn't........ 27 + + Figure 14. Receiver and Sender Both have CRC Option.................. 28 + + + + + + + + + + + + + + + + + + + + + + - ii - + + + + diff --git a/memdump/ymsend.c b/memdump/ymsend.c new file mode 100644 index 00000000..b4b16a55 --- /dev/null +++ b/memdump/ymsend.c @@ -0,0 +1,167 @@ +/* + * Ymodem send routine. Only supports 1K blocks and CRC mode. + */ + +#include +#include +#include "ymsend.h" + +enum { + SOH = 0x01, + STX = 0x02, + EOT = 0x04, + ACK = 0x06, + NAK = 0x15, + CAN = 0x18, +}; + +/* + * Append a CRC16 to a block + */ +static void add_crc16(uint8_t *blk, int len) +{ + static const uint16_t crctab[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 + }; + uint16_t crc = 0; + + while (len--) + crc = crctab[(crc >> 8) ^ *blk++] ^ crc << 8; + + *blk++ = crc >> 8; + *blk = crc; +} + +static void send_ack_blk(struct serial_if *sif, const void *data, size_t bytes) +{ + uint8_t ack_buf; + + if (bytes) + sif->write(sif, data, bytes); + + do { + do { + sif->read(sif, &ack_buf, 1); + } while (ack_buf != ACK && ack_buf != NAK); + } while (ack_buf == NAK); +} + +static const uint8_t eot_buf = EOT; + +void send_ymodem(struct serial_if *sif, struct file_info *fileinfo, + void (*gen_data)(void *, size_t, struct file_info *, size_t)) +{ + uint8_t ack_buf, blk_buf[1024+5], *np, *q; + const char *p; + size_t len, lx, pos; + int blk; + + /* Wait for initial handshake */ + printf("Waiting for handshake...\n"); + do { + sif->read(sif, &ack_buf, 1); + } while (ack_buf != 'C'); + + /* Send initial batch header (filename, length etc.) */ + q = blk_buf + 3; + p = fileinfo->name; + while (*p) + *q++ = *p++; + *q++ = '\0'; + + lx = len = fileinfo->size; + do { + q++; + lx /= 10; + } while (lx); + + np = q; + lx = len; + do { + *--np = (lx % 10) + '0'; + lx /= 10; + } while (lx); + + while (q < blk_buf+1024+3) + *q++ = 0; + + blk = 0; + pos = 0; + do { + if (blk != 0) { + gen_data(blk_buf+3, 1024, fileinfo, pos); + pos += 1024; + len = (len < 1024) ? 0 : len-1024; + } + + blk_buf[0] = STX; + blk_buf[1] = blk; + blk_buf[2] = ~blk; + add_crc16(blk_buf+3, 1024); + + printf("Sending block %d...\r", blk); + send_ack_blk(sif, blk_buf, 1024+5); + + blk++; + } while(len); + + printf("\nSending EOT...\n"); + send_ack_blk(sif, &eot_buf, 1); + printf("Done.\n"); +} + +void end_ymodem(struct serial_if *sif) +{ + uint8_t ack_buf; + uint8_t blk_buf[128+5]; + + /* Wait for initial handshake */ + printf("END: Waiting for handshake...\n"); + do { + sif->read(sif, &ack_buf, 1); + } while (ack_buf != 'C'); + + memset(blk_buf, 0, sizeof blk_buf); + blk_buf[0] = SOH; + blk_buf[1] = 0; + blk_buf[2] = 0xff; + add_crc16(blk_buf+3, 128); + printf("Sending block 0...\n"); + send_ack_blk(sif, &blk_buf, 128+5); + + printf("Sending EOT...\n"); + sif->write(sif, &eot_buf, 1); + /* rb doesn't ack the EOT for an end batch transfer. */ + printf("Done.\n"); +} diff --git a/memdump/ymsend.h b/memdump/ymsend.h new file mode 100644 index 00000000..9bcd5403 --- /dev/null +++ b/memdump/ymsend.h @@ -0,0 +1,27 @@ +#ifndef YMSEND_H +#define YMSEND_H + +#include "mystuff.h" + +struct serial_if { + int port; + void *pvt; + void (*read)(struct serial_if *, void *, size_t); + void (*write)(struct serial_if *, const void *, size_t); +}; + +struct file_info { + const char *name; + size_t size; + void *pvt; +}; + +void send_ymodem(struct serial_if *, struct file_info *, + void (*)(void *, size_t, struct file_info *, size_t)); +void end_ymodem(struct serial_if *); + +int serial_init(struct serial_if *sif); +void serial_read(struct serial_if *sif, void *data, size_t n); +void serial_write(struct serial_if *sif, const void *data, size_t n); + +#endif /* YMSEND_H */ diff --git a/menu/Makefile b/menu/Makefile index 702f4563..b3276310 100644 --- a/menu/Makefile +++ b/menu/Makefile @@ -1,6 +1,6 @@ ## ----------------------------------------------------------------------- ## -## Copyright 2001-2005 H. Peter Anvin - All Rights Reserved +## Copyright 2001-2007 H. Peter Anvin - All Rights Reserved ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ CC = gcc LD = ld -m elf_i386 AR = ar NASM = nasm +NASMOPT = -O9999 RANLIB = ranlib COM32DIR = ../com32 LUDIR = $(COM32DIR)/libutil diff --git a/mkdiskimage b/mkdiskimage index 9991412b..1af992a7 100755 --- a/mkdiskimage +++ b/mkdiskimage @@ -122,8 +122,7 @@ if ( $c == 0 && $file ne '' ) { $c = $len/($h*$s); } -if ( $file eq '' || $c < 1 || $c > 1024 || - $h < 1 || $h > 256 || $s < 1 || $s > 63 ) { +if ( $file eq '' || $c < 1 || $h < 1 || $h > 256 || $s < 1 || $s > 63 ) { print STDERR "Usage: $0 [-doFMz4][-i id] file c h s (max: 1024 256 63)\n"; print STDERR " -d add DOSEMU header\n"; print STDERR " -o print filesystem offset to stdout\n"; @@ -135,6 +134,14 @@ if ( $file eq '' || $c < 1 || $c > 1024 || exit 1; } +if ($c > 1024) { + print STDERR "Warning: more than 1024 cylinders ($c).\n"; + print STDERR "Not all BIOSes will be able to boot this device.\n"; + $cc = 1024; +} else { + $cc = $c; +} + $cylsize = $h*$s*512; if ( !$is_open ) { @@ -179,9 +186,11 @@ $bhead = ($h > 1) ? 1 : 0; $bsect = 1; $bcyl = ($h > 1) ? 0 : 1; $ehead = $h-1; -$esect = $s + ((($c-1) & 0x300) >> 2); -$ecyl = ($c-1) & 0xff; -if ( $psize > 65536 ) { +$esect = $s + ((($cc-1) & 0x300) >> 2); +$ecyl = ($cc-1) & 0xff; +if ( $c > 1024 ) { + $fstype = 0x0e; +} elsif ( $psize > 65536 ) { $fstype = 0x06; } else { $fstype = 0x04; @@ -266,9 +275,15 @@ print OUTPUT pack("V", ($offset-$header_size)>>9); # Set the partition type if ( $opt{'F'} ) { - $fstype = 0x0b; # FAT32 + if ( $c > 1024 ) { + $fstype = 0x0c; # FAT32 LBA + } else { + $fstype = 0x0b; + } } else { - if ( $psize > 65536 ) { + if ( $c > 1024 ) { + $fstype = 0x0e; # FAT16 LBA + } elsif ( $psize > 65536 ) { $fstype = 0x06; # FAT16 > 32MB } else { $fstype = 0x04; # FAT16 <= 32MB @@ -299,7 +314,7 @@ aa 55 31 c9 30 f6 f9 cd 13 72 13 81 fb 55 aa 75 d d1 e9 73 9 66 c7 6 8f 6 b4 42 67 20 73 79 73 74 65 6d 2e d a 0 66 60 66 31 d2 bb 0 7c 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 f4 7b c0 e4 6 88 e1 88 c5 92 f6 36 f8 7b 88 c6 8 e1 41 b8 1 2 8a 16 fa 7b cd 13 83 c4 10 66 61 c3 e8 c4 ff be be 7d bf be 7 b9 20 0 f3 a5 c3 66 60 89 e5 bb be 7 b9 4 0 31 c0 53 51 f6 7 80 74 3 40 89 de 83 c3 10 e2 f3 -48 74 5c 79 39 5b 59 8a 47 4 3c f 74 6 24 7f 3c 5 75 22 66 8b 47 8 66 8b 56 14 66 1 d0 66 21 d2 75 3 66 +48 74 5c 79 39 59 5b 8a 47 4 3c f 74 6 24 7f 3c 5 75 22 66 8b 47 8 66 8b 56 14 66 1 d0 66 21 d2 75 3 66 89 c2 e8 ac ff 72 3 e8 b6 ff 66 8b 46 1c e8 a0 ff 83 c3 10 e2 cc 66 61 c3 e8 64 0 4d 75 6c 74 69 70 6c 65 20 61 63 74 69 76 65 20 70 61 72 74 69 74 69 6f 6e 73 2e d a 0 66 8b 44 8 66 3 46 1c 66 89 44 8 e8 2f ff 72 13 81 3e fe 7d 55 aa f 85 4 ff bc fa 7b 5a 5f 7 fa ff e4 e8 1f 0 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 diff --git a/mkdiskimage.in b/mkdiskimage.in index e772588a..14a430d9 100755 --- a/mkdiskimage.in +++ b/mkdiskimage.in @@ -122,8 +122,7 @@ if ( $c == 0 && $file ne '' ) { $c = $len/($h*$s); } -if ( $file eq '' || $c < 1 || $c > 1024 || - $h < 1 || $h > 256 || $s < 1 || $s > 63 ) { +if ( $file eq '' || $c < 1 || $h < 1 || $h > 256 || $s < 1 || $s > 63 ) { print STDERR "Usage: $0 [-doFMz4][-i id] file c h s (max: 1024 256 63)\n"; print STDERR " -d add DOSEMU header\n"; print STDERR " -o print filesystem offset to stdout\n"; @@ -135,6 +134,14 @@ if ( $file eq '' || $c < 1 || $c > 1024 || exit 1; } +if ($c > 1024) { + print STDERR "Warning: more than 1024 cylinders ($c).\n"; + print STDERR "Not all BIOSes will be able to boot this device.\n"; + $cc = 1024; +} else { + $cc = $c; +} + $cylsize = $h*$s*512; if ( !$is_open ) { @@ -179,9 +186,11 @@ $bhead = ($h > 1) ? 1 : 0; $bsect = 1; $bcyl = ($h > 1) ? 0 : 1; $ehead = $h-1; -$esect = $s + ((($c-1) & 0x300) >> 2); -$ecyl = ($c-1) & 0xff; -if ( $psize > 65536 ) { +$esect = $s + ((($cc-1) & 0x300) >> 2); +$ecyl = ($cc-1) & 0xff; +if ( $c > 1024 ) { + $fstype = 0x0e; +} elsif ( $psize > 65536 ) { $fstype = 0x06; } else { $fstype = 0x04; @@ -266,9 +275,15 @@ print OUTPUT pack("V", ($offset-$header_size)>>9); # Set the partition type if ( $opt{'F'} ) { - $fstype = 0x0b; # FAT32 + if ( $c > 1024 ) { + $fstype = 0x0c; # FAT32 LBA + } else { + $fstype = 0x0b; + } } else { - if ( $psize > 65536 ) { + if ( $c > 1024 ) { + $fstype = 0x0e; # FAT16 LBA + } elsif ( $psize > 65536 ) { $fstype = 0x06; # FAT16 > 32MB } else { $fstype = 0x04; # FAT16 <= 32MB diff --git a/mtools/syslinux b/mtools/syslinux dissimilarity index 69% index 0bc4c502170b204a90444730a7f502df1edfe3e9..00171b18ebdf78dfbfdfc0931a24fa002bc46440 100755 GIT binary patch delta 8611 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 delta 8347 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 LME~c9dXE1IRY{K% delta 8434 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