From c359777f86be56a642d12a97d08647151826a6e2 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 5 Feb 2011 07:54:27 +0100 Subject: [PATCH] Adding upstream version 3.50~pre5. --- NEWS | 13 +- bcopy32.inc | 99 ++- bootsect.inc | 7 +- com32/Makefile | 2 +- com32/include/assert.h | 7 + com32/include/bitsize/stdint.h | 4 +- com32/include/colortbl.h | 6 +- com32/include/com32.h | 2 +- com32/include/dmi/dmi.h | 2 +- com32/include/dmi/dmi_base_board.h | 10 +- com32/include/dmi/dmi_bios.h | 18 +- com32/include/dmi/dmi_chassis.h | 48 +- com32/include/dmi/dmi_processor.h | 38 +- com32/include/dmi/dmi_system.h | 28 +- com32/include/elf.h | 11 + com32/include/klibc/compiler.h | 3 + com32/include/netinet/in.h | 7 + com32/include/sys/elf32.h | 113 ++++ com32/include/sys/elf64.h | 113 ++++ com32/include/sys/elfcommon.h | 187 ++++++ com32/include/sys/pci.h | 4 +- com32/include/sys/times.h | 2 +- com32/{libutil/idle.c => include/syslinux/boot.h} | 34 +- .../{libutil/idle.c => include/syslinux/bootpm.h} | 36 +- .../{lib/sys/idle.c => include/syslinux/bootrm.h} | 50 +- com32/include/syslinux/config.h | 140 ++++ .../sys/idle.c => include/syslinux/features.h} | 45 +- com32/include/{syslinux.h => syslinux/idle.h} | 10 +- .../include/libutil.h => include/syslinux/io.h} | 14 +- com32/include/syslinux/linux.h | 77 +++ .../include => include/syslinux}/loadfile.h | 0 com32/include/syslinux/movebits.h | 94 +++ com32/include/syslinux/pxe.h | 532 +++++++++++++++ .../{libutil/idle.c => include/syslinux/resolve.h} | 27 +- com32/{libutil/idle.c => include/syslinux/video.h} | 29 +- com32/include/tinyjpeg.h | 7 +- com32/lib/Makefile | 39 +- com32/lib/jpeg/bgr24.c | 8 +- com32/lib/jpeg/bgra32.c | 8 +- com32/lib/jpeg/decode1.c | 6 +- com32/lib/jpeg/decode3.c | 8 +- com32/lib/jpeg/grey.c | 4 +- com32/lib/jpeg/jidctflt.c | 33 +- com32/lib/jpeg/rgb24.c | 8 +- com32/lib/jpeg/rgba32.c | 8 +- com32/lib/jpeg/tinyjpeg-internal.h | 13 +- com32/lib/jpeg/tinyjpeg.c | 52 +- com32/lib/jpeg/yuv420p.c | 4 +- com32/lib/libcom32.a | Bin 1216762 -> 1336182 bytes com32/lib/math/strtod.c | 37 +- com32/{modules/pci.c => lib/pci/scan.c} | 130 +--- com32/lib/sys/ansicon_write.c | 2 +- com32/lib/sys/farcall.c | 6 +- com32/lib/sys/intcall.c | 4 +- com32/lib/sys/line_input.c | 2 +- com32/lib/sys/vesa/alphatbl.pl | 1 - com32/lib/sys/vesa/background.c | 41 +- com32/lib/sys/vesa/drawtxt.c | 6 +- com32/lib/sys/vesa/fill.h | 6 +- com32/lib/sys/vesa/fmtpixel.h | 8 +- com32/lib/sys/vesa/initvesa.c | 4 +- com32/lib/sys/vesacon_write.c | 2 +- com32/{libutil/idle.c => lib/syslinux/addlist.c} | 35 +- .../include/libutil.h => lib/syslinux/cleanup.c} | 21 +- com32/{libutil/idle.c => lib/syslinux/config.c} | 31 +- com32/lib/{sys/idle.c => syslinux/dump_mmap.c} | 37 +- .../idle.c => lib/syslinux/dump_movelist.c} | 33 +- com32/{libutil/idle.c => lib/syslinux/features.c} | 31 +- com32/{libutil/idle.c => lib/syslinux/freelist.c} | 30 +- com32/lib/{sys => syslinux}/idle.c | 2 +- com32/{libutil/idle.c => lib/syslinux/initramfs.c} | 54 +- .../idle.c => lib/syslinux/initramfs_archive.c} | 29 +- com32/lib/syslinux/initramfs_file.c | 163 +++++ .../idle.c => lib/syslinux/initramfs_loadfile.c} | 30 +- com32/lib/syslinux/load_linux.c | 308 +++++++++ com32/{libutil => lib/syslinux}/loadfile.c | 2 +- com32/{libutil/idle.c => lib/syslinux/localboot.c} | 30 +- com32/lib/syslinux/memmap.c | 153 +++++ com32/{libutil => lib/syslinux}/movebits.c | 270 +++++--- .../lib/{sys/idle.c => syslinux/pxe_get_cached.c} | 62 +- .../{libutil/idle.c => lib/syslinux/run_command.c} | 35 +- .../{libutil/idle.c => lib/syslinux/run_default.c} | 31 +- com32/lib/syslinux/shuffle.c | 91 +++ com32/lib/{sys/idle.c => syslinux/shuffle_pm.c} | 50 +- com32/lib/{sys/idle.c => syslinux/shuffle_rm.c} | 50 +- com32/lib/syslinux/zonelist.c | 242 +++++++ com32/lib/vsnprintf.c | 2 +- com32/lib/vsscanf.c | 2 +- com32/libutil/Makefile | 3 +- com32/libutil/include/libutil.h | 16 +- com32/libutil/include/movebits.h | 47 -- com32/libutil/libutil_com.a | Bin 21144 -> 16092 bytes com32/libutil/libutil_lnx.a | Bin 65908 -> 43936 bytes com32/modules/Makefile | 11 +- com32/modules/cpuid.c | 2 +- com32/modules/cpuidtest.c | 16 +- com32/modules/cpuidtest.c32 | Bin 10244 -> 10244 bytes com32/modules/dmitest.c32 | Bin 21772 -> 21772 bytes com32/modules/elf.c | 287 ++++++++ com32/modules/elf.c32 | Bin 0 -> 6564 bytes com32/modules/ethersel.c | 37 +- com32/modules/ethersel.c32 | Bin 8484 -> 5796 bytes com32/modules/linux.c | 237 +++++++ com32/modules/linux.c32 | Bin 0 -> 12460 bytes com32/modules/mboot.c32 | Bin 47276 -> 47276 bytes com32/modules/menu.c32 | Bin 31324 -> 31324 bytes com32/modules/menumain.c | 2 +- com32/modules/pcitest.c | 55 +- com32/modules/pcitest.c32 | Bin 10532 -> 5896 bytes com32/modules/readconfig.c | 6 +- com32/modules/vesamenu.c32 | Bin 118464 -> 118468 bytes com32/samples/Makefile | 4 +- com32/samples/fancyhello.c32 | Bin 8528 -> 8528 bytes com32/samples/fancyhello.lnx | Bin 10768 -> 10764 bytes com32/samples/hello.c32 | Bin 4876 -> 4876 bytes com32/samples/keytest.c32 | Bin 9424 -> 9296 bytes com32/samples/keytest.lnx | Bin 16462 -> 15939 bytes comboot.doc | 118 +++- comboot.inc | 111 ++- dos/syslinux.c | 6 +- dos/syslinux.com | Bin 18236 -> 18556 bytes extlinux.asm | 6 +- extlinux.bin | Bin 10761 -> 11065 bytes extlinux.bss | Bin 512 -> 512 bytes extlinux.sys | Bin 10249 -> 10553 bytes extlinux/ext2_fs.h | 26 +- extlinux/extlinux | Bin 21132 -> 21436 bytes extlinux/extlinux.c | 2 +- font.inc | 2 +- getc.inc | 2 +- isolinux-debug.bin | Bin 11737 -> 12041 bytes isolinux.asm | 36 +- isolinux.bin | Bin 11093 -> 11397 bytes keywords.inc | 16 +- layout.inc | 2 +- ldlinux.asm | 14 +- ldlinux.bin | Bin 10825 -> 11129 bytes ldlinux.bss | Bin 512 -> 512 bytes ldlinux.sys | Bin 10313 -> 10617 bytes mbr/Makefile | 2 +- mbr/checksize.pl | 3 +- mbr/mbr.S | 57 +- mbr/mbr.bin | Bin 440 -> 440 bytes mbr/mbr.elf | Bin 4080 -> 4084 bytes mbr/mbr.lst | 741 ++++++++++----------- mbr/mbr.o | Bin 1780 -> 1784 bytes mbr/oldmbr.asm | 35 +- memdisk/memdisk | Bin 20056 -> 20056 bytes memdisk/memdisk.asm | 2 +- memdisk/memdisk16.asm | 2 +- memdisk/setup.c | 2 +- menu/libmenu/des.c | 18 +- mkdiskimage | 10 +- mtools/syslinux | Bin 21524 -> 21828 bytes parseconfig.inc | 6 +- ppmtolss16 | 2 +- pxelinux.0 | Bin 13522 -> 13822 bytes pxelinux.asm | 6 +- pxelinux.doc | 18 +- rllpack.inc | 2 +- runkernel.inc | 10 +- sample/Makefile | 2 +- sample/filetest.c | 2 +- stack.inc | 2 +- syslinux.doc | 2 +- syslinux.spec | 32 +- ui.inc | 4 +- unix/syslinux | Bin 21340 -> 21644 bytes unix/syslinux-nomtools | Bin 21340 -> 21644 bytes unix/syslinux.c | 24 +- version | 2 +- version.gen | 4 +- version.h | 4 +- win32/Makefile | 2 +- win32/hello.exe | Bin 10752 -> 10752 bytes win32/syslinux.c | 4 +- win32/syslinux.exe | Bin 30208 -> 30720 bytes 177 files changed, 4586 insertions(+), 1561 deletions(-) create mode 100644 com32/include/assert.h create mode 100644 com32/include/elf.h create mode 100644 com32/include/sys/elf32.h create mode 100644 com32/include/sys/elf64.h create mode 100644 com32/include/sys/elfcommon.h copy com32/{libutil/idle.c => include/syslinux/boot.h} (65%) copy com32/{libutil/idle.c => include/syslinux/bootpm.h} (69%) copy com32/{lib/sys/idle.c => include/syslinux/bootrm.h} (57%) create mode 100644 com32/include/syslinux/config.h copy com32/{lib/sys/idle.c => include/syslinux/features.h} (67%) rename com32/include/{syslinux.h => syslinux/idle.h} (90%) copy com32/{libutil/include/libutil.h => include/syslinux/io.h} (83%) create mode 100644 com32/include/syslinux/linux.h rename com32/{libutil/include => include/syslinux}/loadfile.h (100%) create mode 100644 com32/include/syslinux/movebits.h create mode 100644 com32/include/syslinux/pxe.h copy com32/{libutil/idle.c => include/syslinux/resolve.h} (81%) copy com32/{libutil/idle.c => include/syslinux/video.h} (77%) rename com32/{modules/pci.c => lib/pci/scan.c} (50%) copy com32/{libutil/idle.c => lib/syslinux/addlist.c} (75%) copy com32/{libutil/include/libutil.h => lib/syslinux/cleanup.c} (82%) copy com32/{libutil/idle.c => lib/syslinux/config.c} (77%) copy com32/lib/{sys/idle.c => syslinux/dump_mmap.c} (69%) copy com32/{libutil/idle.c => lib/syslinux/dump_movelist.c} (72%) copy com32/{libutil/idle.c => lib/syslinux/features.c} (70%) copy com32/{libutil/idle.c => lib/syslinux/freelist.c} (80%) copy com32/lib/{sys => syslinux}/idle.c (98%) copy com32/{libutil/idle.c => lib/syslinux/initramfs.c} (58%) copy com32/{libutil/idle.c => lib/syslinux/initramfs_archive.c} (75%) create mode 100644 com32/lib/syslinux/initramfs_file.c copy com32/{libutil/idle.c => lib/syslinux/initramfs_loadfile.c} (72%) create mode 100644 com32/lib/syslinux/load_linux.c rename com32/{libutil => lib/syslinux}/loadfile.c (97%) copy com32/{libutil/idle.c => lib/syslinux/localboot.c} (80%) create mode 100644 com32/lib/syslinux/memmap.c rename com32/{libutil => lib/syslinux}/movebits.c (56%) copy com32/lib/{sys/idle.c => syslinux/pxe_get_cached.c} (54%) copy com32/{libutil/idle.c => lib/syslinux/run_command.c} (74%) rename com32/{libutil/idle.c => lib/syslinux/run_default.c} (81%) create mode 100644 com32/lib/syslinux/shuffle.c copy com32/lib/{sys/idle.c => syslinux/shuffle_pm.c} (58%) rename com32/lib/{sys/idle.c => syslinux/shuffle_rm.c} (58%) create mode 100644 com32/lib/syslinux/zonelist.c delete mode 100644 com32/libutil/include/movebits.h create mode 100644 com32/modules/elf.c create mode 100755 com32/modules/elf.c32 rewrite com32/modules/ethersel.c32 (90%) create mode 100644 com32/modules/linux.c create mode 100755 com32/modules/linux.c32 rewrite com32/modules/menu.c32 (64%) rewrite com32/modules/pcitest.c32 (85%) rewrite com32/samples/keytest.c32 (61%) rewrite extlinux.bin (82%) rewrite extlinux.sys (83%) rewrite extlinux/extlinux (60%) rewrite isolinux-debug.bin (77%) rewrite isolinux.bin (79%) rewrite ldlinux.bin (83%) rewrite ldlinux.sys (84%) rewrite mbr/mbr.lst (67%) rewrite mbr/mbr.o (64%) rewrite pxelinux.0 (82%) diff --git a/NEWS b/NEWS index abff5966..c683b32a 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,7 @@ 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.40: +Changes in 3.50: * New keywords allow the type of file to be specified in the configuration file. * It is now supported to load a different configuration file @@ -12,6 +12,17 @@ Changes in 3.40: internationalization of menu messages. * A new feature, TEXT HELP, allows the administrator to set a multi-line help message for individual selections. + * Fix API call 0x0012 (Cleanup, shuffle and boot.) + * New API call "Cleanup, shuffle and boot to flat protected mode" + * New API call "Cleanup, shuffle and boot to real mode", + similar to API call 0x0012 but allows arbitrary register setting. + * Introduce a library interface for loading arbitrary binary + formats with relatively easily understood code. See + the elf.c32 module for an example on how to use it. + * New module "elf.c32", to load a protected-mode ELF kernel. + * MBR (old and new): Fix bug in CHS mode when LBA > + 65535*sectors. + * vesamenu: fix decoding of palettized PNG images. Changes in 3.36: * MEMDISK: Disable EDD by default on floppy disks. EDD can be diff --git a/bcopy32.inc b/bcopy32.inc index d98785c4..a7b6d6bd 100644 --- a/bcopy32.inc +++ b/bcopy32.inc @@ -1,6 +1,6 @@ ;; ----------------------------------------------------------------------- ;; -;; Copyright 1994-2005 H. Peter Anvin - All Rights Reserved +;; Copyright 1994-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 @@ -58,27 +58,32 @@ bcopy_gdt_size: equ $-bcopy_gdt ; 32-bit copy, overlap safe ; ; Inputs: -; ESI - source pointer +; ESI - source pointer (-1 means do bzero rather than bcopy) ; EDI - target pointer ; ECX - byte count ; DF - zero ; ; Outputs: -; ESI - first byte after source +; ESI - first byte after source (garbage if ESI == -1 on entry) ; EDI - first byte after target ; ECX - zero ; bcopy: push eax + push ebx push esi push edi push ecx pushf ; Saves, among others, the IF flag push ds push es + push fs + push gs cli call enable_a20 + mov bx,ss ; Save the stack segment value! + o32 lgdt [cs:bcopy_gdt] mov eax,cr0 or al,1 @@ -89,10 +94,19 @@ bcopy: push eax mov es,ax mov ds,ax - ; Don't mess with ss, fs, and gs. They are never changed - ; and should be able to make it back out of protected mode. - ; This works because (and only because) we don't take - ; interrupt in protected mode. + ; Set ss, fs, and gs, in case we're on a virtual machine + ; running on Intel VT hardware -- it can't deal with a + ; partial transition, for no good reason. However, + ; ss is NOT zero in general, so we have to preserve + ; the value. + + mov ax,18h ; Real-mode-like segment + mov fs,ax + mov gs,ax + mov ss,ax + + cmp esi,-1 + je .bzero cmp esi,edi ; If source > destination, we might ja .reverse ; have to copy backwards @@ -125,6 +139,18 @@ bcopy: push eax a32 rep movsd cld + jmp .exit + +.bzero: + xor eax,eax + mov si,cx ; Save low bits + and si,3 + shr ecx,2 + a32 rep stosd + + mov cx,si ; Write fractional dword + a32 rep stosb + ; jmp .exit .exit: mov ax,18h ; "Real-mode-like" data segment @@ -137,6 +163,9 @@ bcopy: push eax jmp 0:.in_rm .in_rm: ; Back in real mode + mov ss,bx + pop gs + pop fs pop es pop ds call disable_a20 @@ -147,6 +176,7 @@ bcopy: push eax pop esi add edi,eax add esi,eax + pop ebx pop eax ret @@ -161,7 +191,7 @@ bcopy: push eax ; %define io_delay call _io_delay %define IO_DELAY_PORT 80h ; Invalid port (we hope!) -%define disable_wait 32 ; How long to wait for a disable +%define disable_wait 32 ; How long to wait for a disable ; Note the skip of 2 here %define A20_DUNNO 0 ; A20 type unknown @@ -394,7 +424,7 @@ try_wbinvd: %endif ; -; bcopy_over_self: +; shuffle_and_boot: ; ; This routine is used to shuffle memory around, followed by ; invoking an entry point somewhere in low memory. This routine @@ -412,18 +442,26 @@ try_wbinvd: ; SS register. That is the responsibility of the caller. ; ; Inputs: -; DS:BX -> Pointer to list of (dst, src, len) pairs -; AX -> Number of list entries +; DS:BX -> Pointer to list of (dst, src, len) pairs(*) +; AX -> Number of list entries ; [CS:EntryPoint] -> CS:IP to jump to ; On stack - initial state (fd, ad, ds, es, fs, gs) ; +; (*) If dst == -1, then (src, len) entry refers to a set of new +; descriptors to load. +; If src == -1, then the memory pointed to by (dst, len) is bzeroed; +; this is handled inside the bcopy routine. +; shuffle_and_boot: +.restart: and ax,ax jz .done .loop: mov edi,[bx] mov esi,[bx+4] mov ecx,[bx+8] + cmp edi, -1 + je .reload call bcopy add bx,12 dec ax @@ -438,6 +476,38 @@ shuffle_and_boot: popfd jmp far [cs:EntryPoint] +.reload: + mov bx, trackbuf ; Next descriptor + movzx edi,bx + push ecx ; Save byte count + call bcopy + pop eax ; Byte count + xor edx,edx + mov ecx,12 + div ecx ; Convert to descriptor count + jmp .restart + +; +; trampoline_to_pm: +; +; This routine is chained to from shuffle_and_boot to invoke a +; flat 32-bit protected mode operating system. +; +trampoline_to_pm: + cli + call enable_a20 + 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 + mov ds,ax + mov ss,ax + mov fs,ax + mov gs,ax + jmp 020h:TrampolineBuf ; 20h = 32-bit code segment + align 2 A20List dw a20_dunno, a20_none, a20_bios, a20_kbc, a20_fast A20DList dw a20d_dunno, a20d_none, a20d_bios, a20d_kbc, a20d_fast @@ -454,3 +524,10 @@ __bcopy_size equ $-__bcopy_start EntryPoint resd 1 ; CS:IP for shuffle_and_boot A20Test resw 1 ; Counter for testing status of A20 A20Tries resb 1 ; Times until giving up on A20 + +; +; This buffer contains synthesized code for shuffle-and-boot. +; 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 diff --git a/bootsect.inc b/bootsect.inc index 7c288daf..3a5fd1b9 100644 --- a/bootsect.inc +++ b/bootsect.inc @@ -92,8 +92,8 @@ load_bootsec: ; replace_bootstrap_one: - push word trackbuf ; Address of descriptor list push word 1 ; Length of descriptor list + push word trackbuf ; Address of descriptor list ; Fall through ; @@ -149,7 +149,8 @@ replace_bootstrap: cmp dword [fs:bx], "$PnP" jz .foundpnp inc bx - jnz .findpnp + 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 @@ -171,8 +172,8 @@ replace_bootstrap: %endif .donepnp: - pop ax ; Copy list count pop bx ; Copy from... + pop ax ; Copy list count cli mov cx,es diff --git a/com32/Makefile b/com32/Makefile index 7e7bfcb6..090ea93e 100644 --- a/com32/Makefile +++ b/com32/Makefile @@ -1,4 +1,4 @@ SUBDIRS = lib libutil modules samples all tidy clean spotless install: - for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done + set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done diff --git a/com32/include/assert.h b/com32/include/assert.h new file mode 100644 index 00000000..b303bb98 --- /dev/null +++ b/com32/include/assert.h @@ -0,0 +1,7 @@ +#ifndef _ASSERT_H +#define _ASSERT_H + +/* Assert not currently supported */ +#define assert(X) ((void)0) + +#endif /* _ASSERT_H */ diff --git a/com32/include/bitsize/stdint.h b/com32/include/bitsize/stdint.h index 40b46496..bdfe1328 100644 --- a/com32/include/bitsize/stdint.h +++ b/com32/include/bitsize/stdint.h @@ -5,12 +5,12 @@ #ifndef _BITSIZE_STDINT_H #define _BITSIZE_STDINT_H -typedef signed char int8_t; +typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long long int int64_t; -typedef unsigned char uint8_t; +typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long long int uint64_t; diff --git a/com32/include/colortbl.h b/com32/include/colortbl.h index ac3f340d..05add6d4 100644 --- a/com32/include/colortbl.h +++ b/com32/include/colortbl.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- * - * + * * Copyright 2006 H. Peter Anvin - All Rights Reserved * * Permission is hereby granted, free of charge, to any person @@ -10,10 +10,10 @@ * 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 diff --git a/com32/include/com32.h b/com32/include/com32.h index 16cd792b..f1df2d61 100644 --- a/com32/include/com32.h +++ b/com32/include/com32.h @@ -39,7 +39,7 @@ typedef struct { reg32_t edi; /* Offset 8 */ reg32_t esi; /* Offset 12 */ reg32_t ebp; /* Offset 16 */ - reg32_t _unused; /* Offset 20 */ + reg32_t _unused_esp; /* Offset 20 */ reg32_t ebx; /* Offset 24 */ reg32_t edx; /* Offset 28 */ reg32_t ecx; /* Offset 32 */ diff --git a/com32/include/dmi/dmi.h b/com32/include/dmi/dmi.h index 5e72b82c..ceed3b4d 100644 --- a/com32/include/dmi/dmi.h +++ b/com32/include/dmi/dmi.h @@ -13,7 +13,7 @@ #ifndef DMI_H #define DMI_H -#define u32 unsigned int +#define u32 unsigned int #define u16 unsigned short #define u8 unsigned char #define PAGE_SIZE 4096 diff --git a/com32/include/dmi/dmi_base_board.h b/com32/include/dmi/dmi_base_board.h index 8de8adc0..d6634c01 100644 --- a/com32/include/dmi/dmi_base_board.h +++ b/com32/include/dmi/dmi_base_board.h @@ -14,11 +14,11 @@ #define DMI_BASE_BOARD_H #include "stdbool.h" -#define BASE_BOARD_MANUFACTURER_SIZE 32 -#define BASE_BOARD_PRODUCT_NAME_SIZE 32 -#define BASE_BOARD_VERSION_SIZE 16 -#define BASE_BOARD_SERIAL_SIZE 32 -#define BASE_BOARD_ASSET_TAG_SIZE 32 +#define BASE_BOARD_MANUFACTURER_SIZE 32 +#define BASE_BOARD_PRODUCT_NAME_SIZE 32 +#define BASE_BOARD_VERSION_SIZE 16 +#define BASE_BOARD_SERIAL_SIZE 32 +#define BASE_BOARD_ASSET_TAG_SIZE 32 #define BASE_BOARD_LOCATION_SIZE 32 #define BASE_BOARD_FEATURES_SIZE 32 #define BASE_BOARD_TYPE_SIZE 32 diff --git a/com32/include/dmi/dmi_bios.h b/com32/include/dmi/dmi_bios.h index 735647ff..d9be233b 100644 --- a/com32/include/dmi/dmi_bios.h +++ b/com32/include/dmi/dmi_bios.h @@ -14,10 +14,10 @@ #define DMI_BIOS_H #include "stdbool.h" -#define BIOS_VENDOR_SIZE 32 -#define BIOS_VERSION_SIZE 32 -#define BIOS_RELEASE_SIZE 16 -#define BIOS_RUNTIME_SIZE_UNIT_SIZE 16 +#define BIOS_VENDOR_SIZE 32 +#define BIOS_VERSION_SIZE 32 +#define BIOS_RELEASE_SIZE 16 +#define BIOS_RUNTIME_SIZE_UNIT_SIZE 16 #define BIOS_ROM_UNIT_SIZE 16 #define BIOS_BIOS_REVISION_SIZE 16 #define BIOS_FIRMWARE_REVISION_SIZE 16 @@ -98,7 +98,7 @@ static const char *bios_charac_x1_strings[]={ "I2O boot is supported", "LS-120 boot is supported", "ATAPI Zip drive boot is supported", - "IEEE 1394 boot is supported", + "IEEE 1394 boot is supported", "Smart battery is supported" /* 7 */ }; @@ -119,7 +119,7 @@ static const char *bios_charac_x2_strings[]={ "BIOS boot specification is supported", /* 0 */ "Function key-initiated network boot is supported", "Targeted content distribution is supported" /* 2 */ -}; +}; /* this struct have BIOS_CHAR_X2_NB_ELEMENTS */ /* each bool is associated to the relevant message above */ @@ -130,9 +130,9 @@ bool target_content_distribution; } __attribute__((__packed__)) s_characteristics_x2; typedef struct { -char vendor[BIOS_VENDOR_SIZE]; -char version[BIOS_VERSION_SIZE]; -char release_date[BIOS_RELEASE_SIZE]; +char vendor[BIOS_VENDOR_SIZE]; +char version[BIOS_VERSION_SIZE]; +char release_date[BIOS_RELEASE_SIZE]; u16 address; u16 runtime_size; char runtime_size_unit[BIOS_RUNTIME_SIZE_UNIT_SIZE]; diff --git a/com32/include/dmi/dmi_chassis.h b/com32/include/dmi/dmi_chassis.h index 933b80b9..1456ede9 100644 --- a/com32/include/dmi/dmi_chassis.h +++ b/com32/include/dmi/dmi_chassis.h @@ -13,32 +13,32 @@ #ifndef DMI_CHASSIS_H #define DMI_CHASSIS_H -#define CHASSIS_MANUFACTURER_SIZE 32 -#define CHASSIS_TYPE_SIZE 16 -#define CHASSIS_LOCK_SIZE 16 -#define CHASSIS_VERSION_SIZE 16 -#define CHASSIS_SERIAL_SIZE 32 -#define CHASSIS_ASSET_TAG_SIZE 32 -#define CHASSIS_BOOT_UP_STATE_SIZE 32 -#define CHASSIS_POWER_SUPPLY_STATE_SIZE 32 -#define CHASSIS_THERMAL_STATE_SIZE 32 -#define CHASSIS_SECURITY_STATUS_SIZE 32 -#define CHASSIS_OEM_INFORMATION_SIZE 32 +#define CHASSIS_MANUFACTURER_SIZE 32 +#define CHASSIS_TYPE_SIZE 16 +#define CHASSIS_LOCK_SIZE 16 +#define CHASSIS_VERSION_SIZE 16 +#define CHASSIS_SERIAL_SIZE 32 +#define CHASSIS_ASSET_TAG_SIZE 32 +#define CHASSIS_BOOT_UP_STATE_SIZE 32 +#define CHASSIS_POWER_SUPPLY_STATE_SIZE 32 +#define CHASSIS_THERMAL_STATE_SIZE 32 +#define CHASSIS_SECURITY_STATUS_SIZE 32 +#define CHASSIS_OEM_INFORMATION_SIZE 32 typedef struct { -char manufacturer[CHASSIS_MANUFACTURER_SIZE]; -char type[CHASSIS_TYPE_SIZE]; -char lock[CHASSIS_LOCK_SIZE]; -char version[CHASSIS_VERSION_SIZE]; -char serial[CHASSIS_SERIAL_SIZE]; -char asset_tag[CHASSIS_ASSET_TAG_SIZE]; -char boot_up_state[CHASSIS_BOOT_UP_STATE_SIZE]; -char power_supply_state[CHASSIS_POWER_SUPPLY_STATE_SIZE]; -char thermal_state[CHASSIS_THERMAL_STATE_SIZE]; -char security_status[CHASSIS_SECURITY_STATUS_SIZE]; -char oem_information[CHASSIS_OEM_INFORMATION_SIZE]; -u16 height; -u16 nb_power_cords; +char manufacturer[CHASSIS_MANUFACTURER_SIZE]; +char type[CHASSIS_TYPE_SIZE]; +char lock[CHASSIS_LOCK_SIZE]; +char version[CHASSIS_VERSION_SIZE]; +char serial[CHASSIS_SERIAL_SIZE]; +char asset_tag[CHASSIS_ASSET_TAG_SIZE]; +char boot_up_state[CHASSIS_BOOT_UP_STATE_SIZE]; +char power_supply_state[CHASSIS_POWER_SUPPLY_STATE_SIZE]; +char thermal_state[CHASSIS_THERMAL_STATE_SIZE]; +char security_status[CHASSIS_SECURITY_STATUS_SIZE]; +char oem_information[CHASSIS_OEM_INFORMATION_SIZE]; +u16 height; +u16 nb_power_cords; } s_chassis; static const char *dmi_chassis_type(u8 code) diff --git a/com32/include/dmi/dmi_processor.h b/com32/include/dmi/dmi_processor.h index 34177202..26ac97ac 100644 --- a/com32/include/dmi/dmi_processor.h +++ b/com32/include/dmi/dmi_processor.h @@ -14,21 +14,21 @@ #define DMI_PROCESSOR_H #include "stdbool.h" -#define PROCESSOR_SOCKET_DESIGNATION_SIZE 32 -#define PROCESSOR_TYPE_SIZE 32 +#define PROCESSOR_SOCKET_DESIGNATION_SIZE 32 +#define PROCESSOR_TYPE_SIZE 32 #define PROCESSOR_FAMILY_SIZE 32 #define PROCESSOR_MANUFACTURER_SIZE 64 -#define PROCESSOR_VERSION_SIZE 32 -#define PROCESSOR_VOLTAGE_SIZE 16 -#define PROCESSOR_STATUS_SIZE 16 +#define PROCESSOR_VERSION_SIZE 32 +#define PROCESSOR_VOLTAGE_SIZE 16 +#define PROCESSOR_STATUS_SIZE 16 #define PROCESSOR_UPGRADE_SIZE 16 #define PROCESSOR_CACHE_SIZE 16 -#define PROCESSOR_SERIAL_SIZE 32 -#define PROCESSOR_ASSET_TAG_SIZE 32 +#define PROCESSOR_SERIAL_SIZE 32 +#define PROCESSOR_ASSET_TAG_SIZE 32 #define PROCESSOR_PART_NUMBER_SIZE 32 #define PROCESSOR_ID_SIZE 32 -#define PROCESSOR_FLAGS_ELEMENTS 32 +#define PROCESSOR_FLAGS_ELEMENTS 32 /* Intel AP-485 revision 28, table 5 */ static const char *cpu_flags_strings[32]={ "FPU (Floating-point unit on-chip)", /* 0 */ @@ -111,12 +111,12 @@ u8 minor_stepping; } __attribute__((__packed__)) s_signature; typedef struct { -char socket_designation[PROCESSOR_SOCKET_DESIGNATION_SIZE]; -char type[PROCESSOR_TYPE_SIZE]; -char family[PROCESSOR_FAMILY_SIZE]; -char manufacturer[PROCESSOR_MANUFACTURER_SIZE]; -char version[PROCESSOR_VERSION_SIZE]; -float voltage; +char socket_designation[PROCESSOR_SOCKET_DESIGNATION_SIZE]; +char type[PROCESSOR_TYPE_SIZE]; +char family[PROCESSOR_FAMILY_SIZE]; +char manufacturer[PROCESSOR_MANUFACTURER_SIZE]; +char version[PROCESSOR_VERSION_SIZE]; +float voltage; u16 external_clock; u16 max_speed; u16 current_speed; @@ -125,10 +125,10 @@ char upgrade[PROCESSOR_UPGRADE_SIZE]; char cache1[PROCESSOR_CACHE_SIZE]; char cache2[PROCESSOR_CACHE_SIZE]; char cache3[PROCESSOR_CACHE_SIZE]; -char serial[PROCESSOR_SERIAL_SIZE]; -char asset_tag[PROCESSOR_ASSET_TAG_SIZE]; -char part_number[PROCESSOR_PART_NUMBER_SIZE]; -char id[PROCESSOR_ID_SIZE]; +char serial[PROCESSOR_SERIAL_SIZE]; +char asset_tag[PROCESSOR_ASSET_TAG_SIZE]; +char part_number[PROCESSOR_PART_NUMBER_SIZE]; +char id[PROCESSOR_ID_SIZE]; s_cpu_flags cpu_flags; s_signature signature; } s_processor; @@ -414,7 +414,7 @@ static const char *dmi_processor_family(u8 code) }; if(family[code]!=NULL) { - return family[code]; + return family[code]; } return out_of_spec; } diff --git a/com32/include/dmi/dmi_system.h b/com32/include/dmi/dmi_system.h index 02f2382c..27293649 100644 --- a/com32/include/dmi/dmi_system.h +++ b/com32/include/dmi/dmi_system.h @@ -13,24 +13,24 @@ #ifndef DMI_SYSTEM_H #define DMI_SYSTEM_H -#define SYSTEM_MANUFACTURER_SIZE 32 -#define SYSTEM_PRODUCT_NAME_SIZE 32 -#define SYSTEM_VERSION_SIZE 16 -#define SYSTEM_SERIAL_SIZE 32 -#define SYSTEM_UUID_SIZE 40 +#define SYSTEM_MANUFACTURER_SIZE 32 +#define SYSTEM_PRODUCT_NAME_SIZE 32 +#define SYSTEM_VERSION_SIZE 16 +#define SYSTEM_SERIAL_SIZE 32 +#define SYSTEM_UUID_SIZE 40 #define SYSTEM_WAKEUP_TYPE_SIZE 32 -#define SYSTEM_SKU_NUMBER_SIZE 32 +#define SYSTEM_SKU_NUMBER_SIZE 32 #define SYSTEM_FAMILY_SIZE 32 typedef struct { -char manufacturer[SYSTEM_MANUFACTURER_SIZE]; -char product_name[SYSTEM_PRODUCT_NAME_SIZE]; -char version[SYSTEM_VERSION_SIZE]; -char serial[SYSTEM_SERIAL_SIZE]; -char uuid[SYSTEM_UUID_SIZE]; -char wakeup_type[SYSTEM_WAKEUP_TYPE_SIZE]; -char sku_number[SYSTEM_SKU_NUMBER_SIZE]; -char family[SYSTEM_FAMILY_SIZE]; +char manufacturer[SYSTEM_MANUFACTURER_SIZE]; +char product_name[SYSTEM_PRODUCT_NAME_SIZE]; +char version[SYSTEM_VERSION_SIZE]; +char serial[SYSTEM_SERIAL_SIZE]; +char uuid[SYSTEM_UUID_SIZE]; +char wakeup_type[SYSTEM_WAKEUP_TYPE_SIZE]; +char sku_number[SYSTEM_SKU_NUMBER_SIZE]; +char family[SYSTEM_FAMILY_SIZE]; } s_system; #endif diff --git a/com32/include/elf.h b/com32/include/elf.h new file mode 100644 index 00000000..c543a812 --- /dev/null +++ b/com32/include/elf.h @@ -0,0 +1,11 @@ +/* + * elf.h + */ + +#ifndef _ELF_H +#define _ELF_H + +#include +#include + +#endif /* _ELF_H */ diff --git a/com32/include/klibc/compiler.h b/com32/include/klibc/compiler.h index f8065066..02af9a0e 100644 --- a/com32/include/klibc/compiler.h +++ b/com32/include/klibc/compiler.h @@ -112,4 +112,7 @@ #define __constructor __attribute__((constructor)) #define __destructor __attribute__((destructor)) +/* Packed structures */ +#define __packed __attribute__((packed)) + #endif diff --git a/com32/include/netinet/in.h b/com32/include/netinet/in.h index e6a20489..5fd71a6a 100644 --- a/com32/include/netinet/in.h +++ b/com32/include/netinet/in.h @@ -37,4 +37,11 @@ static inline uint64_t __htonq(uint64_t v) #define htonq(x) __htonq(x) #define ntohq(x) __htonq(x) +typedef uint32_t in_addr_t; +typedef uint16_t in_port_t; + +struct in_addr { + in_addr_t s_addr; +}; + #endif /* _NETINET_IN_H */ diff --git a/com32/include/sys/elf32.h b/com32/include/sys/elf32.h new file mode 100644 index 00000000..e4df8cec --- /dev/null +++ b/com32/include/sys/elf32.h @@ -0,0 +1,113 @@ +/* + * sys/elf32.h + */ + +#ifndef _SYS_ELF32_H +#define _SYS_ELF32_H + +#include + +/* ELF standard typedefs (yet more proof that was way overdue) */ +typedef uint16_t Elf32_Half; +typedef int16_t Elf32_SHalf; +typedef uint32_t Elf32_Word; +typedef int32_t Elf32_Sword; +typedef uint64_t Elf32_Xword; +typedef int64_t Elf32_Sxword; + +typedef uint32_t Elf32_Off; +typedef uint32_t Elf32_Addr; +typedef uint16_t Elf32_Section; + +/* Dynamic header */ + +typedef struct elf32_dyn { + Elf32_Sword d_tag; + union { + Elf32_Sword d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +/* Relocations */ + +#define ELF32_R_SYM(x) ((x) >> 8) +#define ELF32_R_TYPE(x) ((x) & 0xff) + +typedef struct elf32_rel { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct elf32_rela { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +/* Symbol */ + +typedef struct elf32_sym { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Half st_shndx; +} Elf32_Sym; + +/* Main file header */ + +typedef struct elf32_hdr { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +/* Program header */ + +typedef struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +/* Section header */ + +typedef struct elf32_shdr { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +/* Note header */ +typedef struct elf32_note { + Elf32_Word n_namesz; /* Name size */ + Elf32_Word n_descsz; /* Content size */ + Elf32_Word n_type; /* Content type */ +} Elf32_Nhdr; + +#endif /* _SYS_ELF32_H */ diff --git a/com32/include/sys/elf64.h b/com32/include/sys/elf64.h new file mode 100644 index 00000000..0b486ac2 --- /dev/null +++ b/com32/include/sys/elf64.h @@ -0,0 +1,113 @@ +/* + * sys/elf64.h + */ + +#ifndef _SYS_ELF64_H +#define _SYS_ELF64_H + +#include + +/* ELF standard typedefs (yet more proof that was way overdue) */ +typedef uint16_t Elf64_Half; +typedef int16_t Elf64_SHalf; +typedef uint32_t Elf64_Word; +typedef int32_t Elf64_Sword; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +typedef uint64_t Elf64_Off; +typedef uint64_t Elf64_Addr; +typedef uint16_t Elf64_Section; + +/* Dynamic header */ + +typedef struct elf64_dyn { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + +/* Relocations */ + +#define ELF64_R_SYM(x) ((x) >> 32) +#define ELF64_R_TYPE(x) ((x) & 0xffffffff) + +typedef struct elf64_rel { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + +typedef struct elf64_rela { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; + +/* Symbol */ + +typedef struct elf64_sym { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; + +/* Main file header */ + +typedef struct elf64_hdr { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +/* Program header */ + +typedef struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + +/* Section header */ + +typedef struct elf64_shdr { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + +/* Note header */ +typedef struct elf64_note { + Elf64_Word n_namesz; /* Name size */ + Elf64_Word n_descsz; /* Content size */ + Elf64_Word n_type; /* Content type */ +} Elf64_Nhdr; + +#endif /* _SYS_ELF64_H */ diff --git a/com32/include/sys/elfcommon.h b/com32/include/sys/elfcommon.h new file mode 100644 index 00000000..cc8f9235 --- /dev/null +++ b/com32/include/sys/elfcommon.h @@ -0,0 +1,187 @@ +/* + * sys/elfcommon.h + */ + +#ifndef _SYS_ELFCOMMON_H +#define _SYS_ELFCOMMON_H + +#include + +/* Segment types */ +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_LOOS 0x60000000 +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff +#define PT_GNU_EH_FRAME 0x6474e550 /* Extension, eh? */ + +/* ELF file types */ +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + +/* ELF machine types */ +#define EM_NONE 0 +#define EM_M32 1 +#define EM_SPARC 2 +#define EM_386 3 +#define EM_68K 4 +#define EM_88K 5 +#define EM_486 6 /* Not used in Linux at least */ +#define EM_860 7 +#define EM_MIPS 8 /* R3k, bigendian(?) */ +#define EM_MIPS_RS4_BE 10 /* R4k BE */ +#define EM_PARISC 15 +#define EM_SPARC32PLUS 18 +#define EM_PPC 20 +#define EM_PPC64 21 +#define EM_S390 22 +#define EM_SH 42 +#define EM_SPARCV9 43 /* v9 = SPARC64 */ +#define EM_H8_300H 47 +#define EM_H8S 48 +#define EM_IA_64 50 /* Itanic */ +#define EM_X86_64 62 +#define EM_CRIS 76 +#define EM_V850 87 +#define EM_ALPHA 0x9026 /* Interrim Alpha that stuck around */ +#define EM_CYGNUS_V850 0x9080 /* Old v850 ID used by Cygnus */ +#define EM_S390_OLD 0xA390 /* Obsolete interrim value for S/390 */ + +/* Dynamic type values */ +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff + +/* Auxilliary table entries */ +#define AT_NULL 0 /* end of vector */ +#define AT_IGNORE 1 /* entry should be ignored */ +#define AT_EXECFD 2 /* file descriptor of program */ +#define AT_PHDR 3 /* program headers for program */ +#define AT_PHENT 4 /* size of program header entry */ +#define AT_PHNUM 5 /* number of program headers */ +#define AT_PAGESZ 6 /* system page size */ +#define AT_BASE 7 /* base address of interpreter */ +#define AT_FLAGS 8 /* flags */ +#define AT_ENTRY 9 /* entry point of program */ +#define AT_NOTELF 10 /* program is not ELF */ +#define AT_UID 11 /* real uid */ +#define AT_EUID 12 /* effective uid */ +#define AT_GID 13 /* real gid */ +#define AT_EGID 14 /* effective gid */ +#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ +#define AT_CLKTCK 17 /* frequency at which times() increments */ +/* 18..22 = ? */ +#define AT_SECURE 23 /* secure mode boolean */ + +/* Program header permission flags */ +#define PF_X 0x1 +#define PF_W 0x2 +#define PF_R 0x4 + +/* Section header types */ +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_NUM 12 +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0xffffffff + +/* Section header flags */ +#define SHF_WRITE 0x1 +#define SHF_ALLOC 0x2 +#define SHF_EXECINSTR 0x4 +#define SHF_MASKPROC 0xf0000000 + +/* Special section numbers */ +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_HIPROC 0xff1f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_HIRESERVE 0xffff + +/* Lenght of magic at the start of a file */ +#define EI_NIDENT 16 + +/* Magic number constants... */ +#define EI_MAG0 0 /* e_ident[] indexes */ +#define EI_MAG1 1 +#define EI_MAG2 2 +#define EI_MAG3 3 +#define EI_CLASS 4 +#define EI_DATA 5 +#define EI_VERSION 6 +#define EI_OSABI 7 +#define EI_PAD 8 + +#define ELFMAG0 0x7f /* EI_MAG */ +#define ELFMAG1 'E' +#define ELFMAG2 'L' +#define ELFMAG3 'F' +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define ELFCLASSNONE 0 /* EI_CLASS */ +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +#define ELFDATANONE 0 /* e_ident[EI_DATA] */ +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 + +#define EV_NONE 0 /* e_version, EI_VERSION */ +#define EV_CURRENT 1 +#define EV_NUM 2 + +#define ELFOSABI_NONE 0 +#define ELFOSABI_LINUX 3 + +#endif /* _SYS_ELFCOMMON_H */ diff --git a/com32/include/sys/pci.h b/com32/include/sys/pci.h index 4862cda9..b511477b 100644 --- a/com32/include/sys/pci.h +++ b/com32/include/sys/pci.h @@ -6,15 +6,13 @@ #define MAX_VENDOR_NAME_SIZE 255 #define MAX_PRODUCT_NAME_SIZE 255 -#define MAX_PCI_DEVICES 32 +#define MAX_PCI_DEVICES 32 #define MAX_PCI_BUSES 255 typedef uint32_t pciaddr_t; typedef struct { - char vendor_name[MAX_VENDOR_NAME_SIZE]; uint16_t vendor; - char product_name[MAX_PRODUCT_NAME_SIZE]; uint16_t product; uint16_t sub_vendor; uint16_t sub_product; diff --git a/com32/include/sys/times.h b/com32/include/sys/times.h index 8d03af0a..dd60a3c5 100644 --- a/com32/include/sys/times.h +++ b/com32/include/sys/times.h @@ -11,7 +11,7 @@ struct tms { /* Empty */ }; -#define HZ 18 /* Piddly resolution... */ +#define HZ 18 /* Piddly resolution... */ #define CLK_TCK HZ typedef uint16_t clock_t; diff --git a/com32/libutil/idle.c b/com32/include/syslinux/boot.h similarity index 65% copy from com32/libutil/idle.c copy to com32/include/syslinux/boot.h index 0cb7d000..9b1709f6 100644 --- a/com32/libutil/idle.c +++ b/com32/include/syslinux/boot.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,29 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * syslinux/boot.h * - * What to do in a busy loop... + * SYSLINUX boot API invocation */ -#ifdef __COM32__ +#ifndef _SYSLINUX_BOOT_H +#define _SYSLINUX_BOOT_H -#include +#include +#include -void do_idle(void) -{ - syslinux_idle(); -} +__noreturn syslinux_run_command(const char *); +__noreturn syslinux_run_default(void); -#else +void syslinux_local_boot(uint16_t flags); -#include +void syslinux_final_cleanup(uint16_t flags); -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ -} +void syslinux_chain_bootstrap(uint16_t flags, const void *bootstrap, + uint32_t bootstrap_len, uint32_t edx, + uint32_t esi, uint16_t ds); -#endif +void syslinux_run_kernel_image(const char *filename, const char *cmdline, + uint32_t ipappend_flags, uint32_t type); + +#endif /* _SYSLINUX_BOOT_H */ diff --git a/com32/libutil/idle.c b/com32/include/syslinux/bootpm.h similarity index 69% copy from com32/libutil/idle.c copy to com32/include/syslinux/bootpm.h index 0cb7d000..cfe28103 100644 --- a/com32/libutil/idle.c +++ b/com32/include/syslinux/bootpm.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,27 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * syslinux/bootpm.h * - * What to do in a busy loop... + * Data structures for shuffle and boot to protected mode */ -#ifdef __COM32__ +#ifndef _SYSLINUX_BOOTPM_H +#define _SYSLINUX_BOOTPM_H -#include +#include -void do_idle(void) -{ - syslinux_idle(); -} +struct syslinux_pm_regs { + uint32_t eax; /* Offset 0 */ + uint32_t ecx; /* Offset 4 */ + uint32_t edx; /* Offset 8 */ + uint32_t ebx; /* Offset 12 */ + uint32_t esp; /* Offset 16 */ + uint32_t ebp; /* Offset 20 */ + uint32_t esi; /* Offset 24 */ + uint32_t edi; /* Offset 28 */ -#else + uint32_t eip; /* Offset 32 */ +}; -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ -} - -#endif +#endif /* _SYSLINUX_BOOTPM_H */ diff --git a/com32/lib/sys/idle.c b/com32/include/syslinux/bootrm.h similarity index 57% copy from com32/lib/sys/idle.c copy to com32/include/syslinux/bootrm.h index 6f65c436..2a3b618b 100644 --- a/com32/lib/sys/idle.c +++ b/com32/include/syslinux/bootrm.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,32 +26,40 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * syslinux/bootrm.h * - * What to do in a busy loop... + * Data structures for shuffle and boot to protected mode */ -#include -#include +#ifndef _SYSLINUX_BOOTRM_H +#define _SYSLINUX_BOOTRM_H + +#include #include -#include -void syslinux_idle(void) -{ - static int do_idle = 1; - static const com32sys_t sys_idle = { - .eax.l = 0x0013, - }; - com32sys_t idle_result; +/* This register set is used by the shuffle and boot interface. It is + a completely different structure from what the __intcall() and + __farcall() interfaces use! */ +struct syslinux_rm_regs { + uint16_t es; /* Offset 0 */ + uint16_t _unused_cs; /* Offset 2 */ + uint16_t ds; /* Offset 4 */ + uint16_t ss; /* Offset 6 */ + uint16_t fs; /* Offset 8 */ + uint16_t gs; /* Offset 10 */ - /* This call isn't supported on SYSLINUX < 3.08, but all it does - is return an error, so we don't care. */ + reg32_t eax; /* Offset 12 */ + reg32_t ecx; /* Offset 16 */ + reg32_t edx; /* Offset 20 */ + reg32_t ebx; /* Offset 24 */ + reg32_t esp; /* Offset 28 */ + reg32_t ebp; /* Offset 32 */ + reg32_t esi; /* Offset 36 */ + reg32_t edi; /* Offset 40 */ - if ( do_idle ) { - __intcall(0x22, &sys_idle, &idle_result); + uint16_t ip; /* Offset 44 */ + uint16_t cs; /* Offset 46 */ +}; - do_idle = ~idle_result.eflags.l & EFLAGS_CF; - } - cpu_relax(); -} +#endif /* _SYSLINUX_BOOTRM_H */ diff --git a/com32/include/syslinux/config.h b/com32/include/syslinux/config.h new file mode 100644 index 00000000..d0cb4c26 --- /dev/null +++ b/com32/include/syslinux/config.h @@ -0,0 +1,140 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * syslinux/config.h + * + * Query syslinux configuration information. + */ + +#ifndef _SYSLINUX_CONFIG_H +#define _SYSLINUX_CONFIG_H + +#include + +enum syslinux_filesystem { + SYSLINUX_FS_UNKNOWN = 0x30, + SYSLINUX_FS_SYSLINUX = 0x31, + SYSLINUX_FS_PXELINUX = 0x32, + SYSLINUX_FS_ISOLINUX = 0x33, + SYSLINUX_FS_EXTLINUX = 0x34, +}; + +struct syslinux_version { + uint16_t version; /* (major << 8)+minor */ + uint16_t max_api; + enum syslinux_filesystem filesystem; + const char *version_string; + const char *copyright_string; +}; + +extern struct syslinux_version __syslinux_version; +static inline const struct syslinux_version * +syslinux_version(void) +{ + return &__syslinux_version; +} + +union syslinux_derivative_info { + struct { + uint8_t filesystem; + uint8_t ah; + } c; /* common */ + struct { + uint16_t ax; + uint16_t cx; + uint16_t dx; + const void *esbx; + const void *fssi; + const void *gsdi; + } r; /* raw */ + struct { + uint8_t filesystem; + uint8_t ah; + uint8_t sector_shift; + uint8_t ch; + uint8_t drive_number; + uint8_t dh; + const void *ptab_ptr; + } disk; /* syslinux/extlinux */ + struct { + uint8_t filesystem; + uint8_t ah; + uint16_t cx; + uint16_t apiver; + const void *pxenvptr; + const void *stack; + } pxe; /* pxelinux */ + struct { + uint8_t filesystem; + uint8_t ah; + uint8_t sector_shift; + uint8_t ch; + uint8_t drive_number; + uint8_t dh; + const void *spec_packet; + } iso; /* isolinux */ +}; + +union syslinux_derivative_info __syslinux_derivative_info; +static inline const union syslinux_derivative_info * +syslinux_derivative_info(void) +{ + return &__syslinux_derivative_info; +} + +struct syslinux_serial_console_info { + uint16_t iobase; + uint16_t divisor; + uint16_t flowctl; +}; + +extern struct syslinux_serial_console_info __syslinux_serial_console_info; +static inline const struct syslinux_serial_console_info * +syslinux_serial_console_info(void) +{ + return &__syslinux_serial_console_info; +} + +extern const char *__syslinux_config_file; +static inline const char *syslinux_config_file(void) +{ + return __syslinux_config_file; +} + +struct syslinux_ipappend_strings { + int count; + const char * const *ptr; +}; +extern struct syslinux_ipappend_strings __syslinux_ipappend_strings; +static inline const struct syslinux_ipappend_strings * +syslinux_ipappend_strings(void) +{ + return &__syslinux_ipappend_strings; +} + +#endif /* _SYSLINUX_CONFIG_H */ diff --git a/com32/lib/sys/idle.c b/com32/include/syslinux/features.h similarity index 67% copy from com32/lib/sys/idle.c copy to com32/include/syslinux/features.h index 6f65c436..e3da12e2 100644 --- a/com32/lib/sys/idle.c +++ b/com32/include/syslinux/features.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,33 +25,26 @@ * * ----------------------------------------------------------------------- */ -/* - * idle.c - * - * What to do in a busy loop... - */ - -#include -#include -#include -#include - -void syslinux_idle(void) -{ - static int do_idle = 1; - static const com32sys_t sys_idle = { - .eax.l = 0x0013, - }; - com32sys_t idle_result; +#ifndef _SYSLINUX_FEATURES_H +#define _SYSLINUX_FEATURES_H - /* This call isn't supported on SYSLINUX < 3.08, but all it does - is return an error, so we don't care. */ +#define SYSLINUX_FEATURE_LOCAL_BOOT (0*8+0) +#define SYSLINUX_FEATURE_NOOP_IDLE (0*8+1) - if ( do_idle ) { - __intcall(0x22, &sys_idle, &idle_result); +extern struct __syslinux_feature_flags { + unsigned int len; + const unsigned char *ptr; +} __syslinux_feature_flags; - do_idle = ~idle_result.eflags.l & EFLAGS_CF; - } +static inline int syslinux_has_feature(unsigned int __flag) +{ + unsigned int __byte = __flag >> 3; + unsigned int __bit = __flag & 7; - cpu_relax(); + if (__byte <= __syslinux_feature_flags.len) + return (__syslinux_feature_flags.ptr[__byte] >> __bit) & 1; + else + return 0; } + +#endif /* _SYSLINUX_FEATURE_H */ diff --git a/com32/include/syslinux.h b/com32/include/syslinux/idle.h similarity index 90% rename from com32/include/syslinux.h rename to com32/include/syslinux/idle.h index 614e9b1b..d8f015c7 100644 --- a/com32/include/syslinux.h +++ b/com32/include/syslinux/idle.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 2005-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 @@ -26,13 +26,11 @@ * ----------------------------------------------------------------------- */ /* - * syslinux.h - * - * SYSLINUX-specific functions + * syslinux/idle.h */ -#ifndef _SYSLINUX_H -#define _SYSLINUX_H +#ifndef _SYSLINUX_IDLE_H +#define _SYSLINUX_IDLE_H void syslinux_idle(void); diff --git a/com32/libutil/include/libutil.h b/com32/include/syslinux/io.h similarity index 83% copy from com32/libutil/include/libutil.h copy to com32/include/syslinux/io.h index 3b6278f9..a8d05cc5 100644 --- a/com32/libutil/include/libutil.h +++ b/com32/include/syslinux/io.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,14 +26,14 @@ * ----------------------------------------------------------------------- */ /* - * libutil.h + * syslinux/io.h * - * Misc libutil functions + * SYSLINUX low-level I/O functions */ -#ifndef LIBUTIL_LIBUTIL_H -#define LIBUTIL_LIBUTIL_H +#ifndef _SYSLINUX_IO_H +#define _SYSLINUX_IO_H -void do_idle(void); +int syslinux_read_disk(void *buf, uint32_t sector, uint16_t count); -#endif +#endif /* _SYSLINUX_IO_H */ diff --git a/com32/include/syslinux/linux.h b/com32/include/syslinux/linux.h new file mode 100644 index 00000000..6b2fecbc --- /dev/null +++ b/com32/include/syslinux/linux.h @@ -0,0 +1,77 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * syslinux/linux.h + * + * Definitions used to boot a Linux kernel + */ + +#ifndef _SYSLINUX_LINUX_H +#define _SYSLINUX_LINUX_H + +#include +#include + +/* A chunk of an initramfs. These are kept as a doubly-linked + circular list with headnode; the headnode is distinguished by + having len == 0. The data pointer can be NULL if data_len is zero; + if data_len < len then the balance of the region is zeroed. */ + +struct initramfs { + struct initramfs *prev, *next; + size_t len; + size_t align; + const void *data; + size_t data_len; +}; +#define INITRAMFS_MAX_ALIGN 4096 + +int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, + struct initramfs *initramfs, + char *cmdline, + uint16_t video_mode, + uint32_t mem_limit); + +/* Initramfs manipulation functions */ + +struct initramfs *initramfs_init(void); +int initramfs_add_data(struct initramfs *ihead, const void *data, + size_t data_len, size_t len, size_t align); +int initramfs_mknod(struct initramfs *ihead, const char *filename, + int do_mkdir, + uint16_t mode, size_t len, + uint32_t major, uint32_t minor); +int initramfs_add_file(struct initramfs *ihead, const void *data, + size_t data_len, size_t len, + const char *filename, int do_mkdir, uint32_t mode); +int initramfs_load_file(struct initramfs *ihead, const char *src_filename, + const char *dst_filename, int do_mkdir, uint32_t mode); +int initramfs_add_trailer(struct initramfs *ihead); +int initramfs_load_archive(struct initramfs *ihead, const char *filename); + +#endif /* _SYSLINUX_LINUX_H */ diff --git a/com32/libutil/include/loadfile.h b/com32/include/syslinux/loadfile.h similarity index 100% rename from com32/libutil/include/loadfile.h rename to com32/include/syslinux/loadfile.h diff --git a/com32/include/syslinux/movebits.h b/com32/include/syslinux/movebits.h new file mode 100644 index 00000000..60fcebd7 --- /dev/null +++ b/com32/include/syslinux/movebits.h @@ -0,0 +1,94 @@ +#ifndef _SYSLINUX_MOVEBITS_H +#define _SYSLINUX_MOVEBITS_H + +#include +#include + +typedef uint32_t addr_t; + +/* + * A syslinux_movelist is a linked list of move operations. The ordering + * is important, so no sorting requirement can be imposed. + */ +struct syslinux_movelist { + addr_t dst; + addr_t src; + addr_t len; + struct syslinux_movelist *next; +}; + +/* + * A syslinux_memmap is a sorted, linked list of memory regions, + * guaranteed to satisfy the constraint that no adjacent zones have + * the same type. Undefined memory ranges are represented with entries; + * they have type SMT_UNDEFINED. + * + * Note that there is no length field. The length of a region is obtained + * by looking at the start of the next entry in the chain. + */ +enum syslinux_memmap_types { + SMT_ERROR = -2, /* Internal error token */ + SMT_END = -1, /* End of list */ + SMT_UNDEFINED = 0, /* Unknown range */ + SMT_FREE = 1, /* Available memory */ + SMT_RESERVED, /* Unusable memory */ + SMT_ALLOC, /* Memory allocated by user */ + SMT_ZERO, /* Memory that should be zeroed */ +}; + +struct syslinux_memmap { + addr_t start; + enum syslinux_memmap_types type; + struct syslinux_memmap *next; +}; + + +/* Defined in and respectively */ +struct syslinux_pm_regs; +struct syslinux_rm_regs; + +/* + * moves is computed from "fraglist" and "memmap". Areas that are + * to be zeroed should be marked as such in the memmap, not in the + * fraglist. + */ + +int syslinux_compute_movelist(struct syslinux_movelist **movelist, + struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap); + +struct syslinux_memmap *syslinux_memory_map(void); +void syslinux_free_movelist(struct syslinux_movelist *); +int syslinux_add_movelist(struct syslinux_movelist **, + addr_t dst, addr_t src, addr_t len); +int syslinux_allocate_from_list(struct syslinux_movelist **freelist, + addr_t dst, addr_t len); +int syslinux_prepare_shuffle(struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap); +int syslinux_shuffle_boot_rm(struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap, + uint16_t bootflags, + struct syslinux_rm_regs *regs); +int syslinux_shuffle_boot_pm(struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap, + uint16_t bootflags, + struct syslinux_pm_regs *regs); + +/* Operatons on struct syslinux_memmap */ +struct syslinux_memmap *syslinux_init_memmap(void); +int syslinux_add_memmap(struct syslinux_memmap **list, + addr_t start, addr_t len, + enum syslinux_memmap_types type); +enum syslinux_memmap_types syslinux_memmap_type(struct syslinux_memmap *list, + addr_t start, addr_t len); +int syslinux_memmap_largest(struct syslinux_memmap *list, + enum syslinux_memmap_types type, + addr_t *start, addr_t *len); +void syslinux_free_memmap(struct syslinux_memmap *list); +struct syslinux_memmap *syslinux_dup_memmap(struct syslinux_memmap *list); + +/* Debugging functions */ +void syslinux_dump_movelist(FILE *file, struct syslinux_movelist *ml); +void syslinux_dump_memmap(FILE *file, struct syslinux_memmap *memmap); + +#endif /* _SYSLINUX_MOVEBITS_H */ diff --git a/com32/include/syslinux/pxe.h b/com32/include/syslinux/pxe.h new file mode 100644 index 00000000..3b9108e9 --- /dev/null +++ b/com32/include/syslinux/pxe.h @@ -0,0 +1,532 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * syslinux/pxe.h + * + * PXE definitions and function prototypes for SYSLINUX + */ + +#ifndef _SYSLINUX_PXE_H +#define _SYSLINUX_PXE_H + +#include +#include +#include + +/* PXE spec structures and definitions. These mostly follow the PXE + spec, except when the PXE spec is unnecessarily stupid. Of course, + that is most of the time. */ + +/* Basic types; use Unix-like _t convention instead of SCREAMING; also + re-use types we already have, like in_addr_t. */ + +typedef uint16_t pxenv_status_t; + +#define MAC_ADDR_LEN 16 +typedef uint8_t mac_addr_t[MAC_ADDR_LEN]; + +/* "Protected mode segment descriptor" according to PXE... */ +typedef struct { + uint16_t segaddr; + uint32_t physaddr; + uint16_t segsize; +} __packed pxe_segdesc_t; + +typedef struct { + uint16_t offs; + uint16_t seg; +} segoff16_t; + +/* Function calling structures and constants */ + +typedef struct s_PXENV_GET_CACHED_INFO +{ + pxenv_status_t Status; + uint16_t PacketType; +#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1 +#define PXENV_PACKET_TYPE_DHCP_ACK 2 +#define PXENV_PACKET_TYPE_CACHED_REPLY 3 + uint16_t BufferSize; + segoff16_t Buffer; + uint16_t BufferLimit; +} __packed t_PXENV_GET_CACHED_INFO; + +typedef struct s_PXENV_START_UNDI { + pxenv_status_t Status; + uint16_t AX; + uint16_t BX; + uint16_t DX; + uint16_t DI; + uint16_t ES; +} __packed t_PXENV_START_UNDI; + +typedef struct s_PXENV_STOP_UNDI +{ + pxenv_status_t Status; +} __packed t_PXENV_STOP_UNDI; + +typedef struct s_PXENV_START_BASE +{ + pxenv_status_t Status; +} __packed t_PXENV_START_BASE; + +typedef struct s_PXENV_STOP_BASE +{ + pxenv_status_t Status; +} __packed t_PXENV_STOP_BASE; + +typedef struct s_PXENV_TFTP_OPEN +{ + pxenv_status_t Status; + in_addr_t ServerIPAddress; + in_addr_t GatewayIPAddress; + uint8_t FileName[128]; + in_port_t TFTPPort; + uint16_t PacketSize; +} __packed t_PXENV_TFTP_OPEN; + +typedef struct s_PXENV_TFTP_CLOSE +{ + pxenv_status_t Status; +} __packed t_PXENV_TFTP_CLOSE; + +typedef struct s_PXENV_TFTP_READ +{ + pxenv_status_t Status; + uint16_t PacketNumber; + uint16_t BufferSize; + segoff16_t Buffer; +} __packed t_PXENV_TFTP_READ; + +typedef struct s_PXENV_TFTP_READ_FILE +{ + pxenv_status_t Status; + uint8_t FileName[128]; + uint32_t BufferSize; + void * Buffer; + in_addr_t ServerIPAddress; + in_addr_t GatewayIPAddress; + in_addr_t McastIPAddress; + in_port_t TFTPClntPort; + in_port_t TFTPSrvPort; + uint16_t TFTPOpenTimeOut; + uint16_t TFTPReopenDelay; +} __packed t_PXENV_TFTP_READ_FILE; + +typedef struct s_PXENV_TFTP_GET_FSIZE +{ + pxenv_status_t Status; + in_addr_t ServerIPAddress; + in_addr_t GatewayIPAddress; + uint8_t FileName[128]; + uint32_t FileSize; +} __packed t_PXENV_TFTP_GET_FSIZE; + +typedef struct s_PXENV_UDP_OPEN +{ + pxenv_status_t status; + in_addr_t src_ip; +} __packed t_PXENV_UDP_OPEN; + +typedef struct s_PXENV_UDP_CLOSE +{ + pxenv_status_t status; +} __packed t_PXENV_UDP_CLOSE; + +typedef struct s_PXENV_UDP_WRITE +{ + pxenv_status_t status; + in_addr_t ip; + in_addr_t gw; + in_port_t src_port; + in_port_t dst_port; + uint16_t buffer_size; + segoff16_t buffer; +} __packed t_PXENV_UDP_WRITE; + +typedef struct s_PXENV_UDP_READ +{ + pxenv_status_t status; + in_addr_t src_ip; + in_addr_t dest_ip; + in_port_t s_port; + in_port_t d_port; + uint16_t buffer_size; + segoff16_t buffer; +} __packed t_PXENV_UDP_READ; + +typedef struct s_PXENV_UNDI_STARTUP +{ + pxenv_status_t Status; +} __packed t_PXENV_UNDI_STARTUP; + +typedef struct s_PXENV_UNDI_CLEANUP { + pxenv_status_t Status; +} __packed t_PXENV_UNDI_CLEANUP; + +typedef struct s_PXENV_UNDI_INITIALIZE { + pxenv_status_t Status; + void * ProtocolIni; + uint8_t reserved[8]; +} __packed t_PXENV_UNDI_INITIALIZE; + +#define MAXNUM_MCADDR 8 +typedef struct s_PXENV_UNDI_MCAST_ADDRESS +{ + uint16_t MCastAddrCount; + mac_addr_t McastAddr[MAXNUM_MCADDR]; +} __packed t_PXENV_UNDI_MCAST_ADDRESS; + +typedef struct s_PXENV_UNDI_RESET +{ + pxenv_status_t Status; + t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf; +} __packed t_PXENV_UNDI_RESET; + +typedef struct s_PXENV_UNDI_SHUTDOWN +{ + pxenv_status_t Status; +} __packed t_PXENV_UNDI_SHUTDOWN; + +typedef struct s_PXENV_UNDI_OPEN +{ + pxenv_status_t Status; + uint16_t OpenFlag; + uint16_t PktFilter; +#define FLTR_DIRECTED 0x0001 +#define FLTR_BRDCST 0x0002 +#define FLTR_PRMSCS 0x0004 +#define FLTR_SRC_RTG 0x0008 + t_PXENV_UNDI_MCAST_ADDRESS + R_Mcast_Buf; +} __packed t_PXENV_UNDI_OPEN; + +typedef struct s_PXENV_UNDI_CLOSE +{ + pxenv_status_t Status; +} __packed t_PXENV_UNDI_CLOSE; + +typedef struct s_PXENV_UNDI_TRANSMIT +{ + pxenv_status_t Status; + uint8_t Protocol; +#define P_UNKNOWN 0 +#define P_IP 1 +#define P_ARP 2 +#define P_RARP 3 + uint8_t XmitFlag; +#define XMT_DESTADDR 0x0000 +#define XMT_BROADCAST 0x0001 + segoff16_t DestAddr; + segoff16_t TBD; + uint32_t Reserved[2]; +} __packed t_PXENV_UNDI_TRANSMIT; +#define MAX_DATA_BLKS 8 +typedef struct s_PXENV_UNDI_TBD +{ + uint16_t ImmedLength; + segoff16_t Xmit; + uint16_t DataBlkCount; + struct DataBlk + { + uint8_t TDPtrType; + uint8_t TDRsvdByte; + uint16_t TDDataLen; + segoff16_t TDDataPtr; + } DataBlock[MAX_DATA_BLKS]; +} __packed t_PXENV_UNDI_TBD; + +typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS +{ + pxenv_status_t Status; + t_PXENV_UNDI_MCAST_ADDRESS + R_Mcast_Buf; +} __packed t_PXENV_UNDI_SET_MCAST_ADDR; + +typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS +{ + pxenv_status_t Status; + mac_addr_t StationAddress; +} __packed t_PXENV_UNDI_SET_STATION_ADDR; + +typedef struct s_PXENV_UNDI_SET_PACKET_FILTER +{ + pxenv_status_t Status; + uint8_t filter; +} __packed t_PXENV_UNDI_SET_PACKET_FILTER; + +typedef struct s_PXENV_UNDI_GET_INFORMATION +{ + pxenv_status_t Status; + uint16_t BaseIo; + uint16_t IntNumber; + uint16_t MaxTranUnit; + uint16_t HwType; +#define ETHER_TYPE 1 +#define EXP_ETHER_TYPE 2 +#define IEEE_TYPE 6 +#define ARCNET_TYPE 7 + uint16_t HwAddrLen; + mac_addr_t CurrentNodeAddress; + mac_addr_t PermNodeAddress; + uint16_t ROMAddress; + uint16_t RxBufCt; + uint16_t TxBufCt; +} __packed t_PXENV_UNDI_GET_INFORMATION; + +typedef struct s_PXENV_UNDI_GET_STATISTICS +{ + pxenv_status_t Status; + uint32_t XmtGoodFrames; + uint32_t RcvGoodFrames; + uint32_t RcvCRCErrors; + uint32_t RcvResourceErrors; +} __packed t_PXENV_UNDI_GET_STATISTICS; + +typedef struct s_PXENV_UNDI_CLEAR_STATISTICS +{ + pxenv_status_t Status; +} __packed t_PXENV_UNDI_CLEAR_STATISTICS; + +typedef struct s_PXENV_UNDI_INITIATE_DIAGS +{ + pxenv_status_t Status; +} __packed t_PXENV_UNDI_INITIATE_DIAGS; + +typedef struct s_PXENV_UNDI_FORCE_INTERRUPT +{ + pxenv_status_t Status; +} __packed t_PXENV_UNDI_FORCE_INTERRUPT; + +typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS +{ + pxenv_status_t Status; + in_addr_t InetAddr; + mac_addr_t MediaAddr; +} __packed t_PXENV_UNDI_GET_MCAST_ADDR; + +typedef struct s_PXENV_UNDI_GET_NIC_TYPE +{ + pxenv_status_t Status; + uint8_t NicType; +#define PCI_NIC 2 +#define PnP_NIC 3 +#define CardBus_NIC 4 + union { + struct { + uint16_t Vendor_ID; + uint16_t Dev_ID; + uint8_t Base_Class; + uint8_t Sub_Class; + uint8_t Prog_Intf; + uint8_t Rev; + uint16_t BusDevFunc; + uint16_t SubVendor_ID; + uint16_t SubDevice_ID; + } pci, cardbus; + struct { + uint32_t EISA_Dev_ID; + uint8_t Base_Class; + uint8_t Sub_Class; + uint8_t Prog_Intf; + uint16_t CardSelNum; + } __packed pnp; + } __packed info; +} __packed t_PXENV_UNDI_GET_NIC_TYPE; + +typedef struct s_PXENV_UNDI_GET_IFACE_INFO +{ + pxenv_status_t Status; + uint8_t IfaceType[16]; + uint32_t LinkSpeed; + uint32_t ServiceFlags; + uint32_t Reserved[4]; +} __packed t_PXENV_UNDI_GET_NDIS_INFO; + +typedef struct s_PXENV_UNDI_GET_STATE +{ +#define PXE_UNDI_GET_STATE_STARTED 1 +#define PXE_UNDI_GET_STATE_INITIALIZED 2 +#define PXE_UNDI_GET_STATE_OPENED 3 + pxenv_status_t Status; + uint8_t UNDIstate; +} __packed t_PXENV_UNDI_GET_STATE; + +typedef struct s_PXENV_UNDI_ISR +{ + pxenv_status_t Status; + uint16_t FuncFlag; + uint16_t BufferLength; + uint16_t FrameLength; + uint16_t FrameHeaderLength; + segoff16_t Frame; + uint8_t ProtType; + uint8_t PktType; +} __packed t_PXENV_UNDI_ISR; +#define PXENV_UNDI_ISR_IN_START 1 +#define PXENV_UNDI_ISR_IN_PROCESS 2 +#define PXENV_UNDI_ISR_IN_GET_NEXT 3 +/* One of these will be returned for + PXENV_UNDI_ISR_IN_START */ +#define PXENV_UNDI_ISR_OUT_OURS 0 +#define PXENV_UNDI_USR_OUT_NOT_OURS 1 +/* One of these will be returned for + PXENV_UNDI_ISR_IN_PROCESS and + PXENV_UNDI_ISR_IN_GET_NEXT */ +#define PXENV_UNDI_ISR_OUT_DONE 0 +#define PXENV_UNDI_ISR_OUT_TRANSMIT 2 +#define PXENV_UNDI_ISR_OUT_RECEIVE 3 +#define PXENV_UNDI_ISR_OUT_BUSY 4 + +/* Function numbers and error codes */ + +#define PXENV_TFTP_OPEN 0x0020 +#define PXENV_TFTP_CLOSE 0x0021 +#define PXENV_TFTP_READ 0x0022 +#define PXENV_TFTP_READ_FILE 0x0023 +#define PXENV_TFTP_READ_FILE_PMODE 0x0024 +#define PXENV_TFTP_GET_FSIZE 0x0025 + +#define PXENV_UDP_OPEN 0x0030 +#define PXENV_UDP_CLOSE 0x0031 +#define PXENV_UDP_READ 0x0032 +#define PXENV_UDP_WRITE 0x0033 + +#define PXENV_START_UNDI 0x0000 +#define PXENV_UNDI_STARTUP 0x0001 +#define PXENV_UNDI_CLEANUP 0x0002 +#define PXENV_UNDI_INITIALIZE 0x0003 +#define PXENV_UNDI_RESET_NIC 0x0004 +#define PXENV_UNDI_SHUTDOWN 0x0005 +#define PXENV_UNDI_OPEN 0x0006 +#define PXENV_UNDI_CLOSE 0x0007 +#define PXENV_UNDI_TRANSMIT 0x0008 +#define PXENV_UNDI_SET_MCAST_ADDR 0x0009 +#define PXENV_UNDI_SET_STATION_ADDR 0x000A +#define PXENV_UNDI_SET_PACKET_FILTER 0x000B +#define PXENV_UNDI_GET_INFORMATION 0x000C +#define PXENV_UNDI_GET_STATISTICS 0x000D +#define PXENV_UNDI_CLEAR_STATISTICS 0x000E +#define PXENV_UNDI_INITIATE_DIAGS 0x000F +#define PXENV_UNDI_FORCE_INTERRUPT 0x0010 +#define PXENV_UNDI_GET_MCAST_ADDR 0x0011 +#define PXENV_UNDI_GET_NIC_TYPE 0x0012 +#define PXENV_UNDI_GET_IFACE_INFO 0x0013 +#define PXENV_UNDI_ISR 0x0014 +#define PXENV_STOP_UNDI 0x0015 /* Overlap...? */ +#define PXENV_UNDI_GET_STATE 0x0015 /* Overlap...? */ + +#define PXENV_UNLOAD_STACK 0x0070 +#define PXENV_GET_CACHED_INFO 0x0071 +#define PXENV_RESTART_DHCP 0x0072 +#define PXENV_RESTART_TFTP 0x0073 +#define PXENV_MODE_SWITCH 0x0074 +#define PXENV_START_BASE 0x0075 +#define PXENV_STOP_BASE 0x0076 + +#define PXENV_EXIT_SUCCESS 0x0000 +#define PXENV_EXIT_FAILURE 0x0001 + +#define PXENV_STATUS_SUCCESS 0x00 +#define PXENV_STATUS_FAILURE 0x01 +#define PXENV_STATUS_BAD_FUNC 0x02 +#define PXENV_STATUS_UNSUPPORTED 0x03 +#define PXENV_STATUS_KEEP_UNDI 0x04 +#define PXENV_STATUS_KEEP_ALL 0x05 +#define PXENV_STATUS_OUT_OF_RESOURCES 0x06 +#define PXENV_STATUS_ARP_TIMEOUT 0x11 +#define PXENV_STATUS_UDP_CLOSED 0x18 +#define PXENV_STATUS_UDP_OPEN 0x19 +#define PXENV_STATUS_TFTP_CLOSED 0x1A +#define PXENV_STATUS_TFTP_OPEN 0x1B +#define PXENV_STATUS_MCOPY_PROBLEM 0x20 +#define PXENV_STATUS_BIS_INTEGRITY_FAILURE 0x21 +#define PXENV_STATUS_BIS_VALIDATE_FAILURE 0x22 +#define PXENV_STATUS_BIS_INIT_FAILURE 0x23 +#define PXENV_STATUS_BIS_SHUTDOWN_FAILURE 0x24 +#define PXENV_STATUS_BIS_GBOA_FAILURE 0x25 +#define PXENV_STATUS_BIS_FREE_FAILURE 0x26 +#define PXENV_STATUS_BIS_GSI_FAILURE 0x27 +#define PXENV_STATUS_BIS_BAD_CKSUM 0x28 +#define PXENV_STATUS_TFTP_CANNOT_ARP_ADDRESS 0x30 +#define PXENV_STATUS_TFTP_OPEN_TIMEOUT 0x32 + +#define PXENV_STATUS_TFTP_UNKNOWN_OPCODE 0x33 +#define PXENV_STATUS_TFTP_READ_TIMEOUT 0x35 +#define PXENV_STATUS_TFTP_ERROR_OPCODE 0x36 +#define PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION 0x38 +#define PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION 0x39 +#define PXENV_STATUS_TFTP_TOO_MANY_PACKAGES 0x3A +#define PXENV_STATUS_TFTP_FILE_NOT_FOUND 0x3B +#define PXENV_STATUS_TFTP_ACCESS_VIOLATION 0x3C +#define PXENV_STATUS_TFTP_NO_MCAST_ADDRESS 0x3D +#define PXENV_STATUS_TFTP_NO_FILESIZE 0x3E +#define PXENV_STATUS_TFTP_INVALID_PACKET_SIZE 0x3F +#define PXENV_STATUS_DHCP_TIMEOUT 0x51 +#define PXENV_STATUS_DHCP_NO_IP_ADDRESS 0x52 +#define PXENV_STATUS_DHCP_NO_BOOTFILE_NAME 0x53 +#define PXENV_STATUS_DHCP_BAD_IP_ADDRESS 0x54 +#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60 +#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61 +#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62 +#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63 +#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64 +#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65 +#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66 +#define PXENV_STATUS_UNDI_BAD_MAC_ADDRESS 0x67 +#define PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM 0x68 +#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69 +#define PXENV_STATUS_UNDI_INVALID_STATE 0x6A +#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6B +#define PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6C +#define PXENV_STATUS_BSTRAP_PROMPT_MENU 0x74 +#define PXENV_STATUS_BSTRAP_MCAST_ADDR 0x76 +#define PXENV_STATUS_BSTRAP_MISSING_LIST 0x77 +#define PXENV_STATUS_BSTRAP_NO_RESPONSE 0x78 +#define PXENV_STATUS_BSTRAP_FILE_TOO_BIG 0x79 +#define PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE 0xA0 +#define PXENV_STATUS_BINL_NO_PXE_SERVER 0xA1 +#define PXENV_STATUS_NOT_AVAILABLE_IN_PMODE 0xA2 +#define PXENV_STATUS_NOT_AVAILABLE_IN_RMODE 0xA3 +#define PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED 0xB0 +#define PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY 0xC0 +#define PXENV_STATUS_LOADER_NO_BC_ROMID 0xC1 +#define PXENV_STATUS_LOADER_BAD_BC_ROMID 0xC2 +#define PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE 0xC3 +#define PXENV_STATUS_LOADER_NO_UNDI_ROMID 0xC4 +#define PXENV_STATUS_LOADER_BAD_UNDI_ROMID 0xC5 +#define PXENV_STATUS_LOADER_BAD_UNDI_DRIVER_IMAGE 0xC6 +#define PXENV_STATUS_LOADER_NO_PXE_STRUCT 0xC8 +#define PXENV_STATUS_LOADER_NO_PXENV_STRUCT 0xC9 +#define PXENV_STATUS_LOADER_UNDI_START 0xCA +#define PXENV_STATUS_LOADER_BC_START 0xCB + +/* SYSLINUX-defined PXE utility functions */ +int pxe_get_cached_info(int level, void **buf, size_t *len); + +#endif /* _SYSLINUX_PXE_H */ diff --git a/com32/libutil/idle.c b/com32/include/syslinux/resolve.h similarity index 81% copy from com32/libutil/idle.c copy to com32/include/syslinux/resolve.h index 0cb7d000..96c4365c 100644 --- a/com32/libutil/idle.c +++ b/com32/include/syslinux/resolve.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,16 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * syslinux/resolve.h * - * What to do in a busy loop... + * Interface to the syslinux DNS query API */ -#ifdef __COM32__ +#ifndef _SYSLINUX_RESOLVE_H +#define _SYSLINUX_RESOLVE_H -#include +#include -void do_idle(void) -{ - syslinux_idle(); -} +in_addr_t syslinux_resolve_hostname(const char *); -#else - -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ -} - -#endif +#endif /* _SYSLINUX_RESOLVE_H */ diff --git a/com32/libutil/idle.c b/com32/include/syslinux/video.h similarity index 77% copy from com32/libutil/idle.c copy to com32/include/syslinux/video.h index 0cb7d000..237552fa 100644 --- a/com32/libutil/idle.c +++ b/com32/include/syslinux/video.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,18 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * syslinux/video.h * - * What to do in a busy loop... + * SYSLINUX video API functions. */ -#ifdef __COM32__ +#ifndef _SYSLINUX_VIDEO_H +#define _SYSLINUX_VIDEO_H -#include +#include -void do_idle(void) -{ - syslinux_idle(); -} +void syslinux_force_text_mode(void); +int syslinux_report_video_mode(uint16_t flags, uint16_t xsize, uint16_t ysize); +int syslinux_font_query(void **font); -#else - -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ -} - -#endif +#endif /* _SYSLINUX_API_H */ diff --git a/com32/include/tinyjpeg.h b/com32/include/tinyjpeg.h index d320f9bb..e88d09ad 100644 --- a/com32/include/tinyjpeg.h +++ b/com32/include/tinyjpeg.h @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -70,6 +70,3 @@ int tinyjpeg_set_flags(struct jdec_private *priv, int flags); #endif #endif - - - diff --git a/com32/lib/Makefile b/com32/lib/Makefile index 1bbfadeb..cbaec537 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -15,16 +15,16 @@ LIBOBJS = \ 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 \ - asprintf.o vasprintf.o strlcpy.o strlcat.o \ + asprintf.o vasprintf.o strlcpy.o strlcat.o \ vsscanf.o \ \ libgcc/__ashldi3.o libgcc/__udivdi3.o \ libgcc/__negdi2.o libgcc/__ashrdi3.o libgcc/__lshrdi3.o \ libgcc/__muldi3.o libgcc/__udivmoddi4.o libgcc/__umoddi3.o \ - libgcc/__divdi3.o libgcc/__moddi3.o \ + libgcc/__divdi3.o libgcc/__moddi3.o \ \ sys/intcall.o sys/farcall.o \ - sys/entry.o sys/exit.o sys/argv.o sys/times.o sys/idle.o \ + sys/entry.o sys/exit.o sys/argv.o sys/times.o \ sys/fileinfo.o sys/opendev.o sys/read.o sys/write.o sys/ftell.o \ sys/close.o sys/open.o sys/fileread.o sys/fileclose.o \ sys/isatty.o sys/fstat.o sys/openconsole.o sys/line_input.o \ @@ -40,16 +40,16 @@ LIBOBJS = \ \ sys/ansicon_write.o sys/ansiserial_write.o \ \ - sys/vesacon_write.o sys/vesaserial_write.o \ + sys/vesacon_write.o sys/vesaserial_write.o \ sys/vesa/initvesa.o sys/vesa/drawtxt.o sys/vesa/background.o \ sys/vesa/alphatbl.o \ \ - pci/cfgtype.o \ - pci/readb.o pci/readw.o pci/readl.o pci/readbios.o \ - pci/writeb.o pci/writew.o pci/writel.o pci/writebios.o \ + pci/cfgtype.o pci/scan.o \ + pci/readb.o pci/readw.o pci/readl.o pci/readbios.o \ + pci/writeb.o pci/writew.o pci/writel.o pci/writebios.o \ \ - zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/gzio.o \ - zlib/uncompr.o zlib/deflate.o zlib/trees.o zlib/zutil.o \ + zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/gzio.o \ + zlib/uncompr.o zlib/deflate.o zlib/trees.o zlib/zutil.o \ zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/inffast.o \ \ libpng/png.o libpng/pngset.o libpng/pngget.o libpng/pngrutil.o \ @@ -62,7 +62,24 @@ LIBOBJS = \ jpeg/rgb24.o jpeg/bgr24.o jpeg/yuv420p.o jpeg/grey.o \ jpeg/rgba32.o jpeg/bgra32.o \ \ - sys/x86_init_fpu.o math/pow.o math/strtod.o + sys/x86_init_fpu.o math/pow.o math/strtod.o \ + \ + syslinux/idle.o syslinux/features.o syslinux/config.o \ + \ + syslinux/addlist.o syslinux/freelist.o syslinux/memmap.o \ + syslinux/movebits.o syslinux/shuffle.o syslinux/shuffle_pm.o \ + syslinux/shuffle_rm.o syslinux/zonelist.o \ + syslinux/dump_mmap.o syslinux/dump_movelist.o \ + \ + syslinux/run_default.o syslinux/run_command.o \ + syslinux/cleanup.o syslinux/localboot.o \ + \ + syslinux/loadfile.o \ + syslinux/load_linux.o syslinux/initramfs.o \ + syslinux/initramfs_file.o syslinux/initramfs_loadfile.o \ + syslinux/initramfs_archive.o \ + \ + syslinux/pxe_get_cached.o BINDIR = /usr/bin LIBDIR = /usr/lib @@ -80,7 +97,7 @@ libcom32.a : $(LIBOBJS) tidy: rm -f sys/vesa/alphatbl.c find . -name \*.o -print | xargs -r rm -f - find . -name .\*.d -print | xargs -r rm -f + find . -name .\*.d -print | xargs -r rm -f clean: tidy rm -f *.a diff --git a/com32/lib/jpeg/bgr24.c b/com32/lib/jpeg/bgr24.c index 3f2f4f90..ffdcbdf9 100644 --- a/com32/lib/jpeg/bgr24.c +++ b/com32/lib/jpeg/bgr24.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -51,7 +51,7 @@ * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb - * + * ******************************************************************************/ static unsigned char clamp(int i) { @@ -61,7 +61,7 @@ static unsigned char clamp(int i) return 255; else return i; -} +} /** * YCrCb -> BGR24 (1x1) diff --git a/com32/lib/jpeg/bgra32.c b/com32/lib/jpeg/bgra32.c index fe6b813a..7e2c72bc 100644 --- a/com32/lib/jpeg/bgra32.c +++ b/com32/lib/jpeg/bgra32.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -51,7 +51,7 @@ * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb - * + * ******************************************************************************/ static unsigned char clamp(int i) { @@ -61,7 +61,7 @@ static unsigned char clamp(int i) return 255; else return i; -} +} /** * YCrCb -> BGRA32 (1x1) diff --git a/com32/lib/jpeg/decode1.c b/com32/lib/jpeg/decode1.c index 9d76a05a..554f7f11 100644 --- a/com32/lib/jpeg/decode1.c +++ b/com32/lib/jpeg/decode1.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -47,7 +47,7 @@ static void decode_MCU_1x1_1plane(struct jdec_private *priv) // Y tinyjpeg_process_Huffman_data_unit(priv, cY); IDCT(&priv->component_infos[cY], priv->Y, 8); - + // Cb tinyjpeg_process_Huffman_data_unit(priv, cCb); IDCT(&priv->component_infos[cCb], priv->Cb, 8); diff --git a/com32/lib/jpeg/decode3.c b/com32/lib/jpeg/decode3.c index 9e49eee0..2f79ec97 100644 --- a/com32/lib/jpeg/decode3.c +++ b/com32/lib/jpeg/decode3.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -40,14 +40,14 @@ #include "tinyjpeg-internal.h" /* - * Decode all the 3 components for 1x1 + * Decode all the 3 components for 1x1 */ static void decode_MCU_1x1_3planes(struct jdec_private *priv) { // Y tinyjpeg_process_Huffman_data_unit(priv, cY); IDCT(&priv->component_infos[cY], priv->Y, 8); - + // Cb tinyjpeg_process_Huffman_data_unit(priv, cCb); IDCT(&priv->component_infos[cCb], priv->Cb, 8); diff --git a/com32/lib/jpeg/grey.c b/com32/lib/jpeg/grey.c index bb55b7e2..0034ce2b 100644 --- a/com32/lib/jpeg/grey.c +++ b/com32/lib/jpeg/grey.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE diff --git a/com32/lib/jpeg/jidctflt.c b/com32/lib/jpeg/jidctflt.c index 1327b823..e5e66edc 100644 --- a/com32/lib/jpeg/jidctflt.c +++ b/com32/lib/jpeg/jidctflt.c @@ -5,7 +5,7 @@ * This file is part of the Independent JPEG Group's software. * * The authors make NO WARRANTY or representation, either express or implied, - * with respect to this software, its quality, accuracy, merchantability, or + * with respect to this software, its quality, accuracy, merchantability, or * fitness for a particular purpose. This software is provided "AS IS", and you, * its user, assume the entire risk as to its quality and accuracy. * @@ -25,16 +25,16 @@ * (3) Permission for use of this software is granted only if the user accepts * full responsibility for any undesirable consequences; the authors accept * NO LIABILITY for damages of any kind. - * + * * These conditions apply to any software derived from or based on the IJG code, * not just to the unmodified library. If you use our work, you ought to * acknowledge us. - * + * * Permission is NOT granted for the use of any IJG author's name or company name * in advertising or publicity relating to this software or products derived from * it. This software may be referred to only as "the Independent JPEG Group's * software". - * + * * We specifically permit and encourage the use of this software as the basis of * commercial products, provided that all warranty or liability claims are * assumed by the product vendor. @@ -80,7 +80,7 @@ #define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) -#if defined(__GNUC__) && defined(__i686__) || defined(__x86_64__) +#if defined(__GNUC__) && defined(__i686__) || defined(__x86_64__) static inline unsigned char descale_and_clamp(int x, int shift) { @@ -89,9 +89,9 @@ static inline unsigned char descale_and_clamp(int x, int shift) "\tsar %2,%1\n" "\tsub $-128,%1\n" "\tcmovl %5,%1\n" /* Use the sub to compare to 0 */ - "\tcmpl %4,%1\n" + "\tcmpl %4,%1\n" "\tcmovg %4,%1\n" - : "=r"(x) + : "=r"(x) : "0"(x), "i"(shift), "i"(1UL<<(shift-1)), "r" (0xff), "r" (0) ); return x; @@ -110,7 +110,7 @@ static inline unsigned char descale_and_clamp(int x, int shift) return 255; else if (x<0) return 0; - else + else return x; } #endif @@ -146,14 +146,14 @@ jpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) * With typical images and quantization tables, half or more of the * column DCT calculations can be simplified this way. */ - + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) { /* AC terms all zero */ FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - + wsptr[DCTSIZE*0] = dcval; wsptr[DCTSIZE*1] = dcval; wsptr[DCTSIZE*2] = dcval; @@ -162,13 +162,13 @@ jpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) wsptr[DCTSIZE*5] = dcval; wsptr[DCTSIZE*6] = dcval; wsptr[DCTSIZE*7] = dcval; - + inptr++; /* advance pointers to next column */ quantptr++; wsptr++; continue; } - + /* Even part */ tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); @@ -186,7 +186,7 @@ jpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) tmp3 = tmp10 - tmp13; tmp1 = tmp11 + tmp12; tmp2 = tmp11 - tmp12; - + /* Odd part */ tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); @@ -223,7 +223,7 @@ jpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) quantptr++; wsptr++; } - + /* Pass 2: process rows from work array, store into output array. */ /* Note that we must descale the results by a factor of 8 == 2**3. */ @@ -235,7 +235,7 @@ jpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) * the simplification applies less often (typically 5% to 10% of the time). * And testing floats for zero is relatively expensive, so we don't bother. */ - + /* Even part */ tmp10 = wsptr[0] + wsptr[4]; @@ -278,9 +278,8 @@ jpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) outptr[4] = descale_and_clamp(tmp3 + tmp4, 3); outptr[3] = descale_and_clamp(tmp3 - tmp4, 3); - + wsptr += DCTSIZE; /* advance pointer to next row */ outptr += stride; } } - diff --git a/com32/lib/jpeg/rgb24.c b/com32/lib/jpeg/rgb24.c index d3ee07a8..e37cc77d 100644 --- a/com32/lib/jpeg/rgb24.c +++ b/com32/lib/jpeg/rgb24.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -51,7 +51,7 @@ * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb - * + * ******************************************************************************/ static unsigned char clamp(int i) { @@ -61,7 +61,7 @@ static unsigned char clamp(int i) return 255; else return i; -} +} /** * YCrCb -> RGB24 (1x1) diff --git a/com32/lib/jpeg/rgba32.c b/com32/lib/jpeg/rgba32.c index 2ad91125..5fcbe992 100644 --- a/com32/lib/jpeg/rgba32.c +++ b/com32/lib/jpeg/rgba32.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -51,7 +51,7 @@ * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb - * + * ******************************************************************************/ static unsigned char clamp(int i) { @@ -61,7 +61,7 @@ static unsigned char clamp(int i) return 255; else return i; -} +} /** * YCrCb -> RGBA32 (1x1) diff --git a/com32/lib/jpeg/tinyjpeg-internal.h b/com32/lib/jpeg/tinyjpeg-internal.h index a4145817..78cb0421 100644 --- a/com32/lib/jpeg/tinyjpeg-internal.h +++ b/com32/lib/jpeg/tinyjpeg-internal.h @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -51,13 +51,13 @@ struct huffman_table short int lookup[HUFFMAN_HASH_SIZE]; /* code size: give the number of bits of a symbol is encoded */ unsigned char code_size[HUFFMAN_HASH_SIZE]; - /* some place to store value that is not encoded in the lookup table + /* some place to store value that is not encoded in the lookup table * FIXME: Calculate if 256 value is enough to store all values */ uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256]; }; -struct component +struct component { unsigned int Hfactor; unsigned int Vfactor; @@ -175,13 +175,12 @@ static void print_next_16bytes(int offset, const unsigned char *stream) { trace("%4.4x: %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", offset, - stream[0], stream[1], stream[2], stream[3], + stream[0], stream[1], stream[2], stream[3], stream[4], stream[5], stream[6], stream[7], - stream[8], stream[9], stream[10], stream[11], + stream[8], stream[9], stream[10], stream[11], stream[12], stream[13], stream[14], stream[15]); } #endif #endif - diff --git a/com32/lib/jpeg/tinyjpeg.c b/com32/lib/jpeg/tinyjpeg.c index a93a5125..f8e881f0 100644 --- a/com32/lib/jpeg/tinyjpeg.c +++ b/com32/lib/jpeg/tinyjpeg.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -42,7 +42,7 @@ /* Global variable to return the last error found while deconding */ static char error_string[256]; -static const unsigned char zigzag[64] = +static const unsigned char zigzag[64] = { 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, @@ -57,26 +57,26 @@ static const unsigned char zigzag[64] = /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ /* IMPORTANT: these are only valid for 8-bit data precision! */ static const unsigned char bits_dc_luminance[17] = -{ - 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 +{ + 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; static const unsigned char val_dc_luminance[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - + static const unsigned char bits_dc_chrominance[17] = { - 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 + 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; -static const unsigned char val_dc_chrominance[] = +static const unsigned char val_dc_chrominance[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - + static const unsigned char bits_ac_luminance[17] = { - 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d + 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; static const unsigned char val_ac_luminance[] = { @@ -104,8 +104,8 @@ static const unsigned char val_ac_luminance[] = }; static const unsigned char bits_ac_chrominance[17] = -{ - 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 +{ + 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; static const unsigned char val_ac_chrominance[] = @@ -145,7 +145,7 @@ static const unsigned char val_ac_chrominance[] = * bits. * look_nbits: read nbits from the stream without marking as read. * skip_nbits: read nbits from the stream but do not return the result. - * + * * stream: current pointer in the jpeg data (read bytes per bytes) * nbits_in_reservoir: number of bits filled into the reservoir * reservoir: register that contains bits information. Only nbits_in_reservoir @@ -216,7 +216,7 @@ static int get_next_huffman_code(struct jdec_private *priv, struct huffman_table look_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, HUFFMAN_HASH_NBITS, hcode); value = huffman_table->lookup[hcode]; if (value>=0) - { + { int code_size = huffman_table->code_size[value]; skip_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, code_size); return value; @@ -303,7 +303,7 @@ void tinyjpeg_process_Huffman_data_unit(struct jdec_private *priv, int component /* * Takes two array of bits, and build the huffman table for size, and code - * + * * lookup will return the symbol if the code is less or equal than HUFFMAN_HASH_NBITS. * code_size will be used to known how many bits this symbol is encoded. * slowtable will be used when the first lookup didn't give the result. @@ -316,7 +316,7 @@ static void build_huffman_table(const unsigned char *bits, const unsigned char * int next_free_entry; /* - * Build a temp array + * Build a temp array * huffsize[X] => numbers of bits to write vals[X] */ hz = huffsize; @@ -365,7 +365,7 @@ static void build_huffman_table(const unsigned char *bits, const unsigned char * { /* * Good: val can be put in the lookup table, so fill all value of this - * column with value val + * column with value val */ int repeat = 1UL<<(HUFFMAN_HASH_NBITS - code_size); code <<= HUFFMAN_HASH_NBITS - code_size; @@ -391,7 +391,7 @@ static void build_huffman_table(const unsigned char *bits, const unsigned char * static void build_default_huffman_tables(struct jdec_private *priv) { - if ( (priv->flags & TINYJPEG_FLAGS_MJPEG_TABLE) + if ( (priv->flags & TINYJPEG_FLAGS_MJPEG_TABLE) && priv->default_huffman_table_initialized) return; @@ -418,7 +418,7 @@ static void build_default_huffman_tables(struct jdec_private *priv) * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb - * + * ******************************************************************************/ static void print_SOF(const unsigned char *stream) @@ -440,7 +440,7 @@ static void print_SOF(const unsigned char *stream) nr_components = stream[7]; trace("> SOF marker\n"); - trace("Size:%dx%d nr_components:%d (%s) precision:%d\n", + trace("Size:%dx%d nr_components:%d (%s) precision:%d\n", width, height, nr_components, nr_components_to_string[nr_components], precision); @@ -696,7 +696,7 @@ static int parse_JFIF(struct jdec_private *priv, const unsigned char *stream) if ( (priv->component_infos[cY].Vfactor < priv->component_infos[cCb].Vfactor) || (priv->component_infos[cY].Vfactor < priv->component_infos[cCr].Vfactor)) error("Vertical sampling factor for Y should be greater than vertical sampling factor for Cb or Cr\n"); - if ( (priv->component_infos[cCb].Hfactor!=1) + if ( (priv->component_infos[cCb].Hfactor!=1) || (priv->component_infos[cCr].Hfactor!=1) || (priv->component_infos[cCb].Vfactor!=1) || (priv->component_infos[cCr].Vfactor!=1)) @@ -728,7 +728,7 @@ bogus_jpeg_format: struct jdec_private *tinyjpeg_init(void) { struct jdec_private *priv; - + priv = (struct jdec_private *)calloc(1, sizeof(struct jdec_private)); if (priv == NULL) return NULL; @@ -888,7 +888,7 @@ int tinyjpeg_get_bytes_per_row(struct jdec_private *priv, for (i=0; ibytes_per_row[i]; return 0; -} +} int tinyjpeg_set_bytes_per_row(struct jdec_private *priv, const unsigned int *bytes, @@ -900,7 +900,7 @@ int tinyjpeg_set_bytes_per_row(struct jdec_private *priv, for (i=0; ibytes_per_row[i] = bytes[i]; return 0; -} +} int tinyjpeg_set_flags(struct jdec_private *priv, int flags) { diff --git a/com32/lib/jpeg/yuv420p.c b/com32/lib/jpeg/yuv420p.c index 6d2bd056..0c5edf7c 100644 --- a/com32/lib/jpeg/yuv420p.c +++ b/com32/lib/jpeg/yuv420p.c @@ -5,7 +5,7 @@ * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * + * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * @@ -16,7 +16,7 @@ * - Neither the name of the author nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE diff --git a/com32/lib/libcom32.a b/com32/lib/libcom32.a index 675bfce62795b13305e5ed63f93ffd78c0804cb6..5e375bf3721501453ce12230d17f60436ebdf9b8 100644 GIT binary patch delta 183898 zcwW4H34BdQ`~R6abI!flZ}tRPNMsQrVkb!KOAt%#l|&YzB#{KAt)Qsdxp%cKAsqiIeujrPXwaZ}BXN}BswlLZqSSp!QJPRiX?;dfI)9`ny{{w`!;Vyv5|pt;H;bq|{PKw-X9^sG3632Pq`GNFjyC6f*I!LZy{t6>1%)P@i0dhW1uy zjHf~q&MCCTJ%zTDDymXPQC+tys(|@0DAd!-|&HR?&t{Qna!6=j#S`N99U?bsI;x6(ge`2W0>{@Vk8-rQ5C{_nQZe|z9>Hjl2={wG_h$7WsmZ#K^) z>fC1Bc+jo%-yV3N&Fk>E2i!`>DK_uRf4}v=_kX*U{Qif{A%if<1e#dp|8f4xnLQheupq4+N6&pqEl@ijaZ-#0cYzNh%{ z#aW7)-ilvZ$IM{`MI}mRNzS8rxGTuxA7#H-pH|D}yML$#<>uvQ zrx#}BrDx}i%gf49@US>5Grug$<{4C4JfV10UjEoe)AO=NG_$XE4{PAJ@ay@`CCPK<1$O~ z#^t2v<>wYCjxS_pXQz)Y7?(3Dueii{HMb}y=Pxdg&KX@$G$DO-W}#By7e^P4E%~db z3yX3JGmA=d(u+ro&CTTva@;X5qz@}7C`m6I{Wmv?Mpyb}{;TOF6AE+wba7N>(eRu< zw_e;-ic1~j9$V3*MEzQf%9F?9mDkn34Y=sw(D#+rOkqFADg3N5eO~*|^8*!*$Q;RZ3=N5~OWM`IS zR=9*m{IsPd^AS_Gc#*MPPPP? zQop{8MC=n|V$=qS3HA*!4MsX&fbWYhsP9_&m4Ci!{svyG{4;pPRR|_O3U`D(O))HL z);!UEJti1Z0!b{H18wGz0DG6%?8FUi^{W&Bmu5m&=j_dm6+^E+uUS4TjpEI{%V*OEh!xY)7ENJk% z+OF)`xHtm&H;JG9T-`{TYF+vzooJs_FO~GQAFtPwer2^^pAuzn8y`czx7w4ZM%fp| zr@?X;>TbW%v^`}m_Jn42=(oyJjntygP&oK2jV2T(e@vq25el|D{M2GU^<)%nWG%Zs z&y$oTHgF>rlL`>t$|J}=B=IdW+g__-BAHS4P{Rlk{I{JbThyo#fzdaKf7zMFlPO&+ zewVbjmo|&0Me=7!QQ6669jPvV0=x_o3`wI&9sAIh8(o(o6_I%U_RzH8&if@9EqK*R z(~-6oS|sRBOYxqCz9;C;7UJ%E{BS1?75V3H?zMNy3X(zzcx<&qMO1+Ska=0HX}?}4 zaOpCd487}-fU=y{HD$l-+xtY8?Qb)L(jO&F<5c_PW>IvYDmyo@Y<}CRw48qSgn>c! zgbt@lo&CZ-T$Nb)OkkxPKyUneUq7nQ*Zs1u3;)?sYjMz`@Z8J zp4htck`f0UE4(R_C6fRKgo{9%Z?5)J32&m^jN=iM@P#N2HJ==gEt@vyrOB3rFuUey|Y_s*Oy8 z&|mq%qLDF>&kwZi9APTlXC#8YsKTjm5=~6Do>w8fCW*G6d@`D*xTcmNBe?(fp)L_4I0XKYx^ttHOS1ekMa)@*p)@2{$5W)&9R=r_8$vx!n-F_ zfACCTY4%Bv`oYk4#8#GHRD+OJ_SwY|?`32m})GY9v0YjUUXUir%noP)K`+*4&WH_X^B++yU zkrd(koh?aJ*`SF}l1d_d_pv(xTam9Q&XL%NixL`7+1;NAO)znCS>ohNy_kvC$k(jDQr9mCW$a+D2;{fIjWz1-i%AGb9nbH*uE0Yt zbOf|%qLYFOOUgDql}%BA8&swJStBxwl=Ln=g*#K0J*&P6?Jct-p~o3+!_Ulqm3#vA ze^#UI`{%^aM_q-r_naF;C%X!3KXh&ySzzBWwcSNu$;EWjE$UJJnM7 z!dFPZ5o}{M{?QU!Pl;g8bM|YCLLJG{VX{ZEjcw^a%!i&fqg(2nik@+j(<+( zoBK7#=}NwNY$@AhA4cuH8&yf7q1Q3$XAfCgAarg8u9bx@n@mZFl+G=hVAv;`WY{N~ zU|5S42g-ZbaM8+OyLWyp)cTAQuiwhIv@+h7RD1X;f3nivWK~$JLxNkG{8PuK63agP z6js@d^iF#js774evT_0)hk>PIdI<sMABam!*<9WwXnI zh4o6V0-YrI$L1I34bRWX4i{%U62yJHuwOMyVQ9TOl8&-2Y7zzU?pj~_x!tLx#2#n# zM2DA40}NV7V(8Dp`GqYDNnLyBo=9|jFEov^kK7YO-O&e*(!II5UoZX9UBVyz()35a zw4dZ>$vl<6qU^;<&pAf5k(caq*3M|<7E}05ssfVw9%&QImLAPgquJ$VPd~Grz zGa%xi8exBFe++2=1qapWGJ4?aa{bw`?E1kd64egrhq{FepRQD}v23;C&@hYaNr&o_ z6=kCi9V7751`^ez$^g%=k?|zK3JtxEkO?-cpo=s)P-}y{7vr6)^;Y4`Z zx;2A2$)DmR*VmPlT|RYz&@!pXF5l#uY~K6zolp#47+Ch%hZD$%xAAw;n6$=rqU5UX z3HZ4|(2=5wR&8zZM3PjE5K2yELdmH=Vrw-Oze23)Oniw&eMu1xrYC=dxi`f(+_%5_ zadjR6ru-gZ|Lx;;B&4j(CmU#$y%wS4V3Momx@0d&H)?SUOUmkeK7^9`QoUUh>WwSA z(vP{t4bg>mt99XgxSxGnhvP)4U#eU$@Ku#rlwae*L zA!UzUK3sK2POAOB-%KeB|F)~CeI{Mu3O`L!BvKa?=`AVJTT*2C4_`YB^!%>09eLG$ z{Q3n~;b~**K;U$z;=t*%iUX$$1WrZx?!@VqvYIzO73!)gZMOgVQyhnBMYYadrTc3i zvv<6eN@u#jn| zWuUeMhc3Z!MG@erDZw#8f@7-y2emn6;1@wliWZW3EkNpuI8_&hHV8$7%(377xGf2@ zxA`Qz?C9?WbjeiW`(TLJwTT>(XfP&G!r{a6`YY|#<_hz=F*ecO^CgNz}*?Bt>3cf_{ zH4(tu@UlP}5{lUH8(ExIiWUmZ-AD+@hW>6Ot_cw>aAD{vxqiVv-2Cy1=ePJ(72oGB zd@8rI_-S4l347c~1letzbt91vplt4Ykaflno}`OO$gVadWFtw)5=qFlf{Glq`1oeS%csD5(LqC5>P+G}R43m^B6_jLF-1(rlMR!5dVBU|l zFgTdhXzPxM(yRgdKNHAridJas~mJaLjdJEfm_PWqYToDo)&taQ?6!2%X&d=^Q5 zrK3=4h@E$)mtsmCl~Q+Dsi=pCNKxx8vDaMc;dX*l>KZ{RRfI%R5Bu=@HZ@T1&iATA z4;Mjl45?10!1j~8P2=IiliVn7h#_J1P=%8S0ZDYw@y|84P$7|sF?Te6q&B{V^m4C9 z;Kvx!(W3|()DkcHb|TO|meZjKo{S~^!o%>6n^2Y#fz@Z=710brs*f;!jV1jb0Ea#6 zk}`Yvx7Cdi^~g|@*k|I&FO)nBpS9E?=q~HhBrS@5X_cyv@6-6Xk)KE&VGfdCXhJTM zd2pyHx%3YX*Xzy5?~Xt^#<y884FsGx`cET z$r}9??Ct`%(3(sm%Z!{h#72c9Q>B1~0TJF+6T6hR03C@KPyB zugoqu+nLp|M?EeC)x{{DN(K?Gu}(b6#p>@dZETy)4ZoDYD>L|`Kf{ivNKcs9gT+A9 zOfEmi@Mzpj?unnfLaflWCkuzGcw`MxZZ)EU$E|; zNdpOl%_bj}w;ZzwhTj}AkN!hKg6xWxKDKddKH_+}jM+DdnEfMj=nD6}X|&;MCs9ru za1Z7z=_7(9bRxo$n=&#gcV4PX=fzt(FLwp=sgGbjmCi4fkr6}3*_A)$PF=ONPynO{ znFITQ1ae>IBOrrAW$GR+rZkwAF8FRMh8K#@NTcU6^3wx=BxN~SW7JzgnoAjmc{y67 zvGQ5M!^CLmoqVmq&OjP1eK&ujU=^9CItZIEP>xpGhqkmqzjb80>nx>Wx>84HjMyP& zJvVmKjEB~fSweQ3R-tWDc15;WDdf8X%+IviND|FZXvXs-k~`;HpC?DO&OB&&6z=aM z5wLs{iJ=Ewpsnfh^=BN5Jj;`ejoNcMq zqM@pA4^mBZ@jbc+dI0ij6KI&*#@=H9a2Si7A(QS~$*gzh8(M(IvsCR9*^MH**bp|}3*fDtS<59#WD{On7M8TkaWHmVmzwIMEX@be1qE|VCnjwRt;R-*don0WKCBHH3 zHO|H~7ud;9bXU%y1(HMdsr7?ke7wdM9bM1#9RWD;#`*y=-vaOmMKp*m;on z)4EyMEkOCet`1Qg8d_5-XlQLPKbs9d9wH%ag+CT3eB3oAr>vNYA^{kSp#im)iPLfu zilK*jI*)HIt03(S(w%ICmAG4EeE$Xs{s--2gdHZcO*6Xx2&$h0(v0qvX7n4=jD90> z(8if##O_c(7?c~c-z6)^D6}dhoS4~B#o5s<6+5cdk?}!*j1N>9A7CKQP0>?|Fhz#q zh!1WlGCuIG6dyE^@j(X}AGE~yfQNSQJDxRx$W#1mxsiH`#6E!YzUC71ho?`IaYono zNnev3FMWWaQdg;rzLzB6P+JnB=6?81{W_wu5tVO|uu7vuC7c)%c0+K6ofn*8t^$~Bm;feQt%zZ}5AdQFKJMbssS!$mJh0pqU%_YS zLdEioar#Fx=>d$Q@SL)KB2O4`Kl7LlIoZs#QFetM3w3qW)i^JxKmtjRDVd#1p>$orKue#%+Sz_eimsM!S#Br8|5~ zxW^WXI12DV6+{&0pJ`&XRPM#>g=-C1gi%E4@N$4PHZCw)lZX*+)10nCa~esuLW)jn zll8`Moj&>ihVz_-h8Szb_>M4~m`XL4yHJPWr0pc)$C#oy21PU4u)EVH&Q_iBq(EG; zOor^{A09Bq#@)^S@U)Ew-%r8wHX6!Xc-ThQ)E0q^?#Uu~x4mMKIr9ZBZ7umRo_i}k zYmGVHbSZ)JZ&gvz)bynp#yh@T>?EmO{VBH=Z^#Z@W}*XrW+utcxF1M&JK8SLBuCT0 z^OkA_y*k}k3-LrSf##u@Hp4j-gqDrWg%j0j5}9eZ)u3HuOaB2JbsFdm;qegakEE_% z?gnrlh4Oeh!JkHf=Tjueey@!U;-}LfX#FAgMYe>|H1Y}j7DjtQ>)X`berHMzC<>=B zWPrWR)Mz*qPSfZJF|-CPYSI{5D96_FczexSuiu5A9%r&HPH0s+(*irEt5IZ=QP7!s z5%hE%#6`4BMhS&M>`V+mUAwCGFMJ(>(RGD zru}u3F?UH;z_fT;;#(>pXk~l(-sJ#3JJ)clPghlW_yIO2aH;Wbz)>y2H~XE3MPdm? zCeqcU1{`R|9k;}WoFy;2fUQ0E@}}a+tK5sjlhX}3Y6i3|&6g8o@E3hSqG`83Ll1mAcHKlL}Ipo^Q)3{q;`Y({&Eo>jdF z0-01efjh0wwxD5V7jsAWLH+?XO>hZ1CUI;|!+13s_9yWkFtekcttbxi%8m|g#h_6HYPONm;q~{3|L8_ajiAIN-7B{+)bu;G=yXl{FXu=A~TF$ zZTSyi;yI?OeKW4NqfzBS0{6p>9vx8Eney_Jke8aKaj$8Fb*3YoT5dsCI+AEOmeUyS zccXzZqI}Lu&|KqRlDXFez$_Si;-=4l)~U2wuozc%c}6LZQ57r0#5&z&yKc2zBj(PJQeQ)_RY5PU8wG`tM26zi*2Eec+-WO%u$7MuOE$Do%Wu ze(dO9Mzk8l{cP+XeNS?IZ!==+oe&^9Cw?be+C!i5*U|3 zx7QYxoVpjo5m#FZI`=yTlfC=!V?6g!eBUs-WOA3H>gK6?79CMh^WXc8Mbh?ekT#!A zgwr`RmGp(MTrMPap#XP{;6N@NPusf--9B_Ur(CML(Cx1fY0J>d52@o{vD?>vD67j~NOT|ed@s@<@SrxsdeF%6hNql~uQ zNL^xYy_;M6Woouj=P`PLa8F3+z$7!jI8u7PWTa901kJ5v-3&IFOQ16kT#L+xMpNi$ zuKLzap=Clg6ROad3T!HzU~GHRVRt!`9yJC{r_LnrCQ~yzb;ypVXpiz%H9^WjhDEId zXD*=+bIjrbS+nRhy%S2-QlUr+XVbo9q4CyidRA7R)UA3G^Cp%h3=cCQG<2MgA6)%{ z`q^7QWQ9TV>8sk#at1Z=HMdTAO9cr~u%;(dFsEIWZ!3l@hjo?H0hxwQY9B;+Q zow$BrUdH+)eu^*l#nXIfyOf)@UyZz_w9^B`bvuAAG-fZOZA{+QP^-B-vh7 z{v!7hE^{wdnR{s{X*FBWO5}xApHcYvwj|q1xV@Iv<@!5v9c@Hjgn{d5NDYxw4#F}C zG`Ft#=BO!;c-?lxqII-84IswFb@b;4$iQS?=92R5Mmj|nMjn5jmM1b?H}lZzEY#mj zkLX|VP$7ZXPt~ghp_5G@)Cws5;u!%I}e?cc)fUS06oDwKTsR_+kBlY|bj z!sO9vG%-hDyIJ8Bp1PwpCwq*Z+vs7Z401;h8ttIBgWEW$>Tv$B{+K)s?RV1pfubVc z1;?XB(S(&@!9E3J)=uO$N@kUOLasN2)1F%}Hb2`OP!-yv>k(D@z4Okg$)@{WhVJ{b z(uRK{ZFqnRX`QraBWyQq?d(K(mYfb@+)@X_>wD-{4HM-pVazKuFj$P4TOC#Uk>*~r z!Nk5+KDTO3+Ki zdLXV^&}3OH8b;eaq3c_;iTfn+3KukJEnv=DbTD}dzIlr_<_Lzc!_?nH{)X>HeEAkg zIZV5gS782O8sRIdbelHjH)f(2<?6yzM^kyfkYoO{w?T=Wio zQ=jaqCMf}d!eZHkfx1;yN*3_ZbxXBiZn;KH*S4xFHIv_FAu zb!aX6f>j!=&rI>*dkiOB+__99^CtVls#PS6q#8R;(i3V02$t8;W;3v5a)p24efpXh ztVn{jAJFU>|u4G=eUz-vQ+wt&K5%S;rl#}2c=y`^d-~(87hLb>6 z(PCN#@wdvv-ztf}y8?g2-I)Iw^{H&z>}fOVkW*0KN9_)$uBu+p=^X7bOt?TedFNq- zQIt|Kq4q1@(?u~R)fm=mQV$V6pjcWpx=jF(im5~v+EDfujDB{zrW=wPyYo(1t*PQvmrjT%hUdR?z4dWGag4^UuT)Zv0 z_?03&ly@ZS%z19vl67+>>#)*{h~%>y!DIaMH22yWm}6B#B1FnhRB;Z)%OdH@G@b3@ zdkcbzo`-j=>NQyRGwoeoo1AiwKJlPPzJH(k?@CweSLhdPxyljT^)_8*jHK!wLd;oFvt$qVm;$~> zj*#qU>XVhb$$j&q*_hNK$b2zdY(=GRx(MSz@5^p}tyBa+zU=0v3f-Kd{51e>N&w_3 zl>zXy_^pZnxMOetq*lEI-NF1x73ZM{*Ob$TyQcnfJ{Dlya56Q>yfvQl(!< zl^#kUF-)BgjV5|mjYtQ>)c(e>aPHDnknnq7poCZZ>qx}lk;oIo2#QiuoW0J7R)g&g zI>gexnEmlH_C%}RBvI6$U_ptfm_~J7Y0OZT1XE0=s&f2oHT)K%hV~B^H)MY`Cd-tW zr=SkYmDG{-DHdTGab%o$I0oL@n|mv!2Z=jAf;6+f0EMwU;IYAqST&KXHcrH<+5-e5 zVi@jnoI2OoUzc}XVk#hBjiim-WS*s>OHmhg$E&GYdpAY-MfeqU>Z>s{$z9CVnTW^j z-9=<_tiGB?`^tn<+XQ}nh)6hTjhUjF38(pH!fC!pIFavR$8wu{u)@XjQ#FW?W$r zM|f`eP;S?zYD@)S+4r~MPCQZj8d1&F3#7a_FG?b;uPJ1Gr9xTTQf=cjuam3!1nq9E zM!V`$5fyczUT3vG`30tTRvTMB#!Hs#@Oo!8)FYIO(`2GpkMN7W@O@{sD~X1tUDU*& zWPXP<#zd>TC}eAbL)q?b6sB}hA0rpw_b%#k{_L`@Y7g!%ece?}2m8vUBz&l3cZt6M@`;pwLA?V`)YG-5QK()}+s#gc8zfh72Uq7sJLs}ijCE-qv ztBoG6E-0ZLuC6E-ke23*qQlyipkvRZUe28d2&1+4fef%3p|Lwp6F!TI)<`34=X zKKB5*5XTrd#QjV{49F`t&BmFLXnKOBB-D^2id{`z)YUjST7Ah0l2e|vt#PbSZBwCA z!RL=8Sr5NHp@u=bBDF5r424B%Q?k$4RHV+RdLeziv1(|Av0LNtINnD3xx} zvnJ*?(Fpt>KAY;zs>Q45LC4jAnv1qF598f(bU;T^eCjTPbWMljE3a>VjXR1Ak zaE;C6>Kr;93>AsCryr{(5zu-(JiIDEb+G*#(hC;w;h7V1wF--X}18 zgPKRq!h0LkhQU`+j5-N1LI*BDlkSnvI}ox_JwV=v&o`=pT*7Z|R0oq=(Cc|MB=8OV z&UyUZ;1>AfSD)se)po-4=lOdZ7}xkSu2t4VZZD~wjOSib*O&nA{jz$B@*oQ`MrgI@ zVSl*rh8E40wxGq&{*dsd7Hu3b)O@X+7Fb6<1Qxue4uIQdRX@1*{!rJ6ws)SdcN}p!z;>ygB2LYA!l66IWq?J%`lgaY$=14@PJuS-mVm zD(7@2R7Bj1+GRZPhWaC^x(hV=Ewx|S+PK=~DS{)sZC%5;n>g`^`YIVB=AFaPquey# zbpe~JH5zst<%XBJf^8y;hWkgk!1+PXxB0FHta@9GBSdPeCDN|FVcNAfHtamdA%# zwi~i&{R?B`H(YtZOGjM%V1FHIqu*;ne>h74rTSR@ol`Y86AO#H31{RI zNo-;A&i)d&kZWnV%%^4Nt)A|W_?mk<33> zRBG{!Kec$JXtB{%XKz%wsWH&bg@qd1Tv&X$ljzFI+j~v6H^lTTLZoNm>dD4C8;vtS z&D82Q7JEiZKe%9H*C9Eaxx;tfEH)Fzct~qv2IRA32=*|kh`aH&84f=g#3oyyA`X7Ad;a%tF6~u|BK?w{$ywSO7T+M|@ZzIR%?)vc9Ay{9cnK zCl>NAsa+d$I?)JsH?)9iH>~xh5jHoR7pSIo7x(-W4@U5)58U@<{n|N(0_DJ)*r#F# zESToRGH72p`vpS)tg`kUAnwNU({cE;UrSi#$41)^cl3jMnbh5g@@JI5i;=7z9h(ni zt0l2Y^(=WsIm4yPIx~RzxTTNHA6uN0ot{%%2)5cR3+@ImPusYhtdas*aHSOB7v8JQ zqK(OctTlmAH%S1l+(UP|FMULvNPklx<0z@6hDCzd} z_afljPR(k+H6@&;GT6zD5b?wql1u}ySQbq^G$@>=M$sToj3#M44K92{@EMFJyK^UF zgB0EyVgf7;w@4iEeRyXYP25Dvn!8$c7?<9t5SB*ZUR{;|D??eg$^dHuy{=p85UT)K z=P>pQobqPX;dnRAEx?sKG>sJ1vxQqrw=TYI+>>yA@lF^W&H^(%kRSQ{Lj)vGO7L~A z1ir=+e3}z{10?u*JHfYCf-lDjzKarkS0(r^O7Oia!S^9F^JN{v9!JzAye)7RqcAKo zRU4p8yZ^@T%!g-vS%bvEm7v+A5;VL26*Su+G<)^kh^n!sBBCQiTJ>^#W)*V)_9=&F zUZHu0==2kM&>Cu@(?3_7B3Ln163_txBG@Q>VPblT@+SaiJWn;_bZu5_8jeBHERvpeU$kx_kHpfCk_bJIck^X| zRPq%Z2xieF1PWp}2qQf)#X%=Cd%}?@T2}&ej|6Cn3D6`7&`iyKVQLg@F9AA*19YVX zXqW}k?pV0-kO1v&v9F$2j?Y&SpXoGq98#RS+0)EDy2FG+&2FAAGtZxgRiUgYPBoI zm&k>W`vgL9W7gnb)<}W+g~T0tJmFKr9)8xq?1^{2eWIU8c~x1bxWxzP?!R6E@C9-rc;peg5wod3;hu;C$R{kfNLxE z7^x03TCt>X`G^N9ShUk#icQQ$kHuOnLcG0=FIuq{51K!#pUkq2bIEK#`NaIT>=Y&8 zP`v~H{pQf70|(M@Ik{`NF~0+gFQ;pB$9%u{OE+UXP`YBUGnK|w$~*m@?6jDHYGpV$ zqS{dI#8QI1|I=mv7m5CBC8K$;NnIIgD(c-CKg|c^%6z(z)LQrvO$v?puB<+RpPyn? z>v-jbx!$kMe2jXjthN}+pCAYC&va*B5vrPls=du%bh7DPO*W@{4oYJQ6ozIvklb7p z-WdxrxQ|kbBq3M~BvueuA)(N#l5UL`x|KGURLSCJOj2ctq{>IK)87iJh%}Jyj!6`T zqgA?C>4Bk!)Z8&R*Kq#-LVoI}#^@8p=wvfNy9h=95(W)p)kC)9#g=LK8DZ5i3rmwk z#2n$Sr^2;VtromIj7{_sZbXXn%dN6lb*%Lml*Ovq5P`I#{F+TqB5<+0RueX4aj1-e zclncbpT~Rs#k5uaGjHO4fP9&|{xsejD9=3g4g~zNIrpYP&4yYa`3Qz&vl?WSF(I4f zRlTI)Vh(#6diT~^88>p7jr_&(bueoL`x)!R4o;{=r|6K;k~^3?WN@%U7puq_)kd;? z4w;6@yDdS+&!gBd8hJ$Uj<+}z+rCRA09wa~8k%oG;ZggE%9aRb?G7`>uvjt)c8+1aEEDj_%!V*!8uQh2x&K0DLCqo- zNJc>OA{N5m+rNm_;epxIB9`F!BK~Njk5OZjph@`sm?A3Z^yCerox%}D4R^lHEC!1x(Y{Vs;iW{{*&2WQWKZD5W^Wl!D2<3S&D|P1(%zrA>~sojC2RvR2F6(ETl+%9GXsL zk+AJk%^HW(ELpQ0lYThv!J5l6YQ@Sa)}pOR&CZayMz0QcKGhn+&@Ea9Bt6LjpyN=@ z6TaA@)q&5>@S|lqF{uS|X%f*F64LR21;dU(Trr zz2|UuY>uSiUXzA8Odw7_ZSl^)Ce&L;Pb_qoUtv|HWG^gF^l>c z_^xBMN?(ymrxXQKqZvfl4Rg&FRQZ}sEEKi|KP(j2Y~jp6Rja$>GGsbV{(1{_4~wy& zEmoU7At@`glG^sV%xlI$J)%do4#0#Sb--MXX$wG)ZbC%S1T3jxBx|6{o$4MtV^d=Ld|tCUyUR5YQMVX z%TD6G{_@Of!DvDqAb-}~f@(}1D9=1C#n5E~OCdkO>Hwy8uedSa9GdBFw&3l=VC8 z%6QmO#;TK!@UW&;*JdMCVaggk7ke+Yh=jU(e>!OPsB%!Z>cbAvJtA8{BI5y?3W zN*hSp#f2^ha(8iqf)J#pL4o&nv4=u2Y*bC7Ve7%6jHAYZ=mdl*0ey}3yIE*OmBtYXv!Xmv899Gobhw=;V zAM%fH5G`7aNbay^eav6M70Ot1c}CqH!?P9=3e0T|tUSVzR1NkXVT%GE;@=O_V&(T! z9N&kmqpYb{HU0yvV^0+?+T6Z@%}2Qi-#}WF1IrDkMzVf=sC>7u6aD*`{lUB=8zA55 z?$!{$H&C8=x?P0kZ?j(HEX;nJW%I^df1A~|iG|e~i&rmXA)&3I_A%Clw1k3Vth$d_ zTB`0gRzB6Jb_P6qjHCFJarhWpSqYDo(ncx$^lD%m#}$4d+KB7#vOM%gtSmQ<$tNd~Mgn(7OurNx+>M9=XMhbaBXsO9UUPKY4>MdT5NnIZN?NOlb zJuQ*eqfq#y=1&4)IVeUu$m@D+(rve`pX9qtLV9eU1gh)f4hE)x=kjkQZ+g zU#gIo4ko@Lp!Yd0FWKcMR^FW7TWogf+co zb5*_v(WECyn7g}q@-OSK{|IMy&+}|-AWo7Bvc$?4r8r;o*?BG@;$eq`+=QAJxP)Bh z-_Xnb9XA|a)64xGH}vfF{_@P~hNeLuAm8ck)(pQlP@Z|ZorD)Juy+2am-Ni?mmQO5 zu<&gb3egu?GI<3?Tx5+%9z1uE)v);@yX$N~PAptp8uk{veUZ!hM{wyP>qv$gb-!RA zR8dkgtL{yGa)}25DVN!crq$HHVUgUL#eKt$(1X5k(8U@B)xPCmZx&#`J|!9+`Ibe~ z$xyqGD`*j)!!|OmW!jf!06^@==szIDd>p zGAb+g_?afc9VXu3CgLpxzQ4ixkoO?@ zCl*i_r-oP@CczDryTc^>i1!>Ofl!$G6A!9K2%FG~jYj@Un-D-9k?C&=inYTgAV|0e z;U*GS4x4ZQ+WgG1FbM|popu+04pANtn}22*ftW}LQe)+JQk>rjzsZ{ViiaI2$J_*k z7ml*FU1?vp5AdGD9AHT$b(jMz*QE|~fNn5#m;+2kQ-?Wt18&`9y|n$JRrB9w{`z-Z z(UZY2{1&TC!i~AN*yzepRNSvD;9vB7EOcGQ#pLv_{2DqZRhrD5RWPbp$rtqvko>$J zZg6!!#RRsPlu*3Jy7zHbVNl?10B(L*s5vc$PB2ZYfZ^S7^G|cL&PY8Bk&XXQAgm{ z15W5#Ea?ls=vptWr+5$9rujpbMe9x55yP-(Gf5>cvpm`hfW0nSLX|5rDh7M`M6C8* z;vvflx1!&d0a8Oh0C|_sOGoWvP z)`cvAl>u7yxYKyA+@9*6;JXLNx4G*t;JtzJ%u~;UuL87$;7x*xHe6`#9lm+v!TmOz z>`*UItHI4y*FY_l3^MWpHOm8};0uDa<1&0KtELS$W13nuG#=BOlQGQ@8Pm)%W13kq zrfD6ft*RK)1RB59;;vq@_@^!?ogyB7QDCCnKv_f=#JmKmQKTpL&_X2;#tH7z{g4@{ zMbwb1D&tC4Bx-{q>vy#e#YJkYj?|VtK!7Zk)Gqxd28yG!R$`f360M~W_~B8lh4EO7 zHkbnag+$tW%zNAz7pLu`m4o7*@%)KWT%VWV_~1Znr$jW(l882Ymn?vd{}C8%E}~tR zne@%FYo7{Q(3^@Qldj54I>ukBG>B*>sWX$lm53lopVN_GlvJJ!$6^E4T%J+ArcxnF z(vRYkj`TW~&M`-NeJB((&=v>cbWa{S>8MztdojeET}Q=g7DBhwF)20$C~3?Vm#Ph8(_=pkG6+k4@Nv zD0~YRY6pA|uQb#e(-y?I-cXzO0H}VViS{a@x|#86Q*D@u>cr;SCQ9BFtL&0xaKEJ% zO%J=2Pg3cbq@8mD8s~ebCTqc@Aue2ubIxd2{vl{hBg9hSii*)S5wrWKike7O7|!u) z0?Sgg2(J*NQ@tIMB3fHGmZC+I25=)qYaD!uUnQ37_$h-zo#E@IZZYW1r=>X6?~ z3x`ATy1#L?oz~eo>fmP#?VznEq${YMvi9R7xxatw-@6~oyi2K(}P1EhghgX zg^PcR;!xq3FQg6?-W>{iaLCVrH9a`w&%rA_IOI#1 zdsvGkqap2K&0j2UDLe zD#vDN^@Q8D^ci*v^DSG%nx*6dRNt&e!C3YzjNJNBwn;N7DYJ)=_9y!k8zQCmsL`ki9P0B z2EcD4v}kRam!fo#d6&I;TFXB$zqzOkBioENqqXa#6mtLslWL*_r@E8(CnfLC{)zXy zCGWi@?K-!nBpYIly#YRc}gkIyCglSC6beHu|NwTH^BXh zR!FxhFzJfc9&F1ruVh@m&(Z)@g*(GvR^!FbdocMg*MuhVjN|$WjSeOlahQ`i@+ceN z_d*^8lt8`jcocvECxg`;c@*&WGA+Xe*Nn%cVl3oM*Q&#JW3)QH;+c*cL@a1?JB4q9 z`JME(U0GkZ7b?QeZDmE+xgp4zBVi(pzawFSx|KN+CeK2^a;=>&)($d9!UROq#&p*G zwQ<~8XbzFZTuU^BfyG>PEHcIwYcEzYArc1HpVJcE(u+&7vkLOl#~0;+_fXf^Dy^J4 zY;11fpCii&M8v%)Tr!8!Rz9Sz`8}6SHqi%wlTJ#B7Mf z>~$w*=Q%KY=v$823lg)xO3c1wVm4`-=GA!rA2Hjq9J3fcS!EvP8z+2m<)t++d79?m z921hPxkL(e!=f99R+Q=Smdnj7g@R{EJE=t2Q8+P8TSO8dbGqhFw!!%6T2n9K8+P1j zLiuBOZMxQ_)7DBDMrYfJVH{C)V)%km5yM`UFuWYP&(PX=VN~SA@Df-xgIl=Muz!Zu zs2=*qBo1GO`Z-wC;nWks(Zb~5cS-pf=KrcKfUu{uKo2pCFW~_HRBGfK?Vi$}bzuJ7 z(^`jr!MqDho2A7I#r>ay9XQxMjJC723Fg|{r{`#=C=D}F`@2MKoS6i{J=eTO>jhd< z=Fqd4%_EKE{Do}ez+&yRsb{g;;y={0xcJJ0>shP=s({)5OFf&ujO*FqRnoKFpZPEJ zEV`%v6FsXJp`Ins;s>oESG4&*prVCOmTO^jp#s}}&>lAWt{UuY@RANe>N=(U? zOqq#H*+kaBuX{N^WmD`9Z93ekYeso2Q~|lG1tabuOJ-X8Qy| z>qA;IdeBP>=E_4{Fpqjk!Mu7%!)0dMyuk(Y0?dCyizDwymcC`O^d~cSi+eoZ<_?9A zb6@|gQTnEq?_{x92u%E^);dPhqnsuw&k-}K!(5hFd%)!I49Q{ppEx{La=3=%@CbPO zZO-9wlEX9L`rBG$;4qWJ^(t|AF~l9?+CNJ&a|$wZ5!^h+P0eC(Kh8Ni1==6y9354O zqjM{9v={6-&N(_5zBtZX-%koxuXnU$GQe2$j<%3^o26AKDfweZjY=>2W43+s39a#e z#n7i=@_Fr3xjs_<1s)nt26#{F385aE6|TOgbtW;;^fV9T61-sBV9vkor#b(U;Xc1c zIz!L*xng~b!1d;~TD;4v-sg&ShbfXf;2J-5!I==ENJTD+G{k80f!47y7mf8FYmbu@ z%qWPV67mNDohjM3jMAtapa1$t6-O z$HCb%oQav0m^kkbVwv_CXJQ)c7_GO1*FNKFvYX%}dCa)-nRfB7$4T1!=S(xMoYM-+ z|Hsn>Z4;$OO!_}1>A%aQ|1Lp)n}JS-NR22sf=yGA^T1$wQO>+>(1} zSl<5^9vUu*>-5l`2XF40aVGxJLwoEyEh7*Uoamv6@1!`tbK^U$=^tD*T*U0}T(#8| z(cp&V98OmaSN?IjYWN>zD!OV%zvr$Ru9E*(t{OD_L2E%8m-}e5f6&56OJnN~+G7tA z6E|>2)lr;Nl$SXweLT*T`R}~5r-^jTj-q4s7_9tBOC_h^yPq)8<0BJ2=#s&_wVFFD zpQzOkP8poT(~+lH4Rp)uLi|nsif_<2i-vn|Sb|{IR^3Lfqn8$~=T!)p$4gIbgXyVl zke*rwJaUU)U0{QZ^VXLk?FD_9vE{Z_Mk|KR6Ypq))lq9X0|{2Kh-4*>TbLy_EhVT!nm0u`O`lXT zX|f`aXPQ9v{E8op<*#Sf2rrG_SG;g>3F76B(DT9=K~-!``3dHn{j7D|`ooUEXYmOp&=&DWt@Sac= z=jVD-j9FIyq`e=Ho}MSe|Cmg zC>*1Ds4vb_Q@na36TNVv9rc9}y#!|QwqPO*Gh%b(mwY@Qx zZ0HuMcX+rBUaXTW^k1^#o<`+prw1N*l{Z=6!grYY@uTq;*uUagICQb*!aA){)$$*8O#4s$cnH%m}xS{d-h9hFkk)Scu##*Xah0Esi`<0h--tE z{34Uu;1Q_}&f)i^Ho&?}t__5Zkd_XMSf!=&@1Q4={Zc{fhV%}4A+1Z`y$*VxWKnBg zQ9-0q)6!wWNOM{`rpf{$u}rPQ(yfB*j$DQ_kitpQYPq|0hi5x-A+87YJL&k3J34gY zQY;?n;CKYj9A<7Q%TS&igz>Lf zYP2;QfFo>{khW$6+Tp#>w&qX15Aj{NSNAz|?V>m4axuA!-hq0maHNYK+Z;!8EcL(C zWFIr}ClZ)0e**tUv!y|RE`I_m|162}%-t;oV!P^_yiVX3nwGbz8C>Y9k07r?mu~tb z@;DsrrYG?TTT9g&lH<@kRUb;ehh?dH6Os!jQ}ulE47Bd9HzK2;xV!#L1pZ?!(gk0p zsdf3Ug^Gnzx)q8G7(Ya}HR|`!zqC|TUPf>~z2yV^11rYKJbea95rd+r zY;h8>m~mOYR<#r>9Pq5{K#F={T@8_9H3pVGqKAnZB<{8^hu0p_BT2e++i@h->9*te zy3=hRCEfN(kT6Q$M4p3BN9j%ZnfGYDe+Y)p@IWT=RSC|9PWA8=!7$jeR z=bwhe{u3`f*0?@KpJ)zQPAcXKi+n1h+~HQKua=l&mbk}!>XmW-kG3~~kD}QA#k;zD zx_de^)0re>-xEjz2@v*u-$C{rWZyxE5D*j@kVS9-Vvs^bM8%5>3f}8=5RhF!WV?zx zBJL=NsGz7w-uYH_7Vf?8J%8`>|L60`RGnH*Rh>F@>Qr^rDWkbwMT60r7S@%D`mXSd zyNvs_Pzb`P9yJU?SjBk}S9~3nbRPX5;%l{}b2CY2=*)Poxl(-HD#h3PmEwy@@%37z z_`=qg6kqc~B)*PH@wH!yuTDaIb>Q*{+ zR2_W6&>W0>-DyWzJW6CWaxxizy^E3BFVasHh6c3IOt9z9Q_Mu5!?6A1CdnXVL4{^kRS0re}0jXhbyY@E;8zPp~1(P zwIdpH|2;-hiXsHX2|2Ba%LHb<6Rv)g!#mz%JX9S=D`Lz>;?qUBz)&Ji-XuO!`Sp89 zM6Bn-786pOJy4rxdL+_*LZUbENTl6)>0+av`YYpy7aJquA~bn0R2(d-Si!94Etb$+ zAaZuB%vrp|7&IXECebeT!74;Mbj?c9KIA6Rj)UiwqWx`2Z8fX8iP7%Jc(jYxZoE&XeVq_cJ zNfr@{rw=tU`N|R_S1n5A(}o%~_}LO;uJLTDqBPNYd|@DRnG%j9k9vQ&QPA)~J6 ze5RtL^R2^-ES_3w?QQdJc9S8(Cp_(G39#`rP;4 z-)Qwps{4~wA0114&e)=|@1#)Py?hIm!sw; z@%gnq@!`5J8y$=>1>oAIx}y9Yr;`;(!W!c^0VuM zklWO^BSd~P#Z52j)?JLh7dAR1NYKPhrncxQtg$pjKdJKi+l?7&Yn5->ZuDz6ijrxC zSor!3@}5&5C^|*_jNppH?cY*$wJwOq@P7qR*Ji35{x^8j*NnRCUOweD0m>1#)3fY|0?bjlGA=+; zso@SIFLfpY3uIt&1gzH>wI!4uQO5ZE9Y&i_7f1wVG>-5BU&YD!x`3J{2`Q&WTmjTf z#_16_%5OB6kP$Hjg|v84k?ng2aV=#bz6g8(Fj~o!krBTEY9pbjh(W;FHco;u@{w;k+F}2vLj&B#po-c>JbY7 z^^;JIh-@O8(O*J25qo%>T}D!5JhHo20qTPMQ+Lr=zJ))%%jhzCGOl>lmN}Rby`K;i zQ;_bdAA|FdO3aI3=@{I6Q)6y`Ym{o=QKF~8T=N*#lUi&l1!!|oLae2hdzCn--`9DM z*Nu_v4Bzs)k;$g>ldsdtC6#~mx{(nVjavt!kTxY*s$E4H?|Fpue@s5j{(?MG#*H5{d!jOF{N#y~ij~`D zj2l04baC;_@aZ>=>F%5~@E8f-Y<|}<->ciMn83chp%(YOf@@EoRDmG(uh?1CQ3O6 z_X3kgB#rYl%SEdE)blJ;y_U|m)i=aJ`Ln!e56cXHbjoOKmFuUgcE*S6d}uuDYlze3 zs(gk<{h6p=Dep`v?@kyM^6sE6>GaUXG(|lGkZra5JB0NUBYEQ8}CJyKH=E>qHZqZuY1h5 z|Ee;?R~lwB|D5r&M&mPn@r>DHCxs6i<~zDRVe+(T;U^-@=H*t|eCD$%>&v-gW~p=P zRr1rOdXk^umh)4%UZlA-SU!1*$1m#gC+paGyk@33qdMBKcz$-I;w-_D@TG4%OR$rA z{(4zi+0wnm*5bFyzU{(yXPSK*XvMKD^kRL<-r0%wFUj6$x~VSsszUeo$d0_PZ2~21 z-NGnt&Rb@gHF9Fy6j;wFi;tGclvQ)}r(Es$x-9c4?ZG)pxLLMY%-EXn*6Jqnglb{4 zi2im{U$D)T=X2^T^?kiUp)%z44Lt(0a=F6Qz=!orZ}iUBk(5-sO3@L2j7G{_F$A=} z6dv&>@@kDp+(g_E*S}YqKx1^F{1G}Eh?laBO92A>4C`Q1*EHU?mRXZnb6PF4davVD zy(V^lKb{@22Z*z}S&IL0%3%+b$JBNIDne!tnk691zmRg+Lu5*y|6$@kd#Fqq>EFiB z)iN75EugB|qmPQfZ2wQhk@lDp0pEOAL285D z*LexGct)3LX?W^yQlZ-YKsWIs#Tm*b+qMg?2=|7^_mrsP>iC*5WTJ7DZ&_ej(*0`e{i4*Mln96hIkXj z!$-!w)PLS2{Z`DmAi$oJ=G7;JQ*aew$16p3_j0>xZv62v&pRnD) z?4@R!XIT(5(t$L(h`c|7C(X~9Q%Fp0eo>BD7W5^%CNwWq7W9=1>aw7(UC?l#Uzp#x z;8063aPiYT&*G?n=y&Po5M}q6-@Em{baVZGxViq9%d0QZ{^)|5^9$pX>JaO`VWG;` zU1Wc{#k$CDR8(0YE32sTFQ^iAg3 z@fNV9sm?i#7u7YB)4v6l8ZJ`HnMcfL=BkmJo9#Kig|dx}4`QEUuqx{?M4f5KI@Cw! z4prN@xz{20u=3o_r|8=eZVe-q$a^r?Ywl>!6=MP#JW9+!8GRw(ELgDPa9ym!_oCG zss0Fnxz0UE{EFINrp|X(0M}ks%DlQxXH;vS3pQ{>N99S4<*(?SxS?>tGa884!>tcA?E3&;{& zcnNcwfK3uzcsX-cB7KqzKfs)RXnV2?uVzjs&^5({*Dz-&;tMn|sg|{lIauwPwY3mh zs%5Qb&PfE+(ImW)Iq|4(T{puf=1c^FLT!tHpJmP&bb39}S}kh}bMSS+tnb1vGUsm? zmQ4h4w5)B+xe9W$)K(gRUtvyn5U*88ixe5QGv_PRxV>B8F6O*~kEO zwV|1jFqa^o`I#mM{pVWwp!f634b7A~IR0;bD6r4Z*K)U<*AhFi$1sAwa7PBg%H2WL^t#x9ub;8v8`M3-N( z)14ns!KV5nA~xGOi*9Y^g1OEruvK%BID`?uPOypICq|C=9fAChd83)6tyg#t(G6$9`VRA`I~(*XRM zH*8|2jlK`8Fy3t^4YO@%#{?IqVb%>?JJE${nB5DqO>$uxW*2~VvJ2BNtA}Ez=#NIY z!|Ve8XA`q^TQRQ`>DNT*mzeVe`sQ|hrr{2rbAs1(IXbU0r$5lna^YW?lg=A9CEnk{ z2appI>^#?v{ewBxQOS8OOhZdB^qnsJCzJesmkZxuPJIx2z6+O;tUzbn?ZPw?KSpgA zyS2SXbta)U%iZ`Ts_HoWDyq|uS8GNz6tmW2x)ipXRHrY{t#{#PRR@+f%qLwMZBd=x z;H9Trc$?~6LUo^Z;a61WIB2{{e^kKRRi_t!n2HIB3GI0u6B>1m>R?;Ye9491ROJl! zkMgcio!?RGSM(wge_C~-QLV7PFBF*zt3gK zC7Lq=gMGgXFV~!&sL%m-%sntxbJn4S2i<_xniB_#yy3!YG^Y=0e8`2@X%24vn}^*& zwqA4o4n8>I!W%VbASn2jn|_n#Oy|{F5TUE1m=n5`^xHHCo4w{I<^7{Mi_ngS2SvB5ANkL1S>G-nqIFg=oAKO#Dz-IfcV(VX9q-s{3=HRoeAD8?fz zbWW2~SE5JGG+%}^CmF*t&n@7*=8Q*znr?=Rnu8NWW-S-KtT`H5P}d_{bVYL-gCd2V zjiN=@G-oS%ww~v(fUj##H&D2d+n|NIvjPLInG1)O=+0aOG&{3}q@@c#pgTe% zZRb{SweECA`i^de*67ajXh0_yUPqd8b0oN;6-8rdu$|~>+<`j%qTM4xU{@*vlMu7V z@w%-{n@#7vUv^F#1u2Pi(g;!%x+#fM`<)|91ts3#CTAO*HRBZA_hWx#$L6Hk< z%ZXLdaDygtaScl7n@vAB9Af$M{eLG0@)fj^sr;|gDDc(pE+Acr&5u=-9a!$GPL?0~ zwUh1Q^PeTMJJpkAN`G}?W2Z)2!mEa|4F5>Vu&_4`7&j^e>aiVDUeXI{~D3asV$*&{|r>7F6xJ!kGF|wox&C{#*xL} zY-1LNa*?-5vRm1v$lKHx4@mXDi25`uulgL6*<3<~{}o_rVTe*J|9s+Ar=={@=f6aR zby~@kk^b{Y*(TX-$De@ON+`ykA3`JB1>I(C1a;a=D9)dTq#Yy_9~e_qq&OWVl;Hmp zDLY9h(O*Dp<#d)%l0N{*HQ|-)Ur4>{bd^ww9}nd^-6WLiZ|56LU=InV`EN(PZ;?>C zALbvNo)XINKS8|g^pa4fe+~Mrw}i6%9|7tkp=|%pNZD6H)%~%2NINsB);&lvFj){b z*MAJqAPMFBx1-p>k|fx2dZL}#giYihv@>&C4+@G85%ISYzbWyxs4Xo111y%~e;|I; zl!U#6WEKJn#CDpNSX4YyQS;$XdfmfYw>N8~;cJ*yoe9yFICA6!Ma#a6Fe$0Y350JV zU(()e7J9?P#{wo&;SUMaVmtMG6}RRJfm(c_&ic3awQw zDaz#3Lu>@BYH20sin6W};n_%lxB!v~MV^fVZmr~UQC3@j=m)gHp$ zWFvNs3fe@Khbh0@6#iHTGbIwY9#}(E<$3aDuH;83bYu?pB%AC_RFsb?G;aZw! z=7iQD;UA2p%vIQR)F5SExo2EO(74L5dG%axo~YiRC^coO!ft>$l!UfPit;#mbibf1 zOTyPNwhyTir;VRZUeOl`A5gkKC@RE`$b^ZY`(e;M=@j6@m01oWfu}i$o%aDK^(J!X zT>w3gVpk{cRrJeS*qh6P{>zSmN_p6*klvJ;a};)5)OrTmd*Un*{6=0sJ9&xxb;r+~ zsj%<)oKDnXZ>#*7PG!K_6yg$Qlea(rvy+(` z+Jx^_e#v&|YV1yTL6^S|%J|qgavmYL0ooj3X!L#p8;XWIY(c7`e2!?;I#OVXrX-C- z9c!{*iENEwtNBo(WLXx=nh>#++V4<6?K6q|(avTwyB=kMCc#qp+0JHK^*hLqy-JqJ zYBi)L*Q$w&o{bw)Vdyj*O<-9(vx_;g9+GWF(zj|k)T)BVT)1UIGR6TuWYqkGN<2nk zA0gd)d}kLkD~P2qYR7U}f$;Mmx|k{LZ;;ndBw+ch)+7*2iCjsgf?>q|lc}^mN<$~m z;4uniEb2R&)LMrj@W#{w>$28Q@?Krd1U8&c?rLVUc)qf$nG#(_{O9QqmnQQ3Mp>0V z!n?bgHCfYFRi-_&pxaK(x5b)V@`2hc_Gc@`8v2`6cvkc7_|97Vfz@W$i|=>W{8qQF zSFJ4Tg-u^w(SBX<9#89TCbv1tw#>V#P3rd4#-C@;F8W-H|MCM}(_UThp3b!6%xdwC zm7zTy`bqm{fi>6~rajHNmAw8YrTBe83rew!@w>X4Nd@~BSn2OBd;i9XcT2T**kFn; zSx`*z|72fkt*jQRP1P=}U9WZ%Wu~I=ecjE%mM~k_Hej_4_&No4Ieh|qoyFQRwQFtt zw!k)LWNk%j#3;Nkg}196*_FaZ)mE}44=C4oogQY60d~7rT{|QykfS=;w@%&=&g!8{gCHp=`GI#iHJ}6s#2`O{ayMkxPM5$Fa~>F z`Xhy_3V#e-w3%80C9x8rIIAgMH6bD6hNY=DwFE&8L{J|%;tGN?s5};D;x?)`RTPFH z#fg#1_9hVcv@O+>@IxZ6k-=3{4wUso>;uxvcYhzu78{CaINWEY zKN9W>Zo}b1uAmFc@d--2E3x1JS-K{?8I&x`Q%Mf`%f|eM4Naw_%RRcp1b=z_Ask`+ zT*KJxU8YUlvz#o3WNq&G~?F6o`7 zOSI&@mmFJEbAaDNU6vsI$>h}Z+(h9wshn7mzc2DWsNdABm9c#gyFtH+=9RGn5&MXK zQ+FOLj}0mP5WQ7I_d7|>yZTMM@Ma~czo0aHXKLDh2`D0Rf;+)FFWWtcWr8492 zDjA1Y$vC`9#^L1!Vp{rEQv7!P|4im8q^;;#u*B935j}9LUe1&KGAdKT$>GI)&FK{% zp7FQGG_q*sj0uycjStrxWu9RC#7rkXoHB-1;Nn<;TFb*1 zzG!B7dMV0s#?zlOGSyKYUf1WzVIH17g4JN7c-cgnh8`j0=GVKAx2^YMJd!J{$3B!JycvHe9wBbzFM`WTBEx4_`fC_HN#~a z%-_|}E_5Tzf8f}^`k1VIbu^^nnAI>v9J3+{lpnLgC39x!;$=d4tWT%t2}+GIuT$h1gkU0wLTr_I$l!t$lX>bt|Dk?U52%{As7kLr~a zSL1x{CiBAtTz_K8A~D|BUhld|8^TkbF}JWt^*i0H{Y`D{Av%kil zeco*I?`x$68l-kShp8LiE~l$X2JDSp0@!qj!HscmvE6YR~6 zlA}M4JB^GqVS&ECu!P1JY}YJ)-^=EotUh1lx8lN2{M|gPCC(Z1o!s+MKjb&5N`3`LEvZUHWEm)ctz4 z^XkGjRPz-bvh~7WE_}Y?$j~9fMvT1mz=Ly?0fPqiTYNEjMTbzfwW5Eve&`;gR0{Ws zQ(Ji4+daQEE!#TWA=`(5`^lZKqN8$X=@J3<&$bTTGxuKdQVIxPd_U-#R zauH1REu>75i_fL)I~Ul{rgr=f5RQHRN3kZ&?{h zqWMer7SDaKQ$VC#vUeV85|7=d2Rm6JZ25r)JLQ+3PSc%NOVEg^Z`jgD5R`FVeK3T!Or@4(vLl3qh_Oh&AsSdlwWXx-P04kZ zljCU7Ge~PGd%%uEcZR45e#y9pYEpQ6eG` z5)n;N5gt5U9E>DL0ZB$P&BJNPEn#FSdih% zZFFsc2r)UnuF=>fi}6$>B?(Z8lYjDBFyrBmqHJiLDXcIW7zRfSp)83WrH~Q}g;Paa z6&>uQ#7ID_zZe9HxS=Etdm1VYv?_9Uiz4JMbbR-iXyAajxYbCg4PI5Ptj36m^ zah;MxEv}K1;GG~Os!+~UA0(d#XZCG1U~EK?BhS4m25x<*($sF2Y8-uST~OkfrE7kuemr8mM94ZMhn2P9CSIapjo*M1pu>`i*c+M`!|a<14aa;lT%( z%k{#OR$hBsM=f=%x79@4_lm%Q>UK;`mgt1h6ClT(E;Y4nNZ=z4!oqBVye>W+HdWNL zjs!$(rJwotsu>3E+^d;etD?w4jr6Q*D+vXzwKprT(hWuLjO5ucvhC|klz<_;WVMDN z9zM!Jh?*5r%yDRR?s%7EkO^v@ge-Fw;%Z9BXB>cAOG1%`m}~PTIb#gF3RKMyMq>)( z%c${+t>YS=Esp;AKLY>2{xxgCI*ZpQ>2IENlmK{xHA5P#d;*^%U2{|w^>UD!wZw$? z4E;x<=ByR!6FIBG8@x?nt&szgFe;$P_pKaIpS44Wy(LPrbr3u{luF7LOvaNkvXp|g zm@%_wk#+`5G2_P1alO@`4XA}8bmsVpu2=DAL(_U6wHhMkVVDXAd7)4Rgq`TYNCN9= zvT1|Sv|9)aq8v6f1kMLf#G)`ZR1AcYQE@1*92ytbx(YNYD4IPC6@U%r;H(M|1v(%# z8;*{E!N1^4#0n5w+QHEZyA|!kE_VECyf)58pyE-mwzZy>6KXjKg&pjKbM%8a7~^2` z5~GM*iTHe-c%32=e^gy!3M+ljD|}C;k-%#;_p zCySS9^VIrm)Yox8kRl_Bvp!&;TB7OJluKGAHz4yFycZIs$5^=FBkMs`eF}c zmh_g#faT_hpo&cnpNqcAt_V`i7C{xuVAM;z6-J6Y+y&Bah2RNEzz27s^hd&7Ed4QX z#lTjI>sCd$MwHQeO+|Fc;HuG&i0HnLR7O|qFTr*-b|PtvmJG+{o||BJ)dYAwhbe>L z3nRT>?V&LuRsg{1jCm8SU(|DKHcGuB1VrJ zH*;jMLZfNqZKLNZvnI`$S)7jP4r}-6qi-88qb5&RW>rBua@yos#R_GZFnjt~H-^T& z493E$3E}+rpvO z2i2QNcxFwWLDeeHJ8Slsk#73(1}ite98JM>3^{W7iSEH{tOvaOo$Y!o-`>KCj;q>2 zf#bHRAW!MO3HhPFuwW>!wcFa6GsevxTdYhPH&Zm}-#bPml4Q7Tbn)0pl~k-kIMFCz zGJ$IP__@4fv#}j3kjKR>elxvgN zFo}3@eQpdMjmGUF^*wX#ep+Beils^o&k|bQNAt&;d9pm~$UBXPhHF`#cv`lk^VZL? zEJODyN<)=TdX8m!nvzmgpO@{nviOddOdp@p+>@+Mi{J|jsn|Agd|PuW_5n)NR^?}! zdotDI{ z?UjcA1~=mq^*~y>;)>{hr+YbXV0l!nPtojRN$;8CM~|CU;TuDEU_A`_A3n%p*8?_Z zRH`E^k>ZIW@sM0KMQP!>!b)!pPjBTJ$|syQnuL}iqu&)prR79I?(NI{9P`*(1q`F;Z-jDhzswMZb;eZB6`DhkGcs@y9vK?VOWZRo9(*73=758 zciqOCOy9zd@8rVWU3h>Ck8@q|fxu6*%2GGM<8H(j*L~Ry-|50fUH5(0J>$lI<5u8; z>t1%le|OX2pb^4N*M*H4xZqpHFT}D4zO02Wk{g%J6h8G;Gf;WA7zT73;^iRqvdz

kWI9X6xfEg+%tn!0#5 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 B$A$m^ delta 112199 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

2om~ML88n|XG9S<25b+i!5Ls9FfOKiA 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, "Unknown"); - strcpy(pci_device->product_name, "Unknown"); - strcpy(vendor_id, "0000"); - strcpy(product_id, "0000"); - strcpy(sub_product_id, "0000"); - strcpy(sub_vendor_id, "0000"); - - while (fgets(line, sizeof line, f)) { - if ((line[0] == '#') || (line[0] == ' ') || (line[0] == 'C') - || (line[0] == 10)) - continue; - if (line[0] != '\t') { - strncpy(vendor_id, line, 4); - vendor_id[4] = 0; - vendor = strdup(skipspace(strstr(line, " "))); - remove_eol(vendor); - strcpy(product_id, "0000"); - strcpy(sub_product_id, "0000"); - strcpy(sub_vendor_id, "0000"); - if (strstr(vendor_id, "ffff")) - break; - if (hex_to_int(vendor_id) == pci_device->vendor) - strcpy(pci_device->vendor_name, vendor); - } else if ((line[0] == '\t') && (line[1] != '\t')) { - product = strdup(skipspace(strstr(line, " "))); - remove_eol(product); - strncpy(product_id, &line[1], 4); - product_id[4] = 0; - strcpy(sub_product_id, "0000"); - strcpy(sub_vendor_id, "0000"); - if ((hex_to_int(vendor_id) == pci_device->vendor) - && (hex_to_int(product_id) == pci_device->product)) - strcpy(pci_device->product_name, product); - } else if ((line[0] == '\t') && (line[1] == '\t')) { - product = skipspace(strstr(line, " ")); - product = strdup(skipspace(strstr(product, " "))); - remove_eol(product); - strncpy(sub_vendor_id, &line[2], 4); - sub_vendor_id[4] = 0; - strncpy(sub_product_id, &line[7], 4); - sub_product_id[4] = 0; - 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)) - strcpy(pci_device->product_name, product); - } - } - fclose(f); -} - struct match *find_pci_device(s_pci_device_list * pci_device_list, struct match *list) { int pci_dev; uint32_t did, sid; struct match *m; - for (pci_dev = 0; pci_dev < pci_device_list->count; pci_dev++) { - s_pci_device *pci_device = - &pci_device_list->pci_device[pci_dev]; - sid = - ((pci_device->sub_product) << 16 | (pci_device-> - sub_vendor)); - did = ((pci_device->product << 16) | (pci_device->vendor)); - for (m = list; m; m = m->next) { + for (m = list; m; m = m->next) { + for (pci_dev = 0; pci_dev < pci_device_list->count; pci_dev++) { + s_pci_device *pci_device = + &pci_device_list->pci_device[pci_dev]; + sid = + ((pci_device->sub_product) << 16 | (pci_device-> + sub_vendor)); + did = ((pci_device->product << 16) | (pci_device->vendor)); if (((did ^ m->did) & m->did_mask) == 0 && ((sid ^ m->sid) & m->sid_mask) == 0 && pci_device->revision >= m->rid_min @@ -200,9 +131,6 @@ int pci_scan(s_pci_bus_list * pci_bus_list, s_pci_device_list * pci_device_list) if (hdrtype & 0x80) maxfunc = 7; /* Multifunction device */ - // if ( hdrtype & 0x7f ) - // continue; /* Ignore bridge devices */ - rid = pci_readb(a + 0x08); sid = pci_readl(a + 0x2c); s_pci_device *pci_device = @@ -214,7 +142,6 @@ int pci_scan(s_pci_bus_list * pci_bus_list, s_pci_device_list * pci_device_list) pci_device->sub_vendor = (sid << 16) >> 16; pci_device->revision = rid; pci_device_list->count++; - get_name_from_pci_ids(pci_device); dprintf ("Scanning: BUS %02x DID %08x (%04x:%04x) SID %08x RID %02x\n", bus, did, did >> 16, (did << 16) >> 16, @@ -230,7 +157,6 @@ int pci_scan(s_pci_bus_list * pci_bus_list, s_pci_device_list * pci_device_list) /* Detecting pci buses that have pci devices connected */ for (bus = 0; bus <= 0xff; bus++) { - if (pci_bus_list->pci_bus[bus].pci_device_count > 0) { pci_bus_list->count++; } diff --git a/com32/lib/sys/ansicon_write.c b/com32/lib/sys/ansicon_write.c index c500adbc..4f8eaee0 100644 --- a/com32/lib/sys/ansicon_write.c +++ b/com32/lib/sys/ansicon_write.c @@ -50,7 +50,7 @@ static void ansicon_set_cursor(int, int, int); static struct term_state ts; struct ansi_ops __ansicon_ops = { .erase = ansicon_erase, - .write_char = ansicon_write_char, + .write_char = ansicon_write_char, .showcursor = ansicon_showcursor, .set_cursor = ansicon_set_cursor, .scroll_up = ansicon_scroll_up, diff --git a/com32/lib/sys/farcall.c b/com32/lib/sys/farcall.c index 975c00e7..75288d4b 100644 --- a/com32/lib/sys/farcall.c +++ b/com32/lib/sys/farcall.c @@ -4,8 +4,8 @@ #include -void __farcall(uint16_t __es, uint16_t __eo, - const com32sys_t *__sr, com32sys_t *__dr) +void __farcall(uint16_t cs, uint16_t ip, + const com32sys_t *ireg, com32sys_t *oreg) { - __com32.cs_farcall((__es << 16) + __eo, __sr, __dr); + __com32.cs_farcall((cs << 16)+ip, ireg, oreg); } diff --git a/com32/lib/sys/intcall.c b/com32/lib/sys/intcall.c index 48ff148c..e32fb8a0 100644 --- a/com32/lib/sys/intcall.c +++ b/com32/lib/sys/intcall.c @@ -4,7 +4,7 @@ #include -void __intcall(uint8_t __i, const com32sys_t *__sr, com32sys_t *__dr) +void __intcall(uint8_t vector, const com32sys_t *ireg, com32sys_t *oreg) { - __com32.cs_intcall(__i, __sr, __dr); + __com32.cs_intcall(vector, ireg, oreg); } diff --git a/com32/lib/sys/line_input.c b/com32/lib/sys/line_input.c index 313a25e1..0276b58c 100644 --- a/com32/lib/sys/line_input.c +++ b/com32/lib/sys/line_input.c @@ -33,7 +33,7 @@ #include "file.h" #include -#include +#include ssize_t __line_input(struct file_info *fp, char *buf, size_t bufsize, ssize_t (*get_char)(struct file_info *, void *, size_t)) diff --git a/com32/lib/sys/vesa/alphatbl.pl b/com32/lib/sys/vesa/alphatbl.pl index dd716482..d70c76eb 100644 --- a/com32/lib/sys/vesa/alphatbl.pl +++ b/com32/lib/sys/vesa/alphatbl.pl @@ -51,4 +51,3 @@ for ($i = 0; $i <= 4079; $i++) { printf "\t%3d,\n", linear_to_srgb(($i+0.5)/4079.937744); } print "};\n\n"; - diff --git a/com32/lib/sys/vesa/background.c b/com32/lib/sys/vesa/background.c index ed0ab24d..2103a9c1 100644 --- a/com32/lib/sys/vesa/background.c +++ b/com32/lib/sys/vesa/background.c @@ -62,7 +62,7 @@ static void draw_background_line(int line, int start, int npixels) lbp = line_buf; while (npixels--) lbp = format_pixel(lbp, *bgptr++, pixel_format); - + memcpy(fbptr, line_buf, lbp-line_buf); } @@ -73,10 +73,10 @@ static void draw_background(void) const int bottom_border = VIDEO_BORDER + (TEXT_PIXEL_ROWS % __vesacon_font_height); const int right_border = VIDEO_BORDER + (TEXT_PIXEL_COLS % FONT_WIDTH); - + for (i = 0; i < VIDEO_BORDER; i++) draw_background_line(i, 0, VIDEO_X_SIZE); - + for (i = VIDEO_BORDER; i < VIDEO_Y_SIZE-bottom_border; i++) { draw_background_line(i, 0, VIDEO_BORDER); draw_background_line(i, VIDEO_X_SIZE-right_border, right_border); @@ -122,23 +122,16 @@ static int read_png_file(FILE *fp) /* Set the appropriate set of transformations. We need to end up with 32-bit BGRA format, no more, no less. */ + /* Expand to RGB first... */ + switch (info_ptr->color_type) { + case PNG_COLOR_TYPE_GRAY: case PNG_COLOR_TYPE_GRAY_ALPHA: png_set_gray_to_rgb(png_ptr); - /* fall through */ - - case PNG_COLOR_TYPE_RGB_ALPHA: break; - case PNG_COLOR_TYPE_GRAY: - png_set_gray_to_rgb(png_ptr); - /* fall through */ - case PNG_COLOR_TYPE_RGB: - if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) - png_set_tRNS_to_alpha(png_ptr); - else - png_set_add_alpha(png_ptr, ~0, PNG_FILLER_AFTER); + case PNG_COLOR_TYPE_RGB_ALPHA: break; case PNG_COLOR_TYPE_PALETTE: @@ -150,6 +143,20 @@ static int read_png_file(FILE *fp) break; } + /* ... then add an alpha channel ... */ + switch (info_ptr->color_type) { + case PNG_COLOR_TYPE_GRAY_ALPHA: + case PNG_COLOR_TYPE_RGB_ALPHA: + break; + + default: + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png_ptr); + else + png_set_add_alpha(png_ptr, ~0, PNG_FILLER_AFTER); + break; + } + png_set_bgr(png_ptr); if (info_ptr->bit_depth == 16) @@ -271,13 +278,13 @@ int vesacon_load_background(const char *filename) default_background(); } else { fp = fopen(filename, "r"); - + if (!fp) goto err; - + if (fread(header, 1, 8, fp) != 8) goto err; - + if (!png_sig_cmp(header, 0, 8)) { rv = read_png_file(fp); } else if (!jpeg_sig_cmp(header, 8)) { diff --git a/com32/lib/sys/vesa/drawtxt.c b/com32/lib/sys/vesa/drawtxt.c index a4efb86e..b27ce4b3 100644 --- a/com32/lib/sys/vesa/drawtxt.c +++ b/com32/lib/sys/vesa/drawtxt.c @@ -53,7 +53,7 @@ static inline __attribute__((always_inline)) tmp = __vesacon_srgb_to_linear[fg] * alpha; tmp += __vesacon_srgb_to_linear[bg] * (255-alpha); - + return __vesacon_linear_to_srgb[tmp >> 12]; } @@ -87,9 +87,9 @@ static void vesacon_update_characters(int row, int col, int nrows, int ncols) uint8_t row_buffer[VIDEO_X_SIZE*4], *rowbufptr; uint8_t *fbrowptr; uint8_t sha; - + bgrowptr = &__vesacon_background[row*height+VIDEO_BORDER][col*width+VIDEO_BORDER]; - + pixel_offset = ((row*height+VIDEO_BORDER)*VIDEO_X_SIZE)+ (col*width+VIDEO_BORDER); diff --git a/com32/lib/sys/vesa/fill.h b/com32/lib/sys/vesa/fill.h index 379852eb..6a350125 100644 --- a/com32/lib/sys/vesa/fill.h +++ b/com32/lib/sys/vesa/fill.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- * - * + * * Copyright 2006 H. Peter Anvin - All Rights Reserved * * Permission is hereby granted, free of charge, to any person @@ -10,10 +10,10 @@ * 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 diff --git a/com32/lib/sys/vesa/fmtpixel.h b/com32/lib/sys/vesa/fmtpixel.h index b1d9fa50..33cc30a5 100644 --- a/com32/lib/sys/vesa/fmtpixel.h +++ b/com32/lib/sys/vesa/fmtpixel.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- * - * + * * Copyright 2006 H. Peter Anvin - All Rights Reserved * * Permission is hereby granted, free of charge, to any person @@ -10,10 +10,10 @@ * 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 @@ -53,7 +53,7 @@ static inline __attribute__((always_inline)) *(uint32_t *)ptr = bgra; ptr = (uint8_t *)ptr + 3; break; - + case PXF_LE_RGB16_565: { uint16_t pxv = diff --git a/com32/lib/sys/vesa/initvesa.c b/com32/lib/sys/vesa/initvesa.c index febb5804..c70f1cdb 100644 --- a/com32/lib/sys/vesa/initvesa.c +++ b/com32/lib/sys/vesa/initvesa.c @@ -152,7 +152,7 @@ static int vesacon_set_mode(void) mi->rpos, mi->gpos, mi->bpos); /* Must be an LFB color graphics mode supported by the hardware. - + The bits tested are: 7 - linear frame buffer available 4 - graphics mode @@ -171,7 +171,7 @@ static int vesacon_set_mode(void) (depending on VESA version ) */ pxf = PXF_NONE; /* Not usable */ - if (mi->bpp == 32 && + if (mi->bpp == 32 && (mi->memory_layout == 4 || (mi->memory_layout == 6 && mi->rpos == 16 && mi->gpos == 8 && mi->bpos == 0))) diff --git a/com32/lib/sys/vesacon_write.c b/com32/lib/sys/vesacon_write.c index 87f70666..2a9c61d3 100644 --- a/com32/lib/sys/vesacon_write.c +++ b/com32/lib/sys/vesacon_write.c @@ -51,7 +51,7 @@ static void vesacon_scroll_up(const struct term_state *); static struct term_state ts; static struct ansi_ops op = { .erase = vesacon_erase, - .write_char = vesacon_write_char, + .write_char = vesacon_write_char, .showcursor = vesacon_showcursor, .set_cursor = __vesacon_set_cursor, /* in drawtxt.c */ .scroll_up = vesacon_scroll_up, diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/addlist.c similarity index 75% copy from com32/libutil/idle.c copy to com32/lib/syslinux/addlist.c index 0cb7d000..fbb166c2 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/addlist.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,28 +25,21 @@ * * ----------------------------------------------------------------------- */ -/* - * idle.c - * - * What to do in a busy loop... - */ - -#ifdef __COM32__ +#include +#include -#include - -void do_idle(void) +int syslinux_add_movelist(struct syslinux_movelist **list, + addr_t dst, addr_t src, addr_t len) { - syslinux_idle(); -} + struct syslinux_movelist *ml = malloc(sizeof(struct syslinux_movelist)); + if (!ml) + return -1; -#else + ml->dst = dst; + ml->src = src; + ml->len = len; + ml->next = *list; -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + *list = ml; + return 0; } - -#endif diff --git a/com32/libutil/include/libutil.h b/com32/lib/syslinux/cleanup.c similarity index 82% copy from com32/libutil/include/libutil.h copy to com32/lib/syslinux/cleanup.c index 3b6278f9..3aafde27 100644 --- a/com32/libutil/include/libutil.h +++ b/com32/lib/syslinux/cleanup.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,15 +25,16 @@ * * ----------------------------------------------------------------------- */ -/* - * libutil.h - * - * Misc libutil functions - */ +#include +#include +#include -#ifndef LIBUTIL_LIBUTIL_H -#define LIBUTIL_LIBUTIL_H +void syslinux_final_cleanup(uint16_t flags) +{ + static com32sys_t ireg; -void do_idle(void); + ireg.eax.w[0] = 0x000c; + ireg.edx.w[0] = flags; -#endif + __intcall(0x22, &ireg, NULL); +} diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/config.c similarity index 77% copy from com32/libutil/idle.c copy to com32/lib/syslinux/config.c index 0cb7d000..8a1e9214 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/config.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,28 +25,17 @@ * * ----------------------------------------------------------------------- */ -/* - * idle.c - * - * What to do in a busy loop... - */ - -#ifdef __COM32__ +#include +#include +#include -#include +const char *__syslinux_config_file; -void do_idle(void) +void __constructor __syslinux_get_config_file_name(void) { - syslinux_idle(); -} - -#else + static com32sys_t reg; -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + reg.eax.w[0] = 0x000e; + __intcall(0x22, ®, ®); + __syslinux_config_file = MK_PTR(reg.es, reg.ebx.w[0]); } - -#endif diff --git a/com32/lib/sys/idle.c b/com32/lib/syslinux/dump_mmap.c similarity index 69% copy from com32/lib/sys/idle.c copy to com32/lib/syslinux/dump_mmap.c index 6f65c436..cdd5daea 100644 --- a/com32/lib/sys/idle.c +++ b/com32/lib/syslinux/dump_mmap.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,32 +26,23 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * dump_mmap.c * - * What to do in a busy loop... + * Writes a syslinux_memmap out to a specified file. This is + * intended for debugging. */ -#include -#include -#include -#include +#include +#include -void syslinux_idle(void) +void syslinux_dump_memmap(FILE *file, struct syslinux_memmap *memmap) { - static int do_idle = 1; - static const com32sys_t sys_idle = { - .eax.l = 0x0013, - }; - com32sys_t idle_result; - - /* This call isn't supported on SYSLINUX < 3.08, but all it does - is return an error, so we don't care. */ - - if ( do_idle ) { - __intcall(0x22, &sys_idle, &idle_result); - - do_idle = ~idle_result.eflags.l & EFLAGS_CF; + fprintf(file, "%10s %10s %10s\n" + "--------------------------------\n", + "Start", "Length", "Type"); + while (memmap->type != SMT_END) { + fprintf(file, "0x%08x 0x%08x %10d\n", memmap->start, + memmap->next->start - memmap->start, memmap->type); + memmap = memmap->next; } - - cpu_relax(); } diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/dump_movelist.c similarity index 72% copy from com32/libutil/idle.c copy to com32/lib/syslinux/dump_movelist.c index 0cb7d000..0723dcd1 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/dump_movelist.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,22 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * dump_movelist.c * - * What to do in a busy loop... + * Writes a syslinux_movelist out to a specified file. This is + * intended for debugging. */ -#ifdef __COM32__ +#include +#include -#include - -void do_idle(void) +void syslinux_dump_movelist(FILE *file, struct syslinux_movelist *ml) { - syslinux_idle(); + fprintf(file, "%10s %10s %10s\n" + "--------------------------------\n", + "Dest", "Src", "Length"); + while (ml) { + fprintf(file, "0x%08x 0x%08x 0x%08x\n", ml->dst, ml->src, ml->len); + ml = ml->next; + } } - -#else - -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ -} - -#endif diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/features.c similarity index 70% copy from com32/libutil/idle.c copy to com32/lib/syslinux/features.c index 0cb7d000..2b61eb4c 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/features.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,26 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * syslinux/features.c * - * What to do in a busy loop... + * SYSLINUX feature flag query */ -#ifdef __COM32__ +#include +#include +#include +#include -#include +struct __syslinux_feature_flags __syslinux_feature_flags; -void do_idle(void) +void __constructor __syslinux_detect_features(void) { - syslinux_idle(); -} - -#else + static com32sys_t reg; -#include + memset(®, 0, sizeof reg); + reg.eax.w[0] = 0x0015; + __intcall(0x22, ®, ®); -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + __syslinux_feature_flags.len = reg.ecx.w[0]; + __syslinux_feature_flags.ptr = MK_PTR(reg.es, reg.ebx.w[0]); } - -#endif diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/freelist.c similarity index 80% copy from com32/libutil/idle.c copy to com32/lib/syslinux/freelist.c index 0cb7d000..ebbe2617 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/freelist.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,21 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * freelist.c * - * What to do in a busy loop... + * Frees a syslinux_movelist */ -#ifdef __COM32__ +#include +#include -#include - -void do_idle(void) +void syslinux_free_movelist(struct syslinux_movelist *list) { - syslinux_idle(); -} - -#else + struct syslinux_movelist *m; -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + while (list) { + m = list; + list = list->next; + free(m); + } } - -#endif diff --git a/com32/lib/sys/idle.c b/com32/lib/syslinux/idle.c similarity index 98% copy from com32/lib/sys/idle.c copy to com32/lib/syslinux/idle.c index 6f65c436..f951e822 100644 --- a/com32/lib/sys/idle.c +++ b/com32/lib/syslinux/idle.c @@ -31,10 +31,10 @@ * What to do in a busy loop... */ -#include #include #include #include +#include void syslinux_idle(void) { diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/initramfs.c similarity index 58% copy from com32/libutil/idle.c copy to com32/lib/syslinux/initramfs.c index 0cb7d000..f6d8f827 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/initramfs.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,51 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * initramfs.c * - * What to do in a busy loop... + * Utility functions for initramfs manipulation */ -#ifdef __COM32__ +#include +#include -#include - -void do_idle(void) +struct initramfs *initramfs_init(void) { - syslinux_idle(); -} + struct initramfs *ir; -#else + ir = calloc(sizeof(*ir), 1); + if (!ir) + return NULL; -#include + ir->prev = ir->next = ir; + return ir; +} -void do_idle(void) +int initramfs_add_data(struct initramfs *ihead, const void *data, + size_t data_len, size_t len, size_t align) { - sched_yield(); /* As good as we can get... */ -} + struct initramfs *in; + + if (!len) + return 0; /* Nothing to add... */ -#endif + /* Alignment must be a power of 2, and <= INITRAMFS_MAX_ALIGN */ + if (!align || (align & (align-1)) || align > INITRAMFS_MAX_ALIGN) + return -1; + + in = malloc(sizeof(*in)); + if (!in) + return -1; + + in->len = len; + in->data = data; + in->data_len = data_len; + in->align = align; + + in->next = ihead; + in->prev = ihead->prev; + ihead->prev->next = in; + ihead->prev = in; + + return 0; +} diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/initramfs_archive.c similarity index 75% copy from com32/libutil/idle.c copy to com32/lib/syslinux/initramfs_archive.c index 0cb7d000..69c9ba7b 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/initramfs_archive.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,22 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * initramfs_archive.c * - * What to do in a busy loop... + * Utility function to load an initramfs archive. */ -#ifdef __COM32__ +#include +#include +#include -#include - -void do_idle(void) +int initramfs_load_archive(struct initramfs *ihead, const char *filename) { - syslinux_idle(); -} - -#else + void *data; + size_t len; -#include + if (loadfile(filename, &data, &len)) + return -1; -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + return initramfs_add_data(ihead, data, len, len, 4); } - -#endif diff --git a/com32/lib/syslinux/initramfs_file.c b/com32/lib/syslinux/initramfs_file.c new file mode 100644 index 00000000..26d19c5a --- /dev/null +++ b/com32/lib/syslinux/initramfs_file.c @@ -0,0 +1,163 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * initramfs_file.c + * + * Utility functions to add arbitrary files including cpio header + */ + +#include +#include +#include +#include +#include + +#define CPIO_MAGIC "070701" +struct cpio_header { + char c_magic[6]; /* 070701 */ + char c_ino[8]; /* Inode number */ + char c_mode[8]; /* File mode and permissions */ + char c_uid[8]; /* uid */ + char c_gid[8]; /* gid */ + char c_nlink[8]; /* Number of links */ + char c_mtime[8]; /* Modification time */ + char c_filesize[8]; /* Size of data field */ + char c_maj[8]; /* File device major number */ + char c_min[8]; /* File device minor number */ + char c_rmaj[8]; /* Device node reference major number */ + char c_rmin[8]; /* Device node reference minor number */ + char c_namesize[8]; /* Length of filename including final \0 */ + char c_chksum[8]; /* Checksum if c_magic ends in 2 */ +}; + +static uint32_t next_ino = 1; + +/* Create cpio headers for the directory entries leading up to a file. + Returns the number of bytes; doesn't touch the buffer if too small. */ +static size_t initramfs_mkdirs(const char *filename, void *buffer, + size_t buflen) +{ + const char *p = filename; + char *bp = buffer; + int len; + size_t bytes = 0; + int pad; + + while ((p = strchr(p, '/'))) { + if (p != filename && p[-1] != '/') { + len = p-filename; + bytes += ((sizeof(struct cpio_header)+len+1)+3) & ~3; + } + p++; + } + + if (buflen >= bytes) { + p = filename; + while ((p = strchr(p, '/'))) { + if (p != filename && p[-1] != '/') { + len = p-filename; + bp += sprintf(bp, "070701%08x%08x%08x%08x%08x%08x%08x%08x%08x" + "%08x%08x%08x%08x", next_ino++, S_IFDIR|0755, + 0, 0, 1, 0, 0, 0, 1, 0, 1, len+1, 0); + memcpy(bp, filename, len); + bp += len; + pad = (-(sizeof(struct cpio_header)+len) & 3) + 1; + memset(bp, 0, pad); + bp += pad; + } + } + } + + return bytes; +} + +/* + * Create a file header (with optional parent directory entries) + * and add it to an initramfs chain + */ +int initramfs_mknod(struct initramfs *ihead, const char *filename, + int do_mkdir, + uint16_t mode, size_t len, + uint32_t major, uint32_t minor) +{ + size_t bytes; + int namelen = strlen(filename); + int pad; + char *buffer, *bp; + + if (do_mkdir) + bytes = initramfs_mkdirs(filename, NULL, 0); + else + bytes = 0; + + bytes += ((sizeof(struct cpio_header)+namelen+1)+3) & ~3; + + bp = buffer = malloc(bytes); + if (!buffer) + return -1; + + if (do_mkdir) + bp += initramfs_mkdirs(filename, bp, bytes); + + bp += sprintf(bp, "070701%08x%08x%08x%08x%08x%08x%08x%08x%08x" + "%08x%08x%08x%08x", next_ino++, mode, + 0, 0, 1, 0, len, 0, 1, major, minor, namelen+1, 0); + memcpy(bp, filename, namelen); + bp += len; + pad = (-(sizeof(struct cpio_header)+namelen) & 3) + 1; + memset(bp, 0, pad); + + if (initramfs_add_data(ihead, buffer, bytes, bytes, 4)) { + free(buffer); + return -1; + } + + return 0; +} + +/* + * Add a file given data in memory to an initramfs chain. This + * can be used to create nonfiles like symlinks by specifying an + * appropriate mode. + */ +int initramfs_add_file(struct initramfs *ihead, const void *data, + size_t data_len, size_t len, + const char *filename, int do_mkdir, uint32_t mode) +{ + if (initramfs_mknod(ihead, filename, do_mkdir, + (mode & S_IFMT) ? mode : mode|S_IFREG, + len, 0, 1)) + return -1; + + return initramfs_add_data(ihead, data, data_len, len, 4); +} + +int initramfs_add_trailer(struct initramfs *ihead) +{ + return initramfs_mknod(ihead, "TRAILER!!!", 0, 0, 0, 0, 0); +} diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/initramfs_loadfile.c similarity index 72% copy from com32/libutil/idle.c copy to com32/lib/syslinux/initramfs_loadfile.c index 0cb7d000..de9c4bde 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/initramfs_loadfile.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,27 +26,23 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * initramfs_loadfile.c * - * What to do in a busy loop... + * Load a single file into an initramfs image. */ -#ifdef __COM32__ +#include +#include -#include - -void do_idle(void) +int initramfs_load_file(struct initramfs *ihead, const char *src_filename, + const char *dst_filename, int do_mkdir, uint32_t mode) { - syslinux_idle(); -} - -#else + void *data; + size_t len; -#include + if (loadfile(src_filename, &data, &len)) + return -1; -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + return initramfs_add_file(ihead, data, len, len, dst_filename, + do_mkdir, mode); } - -#endif diff --git a/com32/lib/syslinux/load_linux.c b/com32/lib/syslinux/load_linux.c new file mode 100644 index 00000000..b8d5a732 --- /dev/null +++ b/com32/lib/syslinux/load_linux.c @@ -0,0 +1,308 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * load_linux.c + * + * Load a Linux kernel (Image/zImage/bzImage). + */ + +#include +#include +#include +#include +#include +#include + +struct linux_header { + uint8_t boot_sector_1[0x0020]; + uint16_t old_cmd_line_magic; + uint16_t old_cmd_line_offset; + uint8_t boot_sector_2[0x01f1-0x0024]; + uint8_t setup_sects; + uint16_t root_flags; + uint32_t syssize; + uint16_t ram_size; + uint16_t vid_mode; + uint16_t root_dev; + uint16_t boot_flag; + uint16_t jump; + uint32_t header; + uint16_t version; + uint32_t realmode_swtch; + uint16_t start_sys; + uint16_t kernel_version; + uint8_t type_of_loader; + uint8_t loadflags; + uint16_t setup_move_size; + uint32_t code32_start; + uint32_t ramdisk_image; + uint32_t ramdisk_size; + uint32_t bootsect_kludge; + uint16_t heap_end_ptr; + uint16_t pad1; + uint32_t cmd_line_ptr; + uint32_t initrd_addr_max; + uint32_t kernel_alignment; + uint8_t relocatable_kernel; + uint8_t pad2[3]; + uint32_t cmdline_max_len; +} __packed; + +#define BOOT_MAGIC 0xAA55 +#define LINUX_MAGIC ('H' + ('d' << 8) + ('r' << 16) + ('S' << 24)) +#define OLD_CMDLINE_MAGIC 0xA33F + +/* loadflags */ +#define LOAD_HIGH 0x01 +#define CAN_USE_HEAP 0x80 + +/* Offset for the command line versus the real mode code */ +#define CMDLINE_OFFSET 0x9000 + +/* Get the combined size of the initramfs */ +static addr_t initramfs_size(struct initramfs *initramfs) +{ + struct initramfs *ip; + addr_t size = 0; + + if (!initramfs) + return 0; + + for (ip = initramfs->next; ip->len; ip = ip->next) { + size = (size+ip->align-1) & ~(ip->align-1); /* Alignment */ + size += ip->len; + } + + return size; +} + +/* Create the appropriate mappings for the initramfs */ +static int map_initramfs(struct syslinux_movelist **fraglist, + struct syslinux_memmap **mmap, + struct initramfs *initramfs, + addr_t addr) +{ + struct initramfs *ip; + addr_t next_addr, len, pad; + + for (ip = initramfs->next; ip->len; ip = ip->next) { + len = ip->len; + next_addr = addr+len; + + /* If this isn't the last entry, extend the zero-pad region + to enforce the alignment of the next chunk. */ + if (ip->next->len) { + pad = -next_addr & (ip->next->align-1); + len += pad; + next_addr += pad; + } + + if (ip->data_len) { + if (syslinux_add_movelist(fraglist, addr, (addr_t)ip->data, len)) + return -1; + } + if (len > ip->data_len) { + if (syslinux_add_memmap(mmap, addr+ip->data_len, + len-ip->data_len, SMT_ZERO)) + return -1; + } + addr = next_addr; + } + + return 0; +} + +int syslinux_boot_linux(void *kernel_buf, size_t kernel_size, + struct initramfs *initramfs, + char *cmdline, + uint16_t video_mode, + uint32_t memlimit) +{ + struct linux_header hdr, *whdr; + size_t real_mode_size, prot_mode_size; + addr_t real_mode_base, prot_mode_base; + addr_t irf_size; + size_t cmdline_size; + struct syslinux_rm_regs regs; + struct syslinux_movelist *fraglist = NULL; + struct syslinux_memmap *mmap = NULL; + struct syslinux_memmap *amap = NULL; + + cmdline_size = strlen(cmdline)+1; + + if (kernel_size < 2*512) + goto bail; + + /* Copy the header into private storage */ + memcpy(&hdr, kernel_buf, sizeof hdr); + whdr = (struct linux_header *)kernel_buf; /* Writable header */ + + if (hdr.boot_flag != BOOT_MAGIC) + goto bail; + + if (hdr.header != LINUX_MAGIC) { + hdr.version = 0x0100; /* Very old kernel */ + hdr.loadflags = 0; + } + + whdr->vid_mode = video_mode; + + if (!hdr.setup_sects) + hdr.setup_sects = 4; + + if (hdr.version < 0x0203) + hdr.initrd_addr_max = 0x37ffffff; + + if (!memlimit || memlimit-1 > hdr.initrd_addr_max) + memlimit = hdr.initrd_addr_max+1; /* Zero for no limit */ + + if (hdr.version < 0x0206) + hdr.cmdline_max_len = 256; + + if (cmdline_size > hdr.cmdline_max_len) { + cmdline_size = hdr.cmdline_max_len; + cmdline[cmdline_size-1] = '\0'; + } + + real_mode_size = (hdr.setup_sects+1) << 9; + real_mode_base = (hdr.loadflags & LOAD_HIGH) ? 0x10000 : 0x90000; + prot_mode_base = (hdr.loadflags & LOAD_HIGH) ? 0x100000 : 0x10000; + prot_mode_size = kernel_size - real_mode_size; + + if (!(hdr.loadflags & LOAD_HIGH) && prot_mode_size > 512*1024) + goto bail; /* Kernel cannot be loaded low */ + + if (initramfs && hdr.version < 0x0200) + goto bail; /* initrd/initramfs not supported */ + + if (hdr.version >= 0x0200) { + whdr->type_of_loader = 0x30; /* SYSLINUX unknown module */ + if (hdr.version >= 0x0201) { + whdr->heap_end_ptr = CMDLINE_OFFSET - 0x0200; + whdr->loadflags |= CAN_USE_HEAP; + } + if (hdr.version >= 0x0202) { + whdr->cmd_line_ptr = real_mode_base + CMDLINE_OFFSET; + } else { + whdr->old_cmd_line_magic = OLD_CMDLINE_MAGIC; + whdr->old_cmd_line_offset = CMDLINE_OFFSET; + /* Be paranoid and round up to a multiple of 16 */ + whdr->setup_move_size = (CMDLINE_OFFSET+cmdline_size+15) & ~15; + } + } + + /* Get the memory map */ + mmap = syslinux_memory_map(); /* Memory map for shuffle_boot */ + amap = syslinux_dup_memmap(mmap); /* Keep track of available memory */ + if (!mmap || !amap) + goto bail; + + /* 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 + some of it), or just in the amap? */ + if (memlimit) + if (syslinux_add_memmap(&amap, memlimit, -memlimit, SMT_RESERVED)) + goto bail; + + /* Place the kernel in memory */ + + /* Real mode code */ + if (syslinux_add_movelist(&fraglist, real_mode_base, (addr_t)kernel_buf, + real_mode_size)) + goto bail; + if (syslinux_add_memmap(&amap, real_mode_base, CMDLINE_OFFSET+cmdline_size, + SMT_ALLOC)) + goto bail; + + /* Zero region between real mode code and cmdline */ + if (syslinux_add_memmap(&mmap, real_mode_base+real_mode_size, + CMDLINE_OFFSET-real_mode_size, SMT_ZERO)) + goto bail; + + /* Command line */ + if (syslinux_add_movelist(&fraglist, real_mode_base+CMDLINE_OFFSET, + (addr_t)cmdline, cmdline_size)) + goto bail; + + /* Protected-mode code */ + if (syslinux_add_movelist(&fraglist, prot_mode_base, + (addr_t)kernel_buf + real_mode_size, + prot_mode_size)) + goto bail; + if (syslinux_add_memmap(&amap, prot_mode_base, prot_mode_size, SMT_ALLOC)) + goto bail; + + /* Figure out the size of the initramfs, and where to put it. + We should put it at the highest possible address which is + <= hdr.initrd_addr_max, which fits the entire initramfs. */ + + irf_size = initramfs_size(initramfs); /* Handles initramfs == NULL */ + + if (irf_size) { + addr_t best_addr = 0; + struct syslinux_memmap *ml; + const addr_t align_mask = INITRAMFS_MAX_ALIGN-1; + + if (irf_size) { + for (ml = amap; ml->type != SMT_END; ml = ml->next) { + addr_t adj_start = (ml->start+align_mask) & ~align_mask; + if (ml->type == SMT_FREE && + ml->next->start - adj_start >= irf_size) + best_addr = (ml->next->start - irf_size) & ~align_mask; + } + + if (!best_addr) + goto bail; /* Insufficient memory for initramfs */ + + whdr->ramdisk_image = best_addr; + whdr->ramdisk_size = irf_size; + + if (syslinux_add_memmap(&amap, best_addr, irf_size, SMT_ALLOC)) + goto bail; + + if (map_initramfs(&fraglist, &mmap, initramfs, best_addr)) + goto bail; + } + } + + /* Set up the registers on entry */ + memset(®s, 0, sizeof regs); + regs.es = regs.ds = regs.ss = regs.fs = regs.gs = real_mode_base >> 4; + regs.cs = (real_mode_base >> 4)+0x20; + /* regs.ip = 0; */ + regs.esp.w[0] = CMDLINE_OFFSET; + + syslinux_shuffle_boot_rm(fraglist, mmap, 0, ®s); + + bail: + syslinux_free_movelist(fraglist); + syslinux_free_memmap(mmap); + syslinux_free_memmap(amap); + return -1; +} diff --git a/com32/libutil/loadfile.c b/com32/lib/syslinux/loadfile.c similarity index 97% rename from com32/libutil/loadfile.c rename to com32/lib/syslinux/loadfile.c index d9cfb3b7..9a4e3ca5 100644 --- a/com32/libutil/loadfile.c +++ b/com32/lib/syslinux/loadfile.c @@ -23,7 +23,7 @@ #include #include -#include "loadfile.h" +#include int loadfile(const char *filename, void **ptr, size_t *len) { diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/localboot.c similarity index 80% copy from com32/libutil/idle.c copy to com32/lib/syslinux/localboot.c index 0cb7d000..381883ca 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/localboot.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,28 +25,18 @@ * * ----------------------------------------------------------------------- */ -/* - * idle.c - * - * What to do in a busy loop... - */ - -#ifdef __COM32__ +#include +#include +#include -#include +/* This returns only on failure */ -void do_idle(void) +void syslinux_local_boot(uint16_t flags) { - syslinux_idle(); -} + static com32sys_t ireg; -#else + ireg.eax.w[0] = 0x0014; + ireg.edx.w[0] = flags; -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + __intcall(0x22, &ireg, NULL); } - -#endif diff --git a/com32/lib/syslinux/memmap.c b/com32/lib/syslinux/memmap.c new file mode 100644 index 00000000..e0a435b7 --- /dev/null +++ b/com32/lib/syslinux/memmap.c @@ -0,0 +1,153 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * memmap.c + * + * Create initial memory map for "shuffle and boot" operation + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +struct e820_entry { + uint64_t start; + uint64_t len; + uint32_t type; +}; + +struct syslinux_memmap *syslinux_memory_map(void) +{ + static com32sys_t ireg, zireg; + com32sys_t oreg; + struct e820_entry *e820buf = __com32.cs_bounce; + uint64_t start, len, maxlen; + int memfound = 0; + struct syslinux_memmap *mmap; + enum syslinux_memmap_types type; + + mmap = syslinux_init_memmap(); + if (!mmap) + goto bail; + + /* Use INT 12h to get DOS memory above 0x7c00 */ + __intcall(0x12, &zireg, &oreg); + if (oreg.eax.w[0] > 31 && oreg.eax.w[0] <= 640) { + addr_t dosmem = (oreg.eax.w[0] << 10) - 0x7c00; + if (syslinux_add_memmap(&mmap, 0x7c00, dosmem, SMT_FREE)) + goto bail; + } + + /* First try INT 15h AX=E820h */ + ireg.eax.l = 0xe820; + ireg.edx.l = 0x534d4150; + ireg.ebx.l = 0; + ireg.ecx.l = 20; + ireg.es = SEG(e820buf); + ireg.edi.w[0] = OFFS(e820buf); + + do { + __intcall(0x15, &ireg, &oreg); + + if ((oreg.eflags.l & EFLAGS_CF) || + (oreg.eax.l != 0x534d4150) || + (oreg.ecx.l < 20)) + break; + + type = e820buf->type == 1 ? SMT_FREE : SMT_RESERVED; + start = e820buf->start; + len = e820buf->len; + + if (start < 0x100000000ULL) { + /* Don't rely on E820 being valid for low memory. Doing so + could mean stuff like overwriting the PXE stack even when + using "keeppxe", etc. */ + if (start < 0x100000ULL) { + if (len > 0x100000ULL-start) + len -= 0x100000ULL-start; + else + len = 0; + start = 0x100000ULL; + } + + maxlen = 0x100000000ULL-start; + if (len > maxlen) + len = maxlen; + + if (len) { + if (syslinux_add_memmap(&mmap, (addr_t)start, (addr_t)len, type)) + goto bail; + memfound = 1; + } + } + + ireg.ebx.l = oreg.ebx.l; + } while (oreg.ebx.l); + + if (memfound) + return mmap; + + /* Next try INT 15h AX=E801h */ + ireg.eax.w[0] = 0xe801; + __intcall(0x15, &ireg, &oreg); + + if (!(oreg.eflags.l & EFLAGS_CF) && oreg.ecx.w[0]) { + if (syslinux_add_memmap(&mmap, (addr_t)1 << 20, oreg.ecx.w[0] << 10, + SMT_FREE)) + goto bail; + + if (oreg.edx.w[0]) { + if (syslinux_add_memmap(&mmap, (addr_t)16 << 20, oreg.edx.w[0] << 16, + SMT_FREE)) + goto bail; + } + + return mmap; + } + + /* Finally try INT 15h AH=88h */ + ireg.eax.w[0] = 0x8800; + if (!(oreg.eflags.l & EFLAGS_CF) && oreg.eax.w[0]) { + if (syslinux_add_memmap(&mmap, (addr_t)1 << 20, oreg.ecx.w[0] << 10, + SMT_FREE)) + goto bail; + } + + return mmap; + + bail: + syslinux_free_memmap(mmap); + return NULL; +} diff --git a/com32/libutil/movebits.c b/com32/lib/syslinux/movebits.c similarity index 56% rename from com32/libutil/movebits.c rename to com32/lib/syslinux/movebits.c index 00bdad79..9287758c 100644 --- a/com32/libutil/movebits.c +++ b/com32/lib/syslinux/movebits.c @@ -1,3 +1,42 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * movebits.c + * + * Utility function to take a list of memory areas to shuffle and + * convert it to a set of shuffle operations. + * + * Note: a lot of the functions in this file deal with "parent pointers", + * which are pointers to a pointer to a list, or part of the list. + * They can be pointers to a variable holding the list root pointer, + * or pointers to a next field of a previous entry. + */ + #include #include #include @@ -5,9 +44,16 @@ #include #include -#include "movebits.h" +#include #ifdef TEST +# define DEBUG 1 +#else +# define DEBUG 0 +#endif + +#if DEBUG +# include # define dprintf printf #else # define dprintf(...) ((void)0) @@ -16,73 +62,12 @@ #define min(x,y) ((x) < (y) ? (x) : (y)) #define max(x,y) ((x) > (y) ? (x) : (y)) -/* - * Public utility function - * - * Creates a movelist consisting of only one element, and - * if parent == NULL insert into the movelist chain immediately after - * the parent element. - */ -struct movelist * -make_movelist(struct movelist *pptr, uintptr_t dst, uintptr_t src, uintptr_t len) -{ - struct movelist *ml = malloc(sizeof(struct movelist)); - - if ( !ml ) - return NULL; - - ml->dst = dst; - ml->src = src; - ml->len = len; - ml->next = pptr ? pptr->next : NULL; - - if ( pptr ) - pptr->next = ml; - - return ml; -} - -/* - * Public utility function - * - * Convert a movelist into a linear array of struct move_descriptors - */ -size_t -linearize_movelist(struct move_descriptor **d, struct movelist *m) -{ - size_t n; - struct movelist *mm; - struct move_descriptor *l; - - /* Count the length of the list */ - n = 0; - for ( mm = m ; mm ; mm = mm->next ) - n++; - - *d = l = malloc(n * sizeof(struct move_descriptor)); - if ( !l ) - return (size_t)-1; - - while ( m ) { - l->dst = m->dst; - l->src = m->src; - l->len = m->len; - l++; - mm = m; - m = m->next; - free(mm); - } - - return n; -} - - static jmp_buf new_movelist_bail; -static struct movelist * -new_movelist(uintptr_t dst, uintptr_t src, uintptr_t len) +static struct syslinux_movelist * +new_movelist(addr_t dst, addr_t src, addr_t len) { - struct movelist *ml = malloc(sizeof(struct movelist)); + struct syslinux_movelist *ml = malloc(sizeof(struct syslinux_movelist)); if ( !ml ) longjmp(new_movelist_bail, 1); @@ -95,17 +80,21 @@ new_movelist(uintptr_t dst, uintptr_t src, uintptr_t len) return ml; } -static struct movelist ** -split_movelist(uintptr_t start, uintptr_t len, struct movelist **parentptr) +/* + * Take a chunk, entirely confined in **parentptr, and split it off so that + * it has its own structure. + */ +static struct syslinux_movelist ** +split_movelist(addr_t start, addr_t len, struct syslinux_movelist **parentptr) { - struct movelist *m, *ml = *parentptr; + struct syslinux_movelist *m, *ml = *parentptr; assert(start >= ml->src); assert(start < ml->src+ml->len); /* Split off the beginning */ if ( start > ml->src ) { - uintptr_t l = start - ml->src; + addr_t l = start - ml->src; m = new_movelist(ml->dst+l, start, ml->len-l); m->next = ml->next; @@ -116,8 +105,9 @@ split_movelist(uintptr_t start, uintptr_t len, struct movelist **parentptr) ml = m; /* Continue processing the new node */ } + /* Split off the end */ if ( ml->len > len ) { - uintptr_t l = ml->len - len; + addr_t l = ml->len - len; m = new_movelist(ml->dst+len, ml->src+len, l); m->next = ml->next; @@ -130,9 +120,9 @@ split_movelist(uintptr_t start, uintptr_t len, struct movelist **parentptr) #if 0 static void -delete_movelist(struct movelist **parentptr) +delete_movelist(struct syslinux_movelist **parentptr) { - struct movelist *o = *parentptr; + struct syslinux_movelist *o = *parentptr; *parentptr = o->next; free(o); } @@ -141,10 +131,10 @@ delete_movelist(struct movelist **parentptr) /* * Scan the freelist looking for a particular chunk of memory */ -static struct movelist ** -is_free_zone(uintptr_t start, uintptr_t len, struct movelist **space) +static struct syslinux_movelist ** +is_free_zone(addr_t start, addr_t len, struct syslinux_movelist **space) { - struct movelist *s; + struct syslinux_movelist *s; while ( (s = *space) ) { if ( s->src <= start && s->src+s->len >= start+len ) @@ -159,11 +149,11 @@ is_free_zone(uintptr_t start, uintptr_t len, struct movelist **space) * Scan the freelist looking for the smallest chunk of memory which * can fit X bytes */ -static struct movelist ** -free_area(uintptr_t len, struct movelist **space) +static struct syslinux_movelist ** +free_area(addr_t len, struct syslinux_movelist **space) { - struct movelist **best = NULL; - struct movelist *s; + struct syslinux_movelist **best = NULL; + struct syslinux_movelist *s; while ( (s = *space) ) { if ( s->len >= len ) { @@ -178,13 +168,14 @@ free_area(uintptr_t len, struct movelist **space) /* - * Scan the freelist looking for the largest chunk of memory, returns parent ptr + * Scan the freelist looking for the largest chunk of memory, + * returns parent ptr */ -static struct movelist ** -free_area_max(struct movelist **space) +static struct syslinux_movelist ** +free_area_max(struct syslinux_movelist **space) { - struct movelist **best = NULL; - struct movelist *s; + struct syslinux_movelist **best = NULL; + struct syslinux_movelist *s; while ( (s = *space) ) { if ( !best || s->len > (*best)->len ) @@ -199,9 +190,9 @@ free_area_max(struct movelist **space) * Remove a chunk from the freelist */ static void -allocate_from(uintptr_t start, uintptr_t len, struct movelist **parentptr) +allocate_from(addr_t start, addr_t len, struct syslinux_movelist **parentptr) { - struct movelist *c = *parentptr; + struct syslinux_movelist *c = *parentptr; assert(c->src <= start); assert(c->src+c->len >= start+len); @@ -215,6 +206,7 @@ allocate_from(uintptr_t start, uintptr_t len, struct movelist **parentptr) free(c); } +#if 0 /* * Remove any chunk from the freelist which is already * claimed by source data. This somewhat frivolously @@ -222,10 +214,11 @@ allocate_from(uintptr_t start, uintptr_t len, struct movelist **parentptr) * covered by a free zone or not covered at all. */ static void -tidy_freelist(struct movelist **frags, struct movelist **space) +tidy_freelist(struct syslinux_movelist **frags, + struct syslinux_movelist **space) { - struct movelist **sep; - struct movelist *f; + struct syslinux_movelist **sep; + struct syslinux_movelist *f; while ( (f = *frags) ) { if ( (sep = is_free_zone(f->src, f->len, space)) ) @@ -233,6 +226,7 @@ tidy_freelist(struct movelist **frags, struct movelist **space) frags = &f->next; } } +#endif /* * moves is computed from "frags" and "freemem". "space" lists @@ -240,21 +234,77 @@ tidy_freelist(struct movelist **frags, struct movelist **space) */ int -compute_movelist(struct movelist **moves, struct movelist *frags, - struct movelist *space) +syslinux_compute_movelist(struct syslinux_movelist **moves, + struct syslinux_movelist *frags, + struct syslinux_memmap *memmap) { - struct movelist *mv; - struct movelist *f, **fp, **ep; - struct movelist *o, **op; - uintptr_t needbase, needlen, copysrc, copydst, copylen; - uintptr_t freebase, freelen; + struct syslinux_memmap *mmap = NULL, *mm; + struct syslinux_movelist *mv, *space; + struct syslinux_movelist *f, **fp, **ep; + struct syslinux_movelist *o, **op; + addr_t needbase, needlen, copysrc, copydst, copylen; + addr_t freebase, freelen; + addr_t mstart; + int m_ok; + int rv = -1; + + dprintf("entering syslinux_compute_movelist()...\n"); + + if (setjmp(new_movelist_bail)) + goto bail; *moves = NULL; - if ( setjmp(new_movelist_bail) ) - return -1; /* malloc() failed */ + /* Mark any memory that's in use by source material busy in the memory map */ + mmap = syslinux_dup_memmap(memmap); + if (!mmap) + goto bail; - tidy_freelist(&frags, &space); +#if DEBUG + dprintf("Initial memory map:\n"); + syslinux_dump_memmap(stdout, mmap); +#endif + + for (f = frags; f; f = f->next) { + if (syslinux_add_memmap(&mmap, f->src, f->len, SMT_ALLOC)) + goto bail; + } + +#if DEBUG + dprintf("Adjusted memory map:\n"); + syslinux_dump_memmap(stdout, mmap); +#endif + + /* Compute the freelist in movelist format. */ + space = NULL; + ep = &space; + mstart = -1; + m_ok = 0; + + /* Yes, we really do want to run through the loop on SMT_END */ + for (mm = mmap; mm; mm = mm->next) { + /* We can safely use to-be-zeroed memory as a scratch area. */ + if (mmap->type == SMT_FREE || mmap->type == SMT_ZERO) { + if (!m_ok) { + m_ok = 1; + mstart = mmap->start; + } + } else { + if (m_ok) { + f = new_movelist(0, mstart, mmap->start - mstart); + *ep = f; + ep = &f->next; + m_ok = 0; + } + } + + mmap = mmap->next; + } + +#if DEBUG + dprintf("Computed free list:\n"); + syslinux_dump_movelist(stdout, space); +#endif for ( fp = &frags, f = *fp ; f ; fp = &f->next, f = *fp ) { dprintf("@: 0x%08x bytes at 0x%08x -> 0x%08x\n", @@ -297,7 +347,7 @@ compute_movelist(struct movelist **moves, struct movelist *frags, Then move a chunk of ourselves into place. */ for ( op = &f->next, o = *op ; o ; op = &o->next, o = *op ) { - dprintf("O: 0x%08x bytes at 0x%08x -> 0x%08x\n", + dprintf("O: 0x%08x bytes at 0x%08x -> 0x%08x\n", o->len, o->src, o->dst); if ( !(o->src <= needbase && o->src+o->len > needbase) ) @@ -387,7 +437,11 @@ compute_movelist(struct movelist **moves, struct movelist *frags, space = mv; } - return 0; + rv = 0; + bail: + if (mmap) + syslinux_free_memmap(mmap); + return rv; } #ifdef TEST @@ -398,11 +452,11 @@ int main(int argc, char *argv[]) { FILE *f; unsigned long d, s, l; - struct movelist *frags; - struct movelist **fep = &frags; - struct movelist *space; - struct movelist **sep = &space; - struct movelist *mv, *moves; + struct syslinux_movelist *frags; + struct syslinux_movelist **fep = &frags; + struct syslinux_movelist *space; + struct syslinux_movelist **sep = &space; + struct syslinux_movelist *mv, *moves; f = fopen(argv[1], "r"); while ( fscanf(f, "%lx %lx %lx", &d, &s, &l) == 3 ) { @@ -418,7 +472,7 @@ int main(int argc, char *argv[]) } fclose(f); - if ( compute_movelist(&moves, frags, space) ) { + if ( syslinux_compute_movelist(&moves, frags, space) ) { printf("Failed to compute a move sequence\n"); return 1; } else { @@ -428,6 +482,6 @@ int main(int argc, char *argv[]) } return 0; } -} + } #endif /* TEST */ diff --git a/com32/lib/sys/idle.c b/com32/lib/syslinux/pxe_get_cached.c similarity index 54% copy from com32/lib/sys/idle.c copy to com32/lib/syslinux/pxe_get_cached.c index 6f65c436..b7561211 100644 --- a/com32/lib/sys/idle.c +++ b/com32/lib/syslinux/pxe_get_cached.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,32 +26,56 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * pxe_get_cached.c * - * What to do in a busy loop... + * PXE call "get cached info" */ -#include -#include +#include +#include +#include #include -#include -void syslinux_idle(void) +#include + +/* Returns the status code from PXE (0 on success), + or -1 on invocation failure */ +int pxe_get_cached_info(int level, void **buf, size_t *len) { - static int do_idle = 1; - static const com32sys_t sys_idle = { - .eax.l = 0x0013, - }; - com32sys_t idle_result; + com32sys_t regs; + t_PXENV_GET_CACHED_INFO *gci = __com32.cs_bounce; + void *bbuf, *nbuf; + + memset(®s, 0, sizeof regs); + regs.eax.w[0] = 0x0009; + regs.ebx.w[0] = PXENV_GET_CACHED_INFO; + regs.es = SEG(gci); + regs.edi.w[0] = OFFS(gci); + + bbuf = &gci[1]; + + gci->Status = PXENV_STATUS_FAILURE; + gci->PacketType = level; + gci->BufferSize = gci->BufferLimit = 65536-sizeof(*gci); + gci->Buffer.seg = SEG(bbuf); + gci->Buffer.offs = OFFS(bbuf); + + __intcall(0x22, ®s, ®s); + + if (regs.eflags.l & EFLAGS_CF) + return -1; + + if (gci->Status) + return gci->Status; - /* This call isn't supported on SYSLINUX < 3.08, but all it does - is return an error, so we don't care. */ + nbuf = malloc(gci->BufferSize); /* malloc() does not use the bounce buffer */ + if (!nbuf) + return -1; - if ( do_idle ) { - __intcall(0x22, &sys_idle, &idle_result); + memcpy(nbuf, bbuf, gci->BufferSize); - do_idle = ~idle_result.eflags.l & EFLAGS_CF; - } + *buf = nbuf; + *len = gci->BufferSize; - cpu_relax(); + return 0; } diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/run_command.c similarity index 74% copy from com32/libutil/idle.c copy to com32/lib/syslinux/run_command.c index 0cb7d000..7a433a18 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/run_command.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,28 +25,23 @@ * * ----------------------------------------------------------------------- */ -/* - * idle.c - * - * What to do in a busy loop... - */ - -#ifdef __COM32__ +#include +#include +#include +#include -#include - -void do_idle(void) +__noreturn syslinux_run_command(const char *command) { - syslinux_idle(); -} + static com32sys_t ireg; -#else + strcpy(__com32.cs_bounce, command); -#include + ireg.eax.w[0] = 0x0003; + ireg.es = SEG(__com32.cs_bounce); + ireg.ebx.w[0] = OFFS(__com32.cs_bounce); -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ -} + __intcall(0x22, &ireg, NULL); -#endif + /* Should not return even on failure */ + for(;;); +} diff --git a/com32/libutil/idle.c b/com32/lib/syslinux/run_default.c similarity index 81% rename from com32/libutil/idle.c rename to com32/lib/syslinux/run_default.c index 0cb7d000..7aeb9d5e 100644 --- a/com32/libutil/idle.c +++ b/com32/lib/syslinux/run_default.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -25,28 +25,17 @@ * * ----------------------------------------------------------------------- */ -/* - * idle.c - * - * What to do in a busy loop... - */ - -#ifdef __COM32__ +#include +#include +#include -#include - -void do_idle(void) +__noreturn syslinux_run_default(void) { - syslinux_idle(); -} + static com32sys_t ireg; -#else + ireg.eax.w[0] = 0x0004; + __intcall(0x22, &ireg, NULL); -#include - -void do_idle(void) -{ - sched_yield(); /* As good as we can get... */ + /* Should not return even on failure */ + for(;;); } - -#endif diff --git a/com32/lib/syslinux/shuffle.c b/com32/lib/syslinux/shuffle.c new file mode 100644 index 00000000..47ef51cb --- /dev/null +++ b/com32/lib/syslinux/shuffle.c @@ -0,0 +1,91 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * shuffle.c + * + * Common code for "shuffle and boot" operation; generates a shuffle list + * and puts it in the bounce buffer. Returns the number of shuffle + * descriptors. + */ + +#include +#include +#include +#include + +struct shuffle_descriptor { + uint32_t dst, src, len; +}; + +int syslinux_prepare_shuffle(struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap) +{ + struct syslinux_movelist *moves = NULL, *mp; + struct syslinux_memmap *ml; + struct shuffle_descriptor *dp; + int np, rv = -1; + + if (syslinux_compute_movelist(&moves, fraglist, memmap)) + goto bail; + + dp = __com32.cs_bounce; + np = 0; + + /* Copy the move sequence into the bounce buffer */ + for (mp = moves; mp; mp = mp->next) { + if (np >= 65536/12) + goto bail; /* Way too many descriptors... */ + + dp->dst = mp->dst; + dp->src = mp->src; + dp->len = mp->len; + dp++; np++; + } + + /* Copy any zeroing operations into the bounce buffer */ + for (ml = memmap; ml->type != SMT_END; ml = ml->next) { + if (ml->type == SMT_ZERO) { + if (np >= 65536/12) + goto bail; + + dp->dst = ml->start; + dp->src = (addr_t)-1; /* bzero this region */ + dp->len = ml->next->start - ml->start; + dp++; np++; + } + } + + rv = np; + + bail: + /* This is safe only because free() doesn't use the bounce buffer!!!! */ + if (moves) + syslinux_free_movelist(moves); + + return rv; +} diff --git a/com32/lib/sys/idle.c b/com32/lib/syslinux/shuffle_pm.c similarity index 58% copy from com32/lib/sys/idle.c copy to com32/lib/syslinux/shuffle_pm.c index 6f65c436..ed1a97a0 100644 --- a/com32/lib/sys/idle.c +++ b/com32/lib/syslinux/shuffle_pm.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,32 +26,44 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * shuffle_pm.c * - * What to do in a busy loop... + * Shuffle and boot to protected mode code */ -#include -#include +#include +#include #include -#include +#include +#include +#include -void syslinux_idle(void) +int syslinux_shuffle_boot_pm(struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap, + uint16_t bootflags, + struct syslinux_pm_regs *regs) { - static int do_idle = 1; - static const com32sys_t sys_idle = { - .eax.l = 0x0013, - }; - com32sys_t idle_result; + int nd; + com32sys_t ireg; + char *regbuf; - /* This call isn't supported on SYSLINUX < 3.08, but all it does - is return an error, so we don't care. */ + nd = syslinux_prepare_shuffle(fraglist, memmap); + if (nd < 0) + return -1; - if ( do_idle ) { - __intcall(0x22, &sys_idle, &idle_result); + regbuf = (char *)__com32.cs_bounce + (12*nd); + memcpy(regbuf, regs, sizeof(*regs)); - do_idle = ~idle_result.eflags.l & EFLAGS_CF; - } + memset(&ireg, 0, sizeof ireg); - cpu_relax(); + ireg.eax.w[0] = 0x001a; + ireg.edx.w[0] = bootflags; + ireg.es = SEG(__com32.cs_bounce); + ireg.edi.l = OFFS(__com32.cs_bounce); + ireg.ecx.l = nd; + ireg.ds = SEG(regbuf); + ireg.esi.l = OFFS(regbuf); + __intcall(0x22, &ireg, NULL); + + return -1; /* Too many descriptors? */ } diff --git a/com32/lib/sys/idle.c b/com32/lib/syslinux/shuffle_rm.c similarity index 58% rename from com32/lib/sys/idle.c rename to com32/lib/syslinux/shuffle_rm.c index 6f65c436..31e88277 100644 --- a/com32/lib/sys/idle.c +++ b/com32/lib/syslinux/shuffle_rm.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 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 @@ -26,32 +26,44 @@ * ----------------------------------------------------------------------- */ /* - * idle.c + * shuffle_rm.c * - * What to do in a busy loop... + * Shuffle and boot to protected mode code */ -#include -#include +#include +#include #include -#include +#include +#include +#include -void syslinux_idle(void) +int syslinux_shuffle_boot_rm(struct syslinux_movelist *fraglist, + struct syslinux_memmap *memmap, + uint16_t bootflags, + struct syslinux_rm_regs *regs) { - static int do_idle = 1; - static const com32sys_t sys_idle = { - .eax.l = 0x0013, - }; - com32sys_t idle_result; + int nd; + com32sys_t ireg; + char *regbuf; - /* This call isn't supported on SYSLINUX < 3.08, but all it does - is return an error, so we don't care. */ + nd = syslinux_prepare_shuffle(fraglist, memmap); + if (nd < 0) + return -1; - if ( do_idle ) { - __intcall(0x22, &sys_idle, &idle_result); + regbuf = (char *)__com32.cs_bounce + (12*nd); + memcpy(regbuf, regs, sizeof(*regs)); - do_idle = ~idle_result.eflags.l & EFLAGS_CF; - } + memset(&ireg, 0, sizeof ireg); - cpu_relax(); + ireg.eax.w[0] = 0x001b; + ireg.edx.w[0] = bootflags; + ireg.es = SEG(__com32.cs_bounce); + ireg.edi.l = OFFS(__com32.cs_bounce); + ireg.ecx.l = nd; + ireg.ds = SEG(regbuf); + ireg.esi.l = OFFS(regbuf); + __intcall(0x22, &ireg, NULL); + + return -1; /* Too many descriptors? */ } diff --git a/com32/lib/syslinux/zonelist.c b/com32/lib/syslinux/zonelist.c new file mode 100644 index 00000000..a4c42ed0 --- /dev/null +++ b/com32/lib/syslinux/zonelist.c @@ -0,0 +1,242 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 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 + * 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. + * + * ----------------------------------------------------------------------- */ + +/* + * zonelist.c + * + * Deal with syslinux_memmap's, which are data structures designed to + * hold memory maps. A zonelist is a sorted linked list of memory + * ranges, with the guarantee that no two adjacent blocks have the + * same range type. Additionally, all unspecified memory have a range + * type of zero. + */ + +#include +#include + +/* + * Create an empty syslinux_memmap list. + */ +struct syslinux_memmap *syslinux_init_memmap(void) +{ + struct syslinux_memmap *sp, *ep; + + sp = malloc(sizeof(*sp)); + if (!sp) + return NULL; + + ep = malloc(sizeof(*ep)); + if (!ep) { + free(sp); + return NULL; + } + + sp->start = 0; + sp->type = SMT_UNDEFINED; + sp->next = ep; + + ep->start = 0; /* Wrap around... */ + ep->type = SMT_END; /* End of chain */ + ep->next = NULL; + + return sp; +} + +/* + * Add an item to a syslinux_memmap list, potentially overwriting + * what is already there. + */ +int syslinux_add_memmap(struct syslinux_memmap **list, + addr_t start, addr_t len, + enum syslinux_memmap_types type) +{ + addr_t last; + struct syslinux_memmap *mp, **mpp; + struct syslinux_memmap *mpi, **mppi; + struct syslinux_memmap *range; + enum syslinux_memmap_types oldtype; + + /* Remove this to make len == 0 mean all of memory */ + if (len == 0) + return 0; + + /* Last byte -- to avoid rollover */ + last = start+len-1; + + mpp = list; + oldtype = SMT_ERROR; + while (mp = *mpp, start > mp->start && mp->type != SMT_END) { + oldtype = mp->type; + mpp = &mp->next; + } + + /* Remember where we started messing with things. */ + mppi = mpp; + + if (start < mp->start || mp->type == SMT_END) { + range = malloc(sizeof(*range)); + if (!range) + return -1; + + range->start = start; + range->type = type; + *mpp = range; + range->next = mp; + mpp = &range->next; + } + + while (mp = *mpp, last > mp->start-1) { + oldtype = mp->type; + mp->type = type; + mpp = &mp->next; + } + + if (last < mp->start-1) { + range = malloc(sizeof(*range)); + if (!range) + return -1; + + range->start = last+1; + range->type = oldtype; + *mpp = range; + range->next = mp; + } + + /* Now the map is correct, but quite possibly not optimal. Scan the + map for ranges which are redundant and remove them. This is + technically excessive, since we scan the list to the end even + though only part of it could have changed. Eventually we might + care enough to save an end pointer from the operation above. */ + mpi = *mppi; + while (mpi->type != SMT_END) { + mp = mpi->next; + if (mpi->type == mp->type) { + mpi->next = mp->next; + free(mp); + } else { + /* Go on to the next one */ + mpi = mp; + } + } + + return 0; +} + +/* + * Verify what type a certain memory region is. This function returns + * SMT_ERROR if the memory region has multiple types. + */ +enum syslinux_memmap_types syslinux_memmap_type(struct syslinux_memmap *list, + addr_t start, addr_t len) +{ + addr_t last, llast; + + last = start+len-1; + + while (list->type != SMT_END) { + llast = list->next->start-1; + if (list->start <= start) { + if (llast >= last) + return list->type; /* Region has a well-defined type */ + else if (llast >= start) + return SMT_ERROR; /* Crosses region boundary */ + } + list = list->next; + } + + return SMT_ERROR; /* Internal error? */ +} + +/* + * Find the largest zone of a specific type. Returns -1 on failure. + */ +int syslinux_memmap_largest(struct syslinux_memmap *list, + enum syslinux_memmap_types type, + addr_t *start, addr_t *len) +{ + addr_t size, best_size = 0; + struct syslinux_memmap *best = NULL; + + while (list->type != SMT_END) { + size = list->next->start - list->start; + + if (list->type == type && size > best_size) { + best = list; + best_size = size; + } + + list = list->next; + } + + if (!best) + return -1; + + *start = best->start; + *len = best_size; + + return 0; +} + +/* + * Free a zonelist. + */ +void syslinux_free_memmap(struct syslinux_memmap *list) +{ + struct syslinux_memmap *ml; + + while (list) { + ml = list; + list = list->next; + free(ml); + } +} + +/* + * Duplicate a zonelist. Returns NULL on failure. + */ +struct syslinux_memmap *syslinux_dup_memmap(struct syslinux_memmap *list) +{ + struct syslinux_memmap *newlist = NULL, **nlp = &newlist; + struct syslinux_memmap *ml; + + while (list) { + ml = malloc(sizeof(*ml)); + if (!ml) { + syslinux_free_memmap(newlist); + return NULL; + } + ml->start = list->start; + ml->type = list->type; + ml->next = NULL; + *nlp = ml; + nlp = &ml->next; + + list = list->next; + } + + return newlist; +} diff --git a/com32/lib/vsnprintf.c b/com32/lib/vsnprintf.c index 8279d7a8..80280059 100644 --- a/com32/lib/vsnprintf.c +++ b/com32/lib/vsnprintf.c @@ -27,7 +27,7 @@ enum flags { enum ranks { rank_char = -2, rank_short = -1, - rank_int = 0, + rank_int = 0, rank_long = 1, rank_longlong = 2 }; diff --git a/com32/lib/vsscanf.c b/com32/lib/vsscanf.c index 1882765d..06156790 100644 --- a/com32/lib/vsscanf.c +++ b/com32/lib/vsscanf.c @@ -27,7 +27,7 @@ enum flags { enum ranks { rank_char = -2, rank_short = -1, - rank_int = 0, + rank_int = 0, rank_long = 1, rank_longlong = 2, rank_ptr = INT_MAX /* Special value used for pointers */ diff --git a/com32/libutil/Makefile b/com32/libutil/Makefile index 3656fb3f..1dac1f76 100644 --- a/com32/libutil/Makefile +++ b/com32/libutil/Makefile @@ -46,8 +46,7 @@ LNXCFLAGS = -I./include -W -Wall -O -g LNXSFLAGS = -g LNXLDFLAGS = -g OBJCOPY = objcopy -LIBOBJS = ansiline.o ansiraw.o get_key.o idle.o sha1hash.o unbase64.o \ - movebits.o loadfile.o +LIBOBJS = ansiline.o ansiraw.o get_key.o sha1hash.o unbase64.o LNXLIBOBJS = $(patsubst %.o,%.lo,$(LIBOBJS)) .SUFFIXES: .lss .c .lo .o .elf .c32 .lnx diff --git a/com32/libutil/include/libutil.h b/com32/libutil/include/libutil.h index 3b6278f9..5fab0af5 100644 --- a/com32/libutil/include/libutil.h +++ b/com32/libutil/include/libutil.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 2005-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 @@ -34,6 +34,18 @@ #ifndef LIBUTIL_LIBUTIL_H #define LIBUTIL_LIBUTIL_H -void do_idle(void); +#ifdef __COM32__ + +# include + +# define do_idle syslinux_idle + +#else /* not __COM32__ */ + +# include + +# define do_idle sched_yield + +#endif #endif diff --git a/com32/libutil/include/movebits.h b/com32/libutil/include/movebits.h deleted file mode 100644 index de6ee1ff..00000000 --- a/com32/libutil/include/movebits.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef LIBUTIL_MOVEBITS_H -#define LIBUTIL_MOVEBITS_H - -#include -#include - -struct movelist { - uintptr_t dst; - uintptr_t src; - uintptr_t len; - struct movelist *next; -}; - -struct move_descriptor { - uint32_t dst; - uint32_t src; - uint32_t len; -}; - -/* - * Creates a movelist consisting of only one element, and - * if parent == NULL insert into the movelist chain immediately after - * the parent element. - */ -struct movelist * -make_movelist(struct movelist *parent, uintptr_t dst, - uintptr_t src, uintptr_t len); - -/* - * Convert a movelist into a linear array of struct move_descriptors, - * returning the number of descriptors and freeing the movelist. - * - * Returns (size_t)-1 on failure; if so the movelist is still valid. - */ -size_t -linearize_movelist(struct move_descriptor **d, struct movelist *m); - -/* - * moves is computed from "frags" and "freemem". "space" lists - * free memory areas at our disposal, and is (src, cnt) only. - */ - -int -compute_movelist(struct movelist **moves, struct movelist *frags, - struct movelist *space); - -#endif /* LIBUTIL_MOVEBITS_H */ diff --git a/com32/libutil/libutil_com.a b/com32/libutil/libutil_com.a index 00354e41bc9678c0d7146a80e325df9cd3c4ed29..2ab185772e715b76da9c8f12fe7bdea577360239 100644 GIT binary patch delta 290 zcwU>al<`jO1nEFCBNJmwLqi1x0|gL3CKVJ6O-!Jy1TF>!22LQp!oa|~hk=1>0Rw|* z1tzwNnb@E;ag&`?VqS4(PG(-JUcNrWC_{6oRg?ADBsa%1o?u~z3T)P6y9?(`u5%J+ zHa9ez9N?$9Ih4Ddm2t}Cy8`nWpG>Y5{LJXIxlo9iak4;=;N(_e9kJrdVxS$R74exV zIjIb}skzCy1q=+E_X~3}Nfl=#8fGLGXJB=J*k%LCPs%)|49OXZMOAu6hK9zI^=wbV KUG&d3jRgSDu1gaD delta 3497 zcwTi^eQ*=U72i9Zq_a6}`74%*0|FluVQ?*jF&FIcWj>NH4q%5uOOS;vVuNfMoopOR zs>}$5Znv6-++-&GobpF9nM~VEhWgClgSEUPonO~QyYI&78YR)Ev1kj$ZDDwlMEYu2$o+TC}72Kj*5o zCkkqFOvt3e-_g?1bt+hp#m_-TYVYa$;~q6DSGaJGl3x?!w?h9eCfUSJM(4gp4$Xw%3mHUnPDrVa6%~iOq^#?EbswIvxJjUT^>NARYaOMEhaEkmsLCVIx~B#rnD@4t^vh z&^e&W0`!9D?K>uPmWYksO}qeHwo{_pB)S)DBE|Pg^gJk2Mte%# zqx6<#r$7@HTcUbOt`p_xaLP`ZKnGa~dsa}+^yolw?+*skDA3KxC2WI8>t&IiqXsTbdUBBrRN@hWwvyn-Y-4a4sFAx4>PWKR~}SCz{-rhM~Vj1Ikj+FVH4=G2JT5 z14LJswsfp7H#P`QCtfc{7AMQ%Ai^3&wn0c7|1ao06YB$K8jOV?9^W7_XY6|SHSqOf z#2rVyO|mrlZBW9t$|BrS=2mXy9&19zZjtVhooWtExQCQs)y941{wSHF-0I1pL+-@t zdYBVHjT85c=(m6-5;?f@S=f0VBW#Pv!m?8t?BVGky-dep{-26fdyP3T^c_s%gGWzw|b9U8k!xu61FowqU;i3 zm%H(oB$f-$>L$G$yV7lohe5WK@oblnTo$_+mRKJ6Z1sBaFd`a@s}h?F7Wq7OG56SU z+>rxG)+N$QI^5yJZ8#3VbFpnA>xJ9no}icAXOzK^z+H3yTlrKi0L+DSJOa)vMOi}e zA&t?yu=ol%i8X=$_-LPmj>PlP-NI@xN>7J!TU|ht?t65E-u3h)-ZF$`yp{E`?Ea%J zwYeO=4BQYeoJYq%>^sxNl3T%!j_CPF%8(9-8VDhJRCbWu*e}uC?}2Mjo9cpGI zQ?=plb%;nxwB9#?i?EZ(o)uZ6z$}SEWQPI14VSSwY=@v+?J1xm?#t*rwpUa}dYp6w zqFXouG`!jsCCa#J0~3wVar4Z8`M39`VMccwlaj7@hXj{U1i&HyJ_1Jc^d&9P3zN}v zOZ7(y=+i;Cg{Wa)DC~Nw&eaiE_LLej8Q*l(rWobe2mGC+MJHXgbuL}Rq|00MS=6Aj z%Td%92n1Vvkkt2wf*nNd3bcpQ`Ca<~*QK?t+@g7Fi}*UL_KbZ&*12rs9cE)z7!ZCj?Iv_ zUI9T2g$_MC{uvVGU$pJ34lY~( z3VZh>q=yPe)gMMFLY{%f=MfUZKA(^`P5QHlIY>g!32JJs~mf{FqLLs zZ}J;Vy3y=+LC+Tva?zZ>YVwE8{$D14(xe66=%38ujfIW80bm!>#e`Jz2GUgR`>5)u z*iyMlFKQ!O%!{8{aBj)Sax&Hh2e@r|R*Rl<#QJ(W>G@6FcAb&j2Z^dMRc|yv_;6AS z#>8m_Xe3#xy9Glc5OkS#5 zx|0aut{87h^>{O_3jU#91&eTWd{RagJfv5_Lo=)3A@cvK;0Ng{_yI{(!Na`a&MaLm zzVi$42G-&`=WN=`SqtY|NkN7Vd@cCyvCh!H{9d{SWey BJ`Df> diff --git a/com32/libutil/libutil_lnx.a b/com32/libutil/libutil_lnx.a index 4f0e8cf3d0f528db6b17fd879e5115b916ce05d6..2357eab086d2737e00e96011714ceed2a2f5ffb0 100644 GIT binary patch delta 3478 zcwU{C4^R}>9mn7A?JoDYJLKR99Dhy@4>*+L_;-LLMh_7o4GB?GON~{int=>L8zTAF zDMe%&TVq0Brj1D@*i7gEHH>UJVxrSDnU-lH6O9^4Ytu>7X{<3$TARkIVfub=7ne(` z)0Uatx8L{sz2Cmw-|zFgFLTHAF9`jC-I4ce@r`nWT#56FaODJkne8yyfaDW))He8~qt?dsGRa3ge zB-4}z9BlMAgb$`Cl~oF*YV>vCsr7eQaWyqY9YQ&Q@ndXT#qhDPJf(!#2;ZuDVHdY$ z1ecbecQOnLSL#n^-zD zfnCzMo}IrBj`IZDgzOF9XcF3 zAeCy*<9EeGx}U)`q*h?;2wtXPs_0I+F!tF-$gUr4^U-YG{ddI zae<+j-Ges2p`7-ApvwNeR4#itjyV{Y`V$lE_u>t6&q`z1{yFe0o0on}c*K?hdw8SG zAITQ3upB0Zqf10;#Bm;G`Q{m{0%0X2K@%2bH$EIdf~<=tOcAHQV*3i!o9(rfC)#rZ zWkm(wxPMDw=fj<%l(#)pP#Q93$_h7iY%MJ*Y-|1cwg+0<^q)GXfNvbTNq=l!odVVT zc!FPh!$C-h?~8YHXQB%(ac^QkyCmk$@tzvL-j>)9W19=av_}9@i$MHE?5On%K&VFT z-)sQUVE~aD1w`EqfS8B^;x!8hH5!P677*u6Aod^--B?ko+pKQJj$*MSnbOHh#d}q6 zGNp^pO{k|?}>MxyXq zcSF3Mj>c<>MB(+Jfmio{)OWKBs8@m^8`-BQYfZVHox;U+rfgzY(Rv%?NV%E4h_uV#dzhNQCJ{ueDvH>EB$ivmR$9bvk0w^52C)NC#C|`D z*wr{*BQ_z5*iWN~EyMA8#9lRsJtK*wF9AO_e?i1=Ap4f^^vog~N56pV47nb%PQ4=Y z9;&~ewetT!cEeb*&T<8^%O$c?QOI7A$X>aI?D>V)kS#%Ed1Fx!R_J|2pV4xBiSS*q z{muBOV`77v0d9myM$do*w+gK`Wy}D#jE|QVxC=0kPxhg6KhA6PUH-Sy{Dha$H}pED zsaIT{03Hfw!y|l6I7mMM-V@G%^L!xuRrnge6!vERLii|isvdisRrQlRTo#03-dy$| ze8Ar=D{!4a|B0hUx*g|$Czr4Hj0@?60>@dg3_?aM;+O&cy>cJi$4ASv;eLLs{NAMJ z@p-y2L3CSF3Z}?&H~&&al?Q($pu9rG%r%MW*ko~;ItBXk73*xge%a;!DM>YvUBH{h zT>77?vK9CzkFD`T9xtc~(6uf;KQUKZ>muX=|LdA;{z6Sa%Md$RqaUxi435rCEn7Bk ze7JQ>+h+ak+Ba0*verE}dHU09S1)ppVcJs6s-ugw ztHF+fY_J!IY_RVM6?027dYl&CF-AVaROU02H}#}$+yvKpD;`g&A%;Cyi!*aZ*lyvW zC7R7mWm#DMR?n?QtJQP6QCdBh^XVRMcM0-r_11KZZ}rwgxWwwMAEL}KWgc6F(rT>} zxHc0G%K|B4lEo}|%^;aAKxeDvBBfdYJhRo;jNVrD#qnL+gWdSWrj^393{l78F@)7j zKSNmqv%Pc%rPWK3FU{(uPLx(Jb)&R;X$!8kdg(&k+#SFxdUJ9Hg~_QMbfn_k#9_1g zAIJ5FjAv6F8+cD|#Q7isR4jYvn|!KwL438WiCV>2a+c5Z*5|Zi@3SX~x%d%mV_jG& z_<2XjVq*NcCV9t>)U>xS`&Z=KMGO9t1jUhl@$_a zMf?YGMmF2vb8p&adDUlzQfM0D2U%j{b(j-;wbW>_dwJn-ddV`0mx5n?7NnmO3F!z9 zHl-X8M`bUOR6F>$hW#%5*n+$qFwzl|#>a+(uG=wIKGx3%;)o6MkB0N$hdgN{0-xw# y9yvqt;s4tv#*6lM@x2Z4y87aJ&^L}9p|Fa3$NiATtHuMg&W2A8b$b7Jsq!z{r*cgI delta 20382 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%0Ags7CT-ad5z!6LJTs3lRq{KI?#bO!gA~> z#za|Ii8~s@xdklhPNGdz)w<4(?}4p1oRu@ljuox-MlmPzEG!D~@4>`cpbxY!B_(~( zCMoE(qucZ$asUiF7P9)##{}iDcYqqPS5QtnzCzPSinnZe$##^jkKHDyH2Xp1jT8Hv zyevCDWz;9iB695*34O9Gp`RTqPkpMK00ZsbDu~XwAjl%TK4f}@E+$&3{ZUX08bx=F zwEJOZp`^<2EeF%DmDDslKHS!?6JDJ+%Z}3w`YK6X!{UC2mEajr2e=qgU7m1yo(LNM z_`fniK#V#X?Q)8+xOfI;3k_U>J6b|EC3qIjkcn?w5DMg3_y-7>wu#~pNfx}kgUF=X zYQ}rQ1kL~@+;p85T|7r5m{xuAjTnsIBPu)rS@FTJIEN$LWnPX*eX&x*YG+ zbHd-LV;};rt*@4^t<8UK$mTI-@tCAo`8n%$v4#*F@4b>^0X~9`VzU6}1-s30UYQJk zON2|Q8TW={onf-UmpcVat%lfKWTU6T;^aHUo2y73_Qh8U?mWO8k(>osEV%%e#!~g6}f$37mZTVi)oPwIlRzS=p=kFF{*4s5NiX{W6Ere=sB9!t!+ z`szTKR0Sh@1)`BI7v`FXb0Pt&BK}!wHa(nHxkiM7RS;GL(5o72f}wP!&{9=BR6+^! zw7Z(zH7f#<|88Mimxwi+RgRux+#VTs2BPYi-0l|A6fs?y7YxHA-c@hV5_^c>mq_KB-WDQRO28)e-Lv!rn2c z!IJ|b^kjIQdIB90h}hSgpO4EQ5a``uDpDT`4Wo%JS1n#ipetM=fS*I{6*EIL7Ev-0 z%$6fgtu&j*=Vps4tZ2e(02kG?z6qIB6E*);R5*eT+3Z1U5%yy!J4 za^I0^E{V(GWhS54!#qF1DN+U2GMd42MCiC|qSLlR!&Da$=A)#xO@|sH%p=J!qXH3T zZCSdx^|7AAhN_uAKAOq^=0@%0ZYo5g+D9e7K!%t|x^DyD1!rQPJwed%G#zoNm7QcXac&$3_amh(9R%)!sHK^+sHW#5)01CjU+&ncqW{ZbHS z$7k86|7);0Ws1}6d#BT^ol@jYVu9l$xbYxjoDx<7IxwRf-K!g2(2Xu)p$qhgZuHo2 z8n@iZ-2`TIqr>lL!TVlw3*I(W3s7$Cs$C;)DWR}%RW)m@X%sgfDI=T!4bT$gPWnoG zyUCCShGwPeQd!M&Cucgz~1C_w7e_kgr7KL?~~_JyED>@`-!USn14HCDx5 zV^!=mR&C&8RqQoZ#a?4o>@`-!USn14HCDx5V^!=mR>fXpRqT~;yTaWJv6omCdyQ4G z*I0Q73V2xIn+o4m_@Tmc3cpb(P8t!WD9lngKw*i(i3(?nMG_^JDMqux^$NEr+^z5z z3ZGSYL}8c0j}?BU5Ni@(vcf!tLlsUCu~$mWQVf^ECWSXC+^p~(g?kk4Q+Qb6I|{#3 zh_}_i1cf;Y2Ptgzs>C{lw<)|w;lm2|D*S`OKPx<;@QlK*6^i4?gh>i}DIB73tU~V$ zl~|~-PGOtE4uy9qd{p6Hg+~4x=z%0H{cpuid_level, (int *)&c->x86_vendor_id[0], (int *)&c->x86_vendor_id[8], diff --git a/com32/modules/cpuidtest.c b/com32/modules/cpuidtest.c index ce96d681..ed340bfd 100644 --- a/com32/modules/cpuidtest.c +++ b/com32/modules/cpuidtest.c @@ -29,13 +29,13 @@ int main(void) openconsole(&dev_stdcon_r, &dev_stdcon_w); for (;;) { - detect_cpu(&cpu); - printf("Vendor = %s\n",cpu.vendor); - printf("Model = %s\n",cpu.model); - printf("Vendor ID = %d\n",cpu.vendor_id); - printf("Family = %d\n",cpu.family); - printf("Model ID = %d\n",cpu.model_id); - printf("Stepping = %d\n",cpu.stepping); + detect_cpu(&cpu); + printf("Vendor = %s\n",cpu.vendor); + printf("Model = %s\n",cpu.model); + printf("Vendor ID = %d\n",cpu.vendor_id); + printf("Family = %d\n",cpu.family); + printf("Model ID = %d\n",cpu.model_id); + printf("Stepping = %d\n",cpu.stepping); printf("Flags = "); if (cpu.flags.fpu) printf("fpu "); if (cpu.flags.vme) printf("vme "); @@ -74,7 +74,7 @@ int main(void) printf("\n"); printf("SMP = "); if (cpu.flags.smp) printf("yes\n"); - else printf("no\n"); + else printf("no\n"); break; } diff --git a/com32/modules/cpuidtest.c32 b/com32/modules/cpuidtest.c32 index be9827af6fd8939867fd3027c5be5ffacedb7d6a..01adc6558c352deb93ea4ca74c83de779da5ef83 100755 GIT binary patch delta 62 zcwPZM0Kxx+P=rvhG8qCM0h2TtHUYAeYZ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* If we don't have this much memory for the stack, signal failure */ +#define MIN_STACK 512 + +#define DEBUG 0 +#if DEBUG +# define dprintf printf +#else +# define dprintf(f, ...) ((void)0) +#endif + +static inline void error(const char *msg) +{ + fputs(msg, stderr); +} + +int boot_elf(void *ptr, size_t len, char **argv) +{ + char *cptr = ptr; + Elf32_Ehdr *eh = ptr; + Elf32_Phdr *ph; + unsigned int i; + struct syslinux_movelist *ml = NULL; + struct syslinux_memmap *mmap = NULL, *amap = NULL; + struct syslinux_pm_regs regs; + int argc; + addr_t argsize; + char **argp; + addr_t lstart, llen; + char *stack_frame = NULL; + addr_t stack_frame_size; + addr_t stack_pointer; + uint32_t *spp; + char *sfp; + addr_t sfa; + + memset(®s, 0, sizeof regs); + + /* + * Note: mmap is the memory map (containing free and zeroed regions) + * needed by syslinux_shuffle_boot_pm(); amap is a map where we keep + * track ourselves which target memory ranges have already been + * allocated. + */ + + if ( len < sizeof(Elf32_Ehdr) ) + goto bail; + + /* Must be ELF, 32-bit, littleendian, version 1 */ + if ( memcmp(eh->e_ident, "\x7f""ELF\1\1\1", 6) ) + goto bail; + + /* Is this a worthwhile test? In particular x86-64 normally + would imply ELF64 support, which we could do as long as + the addresses are 32-bit addresses, and entry is 32 bits. + 64-bit addresses would take a lot more work. */ + if ( eh->e_machine != EM_386 && eh->e_machine != EM_486 && + eh->e_machine != EM_X86_64 ) + goto bail; + + if ( eh->e_version != EV_CURRENT ) + goto bail; + + if ( eh->e_ehsize < sizeof(Elf32_Ehdr) || eh->e_ehsize >= len ) + goto bail; + + if ( eh->e_phentsize < sizeof(Elf32_Phdr) ) + goto bail; + + if ( !eh->e_phnum ) + goto bail; + + if ( eh->e_phoff+eh->e_phentsize*eh->e_phnum > len ) + goto bail; + + mmap = syslinux_memory_map(); + amap = syslinux_dup_memmap(mmap); + if (!mmap || !amap) + goto bail; + +#if DEBUG + dprintf("Initial memory map:\n"); + syslinux_dump_memmap(stdout, mmap); +#endif + + ph = (Elf32_Phdr *)(cptr+eh->e_phoff); + + for (i = 0; i < eh->e_phnum; i++) { + if (ph->p_type == PT_LOAD && ph->p_memsz >= ph->p_filesz) { + /* This loads at p_paddr, which is arguably the correct semantics. + The SysV spec says that SysV loads at p_vaddr (and thus Linux does, + too); that is, however, a major brainfuckage in the spec. */ + + dprintf("Segment at 0x%08x len 0x%08x\n", ph->p_paddr, ph->p_memsz); + + if (syslinux_memmap_type(amap, ph->p_paddr, ph->p_memsz) != SMT_FREE) { + dprintf("Region not free!\n"); + goto bail; /* Memory region unavailable */ + } + + /* Mark this region as allocated in the available map */ + if (syslinux_add_memmap(&amap, ph->p_paddr, ph->p_memsz, SMT_ALLOC)) + goto bail; + + if (ph->p_filesz) { + /* Data present region. Create a move entry for it. */ + if (syslinux_add_movelist(&ml, ph->p_paddr, (addr_t)cptr+ph->p_offset, + ph->p_filesz)) + goto bail; + } + if (ph->p_memsz > ph->p_filesz) { + /* Zero-filled region. Mark as a zero region in the memory map. */ + if (syslinux_add_memmap(&mmap, ph->p_paddr+ph->p_filesz, + ph->p_memsz - ph->p_filesz, SMT_ZERO)) + goto bail; + } + } else { + /* Ignore this program header */ + } + + ph = (Elf32_Phdr *)((char *)ph + eh->e_phentsize); + } + + /* Create the invocation record (initial stack frame) */ + + argsize = argc = 0; + for (argp = argv; *argp; argp++) { + dprintf("argv[%2d] = \"%s\"\n", argc, *argp); + argc++; + argsize += strlen(*argp)+1; + } + + /* We need the argument strings, argument pointers, + argc, plus four zero-word terminators. */ + stack_frame_size = argsize + argc*sizeof(char *) + 5*sizeof(long); + stack_frame_size = (stack_frame_size+15) & ~15; + stack_frame = calloc(stack_frame_size, 1); + if (!stack_frame) + goto bail; + +#if DEBUG + dprintf("Right before syslinux_memmap_largest()...\n"); + syslinux_dump_memmap(stdout, amap); +#endif + + if (syslinux_memmap_largest(amap, SMT_FREE, &lstart, &llen)) + goto bail; /* NO free memory?! */ + + if (llen < stack_frame_size+MIN_STACK+16) + goto bail; /* Insufficient memory */ + + /* Initial stack pointer address */ + stack_pointer = (lstart+llen-stack_frame_size) & ~15; + + dprintf("Stack frame at 0x%08x len 0x%08x\n", + stack_pointer, stack_frame_size); + + /* Create the stack frame. sfp is the pointer in current memory for + the next argument string, sfa is the address in its final resting place. + spp is the pointer into the argument array in current memory. */ + spp = (uint32_t *)stack_frame; + sfp = stack_frame + argc*sizeof(char *) + 5*sizeof(long); + sfa = stack_pointer + argc*sizeof(char *) + 5*sizeof(long); + + *spp++ = argc; + for (argp = argv; *argp; argp++) { + int bytes = strlen(*argp) + 1; /* Including final null */ + *spp++ = sfa; + memcpy(sfp, *argp, bytes); + sfp += bytes; + sfa += bytes; + } + /* Zero fields are aready taken care of by calloc() */ + + /* ... and we'll want to move it into the right place... */ +#if DEBUG + if (syslinux_memmap_type(amap, stack_pointer, stack_frame_size) + != SMT_FREE) { + dprintf("Stack frame area not free (how did that happen?)!\n"); + goto bail; /* Memory region unavailable */ + } +#endif + + if (syslinux_add_memmap(&amap, stack_pointer, stack_frame_size, SMT_ALLOC)) + goto bail; + + if (syslinux_add_movelist(&ml, stack_pointer, (addr_t)stack_frame, + stack_frame_size)) + goto bail; + + memset(®s, 0, sizeof regs); + regs.eip = eh->e_entry; + regs.esp = stack_pointer; + +#if DEBUG + dprintf("Final memory map:\n"); + syslinux_dump_memmap(stdout, mmap); + + dprintf("Final available map:\n"); + syslinux_dump_memmap(stdout, amap); + + dprintf("Movelist:\n"); + syslinux_dump_movelist(stdout, ml); +#endif + + /* This should not return... */ + fputs("Booting...\n", stdout); + syslinux_shuffle_boot_pm(ml, mmap, 0, ®s); + + bail: + if (stack_frame) + free(stack_frame); + syslinux_free_memmap(amap); + syslinux_free_memmap(mmap); + syslinux_free_movelist(ml); + + return -1; +} + +int main(int argc, char *argv[]) +{ + void *data; + size_t data_len; + + openconsole(&dev_null_r, &dev_stdcon_w); + + if (argc < 2) { + error("Usage: elf.c32 elf_file arguments...\n"); + return 1; + } + + if (loadfile(argv[1], &data, &data_len)) { + error("Unable to load file\n"); + return 1; + } + + boot_elf(data, data_len, &argv[1]); + error("Invalid ELF file or insufficient memory\n"); + return 1; +} diff --git a/com32/modules/elf.c32 b/com32/modules/elf.c32 new file mode 100755 index 0000000000000000000000000000000000000000..04bfa909b4be5f3d26bbc0c324f833bb48526dd0 GIT binary patch literal 6564 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 literal 0 HcwPel00001 diff --git a/com32/modules/ethersel.c b/com32/modules/ethersel.c index c3f99fe7..924ec56b 100644 --- a/com32/modules/ethersel.c +++ b/com32/modules/ethersel.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2005 H. Peter Anvin - All Rights Reserved + * Copyright 2005-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 @@ -109,6 +109,26 @@ get_did(char *p, uint32_t *idptr, uint32_t *maskptr) return p; } +static char * +get_rid_range(char *p, uint8_t *rid_min, uint8_t *rid_max) +{ + unsigned long r0, r1; + + p = skipspace(p+3); + + r0 = strtoul(p, &p, 16); + if ( *p == '-' ) { + r1 = strtoul(p+1, &p, 16); + } else { + r1 = r0; + } + + *rid_min = r0; + *rid_max = r1; + + return p; +} + static struct match * parse_config(const char *filename) { @@ -148,23 +168,10 @@ parse_config(const char *filename) if ( looking_at(p, "did") ) { p = get_did(p+3, &m->did, &m->did_mask); - m->did_mask = 0xffffffff; } else if ( looking_at(p, "sid") ) { p = get_did(p+3, &m->sid, &m->sid_mask); } else if ( looking_at(p, "rid") ) { - unsigned long r0, r1; - - p = skipspace(p+3); - - r0 = strtoul(p, &p, 16); - if ( *p == '-' ) { - r1 = strtoul(p+1, &p, 16); - } else { - r1 = r0; - } - - m->rid_min = r0; - m->rid_max = r1; + p = get_rid_range(p+3, &m->rid_min, &m->rid_max); } else { char *e; diff --git a/com32/modules/ethersel.c32 b/com32/modules/ethersel.c32 dissimilarity index 90% index 401e96bd0b57344b0daeb6b4cf2f28134db147ef..d0a86d4af028b202bcb40cec44a520c0037076f8 100755 GIT binary patch delta 2480 zcwTK)Z*UXG72lIi^2x}#D@aCQfn_)>pk}ZpBx5^nYuSo04N1-45F3b@f*i^WZG*(n z+NtcEm3UE)F!R?n9?yq$zTbA1T4_Wm^cFOX}DK#qdW3~R{ zK3B~;zeG0ENo~kZNZa`k81~(7h4D~{UasW%;>SDMwSN#oboX%e@y`8qIU6A~mkh~5 zZ(T#Iqv@OkApKH11^Voy#7)r0iHWX_)qjnuHpX$wEzj9lHRq2XMHlql^pGr()E{8b zHVK5NL-H{SQ%IIH>LBC^@mQmUkYt!I^vmP027if6Y)zzK`v6Y(5IL8DiC#@D13>$d zCqz7Jy9lc6Brl$IPk_W-PdB0eUxFigDUlKTU*<@hsHQ_2lKH824ulD<_r9*vT)G*p z6_C;PM*yiUoVM4*LWp%ez?K`BRcke{loyZCV+B`vL~VdV;OXb5%wIn2)?t$h!#JL9 zMNdl&PfI1+#q#t<(1MZO)X!I+lGN=^++(@1tT>i#Gc7*&%COi4810v@AH|c{ zwK34ne!gK$v(dj{HF9QRy>;<5QJzi|%f8Oe9|0fO?HUNXlf#D1)Mj1R)1}0SOrsSS zk*GCKNV?3_t(>ES&me9P_CRt<3Sl1B>OcXW)>7b^IxHW18Q`fju^7fD;zl0D1chrQ zhm1@>LNNE*q7sCn9mzJ&NFy*)8;3QJZy97OF;w(|a!ZU*w+G~`#z$V|K?qz)6PQdU z+=VqM9i_t{%^}ZJ9zvA1Hh`GgiYa&pB}f(NyEp+h&vfj5c9*(mCO0@Zxb5lfTa-Ia zTA=UJw;=dFs%bY%*)_+Y#cpMtrQ4j{;9R+<$G$hx>Sx)~)$tQRI3+78|D2|`R$Wal zc?G@`??(lC{f1VbJM6&uRaB1Ppk$irFB}ro=8T~$aCnaIyHTc__(IUxi`t-IPA+qj zaH3_uHO2vB95TkiYRN-7a_V7%2Zsjdu~v<Fzp+uc2%^-})V0BDtal z48Dn+L@%9q0b)E5lEvgB7#jNV>v+X6j?wx1EGMej^nCBmPFR%O!6)92i3M9Le8AR3 zxvUqh`WB)6nGSRa-s+MYfV@scfhs^F}!M*;h7a!UG&dMer!G%sgTkYCrfu((}ed2jw3#@D8 zqJ};D)U~d}*rwXfYTa&&XlLu)U6wjOJMH!~4?z^q;RWg6=(P50gUGSE)120gfMpig zQ-ZAFVoOh3v_0QK*0a*`Cl@_Aqw7bl5H(+mx>e=_S5j5Tlh|fe#O20km^qL5X>hB#9apv~idRa%#9n%fp_) z6kZ%X-i`-5@OCM8mBO1RMd*($G;0d>2yKYaW`3Yuz&3T?xUD#<_Jf}TA=$Z%y9`d? zetrD?1S)knELeK#VHRIn$$sKk#{Hc=@2IPI6Ixgx17%?ZXtrlu8tJU@uuBX5{2TD9 zvgw7_tf`FIJqKh9_zVbzd zz8n(1c-yQ44_Fp=7OdmoyU@aGGV5Owo`(oDz4ZXHzbvV0GfMRp9RI&sZFCyzwPSY< zBfu;7D&yY$6S#+Z##pBq>oQTh@*Dm^{jv51UOTGCW!AG`>8db?L_!~??+g^LzGp`>tfz_RP_5`RSg62lpTB^0l>W@HNK{?K^~af?@aOvTy8e-*p;3Z_d#X lcFN~Jv$xX6S-ozFjri(+S0#9{chCJpNsvF4OJpw`{=aU;a`^xN delta 5180 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 +#include +#include +#include +#include +#include +#include + +const char *progname = "linux.c32"; + +/* Find the last instance of a particular command line argument + (which should include the final =; do not use for boolean arguments) */ +static char *find_argument(char **argv, const char *argument) +{ + int la = strlen(argument); + char **arg; + char *ptr = NULL; + + for (arg = argv; *arg; arg++) { + if (!memcmp(*arg, argument, la)) + ptr = *arg + la; + } + + return ptr; +} + +/* Get a value with a potential suffix (k/m/g/t/p/e) */ +static unsigned long long suffix_number(const char *str) +{ + char *ep; + unsigned long long v; + int shift; + + v = strtoull(str, &ep, 0); + switch (*ep|0x20) { + case 'k': + shift = 10; + break; + case 'm': + shift = 20; + break; + case 'g': + shift = 30; + break; + case 't': + shift = 40; + break; + case 'p': + shift = 50; + break; + case 'e': + shift = 60; + break; + default: + shift = 0; + break; + } + v <<= shift; + + return v; +} + +/* Stitch together the command line from a set of argv's */ +static char *make_cmdline(char **argv) +{ + char **arg; + size_t bytes; + char *cmdline, *p; + + bytes = 1; /* Just in case we have a zero-entry cmdline */ + for (arg = argv; *arg; arg++) { + bytes += strlen(*arg)+1; + } + + p = cmdline = malloc(bytes); + if (!cmdline) + return NULL; + + for (arg = argv; *arg; arg++) { + int len = strlen(*arg); + memcpy(p, *arg, len); + p[len] = ' '; + p += len+1; + } + + if (p > cmdline) + p--; /* Remove the last space */ + *p = '\0'; + + return cmdline; +} + +int main(int argc, char *argv[]) +{ + uint32_t mem_limit = 0; + uint16_t video_mode = 0; + const char *kernel_name; + struct initramfs *initramfs; + char *cmdline; + char *boot_image; + void *kernel_data; + size_t kernel_len; + int opt_dhcpinfo = 0; + void *dhcpdata; + size_t dhcplen; + char **argp, *arg, *p; + + openconsole(&dev_null_r, &dev_stdcon_w); + + (void)argc; + argp = argv+1; + + while ((arg = *argp) && arg[0] == '-') { + if (!strcmp("-dhcpinfo", arg)) { + opt_dhcpinfo = 1; + } else { + fprintf(stderr, "%s: unknown option: %s\n", progname, arg); + return 1; + } + argp++; + } + + if (!arg) { + fprintf(stderr, "%s: missing kernel name\n", progname); + return 1; + } + + kernel_name = arg; + + printf("Loading %s... ", kernel_name); + if (loadfile(kernel_name, &kernel_data, &kernel_len)) { + printf("failed!\n"); + goto bail; + } + printf("ok\n"); + + boot_image = malloc(strlen(kernel_name)+12); + if (!boot_image) + goto bail; + + strcpy(boot_image, "BOOT_IMAGE="); + strcpy(boot_image+11, kernel_name); + + /* argp now points to the kernel name, and the command line follows. + Overwrite the kernel name with the BOOT_IMAGE= argument, and thus + we have the final argument. */ + *argp = boot_image; + + cmdline = make_cmdline(argp); + if (!cmdline) + goto bail; + + /* Initialize the initramfs chain */ + initramfs = initramfs_init(); + if (!initramfs) + goto bail; + + /* Look for specific command-line arguments we care about */ + if ((arg = find_argument(argp, "mem="))) + mem_limit = suffix_number(arg); + + if ((arg = find_argument(argp, "vga="))) + video_mode = strtoul(arg, NULL, 0); + + if ((arg = find_argument(argp, "initrd="))) { + do { + p = strchr(arg, ','); + if (p) + *p = '\0'; + + printf("Loading %s... ", arg); + if (initramfs_load_archive(initramfs, arg)) { + printf("failed!\n"); + goto bail; + } + printf("ok\n"); + + if (p) + *p++ = ','; + } while ((arg = p)); + } + + /* Append the DHCP info */ + if (opt_dhcpinfo && + !pxe_get_cached_info(PXENV_PACKET_TYPE_DHCP_ACK, &dhcpdata, &dhcplen)) { + if (initramfs_add_file(initramfs, dhcpdata, dhcplen, dhcplen, + "/dhcpinfo.dat", 0, 0755)) + goto bail; + } + + /* This should not return... */ + syslinux_boot_linux(kernel_data, kernel_len, initramfs, cmdline, + video_mode, mem_limit); + + bail: + fprintf(stderr, "Kernel load failure (insufficient memory?)\n"); + return 1; +} diff --git a/com32/modules/linux.c32 b/com32/modules/linux.c32 new file mode 100755 index 0000000000000000000000000000000000000000..dadbe32264498a3de049af516153e5b329342e4b GIT binary patch literal 12460 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 q_VfGJ>gZ~FRR|6&h literal 0 HcwPel00001 diff --git a/com32/modules/mboot.c32 b/com32/modules/mboot.c32 index 4b28c4b4bce3b96e54e70082f55a71eb051ebe78..1b5aae15a01ccef7ae068eebe78525e92157958e 100755 GIT binary patch delta 83 zcwSrck!j6GrVYpH824>HUMJ1On78?HLm{tm^BbFH+ny5w3=AcTy*?@eyBLlMFzirb nU|@LB+4KK@w~LC!_Y2Jr7#D-oe4fyJ#OCni;6ByGYx=YR`C=s5 delta 64 zcwPZO0KfmN@dB*z0^y@#jK~lG0CXXZOe7Gx W0LBmixFP@m0O)0taE=(Gtd1&)92vU+ diff --git a/com32/modules/menu.c32 b/com32/modules/menu.c32 dissimilarity index 64% index 7d72a88a7318a57f50a2d6b8f4632d06b32da158..c0631dcf6c7a1c1e2a401cf858ccb1156de76c1f 100755 GIT binary patch delta 4407 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 delta 4374 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 T%@^7B`TxBpI@XFT4g3EGfr#<# diff --git a/com32/modules/menumain.c b/com32/modules/menumain.c index 342e587c..32c760fe 100644 --- a/com32/modules/menumain.c +++ b/com32/modules/menumain.c @@ -400,7 +400,7 @@ draw_menu(int sel, int top, int edit_line) tabmsg = messages[MSG_TAB].msg; else tabmsg = messages[MSG_NOTAB].msg; - + printf("\1#08\033[%d;1H%s", TABMSG_ROW, pad_line(tabmsg, 1, WIDTH)); printf("\1#00\033[%d;1H", END_ROW); } diff --git a/com32/modules/pcitest.c b/com32/modules/pcitest.c index 2b0b6be2..c5e72e34 100644 --- a/com32/modules/pcitest.c +++ b/com32/modules/pcitest.c @@ -31,31 +31,46 @@ #endif char display_line; -#define moreprintf(...) do { display_line++; if (display_line == 24) { char tempbuf[10]; display_line=0; printf("Press enter to continue\n"); fgets(tempbuf, sizeof tempbuf, stdin);} printf ( __VA_ARGS__); } while (0); +#define moreprintf(...) \ + do { \ + display_line++; \ + if (display_line == 24) { \ + char tempbuf[10]; \ + display_line=0; \ + 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) { - int pci_dev; - for (pci_dev=0; pci_devcount;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,pci_device->sub_vendor,pci_device->sub_product,pci_device->revision); - } - printf("PCI: %d devices found\n",pci_device_list->count); + 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, + 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) { - int bus; - for (bus=0; buscount;bus++) { - s_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_devcount); + int bus; + for (bus=0; buscount;bus++) { + s_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", + pci_device.vendor, pci_device.product, + pci_device.sub_vendor, pci_device.sub_product); + } + } + } + printf("PCI: %d buses found\n",pci_bus_list->count); } int main(int argc, char *argv[]) diff --git a/com32/modules/pcitest.c32 b/com32/modules/pcitest.c32 dissimilarity index 85% index 0194921f2427a8e554796fa250e3bf3e57b42ca5..b9c508894e77844b25d387aec8c9cf9059e7d545 100755 GIT binary patch delta 1899 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

yZdP569j0W*bGTs|V&!k_HmS}D zJx#R7By;&8%?zf|kI#0|Da?ln?1c&B#wHMAcdm(C(VX5T>GE{=a!dwubIwEUH>1IC z0&1;hSh9|i@!(Vd->)PR@*y&ybmr?n=j_s_Hgvz2}8vBBJK>qgaHWlYY(rA)EY5^8*v_@LtDDfAE1Lr&XOp6ygh;+ zXU?`n-~)gyVf-i+&CQ=B&=Lb=g(|K^T{h-zF(vt)So1JZ*+L zMemxf-laEE&^M>iic7QVr=ThA7?ECFM?IkM+L`RZ7bs+imF6|20X2KQ%f<=ygzcyns^qkenHMCpO|Z#J4UVio?~DT^jC7~i#XpFj^SZ@t^ZuZ zlOucSpu=Fr{nUh~&XO*ohSf<*{}e?P__h!^d>#R`dFnhlQ``JWf(f596SX#*;e*eZ zm=OM&aO^BOc+J>{&o_Tgn?o=pPR>BJqGggZ?UvWUS<+|;5dzH-<=QFoSkC*Z?omT` zH`N`ZN9=iB_p+;Bt9wlOE9f3Z-4Bt&=g2`rd#w)D{^9?l+UNeE+EnB8*RQDcEAhC#+g9YUH#)%tr?$hudf2%KI^AIH*K@ zi^KR0eq{J_76}908|m&!b-|-dM@zw)>PDz~a z_=mJU{@>H83{1vEu7r8zuLIY*qI zQCJriw9JC(*d`TRSFzQC&|-`Jvgt1YUu3e4J_Y*BqE9u3xCOBa!-@TxGrolR{uQ?k8tu`f7#yD z%0eid(pro!z5tq1W^${Dn-m(3Y~+Mio!m1fw=TJ7aQp2XY^{PC4M;Ao%4elivn1Ly zF|ZmEPy>!EklCeO##W!6RLJY;N!hl!Q1s`^V(U`2utDMqtK~vvlUQI<4w?Yn zN;joEWhCE(fOKZ;r?jr*Q9(09cTV~8N5~fWSn1aFIC2u?_jOL)6s2Q~)1D+J?LT4p zb%hhN@!aP*Fbq_LS^OWn!Mt|ALH8joBk2AueoPL!{{za)RM-Yt8(Z)PMn+1-%?z2Z z?}aB{0j^3Fs0NKJECQi7OX(Di8krm??>Y}@7T3vobBj<^+-h_Bj>#7wJdv$oFyLQh17Ez|00sc-_0&T2{SQpU)wKa)`jSP zVK?0`JWKZreb?_4QeYcUX)$Vk3l6(MAC^K#RdZh*V#Wavt@^q;3g+QGD87$^^``J` z)A%+vw}bS^mXhN8l&cB(EU;n5U+JEbdmQcuDjoN2ab(vlPG_>~7iZVc&B@MR*svHM ztFE=yK zJpp0GhD{qDsoww}-)b1+P_toM-TE;e*$vEA=CSp4x7F3uGY@S3!R9U7H#7NgF|}|p zmFpkbyt!`k_Z?In6pqQ+EN|MBi#jftB`^(e_rjfXBkVij{vEUr8u#nt+Iau^y6>ME zZ!!+HAMUra1f~z}ez;?BkHG!Sn*^o+?t9>V5blj|f9Ga_se*eg+;wo*!=3N^*6j-y z-En7utJqyqy7caGfJeT!zGg!$$h~Qfz#M@4zu}%US73gTEimuEt-<~IWfRR3yK@Dm zb3XlN1i(@lcPhh33xo-C{P|@I#XT_&{`qBr!qn?<|1TE{bqxEDI=#lVi(cNZT>0xJ zUU}Cp1CUFvo4@AL`{&bZ&evSn`&EYjg#Y!|*D*%k#{28|Qr^i1gSNKPd2uY7XzRlK Ze{TDpc>?48ww-Ry@xo$b{0#(#n} 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 diff --git a/com32/samples/Makefile b/com32/samples/Makefile index 291413a6..b694a489 100644 --- a/com32/samples/Makefile +++ b/com32/samples/Makefile @@ -31,14 +31,14 @@ LNXLDFLAGS = -g SFLAGS = -D__COM32__ -march=i386 LDFLAGS = -T ../lib/com32.ld OBJCOPY = objcopy -PPMTOLSS16 = ../ppmtolss16 +PPMTOLSS16 = ../ppmtolss16 LIBGCC := $(shell $(CC) --print-libgcc) LIBS = ../libutil/libutil_com.a ../lib/libcom32.a $(LIBGCC) LNXLIBS = ../libutil/libutil_lnx.a .SUFFIXES: .lss .c .o .elf .c32 .lnx -all: hello.c32 cat.c32 resolv.c32 vesainfo.c32 \ +all: hello.c32 cat.c32 resolv.c32 vesainfo.c32 \ fancyhello.c32 fancyhello.lnx \ keytest.c32 keytest.lnx \ diff --git a/com32/samples/fancyhello.c32 b/com32/samples/fancyhello.c32 index ce648600591748d72a317b56d48aee25c34b138e..da0f622069cab3b7dd41e000875bf536fde52092 100755 GIT binary patch delta 63 zcwPZN0KosyLeN66(hmW0lhY430S2=R5D5hxgX}zmJuop40049$jZ7pEx}Yu)0JtIm V008I>`IBK47n2kfFtd0S*bA2r6XE~> delta 63 zcwPZN0KosyLeN66(hmVXlhY430XDM>5D5j7NEI+0gX}zmJuop40049$jZ7pEx}Yu) V0JtIm008LS_>(ae7qfU3*bAHO6tMsR diff --git a/com32/samples/fancyhello.lnx b/com32/samples/fancyhello.lnx index 30a70f0b0de6ecbcc4cfb306ac12234e26a0e17c..55534f06469ef14f399e5821bda3e6824e70e807 100755 GIT binary patch delta 1422 zcwU8)OH5Ni6hPm+cT0yy`8>r+rPV@#`fC9ZMFmB}&j2wRVidoqB{pdbSPA};y1^9- z$gsd@6c-w!vcSgh5m!Qt2_~}8#P~_v5qE?b7JlN~=?m$&Ve#h9x%bYUN#5yi>1*kC zlN+OXab4d*6omj^BJ7)PcfCfW+G!qCtF}*36tHSDm`u^;n30xC=9w?e>0jb080g@2 ztwuCiAO#*F&WdJhSXGo~d^@Q6>08#5=Bk>)>S{8~gX*D_@CGg0L>oPdxW>dRn$M4F zb`!HHV{?4Mdz|1flWy9JJ-H?p(ET{UY2rqjiRdzME1hIpY_3>4PVkUck*uISIKgXT zC0)SkCUQ++HT{CZ}i8}Ey zwIp^=a0~Sy*O3Gsqni=yO*~2e;Nb=n&(cz?9wdbVFVGm?)M!5XBCWt`GkGU24k@V* zusmvg%Guysn>MB|U}~IavU!W5mmp4ziUXj(V6Ex3lIF(ZdW*pT5VI?g-E0dnXT&>{Za;jhZVS!DNLzFIW*ZJ>seeK#EB zNc@)(1?!piU?>pjU}3x0TVCSpyc8&oUX6x=k?t$LGJhgdUVOeIT(+$^+7|8%1)}k3 z`xC-m<=kfxd(n!ALcw$0mxH1B2}h$Ef1EoFB*?;U59wk9ZZD}|6MW?_;_FmAHP4#* E4=3y89{>OV delta 1432 zcwU8)O-K|`9Kh$z{MUVstM2G(t~xokeueG&38raD`Bf=VEEHDQR!U3j2X2zpVZG$Z zz<3^vAjCt5!hRxo`+v=Y`HlI<{o@81 znaz)?Y7LPjV&ktK_C?Lq-yl+@iyyLGIU-3C*p($rCMX}7mXt%*nKvodx5ZO%zn|BY zCbP)~3Gf(k*=)A=%91q0!wK0(-?5uXdczB>rjsdt$R0{%-k`WFbkMVi85TOJhmR_m z7P{yJTj3j4aD&@Q8gvwUax5&MM{z^0g(cL9s9Sh|F0xXG9+|@p9@1$h57J@WP;6m6 z-N5R8a@)j4x`yZ_hfQpvtJv%#?IyNR4_3>_yo}gN2eDd3-kR7(e`B?tjG4{tRL9FS zlgJ~J{j>nNg~ae2Ek$g#@B-b&;Wi5|(MqfyCxs?nr6c&Ilh&oL(ORr_kY)43At`Yh z%d_^UoYQ#dQ0CPQOfB$?i?>K>1>*Bra{$z5tTVZpoMBVRd&m#AkZcg0eNL`uFvU<6 zE(SK{@~i{lru(PJrkHbdXv>3W$>eVp0G~vEu~9IWg{RjQmA%*Wk`?7-r+|mw#fIgQ5Kn zx1*3h^>Usn^HVl9t#!Zf%-^)uwPS5xjHtS5o-uN$8CWY=Gs&s8A{F9Z*^{QJbC@pr zZWgQ6T!jTRoqS*sEsMNllbWaKJntk&$*EDGll*zeZ{_r2u5OzT*%adeP)%oFH8=4` z|7c-g4tG&`b-8z7u)8dLD;x^;4Gnv%e6dVLW!aVf-m1#7aG-Y})E$<(dV-cFYbx65J|Rb^bC!TyXFt5Eql75*)K&5v&1} C6cL{Q diff --git a/com32/samples/keytest.c32 b/com32/samples/keytest.c32 dissimilarity index 61% index 14de94d69e2fb52dd834ced48406e622f05c34dc..623969cd04fefdb5b8895204622b7cca4e5f421c 100755 GIT binary patch delta 2927 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 V$|XI&YMsPtVfa_6QJmiQe*;*y>TUo4 diff --git a/com32/samples/keytest.lnx b/com32/samples/keytest.lnx index a9b0c816961c57b204013c99693246cd26b4fc97..dd7ddbc538037dd67348fa1d4683282d6c5dfd9a 100755 GIT binary patch delta 3332 zcwX(6`)^c56vyXrx1H{`W&3{Zc3ZkFrH^gtivk5!LLWplKoroT7HpMA3r$N&dBg>I zh`h@*5ez~TQG^C#-AEx?11Z>&h$4!T2nvaW{$PWOKZ%Ox+!^S$B!)kLCU@`o%y;I@ z+?n&eyxt?olTl6GLCG($WMx)G&Ohy$ob zYYY`L5o0vk#dho*t1((+qZ+3%UM$-ibi!dDF(3mNXq3YC_Bkm%)XeT~= zTD}+$cO#W{nOG!VLp6;)Z+0#fQ&1hFu}mz*%wy>q6TPAW)m$1f#pLN?r+hWR>8r&~ zg|yGiSS6MtmeCz%pP9mmSWXX`_>6EPR%o0rvJopaE)WHXRT^u=1jHFM-Nahajca{U zFK)3|gsXXqN}d><{vEW18r{}8*mhDqE3t0I@u$?I8dk3?OPm@Ub{CMw$V zCL~qk=@n6GUsku8&|*waB9CxrERYd#&Ecy+=esZqrHSQoZ=72d+%9N|<&O*Qal!ph z!FheBkP^mYjt&eHu~66t7$#vDycTNc7GN23SwF|-lsh_|nJD#+P8W`~Hd>Le?lbR- zLajgG-F?j@yEO!Rrej`~78zk}#pa9wbpY0%m<&sDCT+lao=msCVTi+Uoq&~u_hZq2 z!DM;TXzwzNr_p&^4bcHtI6RsCHjbJ2FP0^*X){Dbpfw`OAqC&9p;jJA(mpxN1AJn6 zM4$K`_K7j%6XPMD7=b=v+h97Q9s8hVy2t~|u=Q|bo?hJdjWBE-U_0}O3D_k}pEMDD zWD;;B?KD~WiAQNve&W#@m7jQwM(~sT+ToKa z%jr=Qm7#crMr9~osZkkmA1>jlHK+LsI+3mZh>@>Yo*6E zmA)>QyW*m|QSzb0T5963D&x<}{jMkSK188pyn$7IeY+t-Vj)bxQfIp^nbn*Sxy9e#!Ed*4#pmYAMcp zc|}8EL0-M;cPUWKqk?CH3;1>?VJ5j*a=B_4HDIT>b@02jtCh zE=xarVD%UW2G1ix8W%6sNJ)9GO*|!A|GMImH>dR|_F0e5|=)TfA_=ei1ud zA$Zzk=&x)d9GrZw_!fM`?JUV-v_tlkuJ`RR%z`A$PA0)FlK`FxJfNAf7_w-DzG?)& zIfCCF!N-9e5AsEk6Tm)%BDi3WNIx``wy6#&B$j+j&7s7p_1l^YG*hSn{G7Fz97-aX z(g(TH-N5+%TuGIl1AKk6%8y*g)cizENXRty08O5Y3{{AG8bQLz3tAsX)C4Pm@wipO zFtSGLhp5uu(%i250jP zI5G;JTx?f*1Pdn);Cxu%5@52(HhV`p1?P OQGe~^1SU66J^vpVWZ>`s delta 3804 zcwX(7e{ft?701uL_r1;S{$i8eY<}$~n{Kj6Y_i#8V+qMZmP&shg&7AKtRP8E3ys~< zVj72(mTjjkf@PXyZbo3REeyY=Wd@DQNIQy*W>hK_YE_JgRmUI1vCM#U1T7lQdH1H> zhCk5%d6Rv)pL5PT_s2WmyLYFzzr2%;$M{?AQ;U_w-YtB`TFP9huUT?Kw(t)-FRViV zphgxQ3fyqtUv{67v;X<`+}!c$@$qpLaXY^Kl=xRtBlmnPK%WuxH;X5*0b0$4y-2z&B@as|IsRejzyhOJTjtlQi_v@W+^ zZ45@2&N2Yz#aoubeuX#Jt0}yTXYpp0h%xd@5##7B5#Q9t3AM8#lux2d+TsY>WC_0> z$?jcCSppbrkME@{X|!54UqhCO%@^|8mdkpQ@IlJ&D%peqFJW_1B;{ok;bWhtRB@1D zN>RohanO{*l@Ak^8w|+TRCi@GpTq1{r7=ci9mP}`jL8gTtTEUi zZzhZwY?l9`;Hbe?`Dyajv8QQ0;wjlpnd{k@PIrsHsJF4dj?qAXa$MjS! z_n10a)z{!VhsY|)_9-Wo@b~u*0$)aLxTIVF{6O6iu3|^jKD?*Z6X9Y1k1&zgPl*_- zo>Ym723>}y(K5~e8LzsOa=b;3YN{Rn9yM#IS#lQ!T#BCzuXFn; zIQEW7$B63RG3jn0TC7RBXPy6=yzVCQHT=$@fO`#5Bjx4svQqbpWKQS@y4*>j9<7eD zpQ{(DD|uL`-&8NoZo*KujNN#zB_F|$AEy!MBU{gZsVv37ge6OhrBOPGBNt-^ZdJWC zMkh~-BAwX(qfT!7uuiNCIa6RTJ!{C@1xnxq(#%oLoL41Wdx@#Hiu@@`U(3Pi#; zkyu0-d)j%aS}Y=HP-{hm3~H^2a)YQ93Jx0#$tC2iFjy&bYF8whC#{GYW7Jv^5rbMQ zB5F`;MbxnqMOqQ{>{O9f#Kl?>O{`cd;$o?YHkLoH6?!zi!~&cv%?N*4T%*7wT8q>gIYskmBE3SBO-CJh(wWy)c2x|T0Y`A56MRy)zb$L z$wwU1v$s5B%2k_9?8mq3x|{@BlEvmL`0=tf&nc?Tq}c#HFQ{B?J^Q-aU)vBkNS-^X zZtuZ#WjoXlYx`RFkZ}ivmk(|LcDEzPk&R`?$eyQQJ~B{2)mr&u)mC>U`tJ_5*7={Y-HJsxW4VB?73*YhGU6{;(r>&oZ4^7(|WQ8y*B#nA0r zsk*fgxDi5=sd_GSk_gjjz7bDx}3>Gfo68j@54LJ5P|;aG?p9$=dwBViB)vl z8qR4IK)u*_vNeFNIlLIK?b2&mQ~)8gorL+r9>A4;xtA~V+3LYWRz1^_XzEI}ZTa&0 z_Tkat+|cbKcebUI+S1Y4KDc>Py0d+F?WQfc^@UdxyP0~bd59ir{>X=NLth-(I+RnF zv>a0Jx7^_~qt~a(!p2YdxO!?y#2FEX5n0&M`VuQ-k|!8@Pc2H-*)urYnL=CYyNn%F zf9r_br^^6#s?yH5eM=DFZuOaDP_6C^*smi!uhyddp%}pT)qU8yu>s&uY6@GKCV=-< zM=Ge!U~G3Yz+V+h$L-oy-0CqRs50pQzagovODFh&r20xa;XC?C>OJqmMvh~NoNf+UJgSG{5ux# z_yT@(0Y8hJkDN~!1ll*~q6)&50@`uAC$v8XVR+5>qsISF!<~jDN`iiQ*baMvPHS|% zDYSnHGJPX$W!j%c&A}h`>JG@zV;;~Q0$ja-zd*dtlJwJ~6#THx_&Y#%a2GPYbe+!! zyNv%3)Bb~oCr$jfIj;ZXU$tZb^Z=$!z;8{!jNxsDX@|9n2JkMwutEV`Aq!`kotXDm zKp0u>)BaNKhdB9hfJ3IgH0?QbU1mC1E-t8y0oK~F*BeO3p)J8f&u^8@L9uWkq^(m0`3J5_PpmF+-J-? g4lKJ0^qnH2m16wLO{r~^~ diff --git a/comboot.doc b/comboot.doc index ced893c7..c8546b25 100644 --- a/comboot.doc +++ b/comboot.doc @@ -100,7 +100,7 @@ int _start(unsigned int __nargs, The intcall helper function can be used to issue BIOS or SYSLINUX API calls, and takes the interrupt number as first argument. The second argument is a pointer to the input register definition, an instance of -the following structure (also available in com32.h): +the following structure (available in ): typedef union { uint32_t l; @@ -117,7 +117,7 @@ typedef struct { reg32_t edi; /* Offset 8 */ reg32_t esi; /* Offset 12 */ reg32_t ebp; /* Offset 16 */ - reg32_t _unused; /* Offset 20 */ + reg32_t _unused_esp; /* Offset 20 */ reg32_t ebx; /* Offset 24 */ reg32_t edx; /* Offset 28 */ reg32_t ecx; /* Offset 32 */ @@ -231,11 +231,11 @@ AX=0001h [2.00] Get Version Input: AX 0001h Output: AX number of INT 22h API functions available - CH SYSLINUX major version number - CL SYSLINUX minor version number - DL SYSLINUX derivative ID (e.g. 32h = PXELINUX) + CH SYSLINUX major version number + CL SYSLINUX minor version number + DL SYSLINUX derivative ID (e.g. 32h = PXELINUX) ES:SI SYSLINUX version string - ES:DI SYSLINUX copyright string + ES:DI SYSLINUX copyright string This API call returns the SYSLINUX version and API information. @@ -444,7 +444,7 @@ AX=000Bh [2.00] Get Serial Console Configuration AX=000Ch [2.00] Perform final cleanup Input: AX 000Ch DX derivative-specific flags (0000h = clean up all) - Output: Does not return + Output: None This routine performs any "final cleanup" the boot loader would normally perform before loading a kernel, such as @@ -548,9 +548,9 @@ AX=0011h [3.05] Maximum number of shuffle descriptors Typical values are 682 and 1365. -AX=0012h [3.05] Cleanup, shuffle and boot +AX=0012h [3.50] Cleanup, shuffle and boot Input: AX 0012h - DX derivative-specific flags (see previous function) + DX derivative-specific flags (see function 000Ch) ES:DI shuffle descriptor list (must be in low memory) CX number of shuffle descriptors EBX(!) initial value of EDX after bootstrap @@ -576,6 +576,19 @@ AX=0012h [3.05] Cleanup, shuffle and boot The copies are overlap-safe, like memmove(). + Starting in version 3.50, if the source address is -1 + (FFFFFFFFh) then the block specified by the destination + address and the length is set to all zero. + + Starting in version 3.50, if the destination address is -1 + (FFFFFFFFh) then the data block is loaded as a new set of + descriptors, and processing is continued (and unprocessed + descriptors are lost, this is thus typically only used as the + last descriptor in a block.) The block must still fit in the + internal descriptor buffer (see function 0011h), but can, of + course, itself chain another block. + + Normal boot sectors expect DL to contain the drive number, and, for hard drives (DL >= 80h) DS:SI to contain a pointer to the 16-byte partition table entry. The memory between @@ -585,6 +598,8 @@ AX=0012h [3.05] Cleanup, shuffle and boot (except DS, ESI and EDX) and the stack will be set up as they were set up by the PXE ROM. + This interface was probably broken before version 3.50. + AX=0013h [3.08] Idle loop call Input: AX 0013h @@ -642,7 +657,7 @@ AX=0016h [3.10] Run kernel image DS:SI Filename of kernel image (zero-terminated string) ES:BX Command line (zero-terminated string) ECX IPAPPEND flags [PXELINUX] - EDX Type of file (since 3.40) + EDX Type of file (since 3.50) Output: Does not return if successful; returns with CF=1 if the kernel image is not found. @@ -737,7 +752,7 @@ AX=0018h [3.30] Query custom font been loaded, AL contains zero. -AX=0019h [3.40] Read disk [SYSLINUX, ISOLINUX, EXTLINUX] +AX=0019h [3.50] Read disk [SYSLINUX, ISOLINUX, EXTLINUX] Input: AX 0019h EDX Sector number ESI Reserved - MUST BE ZERO @@ -755,3 +770,84 @@ AX=0019h [3.40] Read disk [SYSLINUX, ISOLINUX, EXTLINUX] This routine reports "boot failed" (and does not return) on disk error. + + +AX=001Ah [3.50] Cleanup, shuffle and boot to flat protected mode + Input: AX 001Ah + DX derivative-specific flags (see function 000Ch) + ES:DI shuffle descriptor list (must be in low memory) + CX number of shuffle descriptors + DS:SI pointer to register values (must be in low memory) + Output: Does not return + (if CX is too large the routine returns with CF=1) + + This routine performs final cleanup, then performs a sequence + of copies, and jumps to a specified protected mode entry point. + This is otherwise similar to function 0012h; see that function + for the meaning of ES:DI and CX. + + DS:SI points to the initial register file, which is a structure + of 9 dwords (available in ): + + struct syslinux_pm_regs { + uint32_t eax; /* Offset 0 */ + uint32_t ecx; /* Offset 4 */ + uint32_t edx; /* Offset 8 */ + uint32_t ebx; /* Offset 12 */ + uint32_t esp; /* Offset 16 */ + uint32_t ebp; /* Offset 20 */ + uint32_t esi; /* Offset 24 */ + uint32_t edi; /* Offset 28 */ + + uint32_t eip; /* Offset 32 */ + }; + + Protected mode is entered with all data segments set up as a + flat 32-bit read/write segment and the code segment a flat 32-bit + read/execute segment. Interrupts and paging is off, CPL=0, DF=0; + however, GDT, LDT and IDT are undefined, so it is up to the + invoked code to set new descriptor tables to its liking. + + +AX=001Bh [3.50] Cleanup, shuffle and boot to real mode + Input: AX 001Ah + DX derivative-specific flags (see function 000Ch) + ES:DI shuffle descriptor list (must be in low memory) + CX number of shuffle descriptors + DS:SI pointer to register values (must be in low memory) + Output: Does not return + (if CX is too large the routine returns with CF=1) + + This routine performs final cleanup, then performs a sequence + of copies, and jumps to a specified entry point. + This is similar to function 0012h but allow more control over + the initial register state; see that function for the meaning of + ES:DI and CX. + + DS:SI points to the initial register file, which is a structure + in the following format (available in ; + note that this is a completely different structure from the + com32sys_t structure described at the top of this document!): + + struct syslinux_rm_regs { + uint16_t es; /* Offset 0 */ + uint16_t _unused_cs; /* Offset 2 */ + uint16_t ds; /* Offset 4 */ + uint16_t ss; /* Offset 6 */ + uint16_t fs; /* Offset 8 */ + uint16_t gs; /* Offset 10 */ + + reg32_t eax; /* Offset 12 */ + reg32_t ecx; /* Offset 16 */ + reg32_t edx; /* Offset 20 */ + reg32_t ebx; /* Offset 24 */ + reg32_t esp; /* Offset 28 */ + reg32_t ebp; /* Offset 32 */ + reg32_t esi; /* Offset 36 */ + reg32_t edi; /* Offset 40 */ + + uint16_t ip; /* Offset 44 */ + uint16_t cs; /* Offset 46 */ + }; + + Interrupts are off and DF=0 on entry. diff --git a/comboot.inc b/comboot.inc index 5ea648f4..dfb37414 100644 --- a/comboot.inc +++ b/comboot.inc @@ -1,6 +1,6 @@ ;; ----------------------------------------------------------------------- ;; -;; Copyright 1994-2006 H. Peter Anvin - All Rights Reserved +;; Copyright 1994-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 @@ -606,11 +606,12 @@ comapi_maxshuffle: ; INT 22h AX=0012h Cleanup, shuffle and boot ; comapi_shuffle: - call comapi_cleanup - mov cx,P_CX - cmp cx,(2*trackbufsize)/12 + cmp P_CX,(2*trackbufsize)/12 ja .error + call comapi_cleanup + + mov cx, P_CX push cx ; On stack: descriptor count lea cx,[ecx+ecx*2] ; CX *= 3 @@ -795,9 +796,107 @@ comapi_readdisk: comapi_readdisk equ comapi_err %endif +; +; INT 22h AX=001Ah Cleanup, shuffle and boot to flat protected mode +; +comapi_shufflepm: + cmp P_CX,(2*trackbufsize)/12 + ja .error + + call comapi_cleanup + + mov cx, P_CX + push cx ; On stack: descriptor count + + lea cx,[ecx+ecx*2] ; CX *= 3 + + mov fs,P_ES + mov si,P_DI + mov di,trackbuf + push di ; On stack: descriptor list address + fs rep movsd ; Copy the list + + mov fs,P_DS + mov si,P_SI + mov edi,TrampolineBuf + mov al,0B8h ; MOV EAX opcode + mov cl,9 +.maketramp: + stosb ; MOV opcode + inc ax ; Next register opcode + fs movsd ; immediate value + loop .maketramp + mov byte [di-5],0E9h ; Last opcode is JMP + sub [di-4],edi ; Make JMP target relative + + mov dword [EntryPoint],trampoline_to_pm + xor bx,bx ; DS on entry + jmp replace_bootstrap +.error: + stc + ret + +; +; INT 22h AX=001Bh Cleanup, shuffle and boot with register setting +; +comapi_shufflerm: + cmp P_CX,(2*trackbufsize)/12 + ja .error + + call comapi_cleanup + + mov cx, P_CX + push cx ; On stack: descriptor count + + lea cx,[ecx+ecx*2] ; CX *= 3 + + mov fs,P_ES + mov si,P_DI + mov di,trackbuf + push di ; On stack: descriptor list address + fs rep movsd ; Copy the list + + mov fs,P_DS + mov si,P_SI + mov di,TrampolineBuf + + ; Generate segment-loading instructions + mov bx,0C08Eh ; MOV ES,AX + mov cl,6 ; 6 segment registers (incl CS) +.segtramp: + mov al,0B8h + stosb ; MOV AX,imm16 opcode + fs movsw ; imm16 + mov ax,bx + 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 + + ; Generate GPR-loading instructions + mov ax,0B866h ; MOV EAX,imm32 + mov cl,8 ; 8 GPRs +.gprtramp: + stosw ; MOV ExX,imm32 opcode + fs movsd ; imm32 + inc ah + loop .gprtramp + + mov al,0EAh ; JMP FAR imm16:imm16 opcode + stosb + fs movsd ; CS:IP + + mov dword [EntryPoint],TrampolineBuf + jmp replace_bootstrap +.error: + stc + ret + section .data -%macro int21 2 +%macro int21 2 db %1 dw %2 %endmacro @@ -843,6 +942,8 @@ int22_table: dw comapi_usingvga ; 0017 report video mode change dw comapi_userfont ; 0018 query custom font dw comapi_readdisk ; 0019 read disk + dw comapi_shufflepm ; 001A cleanup, shuffle and boot to pm + dw comapi_shufflerm ; 001B cleanup, shuffle and boot to rm int22_count equ ($-int22_table)/2 APIKeyWait db 0 diff --git a/dos/syslinux.c b/dos/syslinux.c index 31fb9050..94c30fa5 100644 --- a/dos/syslinux.c +++ b/dos/syslinux.c @@ -157,7 +157,7 @@ void write_device(int drive, const void *buf, size_t nsecs, unsigned int sector) struct diskio dio; dprintf("write_device(%d,%p,%u,%u)\n", drive, buf, nsecs, sector); - + dio.startsector = sector; dio.sectors = nsecs; dio.bufoffs = (uintptr_t)buf; @@ -601,7 +601,7 @@ int main(int argc, char *argv[]) new_ldlinux_name[0] = dev_fd | 0x40; new_ldlinux_name[1] = ':'; new_ldlinux_name[2] = '\\'; - + for (sd = subdir; *sd; sd++) { char c = *sd; @@ -616,7 +616,7 @@ int main(int argc, char *argv[]) *cp++ = c; } - + /* Skip if subdirectory == root */ if (cp > new_ldlinux_name+3) { if (!slash) diff --git a/dos/syslinux.com b/dos/syslinux.com index b57b86b317c98f321f5be1039248c0f2a0bf08bf..1939a20fb66adc8a4044c45c532575099e2e44b1 100755 GIT binary patch delta 6812 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 delta 6443 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 diff --git a/extlinux.asm b/extlinux.asm index eb55dab9..c7840730 100644 --- a/extlinux.asm +++ b/extlinux.asm @@ -396,11 +396,11 @@ getlinsec_ebios: popad lea sp,[si+16] ; Remove DAPA jc .error - pop bp + pop bp add eax,edi ; Advance sector pointer sub bp,di ; Sectors left shl di,SECTOR_SHIFT ; 512-byte sectors - add bx,di ; Advance buffer pointer + add bx,di ; Advance buffer pointer and bp,bp jnz .loop @@ -518,7 +518,7 @@ disk_error: kaboom: xor si,si mov ss,si - mov sp,StackBuf-4 ; Reset stack + mov sp,StackBuf-4 ; Reset stack mov ds,si ; Reset data segment pop dword [fdctab] ; Restore FDC table .patch: ; When we have full code, intercept here diff --git a/extlinux.bin b/extlinux.bin dissimilarity index 82% index c579e1cd8db9d67f2eb272565ecc75d255eec636..855018b807024af1b41e8619c2d440ad405ae0b1 100644 GIT binary patch delta 6108 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 XJGpF8&Y~PujwUBgk|W{2Po4JP&Wodk delta 5752 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 diff --git a/extlinux.bss b/extlinux.bss index 5ee5cc7327631e5e6111a443b6158275d67f295e..c2149997fdcf338456e9a99ceb7e0e0644754d5e 100644 GIT binary patch delta 41 tcwTE@X<(U9#TYQL+7n0|Rc8Kj&1>Ro1IB>KGK^|K(wWf#NVYK6001t34Y~jT delta 41 scwTE@X<(U9#ppk=+7n0|Rc4Nk%$WGvfYE=l45J#5bY^q_k}Zri02d$(y#N3J diff --git a/extlinux.sys b/extlinux.sys dissimilarity index 83% index ee6fa5873aa17e8fd21e331e133798d0c93fb034..d9b9dbf139d035fc424a52d44947534ade78f214 100644 GIT binary patch delta 6083 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 C^qExv delta 5727 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 IA!q9U0K1{rfB*mh diff --git a/extlinux/ext2_fs.h b/extlinux/ext2_fs.h index e0b4bbe1..c0eeb7b7 100644 --- a/extlinux/ext2_fs.h +++ b/extlinux/ext2_fs.h @@ -48,7 +48,7 @@ # define ext2_debug(f, a...) { \ printk ("EXT2-fs DEBUG (%s, %d): %s:", \ __FILE__, __LINE__, __FUNCTION__); \ - printk (f, ## a); \ + printk (f, ## a); \ } #else # define ext2_debug(f, a...) /**/ @@ -331,7 +331,7 @@ struct ext2_super_block { __u16 s_magic; /* Magic signature */ __u16 s_state; /* File system state */ __u16 s_errors; /* Behaviour when detecting errors */ - __u16 s_minor_rev_level; /* minor revision level */ + __u16 s_minor_rev_level; /* minor revision level */ __u32 s_lastcheck; /* time of last check */ __u32 s_checkinterval; /* max. time between checks */ __u32 s_creator_os; /* OS */ @@ -351,15 +351,15 @@ struct ext2_super_block { * feature set, it must abort and not try to meddle with * things it doesn't understand... */ - __u32 s_first_ino; /* First non-reserved inode */ - __u16 s_inode_size; /* size of inode structure */ - __u16 s_block_group_nr; /* block group # of this superblock */ - __u32 s_feature_compat; /* compatible feature set */ - __u32 s_feature_incompat; /* incompatible feature set */ - __u32 s_feature_ro_compat; /* readonly-compatible feature set */ + __u32 s_first_ino; /* First non-reserved inode */ + __u16 s_inode_size; /* size of inode structure */ + __u16 s_block_group_nr; /* block group # of this superblock */ + __u32 s_feature_compat; /* compatible feature set */ + __u32 s_feature_incompat; /* incompatible feature set */ + __u32 s_feature_ro_compat; /* readonly-compatible feature set */ __u8 s_uuid[16]; /* 128-bit uuid for volume */ - char s_volume_name[16]; /* volume name */ - char s_last_mounted[64]; /* directory where last mounted */ + char s_volume_name[16]; /* volume name */ + char s_last_mounted[64]; /* directory where last mounted */ __u32 s_algorithm_usage_bitmap; /* For compression */ /* * Performance hints. Directory preallocation should only @@ -389,7 +389,7 @@ struct ext2_super_block { * Revision levels */ #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ -#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ +#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV #define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV @@ -499,8 +499,8 @@ enum { * * NOTE: It must be a multiple of 4 */ -#define EXT2_DIR_PAD 4 -#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) +#define EXT2_DIR_PAD 4 +#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) #define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ ~EXT2_DIR_ROUND) diff --git a/extlinux/extlinux b/extlinux/extlinux dissimilarity index 60% index a84306a52bcc12a996c29822191f807e1370f3d1..f1e56faddcf3df11ec7664fed2e07c419830e3d7 100755 GIT binary patch delta 6860 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 diff --git a/extlinux/extlinux.c b/extlinux/extlinux.c index 75de5b9f..5ed548fc 100644 --- a/extlinux/extlinux.c +++ b/extlinux/extlinux.c @@ -681,7 +681,7 @@ install_loader(const char *path, int update_only) a new device with the appropriate device type */ snprintf(devname_buf, sizeof devname_buf, "/tmp/dev-%u:%u", major(st.st_dev), minor(st.st_dev)); - + if (mknod(devname_buf, S_IFBLK|0600, st.st_dev)) { fprintf(stderr, "%s: cannot create device %s\n", program, devname); return 1; diff --git a/font.inc b/font.inc index 4eeee1d5..5da4d59f 100644 --- a/font.inc +++ b/font.inc @@ -55,7 +55,7 @@ loadfont: ; ; use_font: -; This routine activates whatever font happens to be in the +; This routine activates whatever font happens to be in the ; vgafontbuf, and updates the adjust_screen data. ; Must be called with CS = DS = ES ; diff --git a/getc.inc b/getc.inc index 1be51769..4b0dd47d 100644 --- a/getc.inc +++ b/getc.inc @@ -239,7 +239,7 @@ unhexchar: ja .err sub al,'a'-10 ; CF <- 0 ret -.err: stc +.err: stc .ret: ret ; diff --git a/isolinux-debug.bin b/isolinux-debug.bin dissimilarity index 77% index 3aea60d260ae9d6cf4f7b41b77993f6bc3f3f761..3bcb61c58256ae19e7f417e5836599b495ca2eb7 100644 GIT binary patch delta 6655 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

GgN)vH=im-ba6 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 CFTQ~Q diff --git a/isolinux.asm b/isolinux.asm index c36c2bcd..9bc1b45a 100644 --- a/isolinux.asm +++ b/isolinux.asm @@ -137,7 +137,7 @@ sp_devspec: resw 1 ; IDE/SCSI information sp_buffer: resw 1 ; User-provided buffer sp_loadseg: resw 1 ; Load segment sp_sectors: resw 1 ; Sector count -sp_chs: resb 3 ; Simulated CHS geometry +sp_chs: resb 3 ; Simulated CHS geometry sp_dummy: resb 1 ; Scratch, safe to overwrite ; @@ -475,8 +475,8 @@ award_oldint13 dd 0 ;; award_string db 0b8h,1,2,0bbh,0,7ch,0b9h,6,0,0bah,80h,1,09ch,09ah ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -award_hack: mov si,spec_err_msg ; Moved to this place from - call writemsg ; spec_query_faild +award_hack: mov si,spec_err_msg ; Moved to this place from + call writemsg ; spec_query_faild ; %ifdef DEBUG_MESSAGES ; ; @@ -495,17 +495,17 @@ award_hack: mov si,spec_err_msg ; Moved to this place from call writestr ; %endif ; push es ; save ES - mov ax,0f000h ; ES = BIOS Seg - mov es,ax ; - cld ; - xor di,di ; start at ES:DI = f000:0 -award_loop: push di ; save DI - mov si,award_string ; scan for award_string + mov ax,0f000h ; ES = BIOS Seg + mov es,ax ; + cld ; + xor di,di ; start at ES:DI = f000:0 +award_loop: push di ; save DI + mov si,award_string ; scan for award_string mov cx,7 ; length of award_string = 7dw - repz cmpsw ; compare - pop di ; restore DI - jcxz award_found ; jmp if found - inc di ; not found, inc di + repz cmpsw ; compare + pop di ; restore DI + jcxz award_found ; jmp if found + inc di ; not found, inc di jno award_loop ; ; award_failed: pop es ; No, not this way :-(( @@ -540,10 +540,10 @@ award_found: mov eax,[es:di+0eh] ; load possible int 13 addr mov si,award_not_crlf ; call writestr ; %endif ; - mov ax,4B01h ; try to read the spec packet - mov dl,[DriveNo] ; now ... it should not fail - mov si,spec_packet ; any longer - int 13h ; + mov ax,4B01h ; try to read the spec packet + mov dl,[DriveNo] ; now ... it should not fail + mov si,spec_packet ; any longer + int 13h ; jc award_fail2 ; ; %ifdef DEBUG_MESSAGES ; @@ -1529,7 +1529,7 @@ default_str db 'default', 0 default_len equ ($-default_str) boot_dir db '/boot' ; /boot/isolinux isolinux_dir db '/isolinux', 0 -config_name db 'isolinux.cfg', 0 +config_name db 'isolinux.cfg', 0 err_disk_image db 'Cannot load disk image (invalid file)?', CR, LF, 0 %ifdef DEBUG_MESSAGES diff --git a/isolinux.bin b/isolinux.bin dissimilarity index 79% index 45ae58cb21e7a9839712ba216eaa11472e43c35a..f5ebefca558dc61aae59dcbbc5cfa3833b4f5719 100644 GIT binary patch delta 6418 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 delta 6091 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 delta 5863 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 X=+}GzKW@$2Yks#zf{;)&Z}z_d69WPh diff --git a/ldlinux.bss b/ldlinux.bss index 364eeeed7caa3a6f37a8ea405b5bac1254cd31e1..5c11e220c7e8850d52045fe63e95aaa4e8068569 100644 GIT binary patch delta 41 tcwTE@X<(U9#ppA!+7n0|Rc8Kj&1>Ro14f_8GK^|K(wWf#NVYK6001oi4W@~ diff --git a/ldlinux.sys b/ldlinux.sys dissimilarity index 84% index a11cbfcf101d71f22e8a4fde23a497ff663abd5e..5dd346f2e3f86434b4ab53cdef2a4b74be580cae 100644 GIT binary patch delta 6203 zcwT*2e_T^nmcK8Amw=FjpCTf}imA30No$$5Vnj+QhV(tr7O=LUU3;~i+1>d-qMfPR zfWek$Fs(iv^-~=JLF=GxvC={sO@faG+>w_4nAWYWQbc-Vtkt3jh{>K8+WpM#AN$Wc z_ulj4p8M;Z?|EldjIW#*8@+1vD#LQ-nR4|*Sr2E2KMVd?_2R>76dRq2P*C!L?&jC} zS9fYdJM*IWY-%RO@CIs|xy(*_Ls;u|Put=_2B!+W%iyEgL-^?6D7Gf&8D@WBiiC!G z3+9q{8*o#K0Xu38FjD>-D{~80zMuSn0aN|hQ3vdLk)3U@oK|*Sk%HP=Q>+HiPBbV_ z_0}tz4J9>QQS}Ok!MwT%I}RA~aMwT-cI*QYnB;yMWWOZG5nggjiBMJM@m0_YK`V7T z=;EdawqOg9;4cSogeVF#9^X{2NZi#f=}T_*GDoB)RbTv)JgPd%{h6KkgZ?{{?*10f z+9GE&8o`Ii)l_mI*>l9;tT7{4`v^W7?)=&&pU=WQbk~3QmnIK|Y%0VH{+7 zyh-I*Z2+;kIYJ44bW*rI7?klJf}HP>u>Dpy@~ z-)6ctly|~-X%s9_MrGJgZgv%IEXjRz6I&Zv`eAiXE7_V9=n`4HJt95rgz*6DuD26w zQXr1}DarqAh#Z{he>xNv_%>pu*}J!92{JAshZV+!rDR!B1#!j)63g7^HRxD#jxgl0 zBsW}+MM;zDVTGJ3;0oRR)f@3qFLEz>dLg24aXLDeRy>+uI5v9)nOyPAV#n z<*GN|fptVeW7BPh%W*SJ(Z#d9CP}^2tQ}pPqbRP{r*A~+3{OD^IXpdM{%56bgW$|V znvug5MoHj%dLzn{dC*(#-VUpxyJMt<(@BbDV86^=*8y@PEtT5yc3(&HX(pht=;X!7 zxP~q*^PoIikGt0inpVZ6eoC#fLRPOh&G_gB0eK8&A=~R*jDC5~M6sOiB;z{PvI^{y z{jqD5+fE>Cm05F6GMJP43Z%#)NNewSTQ+@fRiNV8XH2Q!rDumwMp6~-20KYetRTun zcag(?Fvi_`3O1&+tfZuD{=B;SdD*Ya5Y(w zKt^T=)|@uDI>#7m@_WqMDX+-uv9&+%5I9|tu&!(ctO*vHH?>e~eQL72Qu&eYG(%IN z(4m(b`P-2ivs;d9$Fp9ju2$A{MTeU&{hPAx{b=0f|CNK3b@p%b~t5dy44P1h2eF#Yr_K2cn&1v@%2T6$|wkW*10yn`hru%#&~&^T)e> zjDqp0*a&9=-nhdn0%s{iEPPDVax+X$yDOUg_3|G2YetHEU>W)Af^@p*!#Ra4%Lbc5aLO7Xzrloh!AQMi9;A`=Qx zeu0ePjs=RYzVcC3>3Q8eJ^8CyM_p`bqiQ@y=-E zexs33pEl#Ax0*NJR~wLM&#cjU#Rb{=Prmo+ok{XS{H1B)m6?d;J|(weLzl?1MDijM zziqK&!uG;Ma^zQfH)c#AdNd~33N_YEiJD`%nZ`)6JvMM_OsLUaY(%CAGCh{JPg`IX zI|(EvR_!&(>ope|gY?D5`oc894o$_y#=yu#I<2%TkKnbF4SlxnZJ%(LNn4y{EUikS z_43sD(B8w1{>0F@&{LR}hI$H99*pQIOw^(VM%7S}*;6P*uk{q7GCTNEk!jteA{DoO zYeJkNnU#qfpW5ob65ROER{v0tBqWRp>0!21Jhyk~4Dv9||1l=)@TKoAOMgQ2QEuH!mdbgse;o|8VTR=1A$dFeUXvBgjxFyrsGF%>2UTug_39<~b<8FBPWAT35PHRUY+Yl13 z@jVez%QD1_(?h$Nfkywu+txzWLzXe+=G5j=JNRQQP2?2wST6ZK_J|yg>|^DaFfP~& z?2s#`+4Jq;4OZ>!<`s%G^O@@+b80<>q%jEkB^!3cEVp6s26>RYOnj_1Ec%Zwv2FHC*-0|c2|1k-%3l$yHBcwg=AC~-P?rE~(|1}5JTxOg1INjFSy8aM% z4j`fLi7Q+u?mR9(3igBDgJW%1TA>xTFV5}fzNWKIaClo$}1q8oqZFoH+GfpKxjgI>73>}rXl$PGf7-0VQ&`w?xd1RUR$K3(gz!r zYHtjsyvKVbe}@{uD;ltows|)3HT7HP4loFXE^V-Cideo)k!fD|`t{J!d2EnBY9Vrd z@a9In4WW%<$l54|+Kns4Zr%xmUXHv&n5{~LUAK2kOmbmE+Mz2w;E^14rl6?_#L2)3 zB07;76rC6bfvMOO=6wK;!{d!QdB^|2$N@$EM%so~{vErDU>-jmQvOZZB+J0-@WCuj zGsOHo%L-q70I&V^9lDxDxeGz%M_%oDYoZ0ag8Uw3W)ZVN*^z#MvHYBaH*mV|n667w z>Y~+{`GEG!@o6K6j&^2%-cjq5H|Ks6qek45Hz7v5ls0&~p%AF%d?y;9FEBi%n(;W3 zv+kfkhtr0bCB+O%`ju=LRS7=YZa{%Zk+8b}kE?b~r6Wi+QaLW0I;&&+^D1?&;gS+V z!2rq2GfhlbPdl;p3#=W*O>M7Y$17-ia+AT`{;KDitjsBglNvcxp*{aHwGqil6z^0m zG|L~i+__tIJ)mB%{D_UL8J}G>v`Xt;FOfYyII#v|*4G;DdAX+HMd_OIiH0uQ=a4ji z^zZ$c5ZV~Kmc+<%XBz3;2%}`3;9lx*L0pY+O}_cR7dOQp5Z+@nvA{-S~x)e{JM1#4nXx_=(R*7@2RtTo0cA zO|=~7;Yas37k-{5V!0|uiM=LIy%BPB2(mNfk0#JOgJ-!qNa?i%MFaKu1#P_Vcu zhMmGlQxHkTayf}?)2A(tWcHvi4!Jmn-Ee8CH7A)}obzc*)qOCcVzFghwTZ@1%8B3t z2CSe&r^{Su-YW8HP&82?JH~+$;L8|xOc3>%dTG?u5FNwvBrz?GsSQnItCeM>CRAA^ zZ_Qm$eT}$7Vi7RO@am*1#U2rW<3j>1?jCnqjF4U*J%^R~=uB2dYAC!CZnC1cg-pAP zpDopn0-S3p!7Cwcr5aO9w<}8RH9t_xLdhvC|4j1ZX4be60=k|u&fA_ohuyAwLE0YW zq)?yAp33GuMyIix=QgK?$F0e!ER=dGp;M;No(I}Pr?3Ni1jx@MiKScTJIDa4QPeeD@ek;;lv+jVo; zP9#d$$Vz-nf>qPQgHk!HJD?KB)qn9E9SY12Z-m%S*(2me z8)w4BiL>hV4b_Hz8mgAnM?T3xM<5T$0%>qG)|`DqQ9dbhA06`iG{iSfPcgIW0`FzY znlstJJEO3lQsez%u&}1b6wf|yoVjAVW;VN{Eb{6RwQ(%}s(Rp&0n_z2zAPsvKM+HV zFr^ZGOsu}hC!xTofY*w3rzyjl3>LmHPPd!}Whf@|#atRTpxomP_TqIyST6aVU#I#d zJPT#K5*FkQDYK?~z7fc?A$%ZflrFW)0dyA7Sz;=#NqNj%{*LFm-kDeosL?Nh+u@G4 zdkQ`bV{}iiC)*qRq&4Uryd%IM`E(L;B@#TnE+S0U{(Q#8>4JdkdQXvd==PrCbf_3` zjj9-JR(g7!Ff$iC}K1H`H$99NXqGAig!E{(PkmX+se5Kaz0GrqwKYrL9J{%wCC%aXxyP9f{TUM|Z_CyX`Jq;+SHD zgcaoXsFKJ4>Ai-aE_UWq5I>KSQn5p>--gnom~t0PRlj15E0)HSdM;cZ3uGZ8WyAd5 z)W`H4TCcNCGSW)AQT3gs?hX*7dYniyzYFZOf(1zSAV6j#t4>kOeNIhOsUYYSyOA8q zZnbQr1u*U`JNfc5KXayQy3ygh7vXpDqk=I3zdLx#-P#n0bocQ;&3u`9gD+2;L-q1o z(ll(o-LtdXiR5thKDxk8iFafY?ub+}Dt3)|r*?L4*X7%@&x;(&n4vvWKi+g7J9?x3 zbW!sxwsUq|pQ>pd+eIRZn$uYRMp}9t+pg?W1<%%N(%5wZm-Ck)UOj8BdFW%gx-(v- zJr9wtPo-(1)z;*EJJnw_`iu4p@zqyF+GnxB-g;lVM2r#|tAbX$A5r(vyN3`eu_|^A zc~Bn7Mx}0)$K8(5?HY30fBPMT?6w}OZuiis8VT8hETFOi>ZOX+gFP|w7A zZJ0hZd(;>&#yA&J6WOgWlokEUPk&faYUlrye(!=O?41%-pUNk$7I4x$wnj2Qk%_xL z`WHQE=>95}7h0+{No;8Sr%5Dg#pZs%vy$#1!2g<&vRrXoTkq z>R5XoEEli{T@OLsn#bCNKqQ98`wH$<6UYJ|uUPifDh!Ar(enV?msBkSrfE&!-|-TW zVcLK#x@;D0K8rtwgkO&E{mBoo)iYo;m!*sy`1ZF@J{7Rl??T~Jzy=PF;~8FHJ_0II z+_Z?r^ZPgLoRT(i*pbHuEVwC;#k0M}Sg3mo*iDb%rUI6CWh{XrZJkV5ajX@R{6x6` zyY0!o?5stuY(M5Ax#y*vnda_TdgO!Gg_2ceZj^1i=6>X|_-}5p)HvJXlMjy4$|Evs zdd_9c$+!!(fk!TPU4l&@KYtIVtVj!Qwt#KOhU-lA-}7hGWwGn5f3*IW^{zFcLEBJsV*c!d5$5Xs#D_bowI6>FY2Kc*PbRr_SYAA1--^zJeg}-7ZQt0B z(6znia&FNS(A~$gkpyVM>lBIr`r>C4K+tP@56ItPB7rs>A4s8ru6&TDWk8?YUD z7SKh#&=?g3PD}US76pKgi2^{!MFT)pf2ELIknX=O$^qra=4z<5e1;~wbQLbeWw_+P z6u_Mzr%=O}IBN>c{|4k;MF6o?VTdgvZNSmCerySbj8EW4gPRlTdov?2B$5pfP3pTg zjI;#ud7I{bb07&W4)>{L_&4rR?#70Z)?dN;{~+|G%Mr4DIfcB56CDK1R*5Sx)q^P? zUW3bpYr{3eHSoT&d^BAY%Ccq+>$5_KztBT}ST7;#k*PA=ly*{?2l|o@l9kBx)Cbf& zatxUY!yLNp^WpX6ZPa#gcrDqDO0;Jn1e@j$j;|Kk{IYvzMV@K)M;G${a_{|g*!p+; z?t9D4so1&{TjBXwSvj_ZLdF!56toC2MW*3@suV(5sK|xnfPU}b5_0n{EC6t}Ge$&q zw{HYGCddcD|Ffl?^Zuz|xgsl4qqmI9jmyo;cP{T(zC^!7uhgscDH6Sezjxj}{|zJE BwLt&? delta 5838 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 B`56EJ diff --git a/mbr/Makefile b/mbr/Makefile index d61f7f1c..7662a0a3 100644 --- a/mbr/Makefile +++ b/mbr/Makefile @@ -1,5 +1,5 @@ ## ----------------------------------------------------------------------- -## +## ## Copyright 2007 H. Peter Anvin - All Rights Reserved ## ## This program is free software; you can redistribute it and/or modify diff --git a/mbr/checksize.pl b/mbr/checksize.pl index b7d560a0..4feb20aa 100755 --- a/mbr/checksize.pl +++ b/mbr/checksize.pl @@ -1,5 +1,5 @@ ## ----------------------------------------------------------------------- -## +## ## Copyright 2007 H. Peter Anvin - All Rights Reserved ## ## This program is free software; you can redistribute it and/or modify @@ -28,4 +28,3 @@ if ($size > $maxsize) { } else { exit 0; } - diff --git a/mbr/mbr.S b/mbr/mbr.S index 81e5dd00..1e6842bd 100644 --- a/mbr/mbr.S +++ b/mbr/mbr.S @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- - * + * * Copyright 2007 H. Peter Anvin - All Rights Reserved * * Permission is hereby granted, free of charge, to any person @@ -10,10 +10,10 @@ * 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 @@ -29,10 +29,10 @@ .text .globl bootsec -stack = 0x7c00 -driveno = (stack-6) -heads = (stack-8) -sectors = (stack-10) +stack = 0x7c00 +driveno = (stack-6) +sectors = (stack-8) +secpercyl = (stack-10) BIOS_page = 0x462 @@ -42,7 +42,7 @@ BIOS_page = 0x462 bootsec: .space 512 - .text + .text .globl _start _start: cli @@ -89,18 +89,19 @@ next: /* Get (C)HS geometry */ movb $0x08, %ah int $0x13 + andw $0x3f, %cx /* Sector count */ + pushw %cx /* Save sectors on the stack */ xorw %ax, %ax movb %dh, %al /* dh = number of heads */ incw %ax /* From 0-based to count */ - pushw %ax /* Save heads on the stack */ - andw $0x3f, %cx /* Sector count */ - pushw %cx /* Save sectors on the stack */ + mulw %cx /* Heads*sectors -> sectors per cylinder */ + pushw %ax /* Save sectors/cylinder on the stack */ xorl %eax, %eax pushl %eax /* Base */ pushl %eax /* Root */ call scan_partition_table - + /* If we get here, we have no OS */ jmp missing_os @@ -112,18 +113,16 @@ read_sector: read_sector_cbios: movl %eax, %edx shrl $16, %edx - divw (sectors) - incw %dx - movw %dx, %cx - xorw %dx, %dx - divw (heads) - /* dx = head, ax = cylinder */ + divw (secpercyl) + rorb %ah + rorb %ah + movb %ah, %cl movb %al, %ch - shrw $2, %ax - shrw %ax - andb $0xc0, %al - orb %al, %cl - movb %dl, %dh + movw %dx, %ax + divb (sectors) + movb %al, %dh + incb %ah + orb %ah, %cl movw $bootsec, %bx movw $0x0201, %ax jmp read_common @@ -155,7 +154,7 @@ read_partition_table: 20: popal ret - + /* * scan_partition_table: * Scan a partition table currently loaded in the partition table @@ -165,12 +164,12 @@ read_partition_table: * 18(%bp) - root (offset from MBR, or 0 for MBR) * 22(%bp) - base (location of this partition table) */ - + scan_partition_table: pusha movw %sp, %bp - /* Search for active partitions */ + /* Search for active partitions */ movw $ptab, %di movw $4, %cx xorw %ax, %ax @@ -198,7 +197,7 @@ scan_partition_table: je 8f cmpb $0x85, %al /* Linux extended */ jne 9f - + /* It is an extended partition. Read the extended partition and try to scan it. If the scan returns, re-load the current partition table and resume scan. */ @@ -221,7 +220,7 @@ scan_partition_table: movl 22(%bp), %eax call read_partition_table - /* fall through */ + /* fall through */ 9: /* Not an extended partition */ addw $16, %di @@ -264,7 +263,7 @@ disk_error: too_many_active: movw $too_many_active_msg, %si /* jmp error */ - + error: 2: lodsb diff --git a/mbr/mbr.bin b/mbr/mbr.bin index eb50d7f2376fae37d5dd3e79942be06c13cae34e..11a50b850bf0e9b38ec503df3100b73b149f0c58 100755 GIT binary patch delta 86 zcwPZk0IC1D1Goc_Jwaav>m^#W2+b3N;XhF^z=-fb_u)`xF~DX}W>Dx)0O`~KW{JXP s!RiqAHuiha%+Sn;;fTeF(DpX?dx*yV#0cS$ej5SAk(z=5L6aQ;n=s%jnB>Y2+b2Qz=-fbP=nz=QD!l~W>98O=urUa)&ORS!e+th s5cf9rdqRoPG1B)o_lxaBR6ml2NkDQ1l7{I(avu_Z4v?INq<$licknBO?b20)cr~?Fme1XYl`BVgpQbi;5Y5bU|uSa%Ilse|(<+ Dsd7?G delta 442 zcwYM=|3Q9(Et_L3+iUfxEgWZs4G(mDa0qCAXdjqncpxnxE#O5U!^>+7X`P4C4!#oj zZuYI(sq>=YrSE1xsymJze8F__g~|brgB{l<*Re@69-2Iht%=covn=~-Rz{J@oV?BT z(hLj?->Mm);NyQ~AeqF1;OhcO1vVI;k--Q^wjuFdfMhHZKMY8&M&f4!Nn>^dzYJA< zJwp?a>POPh2P9V@X_yQo_aX6T0Lf`c>em8EJ|y`~K++b8e+WogAo0%v$xt}onUUcR zka9p$@CZoeBk?~1$sQy=D" - 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 heads = (stack-8) - 35 sectors = (stack-10) - 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/ccTYNZSV.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 7211 jc 1f - 78 0030 81FB55AA cmpw $0xaa55, %bx - 79 0034 750B jne 1f - 80 0036 F6C101 testb $0x01, %cl - 81 0039 7406 jz 1f - 82 - 83 /* We have EBIOS; patch in a jump to read_sector_ebios */ - 84 003b C7065D00 movw $0xeb+((read_sector_ebios-read_sector_cbios-2)<< 8), (read_sector_cbios) - 84 EB27 - 85 - 86 1: - 87 0041 5A popw %dx - 88 - 89 /* Get (C)HS geometry */ - 90 0042 B408 movb $0x08, %ah - 91 0044 CD13 int $0x13 - 92 0046 31C0 xorw %ax, %ax - 93 0048 88F0 movb %dh, %al /* dh = number of heads */ - 94 004a 40 incw %ax /* From 0-based to count */ - 95 004b 50 pushw %ax /* Save heads on the stack */ - 96 004c 83E13F andw $0x3f, %cx /* Sector count */ - 97 004f 51 pushw %cx /* Save sectors on the stack */ - 98 - 99 0050 6631C0 xorl %eax, %eax - 100 0053 6650 pushl %eax /* Base */ - 101 0055 6650 pushl %eax /* Root */ - 102 0057 E85100 call scan_partition_table - 103 - 104 /* If we get here, we have no OS */ - GAS LISTING /tmp/ccTYNZSV.s page 3 - - - 105 005a E9D600 jmp missing_os - 106 - 107 /* - 108 * read_sector: read a single sector pointed to by %eax to 0x7c00. - 109 * CF is set on error. All registers clobbered. - 110 */ - 111 read_sector: - 112 read_sector_cbios: - 113 005d 6689C2 movl %eax, %edx - 114 0060 66C1EA10 shrl $16, %edx - 115 0064 F736F67B divw (sectors) - 116 0068 42 incw %dx - 117 0069 89D1 movw %dx, %cx - 118 006b 31D2 xorw %dx, %dx - 119 006d F736F87B divw (heads) - 120 /* dx = head, ax = cylinder */ - 121 0071 88C5 movb %al, %ch - 122 0073 C1E802 shrw $2, %ax - 123 0076 D1E8 shrw %ax - 124 0078 24C0 andb $0xc0, %al - 125 007a 08C1 orb %al, %cl - 126 007c 88D6 movb %dl, %dh - 127 007e BB0000 movw $bootsec, %bx - 128 0081 B80102 movw $0x0201, %ax - 129 0084 EB09 jmp read_common - 130 read_sector_ebios: - 131 0086 BEA801 movw $dapa, %si - 132 0089 66894408 movl %eax, 8(%si) - 133 008d B442 movb $0x42, %ah - 134 read_common: - 135 008f 8A16FA7B movb (driveno), %dl - 136 0093 CD13 int $0x13 - 137 0095 C3 ret - 138 - 139 /* - 140 * read_partition_table: - 141 * Read a partition table (pointed to by %eax), and copy - 142 * the partition table into the ptab buffer. - 143 * Preserve registers. - 144 */ - 145 ptab = _start+446 - 146 - 147 read_partition_table: - 148 0096 6660 pushal - 149 0098 E8C2FF call read_sector - 150 009b 720B jc 20f - 151 009d BEBE01 movw $bootsec+446, %si - 152 00a0 BFBE01 movw $ptab, %di - 153 00a3 B92000 movw $(16*4/2), %cx - 154 00a6 F3A5 rep ; movsw - 155 20: - 156 00a8 6661 popal - 157 00aa C3 ret - 158 - 159 /* - 160 * scan_partition_table: - 161 * Scan a partition table currently loaded in the partition table - GAS LISTING /tmp/ccTYNZSV.s page 4 - - - 162 * area. Preserve 16-bit registers. - 163 * - 164 * On stack: - 165 * 18(%bp) - root (offset from MBR, or 0 for MBR) - 166 * 22(%bp) - base (location of this partition table) - 167 */ - 168 - 169 scan_partition_table: - 170 00ab 60 pusha - 171 00ac 89E5 movw %sp, %bp - 172 - 173 /* Search for active partitions */ - 174 00ae BFBE01 movw $ptab, %di - 175 00b1 B90400 movw $4, %cx - 176 00b4 31C0 xorw %ax, %ax - 177 5: - 178 00b6 F60580 testb $0x80, (%di) - 179 00b9 7403 jz 6f - 180 00bb 40 incw %ax - 181 00bc 89FE movw %di, %si - 182 6: - 183 00be 83C710 addw $16, %di - 184 00c1 E2F3 loopw 5b - 185 - 186 00c3 83F801 cmpw $1, %ax /* Number of active partitions found */ - 187 00c6 7446 je boot - 188 00c8 7773 ja too_many_active - 189 - 190 /* No active partitions found, look for extended partitions */ - 191 00ca BFBE01 movw $ptab, %di - 192 00cd B104 movb $4, %cl /* cx == 0 here */ - 193 7: - 194 00cf 8A4504 movb 4(%di), %al - 195 00d2 3C05 cmpb $0x05, %al /* MS-DOS extended */ - 196 00d4 7408 je 8f - 197 00d6 3C0F cmpb $0x0f, %al /* Win9x extended */ - 198 00d8 7404 je 8f - 199 00da 3C85 cmpb $0x85, %al /* Linux extended */ - 200 00dc 7529 jne 9f - 201 - 202 /* It is an extended partition. Read the extended partition and - 203 try to scan it. If the scan returns, re-load the current - 204 partition table and resume scan. */ - 205 8: - 206 00de 668B4508 movl 8(%di), %eax /* Partition table offset */ - 207 00e2 668B5612 movl 18(%bp), %edx /* "Root" */ - 208 00e6 6601D0 addl %edx, %eax /* Compute location of new ptab */ - 209 00e9 6621D2 andl %edx, %edx /* Is this the MBR? */ - 210 00ec 7503 jnz 10f - 211 00ee 6689C2 movl %eax, %edx /* Offset -> root if this was MBR */ - 212 10: - 213 00f1 6650 pushl %eax /* Push new base */ - 214 00f3 6652 pushl %edx /* Push new root */ - 215 00f5 E89EFF call read_partition_table - 216 00f8 7203 jc 11f - 217 00fa E8AEFF call scan_partition_table - 218 11: - GAS LISTING /tmp/ccTYNZSV.s page 5 - - - 219 00fd 83C408 addw $8, %sp - 220 /* This returned, so we need to reload the current partition table */ - 221 0100 668B4616 movl 22(%bp), %eax - 222 0104 E88FFF call read_partition_table - 223 - 224 /* fall through */ - 225 9: - 226 /* Not an extended partition */ - 227 0107 83C710 addw $16, %di - 228 010a E2C3 loopw 7b - 229 - 230 /* Nothing found, return */ - 231 010c 61 popa - 232 010d C3 ret - 233 - 234 /* - 235 * boot: invoke the actual bootstrap. (%si) points to the partition - 236 * table entry, and 22(%bp) has the partition table base. - 237 */ - 238 boot: - 239 010e 668B4408 movl 8(%si), %eax - 240 0112 66034616 addl 22(%bp), %eax - 241 0116 66894408 movl %eax, 8(%si) - 242 011a 56 pushw %si - 243 011b E83FFF call read_sector - 244 011e 5E popw %si - 245 011f 7217 jc disk_error - 246 0121 813EFE01 cmpw $0xaa55, (bootsec+510) - 246 55AA - 247 0127 750A jne missing_os /* Not a valid boot sector */ - 248 0129 BCFA7B movw $driveno, %sp - 249 012c 5A popw %dx /* dl -> drive number */ - 250 012d 5F popw %di /* es:di -> $PnP vector */ - 251 012e 07 popw %es - 252 012f FA cli - 253 0130 E9FEFF jmp bootsec - 254 - 255 /* - 256 * error messages - 257 */ - 258 missing_os: - 259 0133 BE5501 movw $missing_os_msg, %si - 260 0136 EB08 jmp error - 261 disk_error: - 262 0138 BE6F01 movw $disk_error_msg, %si - 263 013b EB03 jmp error - 264 too_many_active: - 265 013d BE8C01 movw $too_many_active_msg, %si - 266 /* jmp error */ - 267 - 268 error: - 269 2: - 270 0140 AC lodsb - 271 0141 20C0 andb %al, %al - 272 0143 740C jz 3f - 273 0145 B40E movb $0x0e, %ah - 274 0147 8A3E6204 movb (BIOS_page), %bh - GAS LISTING /tmp/ccTYNZSV.s page 6 - - - 275 014b B307 movb $0x07, %bl - 276 014d CD10 int $0x10 - 277 014f EBEF jmp 2b - 278 3: - 279 0151 CD18 int $0x18 /* Boot failure */ - 280 0153 EBFE jmp . /* Die */ - 281 - 282 missing_os_msg: - 283 0155 4D697373 .ascii "Missing operating system." - 283 696E6720 - 283 6F706572 - 283 6174696E - 283 67207379 - 284 016e 00 .byte 0 - 285 disk_error_msg: - 286 016f 4F706572 .ascii "Operating system load error." - 286 6174696E - 286 67207379 - 286 7374656D - 286 206C6F61 - 287 018b 00 .byte 0 - 288 too_many_active_msg: - 289 018c 4D756C74 .ascii "Multiple active partitions." - 289 69706C65 - 289 20616374 - 289 69766520 - 289 70617274 - 290 01a7 00 .byte 0 - 291 - 292 .balign 4 - 293 dapa: - 294 01a8 1000 .short 16 /* Size of packet */ - 295 01aa 0100 .short 1 /* Sector count */ - 296 01ac 007C .short 0x7c00 /* Buffer offset */ - 297 01ae 0000 .short 0 /* Buffer segment */ - 298 01b0 00000000 .long 0 /* LSW of LBA */ - 299 01b4 00000000 .long 0 /* MSW of LBA */ - GAS LISTING /tmp/ccTYNZSV.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 heads - mbr.S:35 *ABS*:0000000000007bf6 sectors - mbr.S:37 *ABS*:0000000000000462 BIOS_page - mbr.S:47 .text:0000000000000000 _start - mbr.S:68 .text:0000000000000020 next - mbr.S:130 .text:0000000000000086 read_sector_ebios - mbr.S:112 .text:000000000000005d read_sector_cbios - mbr.S:169 .text:00000000000000ab scan_partition_table - mbr.S:258 .text:0000000000000133 missing_os - mbr.S:111 .text:000000000000005d read_sector - mbr.S:134 .text:000000000000008f read_common - mbr.S:293 .text:00000000000001a8 dapa - mbr.S:47 .text:00000000000001be ptab - mbr.S:147 .text:0000000000000096 read_partition_table - mbr.S:238 .text:000000000000010e boot - mbr.S:264 .text:000000000000013d too_many_active - mbr.S:261 .text:0000000000000138 disk_error - mbr.S:282 .text:0000000000000155 missing_os_msg - mbr.S:268 .text:0000000000000140 error - mbr.S:285 .text:000000000000016f disk_error_msg - mbr.S:288 .text:000000000000018c too_many_active_msg - -NO UNDEFINED SYMBOLS +GAS LISTING /tmp/cc3pUdAD.s page 1 + + + 1 # 1 "mbr.S" + 2 # 1 "" + 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-10) + 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/cc3pUdAD.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 7211 jc 1f + 78 0030 81FB55AA cmpw $0xaa55, %bx + 79 0034 750B jne 1f + 80 0036 F6C101 testb $0x01, %cl + 81 0039 7406 jz 1f + 82 + 83 /* We have EBIOS; patch in a jump to read_sector_ebios */ + 84 003b C7065F00 movw $0xeb+((read_sector_ebios-read_sector_cbios-2)<< 8), (read_sector_cbios) + 84 EB25 + 85 + 86 1: + 87 0041 5A popw %dx + 88 + 89 /* Get (C)HS geometry */ + 90 0042 B408 movb $0x08, %ah + 91 0044 CD13 int $0x13 + 92 0046 83E13F andw $0x3f, %cx /* Sector count */ + 93 0049 51 pushw %cx /* Save sectors on the stack */ + 94 004a 31C0 xorw %ax, %ax + 95 004c 88F0 movb %dh, %al /* dh = number of heads */ + 96 004e 40 incw %ax /* From 0-based to count */ + 97 004f F7E1 mulw %cx /* Heads*sectors -> sectors per cylinder */ + 98 0051 50 pushw %ax /* Save sectors/cylinder on the stack */ + 99 + 100 0052 6631C0 xorl %eax, %eax + 101 0055 6650 pushl %eax /* Base */ + 102 0057 6650 pushl %eax /* Root */ + 103 0059 E84F00 call scan_partition_table + 104 + GAS LISTING /tmp/cc3pUdAD.s page 3 + + + 105 /* If we get here, we have no OS */ + 106 005c E9D400 jmp missing_os + 107 + 108 /* + 109 * read_sector: read a single sector pointed to by %eax to 0x7c00. + 110 * CF is set on error. All registers clobbered. + 111 */ + 112 read_sector: + 113 read_sector_cbios: + 114 005f 6689C2 movl %eax, %edx + 115 0062 66C1EA10 shrl $16, %edx + 116 0066 F736F67B divw (secpercyl) + 117 006a D0CC rorb %ah + 118 006c D0CC rorb %ah + 119 006e 88E1 movb %ah, %cl + 120 0070 88C5 movb %al, %ch + 121 0072 89D0 movw %dx, %ax + 122 0074 F636F87B divb (sectors) + 123 0078 88C6 movb %al, %dh + 124 007a FEC4 incb %ah + 125 007c 08E1 orb %ah, %cl + 126 007e BB0000 movw $bootsec, %bx + 127 0081 B80102 movw $0x0201, %ax + 128 0084 EB09 jmp read_common + 129 read_sector_ebios: + 130 0086 BEA801 movw $dapa, %si + 131 0089 66894408 movl %eax, 8(%si) + 132 008d B442 movb $0x42, %ah + 133 read_common: + 134 008f 8A16FA7B movb (driveno), %dl + 135 0093 CD13 int $0x13 + 136 0095 C3 ret + 137 + 138 /* + 139 * read_partition_table: + 140 * Read a partition table (pointed to by %eax), and copy + 141 * the partition table into the ptab buffer. + 142 * Preserve registers. + 143 */ + 144 ptab = _start+446 + 145 + 146 read_partition_table: + 147 0096 6660 pushal + 148 0098 E8C4FF call read_sector + 149 009b 720B jc 20f + 150 009d BEBE01 movw $bootsec+446, %si + 151 00a0 BFBE01 movw $ptab, %di + 152 00a3 B92000 movw $(16*4/2), %cx + 153 00a6 F3A5 rep ; movsw + 154 20: + 155 00a8 6661 popal + 156 00aa C3 ret + 157 + 158 /* + 159 * scan_partition_table: + 160 * Scan a partition table currently loaded in the partition table + 161 * area. Preserve 16-bit registers. + GAS LISTING /tmp/cc3pUdAD.s page 4 + + + 162 * + 163 * On stack: + 164 * 18(%bp) - root (offset from MBR, or 0 for MBR) + 165 * 22(%bp) - base (location of this partition table) + 166 */ + 167 + 168 scan_partition_table: + 169 00ab 60 pusha + 170 00ac 89E5 movw %sp, %bp + 171 + 172 /* Search for active partitions */ + 173 00ae BFBE01 movw $ptab, %di + 174 00b1 B90400 movw $4, %cx + 175 00b4 31C0 xorw %ax, %ax + 176 5: + 177 00b6 F60580 testb $0x80, (%di) + 178 00b9 7403 jz 6f + 179 00bb 40 incw %ax + 180 00bc 89FE movw %di, %si + 181 6: + 182 00be 83C710 addw $16, %di + 183 00c1 E2F3 loopw 5b + 184 + 185 00c3 83F801 cmpw $1, %ax /* Number of active partitions found */ + 186 00c6 7446 je boot + 187 00c8 7773 ja too_many_active + 188 + 189 /* No active partitions found, look for extended partitions */ + 190 00ca BFBE01 movw $ptab, %di + 191 00cd B104 movb $4, %cl /* cx == 0 here */ + 192 7: + 193 00cf 8A4504 movb 4(%di), %al + 194 00d2 3C05 cmpb $0x05, %al /* MS-DOS extended */ + 195 00d4 7408 je 8f + 196 00d6 3C0F cmpb $0x0f, %al /* Win9x extended */ + 197 00d8 7404 je 8f + 198 00da 3C85 cmpb $0x85, %al /* Linux extended */ + 199 00dc 7529 jne 9f + 200 + 201 /* It is an extended partition. Read the extended partition and + 202 try to scan it. If the scan returns, re-load the current + 203 partition table and resume scan. */ + 204 8: + 205 00de 668B4508 movl 8(%di), %eax /* Partition table offset */ + 206 00e2 668B5612 movl 18(%bp), %edx /* "Root" */ + 207 00e6 6601D0 addl %edx, %eax /* Compute location of new ptab */ + 208 00e9 6621D2 andl %edx, %edx /* Is this the MBR? */ + 209 00ec 7503 jnz 10f + 210 00ee 6689C2 movl %eax, %edx /* Offset -> root if this was MBR */ + 211 10: + 212 00f1 6650 pushl %eax /* Push new base */ + 213 00f3 6652 pushl %edx /* Push new root */ + 214 00f5 E89EFF call read_partition_table + 215 00f8 7203 jc 11f + 216 00fa E8AEFF call scan_partition_table + 217 11: + 218 00fd 83C408 addw $8, %sp + GAS LISTING /tmp/cc3pUdAD.s page 5 + + + 219 /* This returned, so we need to reload the current partition table */ + 220 0100 668B4616 movl 22(%bp), %eax + 221 0104 E88FFF call read_partition_table + 222 + 223 /* fall through */ + 224 9: + 225 /* Not an extended partition */ + 226 0107 83C710 addw $16, %di + 227 010a E2C3 loopw 7b + 228 + 229 /* Nothing found, return */ + 230 010c 61 popa + 231 010d C3 ret + 232 + 233 /* + 234 * boot: invoke the actual bootstrap. (%si) points to the partition + 235 * table entry, and 22(%bp) has the partition table base. + 236 */ + 237 boot: + 238 010e 668B4408 movl 8(%si), %eax + 239 0112 66034616 addl 22(%bp), %eax + 240 0116 66894408 movl %eax, 8(%si) + 241 011a 56 pushw %si + 242 011b E841FF call read_sector + 243 011e 5E popw %si + 244 011f 7217 jc disk_error + 245 0121 813EFE01 cmpw $0xaa55, (bootsec+510) + 245 55AA + 246 0127 750A jne missing_os /* Not a valid boot sector */ + 247 0129 BCFA7B movw $driveno, %sp + 248 012c 5A popw %dx /* dl -> drive number */ + 249 012d 5F popw %di /* es:di -> $PnP vector */ + 250 012e 07 popw %es + 251 012f FA cli + 252 0130 E9FEFF jmp bootsec + 253 + 254 /* + 255 * error messages + 256 */ + 257 missing_os: + 258 0133 BE5501 movw $missing_os_msg, %si + 259 0136 EB08 jmp error + 260 disk_error: + 261 0138 BE6F01 movw $disk_error_msg, %si + 262 013b EB03 jmp error + 263 too_many_active: + 264 013d BE8C01 movw $too_many_active_msg, %si + 265 /* jmp error */ + 266 + 267 error: + 268 2: + 269 0140 AC lodsb + 270 0141 20C0 andb %al, %al + 271 0143 740C jz 3f + 272 0145 B40E movb $0x0e, %ah + 273 0147 8A3E6204 movb (BIOS_page), %bh + 274 014b B307 movb $0x07, %bl + GAS LISTING /tmp/cc3pUdAD.s page 6 + + + 275 014d CD10 int $0x10 + 276 014f EBEF jmp 2b + 277 3: + 278 0151 CD18 int $0x18 /* Boot failure */ + 279 0153 EBFE jmp . /* Die */ + 280 + 281 missing_os_msg: + 282 0155 4D697373 .ascii "Missing operating system." + 282 696E6720 + 282 6F706572 + 282 6174696E + 282 67207379 + 283 016e 00 .byte 0 + 284 disk_error_msg: + 285 016f 4F706572 .ascii "Operating system load error." + 285 6174696E + 285 67207379 + 285 7374656D + 285 206C6F61 + 286 018b 00 .byte 0 + 287 too_many_active_msg: + 288 018c 4D756C74 .ascii "Multiple active partitions." + 288 69706C65 + 288 20616374 + 288 69766520 + 288 70617274 + 289 01a7 00 .byte 0 + 290 + 291 .balign 4 + 292 dapa: + 293 01a8 1000 .short 16 /* Size of packet */ + 294 01aa 0100 .short 1 /* Sector count */ + 295 01ac 007C .short 0x7c00 /* Buffer offset */ + 296 01ae 0000 .short 0 /* Buffer segment */ + 297 01b0 00000000 .long 0 /* LSW of LBA */ + 298 01b4 00000000 .long 0 /* MSW of LBA */ + GAS LISTING /tmp/cc3pUdAD.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*:0000000000007bf6 secpercyl + mbr.S:37 *ABS*:0000000000000462 BIOS_page + mbr.S:47 .text:0000000000000000 _start + mbr.S:68 .text:0000000000000020 next + mbr.S:129 .text:0000000000000086 read_sector_ebios + mbr.S:113 .text:000000000000005f read_sector_cbios + mbr.S:168 .text:00000000000000ab scan_partition_table + mbr.S:257 .text:0000000000000133 missing_os + mbr.S:112 .text:000000000000005f read_sector + mbr.S:133 .text:000000000000008f read_common + mbr.S:292 .text:00000000000001a8 dapa + mbr.S:47 .text:00000000000001be ptab + mbr.S:146 .text:0000000000000096 read_partition_table + mbr.S:237 .text:000000000000010e boot + mbr.S:263 .text:000000000000013d too_many_active + mbr.S:260 .text:0000000000000138 disk_error + mbr.S:281 .text:0000000000000155 missing_os_msg + mbr.S:267 .text:0000000000000140 error + mbr.S:284 .text:000000000000016f disk_error_msg + mbr.S:287 .text:000000000000018c too_many_active_msg + +NO UNDEFINED SYMBOLS diff --git a/mbr/mbr.o b/mbr/mbr.o dissimilarity index 64% index e80b9e6eda3924ea06251979de405535d7dcdc35..30a1160db8d9e1cbb079c9a6342116297062f76e 100644 GIT binary patch delta 463 zcwYO$`-68vVQf6ZYt^VN9A|}_AKC{R9_aYs@cm&xn&E-8fV6-Y{tPd#Fr;-JN;~*U z;Jewk>I-KsoauPjakTToH?tqr9moD1;dr>4fnf(D(`(LsD;U!{T{yNlb&36|J}Z1U zE#bwHiRYRa9XAIunlmzXOzvd*%qTIrmU*(EECU0>w`v9``1oIavLcIoy&;gT025?j zWH1AgZAg3%AQ_Luj{=gbk@)#Q(wGs!uR>D~GOHhnKM6>#K&Y>0m=2`&AsH|SNKQl2 zun|b|A<1t8lD0_vV?fdZiGLADh9dDF07(ZV{xcw%59cd0GJFM6JxB^T;cNy50R~nE f!O4lNDuTtS$tC$k#SB2YAhjsDGH3H7)+9y%&B$Bv delta 459 zcwYO#`-OKxVQehJYxSrt9A||M4|IHR2xxw2ADCu%AT1y*;6)(A%WDj2orls6z7qIu z_O05f^P=IU?`A)$JB}WF!F2J3$^njp9oKdH^@mv$5{pLVMb4JFN$(>A}8AT@7GEWwiW?*3WR?PqfAO9;)R%DT{*9Ec_V1f*c z3`Rh*4TRK&Y>0m<*)$AsH|ONKQl2 zuog)2A<1t7lD0_vLqO63iGLPIh9dFr07(ZV{v#ln59cd0GJFJ5JxB^z;cNy50R~nE d-pPrqD!dt~i7CYl#i_|9`9;N>r?Dn60syj0R}ugK diff --git a/mbr/oldmbr.asm b/mbr/oldmbr.asm index 31bf1fdf..f3e67282 100644 --- a/mbr/oldmbr.asm +++ b/mbr/oldmbr.asm @@ -1,6 +1,6 @@ ; ----------------------------------------------------------------------- ; -; Copyright 2003-2004 H. Peter Anvin - All Rights Reserved +; Copyright 2003-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 @@ -81,12 +81,13 @@ next: ; mov ah,08h ; Get drive parameters int 13h + and cx,3Fh ; Max sector number + mov [Sectors],cx xor ax,ax mov al,dh inc ax ; From 0-based to count - mov [Heads],ax - and cl,3Fh ; Max sector number - mov [Sectors],cl + mul cx ; Heads*Sectors + mov [SecPerCyl],ax ; Note: we actually don't care about the number of ; cylinders, since that's the highest-order division @@ -142,18 +143,18 @@ no_ebios: push di mov ax,[di+8] mov dx,[di+10] - div word [Sectors] - inc dx - mov cx,dx ; Sector # - xor dx,dx - div word [Heads] - ; DX = head #, AX = cylinder # - mov ch,al - shr ax,1 - shr ax,1 - and al,0C0h - or cl,al - mov dh,dl ; Head # + div word [SecPerCyl] ; AX = cylinder DX = sec in cyl + ror ah,1 + ror ah,1 + mov cl,ah + mov ch,al ; CL = cyl[9:8], CH = cyl[7:0] + + mov ax,dx + div byte [Sectors] ; AL = head AH = sector + mov dh,al + inc ah + or cl,ah ; CX = cylinder and sector + mov dl,[DriveNo] mov bx,7C00h mov ax,0201h ; Read one sector @@ -207,7 +208,7 @@ dapa: dd 0 ; LBA (MSW) ; CHS information -Heads: dw 0 +SecPerCyl: dw 0 ; Heads*Sectors Sectors: dw 0 ; Error messages diff --git a/memdisk/memdisk b/memdisk/memdisk index 57de4f6713832e1c851ee8961eaa70de8f094c7c..5a13f9eee9f85049a6e3164b108c8e53be468f3a 100644 GIT binary patch delta 57 zcwW0Phw;W7#tmJpyru>U#(Jg(x&=k4rVN{>vl^SA30=1|7GW}Cp2#RZS=rAN0Qt`l A1poj5 delta 57 zcwW0Phw;W7#tmJpye0+;#(E|Ox&=k4hDMvGvl^SA30=1|7Gct0p2#RZS=rAN00J5i AQvd(} diff --git a/memdisk/memdisk.asm b/memdisk/memdisk.asm index 1d3d39de..90779cb5 100644 --- a/memdisk/memdisk.asm +++ b/memdisk/memdisk.asm @@ -717,7 +717,7 @@ bcopy: mov ax,2400h ; Disable A20 int 15h .skip_a20d: - popfd ; + popfd ; jmp .done .protmode: diff --git a/memdisk/memdisk16.asm b/memdisk/memdisk16.asm index 87c088fd..99d7fd27 100644 --- a/memdisk/memdisk16.asm +++ b/memdisk/memdisk16.asm @@ -223,7 +223,7 @@ A20Type dw 0 ; Default = unknown ; %define io_delay call _io_delay %define IO_DELAY_PORT 80h ; Invalid port (we hope!) -%define disable_wait 32 ; How long to wait for a disable +%define disable_wait 32 ; How long to wait for a disable %define A20_DUNNO 0 ; A20 type unknown %define A20_NONE 1 ; A20 always on? diff --git a/memdisk/setup.c b/memdisk/setup.c index d1eabc58..bad056cf 100644 --- a/memdisk/setup.c +++ b/memdisk/setup.c @@ -680,7 +680,7 @@ void setup(syscall_t cs_syscall, void *cs_bounce) ranges (each insertrange() can worst-case turn 1 area into 3) plus the terminating range, over what nranges currently show. */ cmdlinelen = strlen(shdr->cmdline)+1; - total_size = hptr->total_size; /* Actual memdisk code */ + total_size = hptr->total_size; /* Actual memdisk code */ total_size += (nranges+3)*sizeof(ranges[0]); /* E820 memory ranges */ total_size += cmdlinelen; /* Command line */ total_size += STACK_NEEDED; /* Stack */ diff --git a/menu/libmenu/des.c b/menu/libmenu/des.c index d8060598..47ff78c4 100644 --- a/menu/libmenu/des.c +++ b/menu/libmenu/des.c @@ -395,7 +395,7 @@ des_init(void) static void setup_ip_maskl(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *il; for (k = 0; k < 8; k++) { @@ -415,7 +415,7 @@ setup_ip_maskl(void) static void setup_ip_maskr(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *ir; for (k = 0; k < 8; k++) { @@ -435,7 +435,7 @@ setup_ip_maskr(void) static void setup_fp_maskl(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *fl; for (k = 0; k < 8; k++) { @@ -455,7 +455,7 @@ setup_fp_maskl(void) static void setup_fp_maskr(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *fr; for (k = 0; k < 8; k++) { @@ -475,7 +475,7 @@ setup_fp_maskr(void) static void setup_key_perm_maskl(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *il; for (k = 0; k < 8; k++) { @@ -497,7 +497,7 @@ setup_key_perm_maskl(void) static void setup_key_perm_maskr(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *ir; for (k = 0; k < 8; k++) { @@ -519,7 +519,7 @@ setup_key_perm_maskr(void) static void setup_comp_maskl(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *il; for (k = 0; k < 8; k++) { @@ -541,7 +541,7 @@ setup_comp_maskl(void) static void setup_comp_maskr(void) { - int i, j, k, inbit, obit; + int i, j, k, inbit, obit; my_u_int32_t *ir; for (k = 0; k < 8; k++) { @@ -563,7 +563,7 @@ setup_comp_maskr(void) static void setup_psbox(void) { - int i, j, b; + int i, j, b; my_u_int32_t *p; for (b = 0; b < 4; b++) diff --git a/mkdiskimage b/mkdiskimage index 91b5cd36..d1651af3 100755 --- a/mkdiskimage +++ b/mkdiskimage @@ -267,13 +267,13 @@ if ( $is_linux ) { exit 0; __END__ fa 31 c0 8e d8 8e d0 bc 0 7c 89 e6 6 57 52 8e c0 fb fc bf 0 6 b9 0 1 f3 a5 ea 20 6 0 0 52 b8 0 41 bb -aa 55 31 c9 30 f6 f9 cd 13 72 11 81 fb 55 aa 75 b f6 c1 1 74 6 c7 6 5d 6 eb 27 5a b4 8 cd 13 31 c0 88 f0 -40 50 83 e1 3f 51 66 31 c0 66 50 66 50 e8 51 0 e9 d6 0 66 89 c2 66 c1 ea 10 f7 36 f6 7b 42 89 d1 31 d2 f7 36 -f8 7b 88 c5 c1 e8 2 d1 e8 24 c0 8 c1 88 d6 bb 0 7c b8 1 2 eb 9 be a8 7 66 89 44 8 b4 42 8a 16 fa 7b cd -13 c3 66 60 e8 c2 ff 72 b be be 7d bf be 7 b9 20 0 f3 a5 66 61 c3 60 89 e5 bf be 7 b9 4 0 31 c0 f6 5 80 +aa 55 31 c9 30 f6 f9 cd 13 72 11 81 fb 55 aa 75 b f6 c1 1 74 6 c7 6 5f 6 eb 25 5a b4 8 cd 13 83 e1 3f 51 +31 c0 88 f0 40 f7 e1 50 66 31 c0 66 50 66 50 e8 4f 0 e9 d4 0 66 89 c2 66 c1 ea 10 f7 36 f6 7b d0 cc d0 cc 88 +e1 88 c5 89 d0 f6 36 f8 7b 88 c6 fe c4 8 e1 bb 0 7c b8 1 2 eb 9 be a8 7 66 89 44 8 b4 42 8a 16 fa 7b cd +13 c3 66 60 e8 c4 ff 72 b be be 7d bf be 7 b9 20 0 f3 a5 66 61 c3 60 89 e5 bf be 7 b9 4 0 31 c0 f6 5 80 74 3 40 89 fe 83 c7 10 e2 f3 83 f8 1 74 46 77 73 bf be 7 b1 4 8a 45 4 3c 5 74 8 3c f 74 4 3c 85 75 29 66 8b 45 8 66 8b 56 12 66 1 d0 66 21 d2 75 3 66 89 c2 66 50 66 52 e8 9e ff 72 3 e8 ae ff 83 c4 8 66 8b 46 -16 e8 8f ff 83 c7 10 e2 c3 61 c3 66 8b 44 8 66 3 46 16 66 89 44 8 56 e8 3f ff 5e 72 17 81 3e fe 7d 55 aa 75 +16 e8 8f ff 83 c7 10 e2 c3 61 c3 66 8b 44 8 66 3 46 16 66 89 44 8 56 e8 41 ff 5e 72 17 81 3e fe 7d 55 aa 75 a bc fa 7b 5a 5f 7 fa e9 cd 74 be 55 7 eb 8 be 6f 7 eb 3 be 8c 7 ac 20 c0 74 c b4 e 8a 3e 62 4 b3 7 cd 10 eb ef cd 18 eb fe 4d 69 73 73 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 6c 6f 61 64 20 65 72 72 6f 72 2e 0 4d 75 6c 74 69 70 6c 65 20 61 63 diff --git a/mtools/syslinux b/mtools/syslinux index 97fddaf302cbc2f34f9fa0df6d5b6b46c457a329..044a6bbc67ad1e1846bd4c37b3ddfc2a1eaebfe9 100755 GIT binary patch delta 6724 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 O1xuGB^bh_H8~$IYu#4CL delta 6359 zcwTKe3sh5Aw&#ZACI}<}5fKrBVhVmRv4}s6ND(pdUPUdRaSA$PkF?YGrVA46Tm1kA zXSiOa+H0%RQ9}YcR&9&QP!O90VgaY1)_!zq>oDTflg6qo6%moVeS>|UwMN#u`<(qd z`+W8|#xkoq?94CUW zgXe`Ey&zSTX#Ol!_~&ix5n{(p9>XL(!JN(-w~>l!02Ci&^+>y9budKmum0!-;Y>)O zqOwP-;3ib}2$Mr&rUZzVSZ;zi0Cs--_RFg6rGCHPUUxxQ8@fmWpf)twAks@-ezJyC zK@vv%e(z~eYrP%npI6-@5=6}VKK?{qq_w2svSM zC1BHQVM`{i0_2NS32Fe%;~$Aq>cz5EJ;J51(ty3=!QRtGWjHmqSLcBzyDw2K8pBLJ z_yqHz%9#G|t?3&6#Tr=TWw5;9-`Oq9Q!gG{atSQ?in>Q4Sq0ZHK2k-QgbhR>i9RSVx~(=y<@d0M5kG3@Sg;UpFPR$|!XRGsGOlvLg9mrI}5&()x? zaWQCAa>@Y0ub$o$r=SGg^vM(>teU>PqTWWj{aEjIhP>uNrdBn2pT);@H}UZsgP4!X zFeO~J$Y7v(4RcX@P1qi7!u6FVz!dyKN_-8gK8%`W!qg>PUk&6Mk*qUWJ5=r8OF?Y+ z7-=U+N19Y0ch@K#rrgT*;2LGUsiH6k*B>xt;P$>?T)!V!V3C5X!@nWIvRx;J7;22~d9oLon| zquxg&&e#T*I;Yi&2Jm5$9z$+Va2++ZR#qU``v5*3m^>Migeka-ZhzhTW(0D+=WwA@ zgr4Gh*Fm;~ThuO_gA|8b6t1HVk{@mk!S>q>t|tun>qM&|)rc&?gS4C3psEh0tcElr zQf)_+v)4vmoX|jq-#oNY^AIG8K=zsgP?&js{)GBb)~d9H+^CG>MH-zrn0VM8o3jN^XG=s6s7*~Qc@vf|9G8h$~ zd@;|ts-ranX$OuJnI*n&=@OJ7ccIN=Yp z9gI(FH7qb9^9DLE--R-2yPVxEAjvCd8OOwmi{v%R4yKdd*@0ZEDmrxT*2U(LidWko5gKGO}gn2oic9y}Mv@=VJAU;(+3T-I=mRIVG3Fj>_V5MtUM?QHm z%z4#DemlO16pwfAb$EXWadw}DgUQR!&CMS;QoO zq@Y;UZ0KNU%I`mX=8*6pSz8gVz*P@Zep6Pas*W5N7{2hIs%ptN-0posL8|J3U~vjF zovQj)uy4vn=dKRXGwhQ#kzgfR7vViQ;@o|R%#ZN4jX-3OFF{h(wvo{_YxA5H4x)(= zuM(?1a^v)k0LdH&3l&djP{w4JnCqSvaL=^v^3uNa6LT3jD1(bk1a9A7hF3pt^7);P!! zHMZxlcs4?6*c08&sJ1;Tfip<^ipg&OE*Q6>O4w}jk2n`sbs{81*d?-(kPav3ASG&Y zU4aXWupLfnw#Ztp&|hwQDfL})YCPr)mzWlK=WdbJptc&WGRPc6MiDutaGD)trkX5| z5*hl22kEaFVf!q79#i$ukII8u{b=(*!!cEzT%=Hzr7dW8t(#YV#Vl+8r(8d%_iqNb z<_%vlE8sekAGY5L2K-oTggXIioPiyIu@oXt3!$@DR>0!4^O)UxRo+E^#Yj;nXhz=Z zQ94ev;i^)e!o#5lA_A*-|3R9!hD})v7&Bd&KFczYo#)E+kS+yLp`wD~8d-q0^~-p< zCyw6PU3(R_nd@;~>>&SARNcJ@kK5QG3M461)!PvF85X{nJ)?rfMr=RF;DsIKL73~n znN>H?J)Hcv09YJ#i7Cy}LOP0;zz5j4D|yb>9ppchPSCqWDPGtnWf3ko<5#u4^e$-) zm&bdbQ92EFVhpfkDMc5*OgoG1-X7ZH9JUj^()-sTc6x~g>{w4743#r&zJcL5T2-eyiZ_nz?5+K__7m=3 z1ch6NVoD`?w?JL(UPaPd2f!A-$o31;sRu;cyAA6@npM9cv%;}w2>~8 z=m)uSsb|R3nH{UIvzuzNBX_c}hPvt1&g|&mA&))X$Yn>`<5(^`+OA<0eLJ*MS@&(} zAgvKD=vK!4DQJuzof-mrqo0*|$OnF&jjnq5tZZwtkfwjCqA=*8XN+mK4Ol1?IMH;) zRsy*LEYpgXLHz$#8c%*FRaO6Cl!MS(e}ds4vc}OZNIkZ>TDRU$)<($VN$ukR`i%Iz zYdiFVkZj1p2yN$bzeXM}CY&zX$;`5O`yTMw>Zh$ks;w~&hYhUa^CCHA63a!+V2>)` z#zIs>o`;^g-8M*-A$7I3!1=28cm&nl*owd16N!0i*AOoi@MZ{WfkZIZxGeccaAR^# zO@tBfMKyS2K@kLq*f+`HFx+;0Cql!b?{M00n4MAAnGtg1EG$=aRz*drb5vAZicO_) zhf=Dk?(g5;sX_28`)WyJQmyzrFY(j+7=+~h{w=&VhZUZCI& zZv0$wa2J%WVh|`1gICF6ahh=op%-P3$fIp4gxid}hDW%7CjHItV}PzeEzxLf1#va7 zB2}~^aa6QoAux=2dw_Nd3mi|b{!&Tp9pU2qfn*crx^VK9G6l}S3oqUG zrQ!!y@OHxilUa&0d|K7fTtJ8|f#6#(y~5;mg@9X{ryr;f1@}_2*dEG`)fi(Xh8k+n zNY)WaXri!fWB(DkB?6$YcDgJpCZAjBd!q zYa#5%m}Bx_+qTMoQp@~N(X1d_{7eOFo&y2VNSTv%#7$#&7=9yd3T~xPuevUV%~(Xo zvRkJ+Vgh(RDu#ttN$qKoEA`g^cG1zS?rjg`H!^{$RwlCMo1JtFi|Qtel2h2NGRI`r zcTRtvkBVh$(k6qJsm2zH?p6CfbnbJIK2)u&0I3i4=Q(8zD{}2HOk-P+$WcpP7%iRS z?vn--2RWv(;&M4}dr0nR>BIn1s(^j_)FS@nw_V5keF=es5a%U(J?Z1jli}fn^M?KX zRsJ9P%j7k(6&y@F| zGSPX(Lw@DQ2T}%UhfM)RTNa%nrZU}xmj8GS37|~XhtGk69 z60t3uVV20$Ox_fy%~rp}5?pEMZk}zC==~Eo!@1@$8FQ$kvzfd?xvHCm(Iqn}k1)fa zp;*CWh^t_0{!!H*bdQVEuy})y#%-0;5h}*kN2by?+=4nNg#Uye4AjT5YpnjDt@LNN z_>Ym4Go%}LJsZ?$CD$4YxMA{TV`fbsx!Bkkl$lAo8*irvSr!?MIyX7nnAu2?X27`1 zWO_F_(U_TedmOD{iKDU7u*+7A%;BB%E*lcN)#k@yo7(so9&x%6A!u__K0F@Im^fe+Di|agNXc=uwv;VW3%4fS}hqk zM$VzKNA`2gz({qqB1v*P=sN})Tu1>7BmwaTgOU4;8ZK3HQ3j(EDWGlD$Ojta9_I@- zV*O6|bZOf}x1;qbgx|*tJ?8QF{Tuh4gLOWcbCPf{<3;M0pjbAIiWFuo)2^?RMF_D;WWY1#CO{xb?qON3f~4I*8yT5G2@ zd{nKCx|B2clm4>k^`)}9DeP!>O=putj1pR2No$-7G+p%GeuQ#)SJg zxHhCA^80~OP_*x-%y|-rO-O#`so8sMEfRIFx>MXO^k7MBrKFD{!;d@ZsYXbR&>-NA zV?{$9NWA{c#0rNEi9|W^JjR>k@!-0R#Xc!~HI)WXVj0&I+$KkX&Bq`wDK+5Xb^&)+}SzVWvoz1fvT>uy#B-C1x`n6W%7WPYuo zc783cw$$i^|5~0OypjJsf0ZBMBTj$2{9sUpXTSN+iy?u&yT9R23qL_9WZw^kxjhKo zcqij*@Rt#L%l0*$oQuleE!!uT+&{9w_`<$5E#of@2xa?vno2GqWY~8#?LJKb+2e{(xPPd{020hXrX@s8JZ(bC2 zD-{+fbVDJ4_UvDEw4@KA>V1#(SEDt6KR>tsi$vqveeYe$y_*EEwW$9KgnoF3`=lfW zp^i!gza|iw&=7g-& zulxx9xRvj&d~2lyAt9fcu2`9bP~f-hK4yY&cXiC^(~L|m`C^7}W_=tj{ujXdRl@c4 US_uI9S*`3Uc`wQEm|ts)i?G`VL&+pl-;ewTclGyi}7 z^S|bt|1p;~`hK@NCH-4lodVfLq3o#oTie(J zE~$D*vHgvwXBnT4keP1)bUdOmgbQs!yH%cV!fB<@UPqF4?pzBps<`l0^pZ-=IKP#C5vS>jQ|B>c7Fr(P`#78)`D_WYRKe;!ltb( z=WIoDcrHn3sR|{ixX)VAWR-dvlQ#)vsgOj)-DyP;JV6SYsX`BwTv!_l;$bzWMmO1M z#0;aId$JXMsI>fnMOT%F=b}Ao%T^YBszl97&!551YV$JXu<50M%somToQ@nyv|Y&y zrInax8fsLc3MDV|B_7T|e^;Vs12Q-Aa3&^3E0j<(9N4Xf^YSvbg|U~27_5W36={@~ zKeFg4UWXvH1A@sMMxy;B5+4y@u7_Jv)V=C<0?P9*%arFI}i_G!!ESuIz; zcQ5t>H+j$&7XixE=1HUPUn zl)pB>t!zU%iD+{oRx^6a;!>2Eh}4OkJRi+UM2U&RWMMmD2zKKM@VjBtF`MJ4tt%aS zAhJSa)*iJ1eF(R*1^E&@1#)yg8RaFivw|jNPzQwud2jgqYyzLX&Sun|;0c#=Pq#bz z*LF67A@~l@T4;ET14|uX*#l%qVXK4E=5J|3TM{_143#IKk_4VcpckP{*peN~SFdyW7IZh>vsgxP z_BM1Q9&@36=xRK=6i@pcU>bTa9Cb#occHCHvsSMIhLB-0l3F9H2_nqeDjk+Q3b@}j zqr>rTGKvBYaPrv1UWJ}KCht{v??Owt4mL?BXeq<9m_j*I1<zbq@M zV){0++7C|ZuMJ}kgkBb4l$BmV>X&CdQB_dw_n)flX+bk5d%O81_A{ZlMv`< zAt=*ND?*>dm7=XRd--%`IAwWRm+UkMYK5BNd6}>3D%U8> zLAuHzbfV*ls?@$BPSVGA2S*vZ87bL4bb!`Y=tP)ZF<0Z{r5(^U2)i4rb($*;!QG7t z%A~Dz0>ezp4yQ*l!K{5z2lQ*mqGAWguJ7T*E(h4nNH^=o`RGbTwNeG;ChPiuL*AF} z?EE9RV>1v1v{p`aZMLn%a!`SEjci9JFhWMeWXdT>3*C!^!0ZxMkG*26`jU~ppi4e$ zh{I|+>iUY&XL7Ep8SRfPMSEhofi}+>2`BEso+&C`zPxzIs#~M~=e;YtUiT9Y-zoQE z0_@T}96In|m9BK?fXD6Q{@mu;lhNa&Y}DZL0! z63X!PDkMna#Ah&fM!E&tq0L+P@bkx*|U#ntuU`+-&@tw&{%=xmIq@c}2dqAf9=wg<_V45Il!DBC{bD_l{; zx!X{2OgYFFLD~CG*nL$FL;7J;0tJKp1OTwxh(cgf5`}&n20OC>#>|r@QB}c^!4piy zgXT&pdP%0P*7}HNT4Xz#d`0MnlELqlTWakL!$$)v!$`$_LkA8gwG5NhIzlhOfr*iZ z+J8X_^kLjoJ8Dv?aU4uy@OeaUt2nS*<7^Vlq}UDOtmKQsYc(!c?clY3Y3t6@9dFl<=N4yM?GbqM{pCdjSxDG)OCJDeqCKs`>}8o6ej@ z!5%V(VkdcF?a$y25(%-We0&*E<>MbZTMuHzLij#$SdnKBL9@yc(*&*MtkG>HvTMXzeHLfzVk- zERW=J-}SsG?jfgBLY#HdDB#)aBbB_&%TiGqgS{FE5&0VDYr>+!{Iq!(qbE&SGYvzz zMGnbDgu;*vl$Pjfg9B^Z{;3kVlw{q9^_Q__l8X*WKT42P-;(sx+R#3JLs5vVW;>uS zLbfn$x`={LLJRhOby#c}Rk277X+?~HAMnNgw1_+1hF*x|Fpo`_-<<|ZB*xIg0Wm%W)g6RwxNE3=4HeWRT(zFYpB$t%#DU88aG z_WV++O^dk}#vg{I5%dL=7vaB#L~-bOz>kXf5!cS#NF@Dft_&Y>p(nwJt3FrFR7I-W zvQqTH=ysgvPGV(wK+8&B`}N3A~6ZmrEta5dmZsom-w z8dZ|A2H8PKJ*exg|FZrJ{V!A%Z5~Oe5NMn%amD}k%T`Z>|GujyHz5J^^BuJDJpo?Ni787oto!c@u8^Wi@~;+Tad&xk8GReLDeal|$J zL6Gb%@}@2IU+DEv;$Ir4=2CCOh>K;Uv$Eoab@|vNxv6W!6?lpfV2kA?)?bXf7YngM z*cUO+1iPwV#pAZw$n0nGW7r|-RO6|j`z|Io(lZz|&geZWrX)b%t!0U~UB$Tz8?O!+ z--q54sZe3CtVZjjaU^d76paJ9lI#FU8m4$Z?xd20DE4xXC-D{w4xAsh(I*M@!VnLlVpW%Vd@}` zW2jVtj*sE!B*!tTq!h=<$6rSaB4C$r7XYJtFrn4yRGlJ&dVq`75<)h~dEG3s=VK%ugrM9P08aw2DR>MuZkGYr)wFB$0Ucng`SwO7 zUKfLo7%(o57mZaq$*Yv&<5hYS6O6~gz}iu41r8Ry{bQcaJA0+SDL=XkuJ{Oc-Nj@c z(mx(};Ci?(jaENSeU!%F5$=W5PuIRHzaGa_P#QM zGT+LC8)$7h)qPD!e9h=nW@^qJ2^)H+wc{f!pq0tHJLOYJ5}@<$!dBSTwaXLf_xthI z%ygasnL)9KCdS57nd|qt$Uti1^Dm#k(eI-Q_(RKnGciW+`0MQ0#3`{j4WrLU&6Q0= zIS`{yBF01HFnN=GB7Bl@P046ocl|}262J4D>XWLPq;~XH1ouiC@=358sQjO8O|wYt zaNkF0t3*G6LaZb!UQcEP=>_Xu+^20_IQ#~6ZG8RT!f%(ve{H4EkTJA9BFeT-eJgSfxV%yoxK&F6a7LfS|G7R2)hT!CE4>qLuD>1kZ_mSB@sCj z^4ie#u=T3@E{c1*m3=#6g&?nu^+qHa?GjK}PS2MSNqE6j6XP z{NwE?Is(#p!j+6_rJFoq1F-3&4bCBPk2RUhYS#;)B^$R}P8+Q}ZL=(DZ*tqX?`@s& zxGt)`#dH49<~U*NngdXtK(@UA_bQl&Y)3BP&y>%y^Tj7qI)YW`AurefptWDw>XZYv z9`Xwt5RZ3q|G=z2w>d7b??)zU?VdrvRE^?2kXa;zPmujK!#{gSIku#v#B$k2FA~6> zMG|}f{5^~0K)^`9u$etr@(IA1?5rYcszBV%E{NI~=f*YO7&G_TgvR_2_wMpxcAF0;Aa%!cD6MpU69hoei@TWbg-h>oD@55 zVC75*`o5E(p(R_qc&+G{_JJnFL&?X1BAx z*yzN2IQG)o+0E-cf5EFVLnK8H5iVSki5%8pHY1MT{!Co55x4f%_7=OxcN6F()S@`%Hebu+*`MA!rW7ig@SvCvPnk4p; zpB`tB61#asSW-#2_<%O5PYNz%&+@A0h^=PB7VzzTY7+@UK z_#DNH^X_q><-UsO08%I>pQF5T9v|^H$2)`GWH&~LcsOj2D=SnVkDIiKjP}jJYX6iw zm7?0>bi%De-!DvQFrjTAA)-2G`4xY*Onq` zETg>5!`Q__{R}=gGRjwU$yfC8g*(;jDYjo38TP~ndna#5Pb6> zp_k?GwI&;8#Z~WqjgVJ@@=u+=@dj$9bavxY7LN3t9 zI>cwwoxU?IKIhdj7e*rc1OBU>%OO644nC;96>^5wZqZ?|2mKX;;vQQ2f({q^CLP!& zbBM9oJk~{PH}gc@NY8`aX1~A?V$zDcXBh+<{~}sTcDs;utRgJ1(GXm#tk$_|l|qc& zJr=;}rH&e>Ch*y%g;vteaS?h+V{kWmmB4FkebNk~pFNS3gpcTzB&Ct6{kr;E&}~{t zQE-iygk7d70O+83?5T<_*a1Eu0Q@VwH`G*06`K7)+sKRGF{gl#*1n?K^-R!VGy2w1 zLXV=a967ZE=(6K*P)-iI=(w2`WSINplj%-$#*uTFKn{#?Rt9UF=sibH&dpGgqEM^D zq#d-D0{uicIcNp^*Q?DB`L9>-AwIpY;2P9bi2eX{=>5AcR0AABXXkc8;~Z*5Yk2@Q z+;x*C9l;65KQi%Oj>O&kmm@mx6{?|H*C^~}KS^Gg%R59EG}MB#PUV<|?8bCNPbUzh zb_c$}3Z1x`#RMoBFxppj^hIK{0w1ndbsP|rct&`g03K}bq7E2TLDkbYSd9`%*GIUETl^W z0wE745X=B-u3+9ZxYoYy$4SaWv76NiMyfZeQUsH)7}j{V!uf>@m#s8xfM)Fr6xeni zo(O#An4#EARmNiED-@xBAKv>M&QsJ-m4_gWC$IHBjCJD07x4~UCFm)b+F$j?IJJR> zO(x1~h87dW=jsV?9#)|0acIFCGdc*=%ZjGXPody?k*lz+1$XMBB`&2@#lKcDe&NkN zwC*0<%Lj6{eCq7qP*tJnmwfKInK%eb1F=lNTL<^4T)qoG!#EQ20eL(;)=KlgcWIX26L#8$Zfg`?|Ptad{j|<{2p1=!+PdMw{ zL-R=M9roU|6s&ndswU#D(4-H>+IX+8URCOe@Z-eGu1nP@ch}p@{Quy8(RF*wIRynz z>wddzVcz2TK%PI<&bFoI%2mu1<`Jfe>0#cWzhq|CvA$Fodk6gb@6j7?0fF@{0M>i< zKTSUuY9by_c>d8O@WPAFZ{E1Y@M79?aKr44TQ=$|%I5Q;ew#c0z1YX_ z{^R@gf18KrUHcFG^@%e8oZb8Vs^#YaXxN*5GUT7{{gv8x>_`UK*g)+Q34XM`s4Lo6 z*b&kH7mPoDth^t98T&40{zwvd{_~M^AOOZ0`yyT=KoCYe-$&q1a>l;B;^zEdJl7o= zh#~R3B7-DFc+Pvv?G)qryl{{N;K}{^xr*=fSimYLE^0u{{-p=Y2LSlPzK5F2F%-t1 z&A9fDGTnlG@AfahRgUM*(rf>~z1?2=OnDptC-%y}T%vf{hzX@3U_uq12PL>iJ-2ZG z9X!|Kd5DKUTDbo%599eq9zMTt|1b~Z`5q7VF5ExD!+5^W!xt9rm+vP)EuL@lcz)i) zd+Nd7yI{_H_W%e>~o4qE4_6mOvdWg+vb|+;9ynas6=Jblrr@ z(KI)?WvxGrNh{K&`K>uR3>WDHs0QXLd=J7_R@S-}k4L zukFIMuk8IXxE$Smh*i~Gf}Ik+K)pBUeSZ`k_5GWxI;Q>Vv%`(8Ym>n4Z`Xah?$$b@ WbZY4#{44i%1_p&ZUt#?g0VqcvFdKO-L*eF?Ya|VD-=aQP2Rbo?c4X>=KC^d z=FFLM&diXP&)5^{{<{RyZ{C?Dy{DsI=qADLvPNLP@n`q+P-<=)|*= z`8_tAp4?AL9j`t;$Mklj!g2%Qu&A0azVsNrruNQ@WYl6u14%k~RXe_{=JoCPyjsI9 zCtIZsd{vDd>V<@;I+^*Z!KFDvWoYQyMX4p_k16U}5H1IHZy;u*(ZxU1jt{6cG`l>U zZauw^mv!Km1uiN0Ej4~Y&8K(Z?P^U1yL>wSy&6+$Ue|$XfglZ=)VNs9mv!J$VXOga zyok#nW}6)RYwdWN+InUmp07T>0DqfqJ-rXlQsapv?|$^7+Ja0a-FiMK^V=k0I15Lr z@ux|G&@YmJXEwf*gg;CYWS$qsx%m4e{HG*A=KI1p4~TJF60IE#uGY}`%X4=`aF>ZV z(4o2=*Ckmm?89#+fexkV*7N%?mxMPa$t7A>i|vl{tFGQ(BitDs$os0RI@B_T3|Y?6 zAnssvb(nRc3vWuo^OAVWF`S=-%ae|$U}btaE>6P9N#5Tn*Rb-dUHE&I;yt-YS}%`r zG!xPmm4i=|I%6HCRU=1wW;!y*wXTtNeru<5rlUuKMvkoERgNXSzq57LpK)RFXYKWa zX^PLJyT_MgJK_#L=u^U~AoxccxYKmQ(0wD0aF1%BP@5j>CI=d4U zmEnBV%Y$^^S>?-v{97IPKq7V~f|^^?9@Aqc5&uUbuPnmmM7%9=lx(&W#!wFcB&?=e z#dfF2-kSp_5LGR)=tOp82;<*6hF2weTNF4s6(36E=7dborH+b?%7Ms*iwU@Up>N~p zMDKG7{)pYVZGDdgjnHiZYq9ZXJX+yIEAQj8Gq~E2?1iT~aNjf@t;D_4aK|)(Mr4rS zt+10_$Z0;smv;6{fdeVyvmHGNXrv7nBg*)T9%)cJ?q*1qDYp|wBS$K+92sX9U%k$| zj^X9gya(kKe4qm_oCaJNKb}7gr%z-2PLzSAkysX6>Bgs%EV})AWDFZ6qp5X@x)8#m zdrc3LClG(qhC`-#$QTMaQSXVV11bY~LOG!F-KMSedb(9cfp~yY3NM{0qAeOJg;HFG z7Yj^=l?5r)vv!cR0n}@_HVPaFgCfYNAg7u%tSWe9dvR?b@P18yJ2p-C^$Anl-^6ND zuc4`!=WW=K;G2q{P4KP_;E5FP(*c2i@R`NoS=yX$eBm#jDOk2+C@a7EW?A2$Bvg9t z59Z&Akzo$*ksC5fab|)Ze;DhVQYLtZ%ml$Z%t#P+laxS}c|sA7dU0d|<+JnR4`63K zX5q{DWO(?=_@Kt#99KKgIAs?~@j0cwvmj;1J=j<%bhh6uV)7y>>mhxr%P6WBYe)0* z-qhEuQ&*v!WT)7P!;+FSKPly97r4IA7?X>Yldh2?jBcM^0_@88I;SA*2-PfhwOIAq zE6t&<78PaI)jN?f%eu?yrDPV}K|M08BTLJiXmMjdFFoxEE6M(TU>kZeAo6b zS@~Xl>N#TqsOfCDP=>RV{An8=j??3BY;vgh{! z!s&nC^B95lXdjFmxxa=2mAoE5KWOt_kH9;UaXy&g^J1J6XPjN0Pd+dHrC|uqjiv)~ zDP@oVkWt33*WhQ8dFdJ8&dM7F2LI__gEQmsqGUIlCx$D9C{`t+DkgQq`xLde8ZIz8 z>4nO&lF9v=C-+OUEAN+6iuZIXiUbN1>;tzYSK^aVI5E!Ka-Xkg!+o*d&ikpCjgo~(tk^l` zFIip6M|R@&*ebMGLMu+X=)S8;I_x6dnn=;10Rkbq&xFJ1))Wdih0{HY5n%G=Db)5* zngu{-LZiK+$LHmmTAiPGrd_eC)nAGis#*B1d{bLb1Y8YJhLuY%j2txzz?Rda3ApvHIMdcU9F-lirXwLNG-4vq+H_M*eQ5Yn{g`K zTuC;QmqqzVtt-0~sLn{UbEZdCf5NCI2;Vu2M~tJRs{80#A3`FOO*86x%IA3q^2ld9x_4JuK;&&;H6Mc4Au$?vc`K^t3fmpfw}3U8=p@>v#)q zil-S}8r2O};1Vc*8)MOBQOFR2uOqxm%8z#7Eiw4+G`vbK&H9BF1j6?} z<&K2UF@Zdi-*?pev811zMTsHmWK+o71=5#O^`XJJ9iJvk+-kDnY~$y!GucI_>=XP#MC~ovCyXxqg0SG2 zR8hARF_&nrBx06?qMx9xaQd|o@tdgXWg41M#fgLl4EwWEUfGG=Q9SVYAWAs)lTmuQ z{8T_89HAvvlI(pwiq{;)%|VhwQG$JcNb<{%dYz=3zj_qE66LKPgKIvr5Cv+!E5!q$ zoIm18(VlSbN!fDKpJIE$5#QO?xu7tqYjAula8a?ZFpI8K98*{&$)8O0oH<&x(d-jx z&#lwCg#G-Ks=XL{Ekd{qZ$&Z}@S(`SHM}++KZk^NOTw6YcVRTH`~iBVj=Av@Xw2PM zsA0E9YdQ{^%9-PW0O_^g722uFasVOd_v|i(H^OJ$L`octa zGj!#FHs8pEnp89^j?xwP8wMJ`Z2XY<2R^5=j3rcyv@VXg68OVMZQiKBxVyhFF#+`# z#$|-`7e?ozh9YHyKCQn{yr8qc5bd#nGWs-jyApR#{jm!^3(t5dzRFzd_4=#mTJJSK z&WamztAo>G;lpi}CgV`<=9CoEN75RRc9hvJc8|GPy|S?|jeQB>!&0U&am?*0Ow6@P z9ZX@gRSd1tNflFZTU>o)R1vETNv$q><2!C4G0Mo{AdNz9akZA z!QM5&yL(*9Wb;E_@j8IH>-B{9) zg5c^8Hsa$Mje-eWWYgzS2nDWfW;OK`7dAD`l)Y;x(2-H>=Q=D{%3Zx(_47RlRSA9u z8ZoL`6&&^=v^De|F19ET-89CTg?dq&k04&YR5g3rU6#Lt>oW4OZ;Yke`Ma9#NS*?ylgkwR6j&SBtm~?qGC^$st1}rB1Vh z(Iwcs5z#?+(U4(IDHW=Ml&E3|kM(vO8$~nA#ZR%xPkG32s7+dBc6u%e1!cI>+8mX4#Q+vJ6TC*0bzRHMc1yRp;;yBX;`)tfARuV)_v> z#cuqxpH#w5%FC@8c4nD~?q4Q@FCXY%rbHrEo@KXqLGmfYn;o1xW~QhdikFxz2`Uhh zVBZ97oIL^kpreT3uOH)HP|cMturE#zxLOx*?W(n+dOJtPZV{c`$Nf5X_fn9xie09{ zXAr9b_2o*(s@3dzHKPXIH9zStsMnfe|8WoOGEr-WofWqRx3VxUDZ+8p>Q&uay9V+L z?zy;ZB8%G}_poWFKocD#SJ@|-{QL73v^NK}7yqdJCO;ISbfp{aqn%Lf;?Pgw{x4l- zU6?~u6T<(kOY7=Pbr}*l=O#y))+MBW9Td*=S1-11a#*H}A>+foFMCmdRYf|u^7tIl zwhnH0d?q2~PQ))wb3pZ{l)^1BNDBsQKsnIM8vU;bIIDz&M8d)SEMYpdYZDd~HrTx$ zWS$5yM$l{`Bzb%7-uGZk8mCn-eSKb$d0f0*^p4nR8->h>(Yu1fI2UKP4~H#&@yV|5ay+X$NRwl>d28-+rg$P zoXR4)d&{ z=}oOGARZM#`Lg1tT0kfTN+>4pY0CPhy|t7&>>h_YUFK|w;1S2~3%suxe9$Q2aFCMG6Q zwSgz88buj42dHXkd%>KV?=T+_3f=;Wb0^*)&T{r7)jUe#AvaMHY$oW{;NIm2?YMKC zUR$aiW#vuwRrG4ezY+`yrMu;;ZRY6ihx08N1aRsolC~#V5jg z2sEHV#-O>F$=uwO0W4ljW4=kQ|uH~ zy9>e%)1X3{3gKp`HjqACBdHHv4l!rQjV%&iB76xpZ{N^Hj~MZ7L(cSJ+~ zOc{K5&^YwUpUZK{X(1H5g(X~5avTNZmkqI&(?CfW6ibD?FG#I8;PRh^yNo}(hrhlj zJjfWQ|G@lKkS}5Q=l@U}ujG95%Aaq#g(sVWL8BVB+ z90#ihTj%9Ar}%?l1?rTZ&2jlZZ1=ma-g5&Izk6SJZ*x1PXYkScwYS2~FuF!P3_bXD z7)m{iZm%BF^kzNUp>Rr1V~c=2&FC5gA{RCYLzg8WGKQITQr8@#NE=wj=t!3v+wN6I z1Q!}Z>(y4hyIw5@?B07poI&oab83Zpf25sJGtNm723bp}3%^9b9G9OuoA`v=oSH&V zTz#rKf~xBiq*+E|VC;I^sGrA`Io@YXiTkt(+IWvLpIG5HB z;#&g~$S45gstMJ)@OkIbr8mRL3JRZgnsp0p$S~DI z0uWx8o_`>`F3}I*f;Z_Aa+ly=BMP6q?Z$P;IbZDT*-25*~+|Z+pmQJ;947 zUx9?D9jQxr+F^pvM9o%xi`d0krY|WJ_AL$>X@|&GbI(e;fR5 zz^RDUy{Ts|5fjyL0pHZ~NJ>_r9LdNLiJOn-!e=;R4V^ui2-1m1+=eK+>*^hT@NHix zFX9GgY!wk7a4XWLiw@ekZE5Kyoz2;Bu?I=vI(W#%He!@qZMzTUwpcVO3=NAvXt=mr zr?cf;5oQQOvi4m4xOFQvI$VGH@sM=G^fz!?rGHC8f(Rq1TR z#m7g#*IpJpMRjQN2Fic7-g81Ecoq#SCsX)`Q~JrqAq2^QykW?R7ULWQnbTtCZiud7 zsHYjxaB6gi6E!#Xv%1Ei56mKb09jy3iK1DeUvsrz;-)WM&$*1blj)mdhf+rkk%C|B zMJc#^I9SJlg4}$~e9>wf_q=B2oF%qyk#a!k5zc|`C#xv4Xpq1Y4?N^fJyZiw-P0A5 zA*C5sxHPd#SKE*1>BjIZ^Ib%aeucAcc$awjXb}OE(EYf{V#`D1zD^ zo^#pnS&+AZ;)*kp<9F&O9X$B#uX8T@{%pQM)LhsN2=0}PXNY0$%Z&KhLa_a%O?Y-I z=52TIEx(Wrchugp4Kun*+bJ39ArWsI&Ch$$#-(P)nx3*j%xrzeMz?OU{r}`_jm`O# zO-RV5e5cs?7P9DoT(Rpl#LAx+Ll%&E_K}MU%PXj#+zf2`Nuv#koSSVzg#Y4O$iKgM z1SX7swc)n|%`Pi7k`17up2bn%-O1P7mQ$h1{nOfzD*lY-eo94T|c8%T} z72u}K(yFiRv0H@y@GD=ihb&8ri=U=`zH-U(#}*=G(M$)oepaDO&8D$)*%sErzRGZp zS#Dx7{&LcGP#^U$GK9#=yZqtc(a?$&5z1t)a-LW0iA8RVIQ@)$@nBXOqbIXt*428 zn()x&?(eRfubaU|WP8Y8tq)|g*}u_e2W*@4F#e5Rgf}5073_+;iL|DHn8SEAGOlzG zxDy!*gA?4V^O8gWj?YUBeQ?x!D~G!@Z?+`JP))#Fk+OTHBFE+foAyyx&_imWj@cjl6Lfn=4GyWSeLKk5G diff --git a/pxelinux.asm b/pxelinux.asm index 1dd6afff..73e6cdd9 100644 --- a/pxelinux.asm +++ b/pxelinux.asm @@ -172,7 +172,7 @@ tftp_pktbuf resw 1 ; Packet buffer offset ; ; Memory below this point is reserved for the BIOS and the MBR ; - section .earlybss + section .earlybss trackbufsize equ 8192 trackbuf resb trackbufsize ; Track buffer goes here getcbuf resb trackbufsize @@ -1806,8 +1806,8 @@ get_packet: ; Send ACK packet. This is a common operation and so is worth canning. ; ; Entry: -; SI = TFTP block -; AX = Packet # to ack (network byte order) +; SI = TFTP block +; AX = Packet # to ack (network byte order) ; Exit: ; ZF = 0 -> Error ; All registers preserved diff --git a/pxelinux.doc b/pxelinux.doc index c029ed5d..45405a97 100644 --- a/pxelinux.doc +++ b/pxelinux.doc @@ -144,9 +144,9 @@ syntax: # You need an entry like this for every host # unless you're using dynamic addresses host { - hardware ethernet ; - fixed-address ; - } + hardware ethernet ; + fixed-address ; + } } Note that if your particular TFTP daemon runs under chroot (tftp-hpa @@ -184,9 +184,9 @@ vendor-class-identifier" if you are using DHCP 3.0): # You need an entry like this for every host # unless you're using dynamic addresses host { - hardware ethernet ; - fixed-address ; - } + hardware ethernet ; + fixed-address ; + } } Here, the boot file name is obtained from the PXE server. @@ -218,9 +218,9 @@ configurations correctly; however, there are no guarantees: # You need an entry like this for every host # unless you're using dynamic addresses host { - hardware ethernet ; - fixed-address ; - } + hardware ethernet ; + fixed-address ; + } } Note that this *will not* boot some clients that *will* boot with the diff --git a/rllpack.inc b/rllpack.inc index e31f9498..da5618db 100644 --- a/rllpack.inc +++ b/rllpack.inc @@ -19,7 +19,7 @@ ; ; Format of leading byte ; 1-128 = x verbatim bytes follow -; 129-255 = (x-126) times subsequent byte +; 129-255 = (x-126) times subsequent byte ; 0 = end of data ; diff --git a/runkernel.inc b/runkernel.inc index 0c105163..aabbd86b 100644 --- a/runkernel.inc +++ b/runkernel.inc @@ -106,10 +106,10 @@ kernel_sane: push ax ; construct_cmdline: mov di,[CmdLinePtr] - mov si,boot_image ; BOOT_IMAGE= + mov si,boot_image ; BOOT_IMAGE= mov cx,boot_image_len rep movsb - mov si,KernelCName ; Unmangled kernel name + mov si,KernelCName ; Unmangled kernel name mov cx,[KernelCNameLen] rep movsb mov al,' ' ; Space @@ -302,7 +302,7 @@ nk_noinitrd: ; ; Abandon hope, ye that enter here! We do no longer permit aborts. ; - call abort_check ; Last chance!! + call abort_check ; Last chance!! mov si,ready_msg call cwritestr @@ -467,7 +467,7 @@ kill_motor: ; initrd, and are always loaded low. ; old_kernel: - cmp word [InitRDPtr],0 ; Old kernel can't have initrd + cmp word [InitRDPtr],0 ; Old kernel can't have initrd je load_old_kernel mov si,err_oldkernel jmp abort_load @@ -615,7 +615,7 @@ loadinitrd: mov si,crlf_msg jmp abort_load -no_high_mem: ; Error routine +no_high_mem: ; Error routine mov si,err_nohighmem jmp abort_load diff --git a/sample/Makefile b/sample/Makefile index bacc57ca..f301b9f1 100644 --- a/sample/Makefile +++ b/sample/Makefile @@ -28,7 +28,7 @@ CFLAGS = $(M32) -W -Wall -march=i386 -Os -fomit-frame-pointer -I../com32/inc SFLAGS = $(M32) -march=i386 LDFLAGS = -s OBJCOPY = objcopy -PPMTOLSS16 = ../ppmtolss16 +PPMTOLSS16 = ../ppmtolss16 LIB = liboldcom32.a LIBOBJS = conio.o atou.o skipatou.o printf.o c32exit.o diff --git a/sample/filetest.c b/sample/filetest.c index 18b08361..b4ca2d80 100644 --- a/sample/filetest.c +++ b/sample/filetest.c @@ -26,7 +26,7 @@ static void printregs(const com32sys_t *r) "ebp = %08x esi = %08x edi = %08x esp = %08x\n", r->eflags.l, r->ds, r->es, r->fs, r->gs, r->eax.l, r->ebx.l, r->ecx.l, r->edx.l, - r->ebp.l, r->esi.l, r->edi.l, r->_unused.l); + r->ebp.l, r->esi.l, r->edi.l, r->_unused_esp.l); } int __start(void) diff --git a/stack.inc b/stack.inc index adb08b51..0e39b6ea 100644 --- a/stack.inc +++ b/stack.inc @@ -31,7 +31,7 @@ mov es,%1 %if IS_SYSLINUX || IS_EXTLINUX mov ss,%1 ; Just in case... - mov sp,StackBuf-2*3 ; Reset stack + mov sp,StackBuf-2*3 ; Reset stack %elif IS_PXELINUX lss esp,[BaseStack] %elif IS_ISOLINUX diff --git a/syslinux.doc b/syslinux.doc index 69a64d42..7aea49bf 100644 --- a/syslinux.doc +++ b/syslinux.doc @@ -296,7 +296,7 @@ SERIAL port [[baudrate] flowcontrol] "flowcontrol" is a combination of the following bits: 0x001 - Assert DTR - 0x002 - Assert RTS + 0x002 - Assert RTS 0x010 - Wait for CTS assertion 0x020 - Wait for DSR assertion 0x040 - Wait for RI assertion diff --git a/syslinux.spec b/syslinux.spec index fb9c1179..c07d249a 100644 --- a/syslinux.spec +++ b/syslinux.spec @@ -1,6 +1,6 @@ # -*- rpm -*- -%define RPMVERSION 3.39.12 -%define VERSION 3.40-pre12 +%define RPMVERSION 3.49.5 +%define VERSION 3.50-pre5 Summary: Kernel loader which uses a FAT, ext2/3 or iso9660 filesystem or a PXE network Name: syslinux Version: %{RPMVERSION} @@ -73,17 +73,21 @@ mkdir -p %{buildroot}%{_bindir} mkdir -p %{buildroot}%{_sbindir} mkdir -p %{buildroot}%{_datadir}/syslinux mkdir -p %{buildroot}%{_includedir} -mkdir -p %{buildroot}/boot %{buildroot}/tftpboot/pxelinux.cfg +mkdir -p %{buildroot}/boot/extlinux %{buildroot}/etc +mkdir -p %{buildroot}/tftpboot/pxelinux.cfg make CC='%{my_cc}' install-all \ INSTALLROOT=%{buildroot} BINDIR=%{_bindir} SBINDIR=%{_sbindir} \ LIBDIR=%{_datadir} INCDIR=%{_includedir} make CC='%{my_cc}' -C sample tidy cp mkdiskimage sys2ansi.pl keytab-lilo.pl %{buildroot}%{_datadir}/syslinux -cp %{buildroot}%{_datadir}/syslinux/*.c32 %{buildroot}/boot -cp %{buildroot}%{_datadir}/syslinux/memdisk %{buildroot}/boot -cp %{buildroot}%{_datadir}/syslinux/*.c32 %{buildroot}/tftpboot + +cp %{buildroot}%{_datadir}/syslinux/*.c32 %{buildroot}/boot/extlinux +cp %{buildroot}%{_datadir}/syslinux/memdisk %{buildroot}/boot/extlinux +( cd %{buildroot}/etc && ln -s ../boot/extlinux/extlinux.conf . ) + +cp %{buildroot}%{_datadir}/syslinux/*.c32 %{buildroot}/tftpboot cp %{buildroot}%{_datadir}/syslinux/pxelinux.0 %{buildroot}/tftpboot -cp %{buildroot}%{_datadir}/syslinux/memdisk %{buildroot}/tftpboot +cp %{buildroot}%{_datadir}/syslinux/memdisk %{buildroot}/tftpboot %clean rm -rf %{buildroot} @@ -110,7 +114,8 @@ rm -rf %{buildroot} %files extlinux %{_sbindir}/extlinux -/boot +/boot/extlinux +%config /etc/extlinux.conf %files tftpboot /tftpboot @@ -118,11 +123,20 @@ rm -rf %{buildroot} %post extlinux # If we have a /boot/extlinux.conf file, assume extlinux is our bootloader # and update it. -if [ -f /boot/extlinux.conf ]; then extlinux --update /boot; fi +if [ -f /boot/extlinux/extlinux.conf ]; then \ + extlinux --update /boot/extlinux ; \ +elif [ -f /boot/extlinux.conf ]; then \ + mkdir -p /boot/extlinux && \ + mv /boot/extlinux.conf /boot/extlinux/extlinux.conf && \ + extlinux --update /boot/extlinux ; \ +fi %postun %changelog +* Thu Mar 15 2007 H. Peter Anvin +- Move extlinux /boot stuff into /boot/extlinux. + * Thu Jan 25 2007 H. Peter Anvin - Hacks to make the 32-bit version build correctly on 64-bit machines. diff --git a/ui.inc b/ui.inc index 71501181..400c2d6e 100644 --- a/ui.inc +++ b/ui.inc @@ -331,7 +331,7 @@ get_kernel: mov byte [KernelName+FILENAME_MAX],0 ; Zero-terminate filename/e .no_skip: mov [KernelExtPtr],di mov bx,exten_table .search_loop: push bx - mov di,KernelName ; Search on disk + mov di,KernelName ; Search on disk call searchdir pop bx jnz kernel_good @@ -448,7 +448,7 @@ getchar_timeout: ; that decision on the file extension. The following extensions are ; recognized; case insensitive: ; -; .com - COMBOOT image +; .com - COMBOOT image ; .cbt - COMBOOT image ; .c32 - COM32 image ; .bs - Boot sector diff --git a/unix/syslinux b/unix/syslinux index feebed2d3d536aaa578b7664f6ccf751f7c68f67..ba3c7f02d034593f49f32c46f786fdd79526eaed 100755 GIT binary patch delta 6836 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 A(f|Me delta 6471 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 A(f|Me delta 6471 zcwS{W3sh5Aw&#ZACI}?qBO+pmiYfjuu@tppM2d)s_bO`n)G6rH9%*OZ%q&Q7-s%T1 z*x?$W+S^v!Q9}YcR&9$)DTqx1u>q%0t^L{BI*d5=q_NhPihxMozQN9$w;rr@_c>>O z&OYbtFVwz8eRG7`qZW;^duQ&XH_b=rM9Rry&x%D`dQZnnZczfHrI$iP+j{x0C#eK5 zI%!eF(T~Nl67`#6S>TZ^z5LQJ)s)~$?t>MvjO-l`1niZ)r~eSfQlh4hd1ts$R@*C} zYkE&dMzl~<1rBm(BoMIN4DXgSzzo4pBhX%z`4+KchC@32g5Dz*B z9s!bzk&^|=8i<3fxzaXfcd6C3-gEJwB++Ufk0u9c`WKF zfqZLpVssFFU>MMPKo77Iv$2^P_|BS@0pD%2D#gta zKd#~_QQRv@5z|t&>W5QOwF~}K`m}D58bwTsN8_SXdSHI;v~IeL;}BX2ZT6z1T@ z1I7&8*&m7<_X7!RGLHt@PsvGym)}t!RGM^hBa8wtir)>q*gpSxY#}22X+I7TNMXm5 z;u%0ivf8i;S)cW=y@(Bx9)v|G?1K1|Z%$<4{GqsI2i z3It~##K(h^2V*j0I_{=BU+}#gg`96WT<8>`r@P*CknNFXrOW0Z#gS&2>!^d|N1DR0 z{U(DO2}9nSV$r7>kU4aSb~Bq5)uEI{pJqUcU5Ik_*~qh#y>usoTp6cYBKu-Zbc?bt z*8dCMU{5yS#x@4qlK{3bBte8NnidAB-KOW#D@;tfx^(Uix+;)y$}}(p5-5`*C@5W9 zN}F=imzJ-q3an@;>pn&<#rQh~6yNZWD&dsrz&ht=HgYA#A4$%~_?`%mAL4zR0zrbW zADUL-+E=+8nNrD6glS}dl|t9-s; zf~~knS|jgbymW0Ba;>fC(z@H1p`YI|Q|mbWS*BySaU;kjzVOY8U8fPYO08*U8O({j zSz-hMtmBGmu=*!=ps@a?R?eY`ytHPa~3WpFF!Xo zfAC20X4B_)uhhL9pj`SE?Fy6UjTIIb4OTSyz8rTB*?b*g#5^^S_Ioj@iZUk` zETexfHr>Vnc?)Bb0%&8**9uADRAmtG-KkR*vgC*6f0WwT?|bH0*B8W;_uGUR7A>f)kw;3 z%gPkhF_VJBXa1n57EQvPz6Thjs2&UzrZCegs&9n)r*CoAbqStfpSqQV%E`tk-^nrO zo2UT43-2agoU$YE~b!f}N4DsZO*<=We{r@S}5Q#kV@zrD*VoIT9>Un!=@BX8g3yog$zY&r6xp z9#MLMQ;kyo^A@j|9FHjNOu?KghxND16RU2aJzUyn41|Pp3|~JltAf#ZX{AV~QMA%O zQH@_P5H&QoF+rqhh!i=#WC}l;o-m7ZzbV+|&Yrv|OgU)bab&H_54J%;_&O zZD8kafmE-w=r1$K6hg)kIVN+O9Auu7tcn!~`bUT8uNi*Vd|e(>H4;GOA?*RQZLsN> zqCqNPDD#Row5Q%}m4Csk?EI%xH>3+}1Gl#7zhG9wbIcj(yb%iP6R{EA1hjDmPXx+R zh&;@PFIZCno72u?cHd=bH~j@8MqZGNeAVN$O3>l5T$*BqOAkf_R_A_6oVT7$Sq3X6 zx-xyfc`!TAmFpqhGNM351;sUzAa2L!iBgY>uI;J649Cp%xGr>&f61zTya2{+=n@!` zWs2&Zi2DTdpDmbM!D0ippJVXSuJRDfb>YmaYv?wf^YKL4EVlc4X^(T% zPIPkLd&6MtgUeB%OmZua9F*`oQ;ecg8Gj*Vwag#cJ_$L$JjAOOPJQMZd&%4?zesm} zv(7CXsQ%*Fcb>a9MovWzgb5~Nh~PdZt0DpeWN$Qi8VO$%G3?o$9Yco0Cm;im7|^h% zK3iigkI|e+Pcli!*Wvym>!X%pfCS2_{%W5=pZR7MjTTOO? zrvZlYc{cyxsESrJD30PSW3_$t-`0P~{fnST%W!d&W_QcT2@(Gl+>LqMlW_}qedI(Qj}yZSCXPTzYZZzk)(H{OPHO$@5f6X-s!tO zPM(Sy_NanrvG8tpC5dF0g#VK^aYZv-CejUYvRTPGdcqWJz*nosW!5dAN?I4glKr@Y?8N~l@#fjv1Vny{!;~a$6#uE$& zkyS;vA?3v3>fO2k*$^d7B=z@$%Vz}huJ6(fL9!uBqcq-C0kt$yNI2cJlbLVx_20E- zD<8HDD|W;?95&F(nis>#lUXiyE_+l4FBYa4_KbKM_Shg*hBegNg7>T3>){oP5-R?F zTR`S*SWkRZ(3>Hw1rxy{!^$~7fg6)^O2UtUFDk(!3yL5>B)m)xN8pa*wFr$0zQbw0 zVQOQqGGpZ0S=g@Vtb&SF<|rsticO(*hf|7~?(bi#RUXhN}^` z`WJ|L9lxyuZwLf{HSHTg0DYC=-$|XC%%p8S=%IswSjamBa#ChJqV{zbi}#_$S-3?h@7wVSDp)xbe?ucdXs$YS^o)SoEyH*GlbBlh%F>snm)}$r-ztCTRl#zqXU9cNXOcj|8Gz#gomFf zb`-mQ8T5VfQ*H+o$QcM*Rv?qa!cR$?3;jc8TIy8e)7DKfLQV%5k1gLrRelYJ#MT=5 zm(!-Inabr0p-HgU7+2%<+_+E(iqjXG@BZa3F2Id98NMeiom#|87UzSwCl@aiwIAZ^ z7q1Z2-{LPU9-L#uTsNNcWtj|T;H4Mu_*3!SFYzw@0i#KbGyEFG(Og&%S_0m`WOjwo z=L!S2G|fKH7!K|wXR$q;ov1M;N(?2`pfRjHzNs;mJ?I&MTo%r5A6Q{ci)ELk#W$7C zg%u@>EhEZu8bd22BxhK#0u!y0cA(^q16$oR?6#1kwP+TfImcF3u7I6lIB6^JBFE0Jw=oAWAeAq(^x5sq}A;#^cXR%T* zoy1B>C51PD-O6K{NZ5V+M4oQQDvxW*#Ty{($D88w;Mlgxe^M(0v2iRfS@u{3Ygz~a z(LkA!cdKTxyY;^nw}iG+s887t&t^PIC$KwaJK}@u*4TI!S|z2YO)A%20oYB)vD()> zkl)B;s#>1Jny!24cosEG6F8@{J0y;2tpA+uyfrp~tx1~(Qf3<3D7sJSf7iLsLHbd( zyaKr1)t%?$@vK0#TR)3!LjpxTd1kzHp}Suk6ddB1#R}WyyyhXfdY1;bTni*_ezU1anwP`r> zrn-MgzxnoGJ}n^Moe~0yXM$zY388x-9|rtG9=t{9+suj9SdehZG{w>d%+QQw3b`mK zK=GP;ya#Xf1nFXDKG^E#;4YNu`ye4dmOg!o^GgqTB7hI14ABmo42rfaIz>oj+U1W{ zBp-394eeP5sJeV2unuRD&6U*>tZ`jEPOW?V!(-#_Yxg{`NIo8eWP?1eo-@QVR`uig zGn_uf0MoOi1*Sb`Ila~ZbwP#!?NGRS+Q=bcwT;uy7l>NP%fhtP5)hd~EA>6C3(O*2 zU^1sa*E+#t3U_#0$)71#bt^x-ZD=jzoI%NzBo3by7SRRbZnIhC5loBcHIsGN;Z zF}B<@mUiGa)I}lu2EIGksAAV!0wFu-Pi|O0Kw?gxZm4@aq}f8QG#7BAmUXf;b5&6WB(TQM?4dg(eF z61vsa`$C)Ad>@QB-GGp1J^39fCQ_)BUPRDWwr5fhKaZ0kqVe0;?l^}U z{1WF>{$R$l)D2#?auyZC&tIuoS8sFe^|T`yyuFv+W1|Ec83P*;i-v@$DdU5^p56L- zoA!!;p-hRo^ED&(x$MwSHC;K5>1^AK$Udb#ne8MYIgSLDx35%1vMq`}<#=z6CV}1R z;nH3o;4iM6T`_P*rf!Q;>aIYf>r-m%wAvb5Z=){e4E?OTBzS$Pq+vQc-c#dk5eZR3 zW0lit=Mr@{{ptWhxmNir1JGy_Ey{DE4DN1-{*{6DhF|}jf*R_(t@>97KByFt*N_ER z)cO9Ur@cgYQ|9(512cw9Q9_LCKx!hr6D$P<{eI4TMC7pXa~^wW!CqUN zNZF_K3a5o0ESaqo^;2Z@zL%b9fYb;L0^TxFG&BIm3y)2yaM+N5loHQS>Vk2mCQyA z^+AklKHE3BObSTzX8#}Yasgr9jxBmEi+1$lGtd|nAUrR2K3g^wR?}I^^gh1(HMAdD zY}wn;cx18uBO`dK8<0zYMU3sKES__*eD4IcnZu14tlxs|87!XRHbp?+n8lVa!S*bc z|6SH{XmYknJ?l>#gFHW4;DOtAX|K0ep$;vK)%vI3bJxjOj+HFtn#(XEz*57h2 zxi0)|Ynj+I!{U`)8=@6QrB+qib<9b*t5yCb*Es#33W zzY%jgXf7@FdUqDByC#mGDx6r?r(Zy>4yk~?faoHw-=#nuV$l=?fGToBDkRWPf8N0BcY7 z$I$>cETU;Cz}2sL-LeW8^ooC?5qfgJ>CxC5sjxwz8wvrmcmLX>CH)9h@4K(N9H)l$ z^NR*POEPTO_twSSACm#L7Y%%d&=0S3AC|-;H1@jk+nm@(fleNZBGLf<6pm1jYt#Op z0m|H)_74Kg0r(5R8i02IruM*KNFeCkwEwO^0B~3!05~ED0H{1fAz9a^{kH`=fcy!A zhEnpM8nh4P;e4EXKt+#|I)qau3ie-X^`~;6h*k!RXnv(}3N?=}G|qeGL0SFpTDmg_ zs`o_lJ~{}MRxvKZR5zx)xWIGkyUOn>!6#C@G@TPjv8KcsQUXWB2AIbgL}VK>7YB#p zHY({r-{ga212QwGC~^XsvjqenzE(xW@$=SBmrQo}`d9JH+Ie(PhMa$KZNah_Y+Zq^ zVA$4mGRW{2Pk4^`=6}@cffST;3w}p(!q({4ybr(Jnm5 new_ldlinux_name+3) { if (!slash) diff --git a/win32/syslinux.exe b/win32/syslinux.exe index 351085181be460edbcdaa88771d552ca9aa10163..07a9bae512d682f2483a64d30da7aa40bb9b8ad1 100755 GIT binary patch delta 6659 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 b&D0`3qT)dCza?5*DhepRK;&wCJ^a4_tJ-1u delta 6286 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 S(I))_M4z~`F_&_@7XIIeVzX)h -- 2.11.4.GIT