Update syslinux to 4.05 to support mic-0.15 accepted/trunk/20121206.035147 submit/trunk/20121206.041233
authorGraydon, Tracy <tracy.graydon@intel.com>
Thu, 6 Dec 2012 04:11:50 +0000 (20:11 -0800)
committerGraydon, Tracy <tracy.graydon@intel.com>
Thu, 6 Dec 2012 04:11:50 +0000 (20:11 -0800)
244 files changed:
.gitignore [new file with mode: 0644]
Makefile
NEWS
com32/Makefile
com32/cmenu/Makefile
com32/cmenu/complex.c32
com32/cmenu/display.c32
com32/cmenu/libmenu/com32io.o
com32/cmenu/libmenu/des.o
com32/cmenu/libmenu/help.o
com32/cmenu/libmenu/libmenu.a
com32/cmenu/libmenu/menu.o
com32/cmenu/libmenu/passwords.o
com32/cmenu/libmenu/syslnx.o
com32/cmenu/libmenu/tui.o
com32/cmenu/simple.c32
com32/cmenu/test.c32
com32/cmenu/test2.c32
com32/gdbstub/Makefile
com32/gfxboot/Makefile
com32/gfxboot/gfxboot.c
com32/gfxboot/gfxboot.c32
com32/gplinclude/acpi/acpi.h
com32/gplinclude/cpuid.h
com32/gplinclude/zzjson/zzjson.h [new file with mode: 0644]
com32/gpllib/Makefile
com32/gpllib/acpi/acpi.c
com32/gpllib/cpuid.c
com32/gpllib/zzjson/zzjson_create.c [new file with mode: 0644]
com32/gpllib/zzjson/zzjson_free.c [new file with mode: 0644]
com32/gpllib/zzjson/zzjson_parse.c [new file with mode: 0644]
com32/gpllib/zzjson/zzjson_print.c [new file with mode: 0644]
com32/gpllib/zzjson/zzjson_query.c [new file with mode: 0644]
com32/hdt/Makefile
com32/hdt/floppy/hdt.cfg
com32/hdt/hdt-cli-acpi.c
com32/hdt/hdt-cli-hdt.c
com32/hdt/hdt-cli.c
com32/hdt/hdt-cli.h
com32/hdt/hdt-common.c
com32/hdt/hdt-common.h
com32/hdt/hdt-dump-acpi.c [new file with mode: 0644]
com32/hdt/hdt-dump-cpu.c [new file with mode: 0644]
com32/hdt/hdt-dump-disks.c [new file with mode: 0644]
com32/hdt/hdt-dump-dmi.c [new file with mode: 0644]
com32/hdt/hdt-dump-hdt.c [new file with mode: 0644]
com32/hdt/hdt-dump-kernel.c [new file with mode: 0644]
com32/hdt/hdt-dump-memory.c [new file with mode: 0644]
com32/hdt/hdt-dump-pci.c [new file with mode: 0644]
com32/hdt/hdt-dump-pxe.c [new file with mode: 0644]
com32/hdt/hdt-dump-syslinux.c [new file with mode: 0644]
com32/hdt/hdt-dump-vesa.c [new file with mode: 0644]
com32/hdt/hdt-dump-vpd.c [new file with mode: 0644]
com32/hdt/hdt-dump.c [new file with mode: 0644]
com32/hdt/hdt-dump.h [new file with mode: 0644]
com32/hdt/hdt-menu-acpi.c
com32/hdt/hdt-menu-disk.c
com32/hdt/hdt-menu-pxe.c
com32/hdt/hdt-menu.c
com32/hdt/hdt.c32
com32/hdt/hdt.h
com32/include/bitsize/stddef.h
com32/include/bitsize/stdint.h
com32/include/bitsize/stdintconst.h
com32/include/bitsize/stdintlimits.h
com32/include/bufprintf.h [new file with mode: 0644]
com32/include/cpufeature.h
com32/include/ctype.h
com32/include/dprintf.h
com32/include/netinet/in.h
com32/include/stdint.h
com32/include/syslinux/movebits.h
com32/lib/Makefile
com32/lib/bufprintf.c [new file with mode: 0644]
com32/lib/chrreplace.c [new file with mode: 0644]
com32/lib/dprintf.c
com32/lib/inet.c [new file with mode: 0644]
com32/lib/pci/scan.c
com32/lib/syslinux/dump_mmap.c
com32/lib/syslinux/dump_movelist.c
com32/lib/syslinux/load_linux.c
com32/lib/syslinux/movebits.c
com32/lib/syslinux/shuffle.c
com32/lib/syslinux/zonelist.c
com32/lib/vdprintf.c
com32/libupload/.gitignore [new file with mode: 0644]
com32/libupload/Makefile [new file with mode: 0644]
com32/libupload/cpio.c [moved from com32/sysdump/cpio.c with 75% similarity]
com32/libupload/ctime.c [moved from com32/sysdump/ctime.c with 100% similarity]
com32/libupload/ctime.h [moved from com32/sysdump/ctime.h with 100% similarity]
com32/libupload/serial.c [moved from com32/sysdump/serial.c with 100% similarity]
com32/libupload/serial.h [moved from com32/sysdump/serial.h with 100% similarity]
com32/libupload/srecsend.h [moved from com32/sysdump/srecsend.h with 100% similarity]
com32/libupload/tftp.h [new file with mode: 0644]
com32/libupload/upload_backend.h [new file with mode: 0644]
com32/libupload/upload_srec.c [moved from com32/sysdump/be_srec.c with 91% similarity]
com32/libupload/upload_tftp.c [moved from com32/sysdump/be_tftp.c with 70% similarity]
com32/libupload/upload_ymodem.c [moved from com32/sysdump/be_ymodem.c with 96% similarity]
com32/libupload/ymodem.txt [moved from com32/sysdump/ymodem.txt with 100% similarity]
com32/libupload/zout.c [moved from com32/sysdump/zout.c with 80% similarity]
com32/libutil/Makefile
com32/libutil/libutil_com.a
com32/libutil/libutil_lnx.a
com32/lua/src/Makefile
com32/lua/src/lua.c32
com32/mboot/Makefile
com32/mboot/map.c
com32/mboot/mboot.c32
com32/menu/Makefile
com32/menu/menu.c32
com32/menu/vesamenu.c32
com32/modules/Makefile
com32/modules/cat.c32
com32/modules/chain.c
com32/modules/chain.c32
com32/modules/config.c32
com32/modules/cpuid.c32
com32/modules/cpuidtest.c32
com32/modules/disk.c32
com32/modules/dmitest.c32
com32/modules/elf.c
com32/modules/elf.c32
com32/modules/ethersel.c
com32/modules/ethersel.c32
com32/modules/host.c32
com32/modules/ifcpu.c32
com32/modules/ifmemdsk.c [new file with mode: 0644]
com32/modules/linux.c32
com32/modules/ls.c32
com32/modules/meminfo.c32
com32/modules/pcitest.c
com32/modules/pcitest.c32
com32/modules/pmload.c
com32/modules/pmload.c32
com32/modules/sdi.c32
com32/modules/vesainfo.c32
com32/modules/vpdtest.c32
com32/modules/zzjson.c [new file with mode: 0644]
com32/rosh/Makefile
com32/rosh/rosh.c32
com32/samples/Makefile
com32/samples/advdump.c32
com32/samples/entrydump.c32
com32/samples/fancyhello.c32
com32/samples/fancyhello.lnx
com32/samples/hello.c32
com32/samples/keytest.c32
com32/samples/keytest.lnx
com32/samples/resolv.c32
com32/samples/serialinfo.c32
com32/sysdump/Makefile
com32/sysdump/acpi.c
com32/sysdump/backend.h [deleted file]
com32/sysdump/cpuid.c
com32/sysdump/data.h [deleted file]
com32/sysdump/dmi.c
com32/sysdump/main.c
com32/sysdump/memmap.c
com32/sysdump/memory.c
com32/sysdump/pci.c
com32/sysdump/sysdump.c32
com32/sysdump/sysdump.h
com32/sysdump/vesa.c
com32/tools/Makefile
core/Makefile
core/diskboot.inc
core/diskfs.inc
core/diskstart.inc
core/head.inc
core/init.inc
core/isolinux-debug.bin
core/isolinux.asm
core/isolinux.bin
core/ldlinux.bin
core/ldlinux.bss
core/ldlinux.sys
core/pxelinux.0
core/pxelinux.bin
core/ui.inc
diag/geodsp/Makefile
diag/geodsp/geodsp1s.lst [deleted file]
diag/geodsp/geodspms.lst [deleted file]
diag/geodsp/mk-lba-img [deleted file]
diag/geodsp/mk-lba-img.c
diag/mbr/Makefile
doc/isolinux.txt
doc/logo/syslinux-100.png [new file with mode: 0644]
dos/Makefile
dos/syslinux.com
dosutil/Makefile
extlinux/Makefile
extlinux/btrfs.h
extlinux/extlinux
extlinux/main.c
gpxe/gpxelinux.0
gpxe/gpxelinuxk.0
libinstaller/Makefile
libinstaller/syslxint.h
libinstaller/syslxmod.c
linux/Makefile
linux/syslinux
linux/syslinux-nomtools
lzo/Makefile
mbr/Makefile
mbr/isohdpfx.S
mbr/isohdpfx.bin
mbr/isohdpfx_c.bin
mbr/isohdpfx_f.bin
mbr/isohdppx.bin
mbr/isohdppx_c.bin
mbr/isohdppx_f.bin
memdisk/Makefile
memdisk/memdisk
memdump/Makefile
memdump/memdump.com
mk/build.mk [moved from MCONFIG.build with 97% similarity]
mk/com32.mk [moved from com32/MCONFIG with 98% similarity]
mk/embedded.mk [moved from MCONFIG.embedded with 98% similarity]
mk/lib.mk [moved from com32/lib/MCONFIG with 98% similarity]
mk/rosh.mk [moved from com32/rosh/MCONFIG with 97% similarity]
mk/syslinux.mk [moved from MCONFIG with 96% similarity]
modules/Makefile
mtools/Makefile
mtools/syslinux
packaging/0001-btrfs-Correctly-determine-the-installation-subvolume.patch [deleted file]
packaging/correct-uuid-link-lib.patch [new file with mode: 0644]
packaging/syslinux.manifest [deleted file]
packaging/syslinux.spec
sample/Makefile
syslinux.spec
utils/Makefile
utils/gethostip
utils/isohybrid
utils/isohybrid.c
utils/isohybrid.h
utils/isohybrid.pl
utils/memdiskfind
utils/ppmtolss16
version
version.gen
version.h
version.mk
win32/syslinux.exe
win64/syslinux64.exe

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..2443538
--- /dev/null
@@ -0,0 +1,49 @@
+*.0
+*.a
+*.bin
+*.bss
+*.c32
+*.com
+*.cp
+*.d
+*.elf
+*.exe
+*.gen
+*.img
+*.img.xz
+*.lib
+*.lnx
+*.lo
+*.lsr
+*.lst
+*.map
+*.o
+*.obj
+*.orig
+*.raw
+*.rej
+*.s
+*.sec
+*.sys
+*_bin.c
+*~
+\#*
+.\#*
+.depend
+/com32/lib/sys/vesa/alphatbl.c
+/diag/geodsp/mk-lba-img
+/extlinux/extlinux
+/memdisk/memdisk
+/mtools/syslinux
+/release
+/sample/syslogo.lss
+/linux/syslinux
+/linux/syslinux-nomtools
+/utils/gethostip
+/utils/isohdpfx.c
+/utils/isohybrid
+/utils/isohybrid.pl
+/utils/memdiskfind
+/utils/mkdiskimage
+/version.h
+/version.mk
index 60a5956..48b3420 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,8 @@
 # Main Makefile for SYSLINUX
 #
 topdir = .
-include $(topdir)/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/syslinux.mk
 -include $(topdir)/version.mk
 
 #
@@ -97,6 +98,13 @@ installer:
 
 installer-local: $(ITARGET) $(BINFILES)
 
+strip:
+       $(MAKE) strip-local
+       set -e ; for i in $(ISUBDIRS); do $(MAKE) -C $$i strip ; done
+       -ls -l $(BOBJECTS) $(IOBJECTS)
+
+strip-local:
+
 version.gen: version version.pl
        $(PERL) version.pl $< $@ '%define < @'
 version.h: version version.pl
diff --git a/NEWS b/NEWS
index 94c47ab..c89da2d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,20 @@ Starting with 1.47, changes marked with SYSLINUX, PXELINUX, ISOLINUX
 or EXTLINUX apply to that specific program only; other changes apply
 to all derivatives.
 
+Changes in 4.05:
+       * HDT updated, and now supports uploading data to a TFTP
+         server.
+       * ISOLINUX: remove the .img file support; it has been broken
+         on virtually all systems since the beginning, and has been
+         totally broken since 4.00 at least.  Use MEMDISK instead.
+       * chain.c32: Support chaining ReactOS' FreeLdr (Shao Miller)
+       * isohybrid: -m option to add support for Mac EFI booting.
+        * ifmemdsk.c32: Choose boot option based on presence of
+         MEMDISK.
+       * Remove bogus distributed mk-lba-img binary.
+       * The Syslinux project has a new, cool logo by Abi
+         "ixxvil" Rasheed (doc/logo/*).
+
 Changes in 4.04:
        * PXELINUX: Fix handling of unqualified DNS names.
        * PXELINUX: Fix timer bug when PXELINUX might be unloaded
index b090c40..da632a1 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = tools lib gpllib libutil modules mboot menu samples rosh cmenu \
+SUBDIRS = libupload tools lib gpllib libutil modules mboot menu samples rosh cmenu \
          hdt gfxboot sysdump lua/src
 
 all tidy dist clean spotless install:
index 794af74..446bbcd 100644 (file)
 
 NOGPL := 1
 
-# This must be defined before MCONFIG is included
+# This must be defined before com32.mk is included
 LIBS   = libmenu/libmenu.a
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
 CFLAGS   += -I./libmenu
 
index 325c718..14bf8fb 100755 (executable)
Binary files a/com32/cmenu/complex.c32 and b/com32/cmenu/complex.c32 differ
index 0cabacb..c5bc1c3 100755 (executable)
Binary files a/com32/cmenu/display.c32 and b/com32/cmenu/display.c32 differ
index e84966d..49fcced 100644 (file)
Binary files a/com32/cmenu/libmenu/com32io.o and b/com32/cmenu/libmenu/com32io.o differ
index fab2367..c77fe15 100644 (file)
Binary files a/com32/cmenu/libmenu/des.o and b/com32/cmenu/libmenu/des.o differ
index 28c4586..daa5b5a 100644 (file)
Binary files a/com32/cmenu/libmenu/help.o and b/com32/cmenu/libmenu/help.o differ
index ea72169..ad5a828 100644 (file)
Binary files a/com32/cmenu/libmenu/libmenu.a and b/com32/cmenu/libmenu/libmenu.a differ
index 3dd53a9..ad5e37e 100644 (file)
Binary files a/com32/cmenu/libmenu/menu.o and b/com32/cmenu/libmenu/menu.o differ
index c8826fa..37c26e6 100644 (file)
Binary files a/com32/cmenu/libmenu/passwords.o and b/com32/cmenu/libmenu/passwords.o differ
index cd56075..8476179 100644 (file)
Binary files a/com32/cmenu/libmenu/syslnx.o and b/com32/cmenu/libmenu/syslnx.o differ
index 07b19c9..119abb4 100644 (file)
Binary files a/com32/cmenu/libmenu/tui.o and b/com32/cmenu/libmenu/tui.o differ
index abed02b..4e731c7 100755 (executable)
Binary files a/com32/cmenu/simple.c32 and b/com32/cmenu/simple.c32 differ
index b46e988..a52fde5 100755 (executable)
Binary files a/com32/cmenu/test.c32 and b/com32/cmenu/test.c32 differ
index 01aeaa1..04c2ec6 100755 (executable)
Binary files a/com32/cmenu/test2.c32 and b/com32/cmenu/test2.c32 differ
index 5513876..38d003c 100644 (file)
@@ -15,7 +15,8 @@
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
 CFLAGS += -fPIE
 
index 73133e1..183115f 100644 (file)
@@ -12,7 +12,8 @@
 ## -----------------------------------------------------------------------
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
 MODULES          = gfxboot.c32
 
index 3749920..35d180a 100644 (file)
@@ -102,6 +102,8 @@ typedef struct __attribute__ ((packed)) {
                                //    0: GFX_CB_MENU_INIT accepts 32 bit addresses
                                //    1: knows about xmem_start, xmem_end
   uint16_t reserved_1;         // 62:
+  uint32_t gfxboot_cwd;                // 64: if set, points to current gfxboot working directory relative
+                               //     to syslinux working directory
 } gfx_config_t;
 
 
@@ -181,6 +183,7 @@ int main(int argc, char **argv)
 {
   int menu_index;
   const union syslinux_derivative_info *sdi;
+  char working_dir[256];
 
   openconsole(&dev_stdcon_r, &dev_stdcon_w);
 
@@ -224,6 +227,10 @@ int main(int argc, char **argv)
     return 0;
   }
 
+  if(getcwd(working_dir, sizeof working_dir)) {
+    gfx_config.gfxboot_cwd = (uint32_t) working_dir;
+  }
+
   if(gfx_init(argv[1])) {
     printf("Error setting up gfxboot\n");
     if(argc > 2) show_message(argv[2]);
@@ -806,6 +813,12 @@ void boot(int index)
   int i, label_len;
   unsigned ipapp;
   const struct syslinux_ipappend_strings *ipappend;
+  char *gfxboot_cwd = (char *) gfx_config.gfxboot_cwd;
+
+  if(gfxboot_cwd) {
+    chdir(gfxboot_cwd);
+    gfx_config.gfxboot_cwd = 0;
+  }
 
   for(menu_ptr = menu; menu_ptr; menu_ptr = menu_ptr->next, index--) {
     if(!index) break;
@@ -922,11 +935,15 @@ void boot_entry(menu_t *menu_ptr, char *arg)
     *skip_nonspaces(s) = 0;
     initrd_arg = s;
   }
+  else if(initrd_arg) {
+    free(s0);
+    initrd_arg = s0 = strdup(initrd_arg);
+  }
 
   if(initrd_arg) {
     initrd = initramfs_init();
 
-    while((t = strsep(&s, ","))) {
+    while((t = strsep(&initrd_arg, ","))) {
       initrd_buf = load_one(t, &initrd_size);
 
       if(!initrd_buf) {
index 1900598..12962c7 100755 (executable)
Binary files a/com32/gfxboot/gfxboot.c32 and b/com32/gfxboot/gfxboot.c32 differ
index 94589f3..bf3ffdb 100644 (file)
@@ -95,4 +95,5 @@ void parse_madt(s_acpi * acpi);
 int search_rsdp(s_acpi *acpi);
 void get_acpi_description_header(uint8_t *q, s_acpi_description_header * adh);
 bool parse_header(uint64_t *address, s_acpi *acpi);
+char *flags_to_string(char *buffer, uint16_t flags);
 #endif
index 53a0808..6a33e9c 100644 (file)
 
 #include <stdbool.h>
 #include <stdint.h>
+#include <stdio.h>
 #include <cpufeature.h>
 #include <sys/bitops.h>
 #include <sys/cpu.h>
+#include <sys/io.h>
 #include <klibc/compiler.h>
 
 #define PAGE_SIZE 4096
 #define CPU_MODEL_SIZE  48
 #define CPU_VENDOR_SIZE 48
 
+#define CPU_FLAGS(m_) \
+m_(bool,  fpu,                         /* Onboard FPU */) \
+m_(bool,  vme,                         /* Virtual Mode Extensions */) \
+m_(bool,  de,                  /* Debugging Extensions */) \
+m_(bool,  pse,                 /* Page Size Extensions */) \
+m_(bool,  tsc,                 /* Time Stamp Counter */) \
+m_(bool,  msr,                 /* Model-Specific Registers, RDMSR, WRMSR */) \
+m_(bool,  pae,                 /* Physical Address Extensions */) \
+m_(bool,  mce,                 /* Machine Check Architecture */) \
+m_(bool,  cx8,                 /* CMPXCHG8 instruction */) \
+m_(bool,  apic,                        /* Onboard APIC */) \
+m_(bool,  sep,                 /* SYSENTER/SYSEXIT */) \
+m_(bool,  mtrr,                        /* Memory Type Range Registers */) \
+m_(bool,  pge,                 /* Page Global Enable */) \
+m_(bool,  mca,                 /* Machine Check Architecture */) \
+m_(bool,  cmov,                        /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */) \
+m_(bool,  pat,                 /* Page Attribute Table */) \
+m_(bool,  pse_36,              /* 36-bit PSEs */) \
+m_(bool,  psn,                 /* Processor serial number */) \
+m_(bool,  clflsh,              /* Supports the CLFLUSH instruction */) \
+m_(bool,  dts,                 /* Debug Trace Store */) \
+m_(bool,  acpi,                        /* ACPI via MSR */) \
+m_(bool,  pbe,                 /* Pending Break Enable */) \
+m_(bool,  mmx,                 /* Multimedia Extensions */) \
+m_(bool,  fxsr,                        /* FXSAVE and FXRSTOR instructions (fast save and restore of FPU context), and CR4.OSFXSR available */) \
+m_(bool,  sse,                 /* Streaming SIMD Extensions */) \
+m_(bool,  sse2,                        /* Streaming SIMD Extensions 2 */) \
+m_(bool,  ss,                  /* CPU self snoop */) \
+m_(bool,  htt,                 /* Hyper-Threading */) \
+m_(bool,  acc,                 /* Automatic clock control */) \
+m_(bool,  syscall,             /* SYSCALL/SYSRET */) \
+m_(bool,  mp,                  /* MP Capable. */) \
+m_(bool,  nx,                  /* Execute Disable */) \
+m_(bool,  mmxext,              /* AMD MMX extensions */) \
+m_(bool,  fxsr_opt,            /* FXSAVE/FXRSTOR optimizations */) \
+m_(bool,  gbpages,             /* "pdpe1gb" GB pages */) \
+m_(bool,  rdtscp,              /* RDTSCP */) \
+m_(bool,  lm,                  /* Long Mode (x86-64) */) \
+m_(bool,  nowext,              /* AMD 3DNow! extensions */) \
+m_(bool,  now,                 /* 3DNow! */) \
+m_(bool,  smp,                 /* A smp configuration has been found */) \
+m_(bool,  pni,                 /* Streaming SIMD Extensions-3 */) \
+m_(bool,  pclmulqd,            /* PCLMULQDQ instruction */) \
+m_(bool,  dtes64,              /* 64-bit Debug Store */) \
+m_(bool,  vmx,                 /* Hardware virtualization */) \
+m_(bool,  smx,                 /* Safer Mode */) \
+m_(bool,  est,                 /* Enhanced SpeedStep */) \
+m_(bool,  tm2,                 /* Thermal Monitor 2  */) \
+m_(bool,  sse3,                        /* Supplemental SSE-3 */) \
+m_(bool,  cid,                 /* Context ID */) \
+m_(bool,  fma,                 /* Fused multiply-add  */) \
+m_(bool,  cx16,                        /* CMPXCHG16B */) \
+m_(bool,  xtpr,                        /* Send Task Priority Messages */) \
+m_(bool,  pdcm,                        /* Performance Capabilities  */) \
+m_(bool,  dca,                 /* Direct Cache Access */) \
+m_(bool,  xmm4_1,              /* "sse4_1" SSE-4.1 */) \
+m_(bool,  xmm4_2,              /* "sse4_2" SSE-4.2 */) \
+m_(bool,  x2apic,              /* x2APIC */) \
+m_(bool,  movbe,                       /* MOVBE instruction */) \
+m_(bool,  popcnt,              /* POPCNT instruction */) \
+m_(bool,  aes,                 /* AES Instruction */) \
+m_(bool,  xsave,                       /* XSAVE/XRSTOR/XSETBV/XGETBV */) \
+m_(bool,  osxsave,             /* XSAVE enabled in the OS */) \
+m_(bool,  avx,                 /* Advanced Vector Extensions */) \
+m_(bool,  hypervisor,          /* Running on a hypervisor */) \
+m_(bool,  ace2,                        /* Advanced Cryptography Engine v2 */) \
+m_(bool,  ace2_en,             /* ACE v2 enabled */) \
+m_(bool,  phe,                 /* PadLock Hash Engine */) \
+m_(bool,  phe_en,              /* PadLock Hash Engine Enabled */) \
+m_(bool,  pmm,                 /* PadLock Montgomery Multiplier */) \
+m_(bool,  pmm_en,              /* PadLock Montgomery Multiplier enabled */) \
+m_(bool,  svm,                 /* Secure virtual machine */) \
+m_(bool,  extapic,             /* Extended APIC space */) \
+m_(bool,  cr8_legacy,          /* CR8 in 32-bit mode */) \
+m_(bool,  abm,                 /* Advanced bit manipulation */) \
+m_(bool,  sse4a,                       /* SSE4-A */) \
+m_(bool,  misalignsse,         /* Misaligned SSE mode */) \
+m_(bool,  nowprefetch,         /* 3DNow prefetch instructions */) \
+m_(bool,  osvw,                        /* OS Visible Workaround */) \
+m_(bool,  ibs,                 /*  Instruction Based Sampling */) \
+m_(bool,  sse5,                        /* SSE5 */) \
+m_(bool,  skinit,              /* SKINIT/STGI instructions */) \
+m_(bool,  wdt,                 /* Watchdog Timer */) \
+m_(bool,  ida,                 /* Intel Dynamic Acceleration */) \
+m_(bool,  arat,                        /* Always Running APIC Timer */) \
+m_(bool,  tpr_shadow,          /* Intel TPR Shadow */) \
+m_(bool,  vnmi,                        /* Intel Virtual NMI */) \
+m_(bool,  flexpriority,                /* Intel FlexPriority */) \
+m_(bool,  ept,                 /* Intel Extended Page Table */) \
+m_(bool,  vpid,                        /* Intel Virtual Processor ID */)
+
+#define STRUCT_MEMBERS(type_, name_, comment_) type_ name_;
+
+#define STRUCT_MEMBER_NAMES(type_, name_, comment_) #name_ , 
+
+#define STRUCTURE_MEMBER_OFFSETS(type_, name_, comment_) \
+         offsetof(s_cpu_flags, name_),
+
 typedef struct {
-    bool fpu;                  /* Onboard FPU */
-    bool vme;                  /* Virtual Mode Extensions */
-    bool de;                   /* Debugging Extensions */
-    bool pse;                  /* Page Size Extensions */
-    bool tsc;                  /* Time Stamp Counter */
-    bool msr;                  /* Model-Specific Registers, RDMSR, WRMSR */
-    bool pae;                  /* Physical Address Extensions */
-    bool mce;                  /* Machine Check Architecture */
-    bool cx8;                  /* CMPXCHG8 instruction */
-    bool apic;                 /* Onboard APIC */
-    bool sep;                  /* SYSENTER/SYSEXIT */
-    bool mtrr;                 /* Memory Type Range Registers */
-    bool pge;                  /* Page Global Enable */
-    bool mca;                  /* Machine Check Architecture */
-    bool cmov;                 /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */
-    bool pat;                  /* Page Attribute Table */
-    bool pse_36;               /* 36-bit PSEs */
-    bool psn;                  /* Processor serial number */
-    bool clflsh;               /* Supports the CLFLUSH instruction */
-    bool dts;                  /* Debug Trace Store */
-    bool acpi;                 /* ACPI via MSR */
-    bool pbe;                  /* Pending Break Enable */
-    bool mmx;                  /* Multimedia Extensions */
-    bool fxsr;                 /* FXSAVE and FXRSTOR instructions (fast save and restore */
-    /* of FPU context), and CR4.OSFXSR available */
-    bool sse;                  /* Streaming SIMD Extensions */
-    bool sse2;                 /* Streaming SIMD Extensions 2 */
-    bool ss;                   /* CPU self snoop */
-    bool htt;                  /* Hyper-Threading */
-    bool acc;                  /* Automatic clock control */
-    bool syscall;              /* SYSCALL/SYSRET */
-    bool mp;                   /* MP Capable. */
-    bool nx;                   /* Execute Disable */
-    bool mmxext;               /* AMD MMX extensions */
-    bool fxsr_opt;             /* FXSAVE/FXRSTOR optimizations */
-    bool gbpages;              /* "pdpe1gb" GB pages */
-    bool rdtscp;               /* RDTSCP */
-    bool lm;                   /* Long Mode (x86-64) */
-    bool nowext;               /* AMD 3DNow! extensions */
-    bool now;                  /* 3DNow! */
-    bool smp;                  /* A smp configuration has been found */
-    bool pni;                  /* Streaming SIMD Extensions-3 */
-    bool pclmulqd;             /* PCLMULQDQ instruction */
-    bool dtes64;               /* 64-bit Debug Store */
-    bool vmx;                  /* Hardware virtualization */
-    bool smx;                  /* Safer Mode */
-    bool est;                  /* Enhanced SpeedStep */
-    bool tm2;                  /* Thermal Monitor 2  */
-    bool sse3;                 /* Supplemental SSE-3 */
-    bool cid;                  /* Context ID */
-    bool fma;                  /* Fused multiply-add  */
-    bool cx16;                 /* CMPXCHG16B */
-    bool xtpr;                 /* Send Task Priority Messages */
-    bool pdcm;                 /* Performance Capabilities  */
-    bool dca;                  /* Direct Cache Access */
-    bool xmm4_1;               /* "sse4_1" SSE-4.1 */
-    bool xmm4_2;               /* "sse4_2" SSE-4.2 */
-    bool x2apic;               /* x2APIC */
-    bool movbe;                        /* MOVBE instruction */
-    bool popcnt;               /* POPCNT instruction */
-    bool aes;                  /* AES Instruction */
-    bool xsave;                        /* XSAVE/XRSTOR/XSETBV/XGETBV */
-    bool osxsave;              /* XSAVE enabled in the OS */
-    bool avx;                  /* Advanced Vector Extensions */
-    bool hypervisor;           /* Running on a hypervisor */
-    bool ace2;                 /* Advanced Cryptography Engine v2 */
-    bool ace2_en;              /* ACE v2 enabled */
-    bool phe;                  /* PadLock Hash Engine */
-    bool phe_en;               /* PadLock Hash Engine Enabled */
-    bool pmm;                  /* PadLock Montgomery Multiplier */
-    bool pmm_en;               /* PadLock Montgomery Multiplier enabled */
-    bool svm;                  /* Secure virtual machine */
-    bool extapic;              /* Extended APIC space */
-    bool cr8_legacy;           /* CR8 in 32-bit mode */
-    bool abm;                  /* Advanced bit manipulation */
-    bool sse4a;                        /* SSE4-A */
-    bool misalignsse;          /* Misaligned SSE mode */
-    bool nowprefetch;          /* 3DNow prefetch instructions */
-    bool osvw;                 /* OS Visible Workaround */
-    bool ibs;                  /*  Instruction Based Sampling */
-    bool sse5;                 /* SSE5 */
-    bool skinit;               /* SKINIT/STGI instructions */
-    bool wdt;                  /* Watchdog Timer */
-    bool ida;                  /* Intel Dynamic Acceleration */
-    bool arat;                 /* Always Running APIC Timer */
-    bool tpr_shadow;           /* Intel TPR Shadow */
-    bool vnmi;                 /* Intel Virtual NMI */
-    bool flexpriority;         /* Intel FlexPriority */
-    bool ept;                  /* Intel Extended Page Table */
-    bool vpid;                 /* Intel Virtual Processor ID */
+    CPU_FLAGS(STRUCT_MEMBERS)
 } s_cpu_flags;
 
+extern size_t cpu_flags_offset[];
+extern const char *cpu_flags_names[];
+extern size_t cpu_flags_count;
+
 typedef struct {
     char vendor[CPU_VENDOR_SIZE];
     uint8_t vendor_id;
@@ -135,6 +150,7 @@ typedef struct {
     s_cpu_flags flags;
 } s_cpu;
 
+extern bool get_cpu_flag_value_from_name(s_cpu *cpu, const char * flag);
 /**********************************************************************************/
 /**********************************************************************************/
 /* From this point this is some internal stuff mainly taken from the linux kernel */
@@ -171,11 +187,37 @@ typedef struct {
 #define X86_VENDOR_RISE 6
 #define X86_VENDOR_TRANSMETA 7
 #define X86_VENDOR_NSC 8
-#define X86_VENDOR_NUM 9
-#define X86_VENDOR_UNKNOWN 0xff
+#define X86_VENDOR_UNKNOWN 9 
+#define X86_VENDOR_NUM 10 
 
 #define cpu_has(c, bit)                test_bit(bit, (c)->x86_capability)
 
+// Taken from asm/processor-flags.h
+// NSC/Cyrix CPU configuration register indexes
+#define CX86_CCR2       0xc2
+#define CX86_CCR3      0xc3
+#define CX86_DIR0       0xfe
+#define CX86_DIR1       0xff
+
+static const char Cx86_model[][9] = {
+       "Cx486", "Cx486", "5x86 ", "6x86", "MediaGX ", "6x86MX ",
+       "M II ", "Unknown"
+};
+
+static const char Cx486_name[][5] = {
+       "SLC", "DLC", "SLC2", "DLC2", "SRx", "DRx",
+       "SRx2", "DRx2"
+};
+
+static const char Cx486S_name[][4] = {
+       "S", "S2", "Se", "S2e"
+};
+
+static const char Cx486D_name[][4] = {
+       "DX", "DX2", "?", "?", "?", "DX4"
+};
+
+
 /*
  *  CPU type and hardware bug flags. Kept separately for each CPU.
  *  Members of this structure are referenced in head.S, so think twice
@@ -260,6 +302,16 @@ struct intel_mp_floating {
     uint8_t mpf_feature5;      /* Unused (0)                   */
 };
 
+static inline uint8_t getCx86(uint8_t reg) {
+       outb(reg, 0x22);
+       return inb(0x23);
+}
+
+static inline void setCx86(uint8_t reg, uint8_t data) {
+       outb(reg, 0x22);
+       outb(data, 0x23);
+}
+
 extern void get_cpu_vendor(struct cpuinfo_x86 *c);
 extern void detect_cpu(s_cpu * cpu);
 #endif
diff --git a/com32/gplinclude/zzjson/zzjson.h b/com32/gplinclude/zzjson/zzjson.h
new file mode 100644 (file)
index 0000000..d4b32e1
--- /dev/null
@@ -0,0 +1,116 @@
+/* ZZJSON - Copyright (C) 2008 by Ivo van Poorten
+ * License: GNU Lesser General Public License version 2.1
+ */
+#ifndef ZZJSON_H
+#define ZZJSON_H
+
+#include <stdlib.h>
+
+/* Version: */
+
+#define ZZJSON_VERSION_MAJOR    1
+#define ZZJSON_VERSION_MINOR    1
+#define ZZJSON_VERSION_MICRO    0
+#define ZZJSON_VERSION_INT      ( 1<<16 | 1<<8 | 0 )
+#define ZZJSON_IDENT            "zzjson 1.1.0"
+
+/* Defines: */
+
+#define ZZJSON_ALLOW_EXTRA_COMMA        1
+#define ZZJSON_ALLOW_ILLEGAL_ESCAPE     2
+#define ZZJSON_ALLOW_CONTROL_CHARS      4
+#define ZZJSON_ALLOW_GARBAGE_AT_END     8
+#define ZZJSON_ALLOW_COMMENTS           16
+
+#define ZZJSON_VERY_LOOSE               (-1)
+#define ZZJSON_VERY_STRICT              0
+
+/* Types: */
+
+/* needed by: pa = parser, pr = printer, f = free, q = query, c = create */
+typedef struct ZZJSON_CONFIG {
+    int strictness;                                        // pa
+    void *ihandle;                                         // pa
+    int (*getchar)(void *ihandle);                         // pa
+    int (*ungetchar)(int c, void *ihandle);                // pa
+    void *(*malloc)(size_t size);                          // pa      c
+    void *(*calloc)(size_t nmemb, size_t size);            // pa      c
+    void (*free)(void *ptr);                               // pa    f c
+    void *(*realloc)(void *ptr, size_t size);              // pa
+    void *ehandle;                                         // pa pr   c
+    void (*error)(void *ehandle, const char *format, ...); // pa pr   c
+    void *ohandle;                                         //    pr
+    int (*print)(void *ohandle, const char *format, ...);  //    pr
+    int (*putchar)(int c, void *handle);                   //    pr
+} ZZJSON_CONFIG;
+
+typedef enum ZZJSON_TYPE {
+    ZZJSON_NONE = 0,
+    ZZJSON_OBJECT,
+    ZZJSON_ARRAY,
+    ZZJSON_STRING,
+    ZZJSON_NUMBER_NEGINT,
+    ZZJSON_NUMBER_POSINT,
+    ZZJSON_NUMBER_DOUBLE,
+    ZZJSON_NULL,
+    ZZJSON_TRUE,
+    ZZJSON_FALSE
+} ZZJSON_TYPE;
+
+typedef struct ZZJSON {
+    ZZJSON_TYPE type;
+    union {
+        struct {
+            char *label;
+            struct ZZJSON *val;
+        } object;
+        struct {
+            struct ZZJSON *val;
+        } array;
+        struct {
+            char *string;
+        } string;
+        struct {
+            union {
+                unsigned long long ival;
+                double             dval;
+            } val;
+        } number;
+    } value;
+    struct ZZJSON *next;
+} ZZJSON;
+
+/* Functions: */
+
+ZZJSON *zzjson_parse(ZZJSON_CONFIG *config);
+void zzjson_free(ZZJSON_CONFIG *config, ZZJSON *zzjson);
+int zzjson_print(ZZJSON_CONFIG *config, ZZJSON *zzjson);
+
+ZZJSON *zzjson_object_find_label(ZZJSON *zzjson, char *label);
+ZZJSON *zzjson_object_find_labels(ZZJSON *zzjson, ...); // end with , NULL
+unsigned int zzjson_object_count(ZZJSON *zzjson);
+unsigned int zzjson_array_count(ZZJSON *zzjson);
+
+ZZJSON *zzjson_create_true(ZZJSON_CONFIG *config);
+ZZJSON *zzjson_create_false(ZZJSON_CONFIG *config);
+ZZJSON *zzjson_create_null(ZZJSON_CONFIG *config);
+ZZJSON *zzjson_create_number_d(ZZJSON_CONFIG *config, double d);
+ZZJSON *zzjson_create_number_i(ZZJSON_CONFIG *config, long long i);
+ZZJSON *zzjson_create_string(ZZJSON_CONFIG *config, char *s);
+
+/* list of ZZJSON *'s and end with , NULL */
+ZZJSON *zzjson_create_array(ZZJSON_CONFIG *config, ...);
+
+/* list of char*,ZZJSON* pairs, end with , NULL */
+ZZJSON *zzjson_create_object(ZZJSON_CONFIG *config, ...);
+
+ZZJSON *zzjson_array_prepend(ZZJSON_CONFIG *config, ZZJSON *array,
+                                                    ZZJSON *val);
+ZZJSON *zzjson_array_append (ZZJSON_CONFIG *config, ZZJSON *array,
+                                                    ZZJSON *val);
+
+ZZJSON *zzjson_object_prepend(ZZJSON_CONFIG *config, ZZJSON *object,
+                                        char *label, ZZJSON *val);
+ZZJSON *zzjson_object_append (ZZJSON_CONFIG *config, ZZJSON *object,
+                                        char *label, ZZJSON *val);
+#endif
index a174061..4b7b846 100644 (file)
@@ -4,11 +4,12 @@
 
 # Include configuration rules
 topdir = ../..
-include ../lib/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/lib.mk
 
-REQFLAGS += -I../gplinclude
+REQFLAGS += -I../gplinclude -I../gplinclude/zzjson
 
-GPLDIRS := . disk dmi vpd acpi
+GPLDIRS := . disk dmi vpd acpi zzjson
 LIBOBJS := $(foreach dir,$(GPLDIRS),$(patsubst %.c,%.o,$(wildcard $(dir)/*.c)))
 
 BINDIR   = /usr/bin
index 8e5ee29..d2bf29e 100644 (file)
 #include <memory.h>
 #include "acpi/acpi.h"
 
+/* M1PS flags have to be interpreted as strings */
+char *flags_to_string(char *buffer, uint16_t flags)
+{
+    memset(buffer, 0, sizeof(buffer));
+    strcpy(buffer, "default");
+    if ((flags & POLARITY_ACTIVE_HIGH) == POLARITY_ACTIVE_HIGH)
+       strcpy(buffer, "high");
+    else if ((flags & POLARITY_ACTIVE_LOW) == POLARITY_ACTIVE_LOW)
+       strcpy(buffer, "low");
+    if ((flags & TRIGGER_EDGE) == TRIGGER_EDGE)
+       strncat(buffer, " edge", 5);
+    else if ((flags & TRIGGER_LEVEL) == TRIGGER_LEVEL)
+       strncat(buffer, " level", 6);
+    else
+       strncat(buffer, " default", 8);
+
+    return buffer;
+}
+
 void dbg_printf(const char *fmt, ...)
 {
        va_list args;
index 2d5b5ce..2abd0bd 100644 (file)
 #include <string.h>
 #include "cpuid.h"
 
+const char *cpu_flags_names[] = {
+    CPU_FLAGS(STRUCT_MEMBER_NAMES)
+};
+
+size_t cpu_flags_offset[] = {
+    CPU_FLAGS(STRUCTURE_MEMBER_OFFSETS)
+};
+
+size_t cpu_flags_count = sizeof cpu_flags_names / sizeof *cpu_flags_names;
+
 struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = { };
 
+bool get_cpu_flag_value_from_name(s_cpu *cpu, const char * flag_name) {
+    size_t i;
+    bool cpu_flag_present=false, *flag_value = &cpu_flag_present;
+
+    for (i = 0; i < cpu_flags_count; i++) {
+       if (strcmp(cpu_flags_names[i],flag_name) == 0) {
+               flag_value = (bool *)((char *)&cpu->flags + cpu_flags_offset[i]);
+       }
+    }
+    return *flag_value;
+}
+
+
 /*
 * CPUID functions returning a single datum
 */
@@ -73,6 +96,48 @@ static struct cpu_dev transmeta_cpu_dev = {
     .c_ident = {"GenuineTMx86", "TransmetaCPU"}
 };
 
+static struct cpu_dev nsc_cpu_dev = {
+    .c_vendor = "National Semiconductor",
+    .c_ident = {"Geode by NSC"}
+};
+
+static struct cpu_dev unknown_cpu_dev = {
+    .c_vendor = "Unknown Vendor",
+    .c_ident = {"Unknown CPU"}
+};
+
+/*
+ * Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU
+ */
+void do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
+{
+       unsigned char ccr2, ccr3;
+
+       /* we test for DEVID by checking whether CCR3 is writable */
+       ccr3 = getCx86(CX86_CCR3);
+       setCx86(CX86_CCR3, ccr3 ^ 0x80);
+       getCx86(0xc0);   /* dummy to change bus */
+
+       if (getCx86(CX86_CCR3) == ccr3) {       /* no DEVID regs. */
+               ccr2 = getCx86(CX86_CCR2);
+               setCx86(CX86_CCR2, ccr2 ^ 0x04);
+               getCx86(0xc0);  /* dummy */
+
+               if (getCx86(CX86_CCR2) == ccr2) /* old Cx486SLC/DLC */
+                       *dir0 = 0xfd;
+               else {                          /* Cx486S A step */
+                       setCx86(CX86_CCR2, ccr2);
+                       *dir0 = 0xfe;
+               }
+       } else {
+               setCx86(CX86_CCR3, ccr3);  /* restore CCR3 */
+
+               /* read DIR0 and DIR1 CPU registers */
+               *dir0 = getCx86(CX86_DIR0);
+               *dir1 = getCx86(CX86_DIR1);
+       }
+}
+
 void init_cpu_devs(void)
 {
     cpu_devs[X86_VENDOR_INTEL] = &intel_cpu_dev;
@@ -83,6 +148,8 @@ void init_cpu_devs(void)
     cpu_devs[X86_VENDOR_CENTAUR] = &centaur_cpu_dev;
     cpu_devs[X86_VENDOR_RISE] = &rise_cpu_dev;
     cpu_devs[X86_VENDOR_TRANSMETA] = &transmeta_cpu_dev;
+    cpu_devs[X86_VENDOR_NSC] = &nsc_cpu_dev;
+    cpu_devs[X86_VENDOR_UNKNOWN] = &unknown_cpu_dev;
 }
 
 void get_cpu_vendor(struct cpuinfo_x86 *c)
@@ -90,7 +157,7 @@ void get_cpu_vendor(struct cpuinfo_x86 *c)
     char *v = c->x86_vendor_id;
     int i;
     init_cpu_devs();
-    for (i = 0; i < X86_VENDOR_NUM; i++) {
+    for (i = 0; i < X86_VENDOR_NUM-1; i++) {
        if (cpu_devs[i]) {
            if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
                (cpu_devs[i]->c_ident[1] &&
@@ -177,6 +244,96 @@ void detect_cache(uint32_t xlvl, struct cpuinfo_x86 *c)
     c->x86_l2_cache_size = l2size;
 }
 
+void detect_cyrix(struct cpuinfo_x86 *c) {
+       unsigned char dir0, dir0_msn, dir0_lsn, dir1 = 0;
+        char *buf = c->x86_model_id;
+       char Cx86_cb[] = "?.5x Core/Bus Clock";
+       const char cyrix_model_mult1[] = "12??43";
+       const char cyrix_model_mult2[] = "12233445";
+        const char *p = NULL;
+
+       do_cyrix_devid(&dir0, &dir1);
+       dir0_msn = dir0 >> 4; /* identifies CPU "family"   */
+       dir0_lsn = dir0 & 0xf;                /* model or clock multiplier */
+       c->x86_model = (dir1 >> 4) + 1;
+        c->x86_mask = dir1 & 0xf;
+       switch (dir0_msn) {
+               unsigned char tmp;
+
+               case 0: /* Cx486SLC/DLC/SRx/DRx */
+                        p = Cx486_name[dir0_lsn & 7];
+                        break;
+       
+               case 1: /* Cx486S/DX/DX2/DX4 */
+                        p = (dir0_lsn & 8) ? Cx486D_name[dir0_lsn & 5] : Cx486S_name[dir0_lsn & 3];
+                        break;
+
+                case 2: /* 5x86 */
+                        Cx86_cb[2] = cyrix_model_mult1[dir0_lsn & 5];
+                        p = Cx86_cb+2;
+                        break;
+
+               case 3: /* 6x86/6x86L */
+                          Cx86_cb[1] = ' ';
+                          Cx86_cb[2] = cyrix_model_mult1[dir0_lsn & 5];
+                          if (dir1 > 0x21) { /* 686L */
+                                  Cx86_cb[0] = 'L';
+                                  p = Cx86_cb;
+                                  (c->x86_model)++;
+                          } else             /* 686 */
+                                  p = Cx86_cb+1;
+                          
+                          c->coma_bug = 1;
+                          break;
+               case 4:
+                          c->x86_l1_data_cache_size = 16; /* Yep 16K integrated cache thats it */
+                          if (c->cpuid_level != 2) { /* Media GX */
+                                  Cx86_cb[2] = (dir0_lsn & 1) ? '3' : '4';
+                                  p = Cx86_cb+2;
+                          }
+                          break;
+               
+               case 5: /* 6x86MX/M II */
+                          if (dir1 > 7) {
+                                  dir0_msn++;  /* M II */
+                          } else {
+                                  c->coma_bug = 1;      /* 6x86MX, it has the bug. */
+                          }
+
+                          tmp = (!(dir0_lsn & 7) || dir0_lsn & 1) ? 2 : 0;
+                          Cx86_cb[tmp] = cyrix_model_mult2[dir0_lsn & 7];
+                          p = Cx86_cb+tmp;
+                          if (((dir1 & 0x0f) > 4) || ((dir1 & 0xf0) == 0x20))
+                                  (c->x86_model)++;
+                          break;
+               
+               case 0xf:  /* Cyrix 486 without DEVID registers */
+                          switch (dir0_lsn) {
+                                  case 0xd:  /* either a 486SLC or DLC w/o DEVID */
+                                          dir0_msn = 0; 
+                                          p = Cx486_name[(c->hard_math) ? 1 : 0];
+                                          break;
+                                  
+                                  case 0xe:  /* a 486S A step */
+                                          dir0_msn = 0;
+                                          p = Cx486S_name[0];
+                                          break;
+                          }
+                          break;
+                          
+               default:
+                          dir0_msn = 7;
+                          break;
+       }
+
+       /* If the processor is unknown, we keep the model name we got
+        * from the generic call */
+       if (dir0_msn < 7) {     
+               strcpy(buf, Cx86_model[dir0_msn & 7]);
+               if (p) strcat(buf, p);
+       }
+}
+
 void generic_identify(struct cpuinfo_x86 *c)
 {
     uint32_t tfms, xlvl;
@@ -222,6 +379,13 @@ void generic_identify(struct cpuinfo_x86 *c)
            get_model_name(c);  /* Default name */
     }
 
+    /* Specific detection code */
+    switch (c->x86_vendor) {
+           case X86_VENDOR_CYRIX:
+           case X86_VENDOR_NSC: detect_cyrix(c); break;
+           default: break;
+    }
+
     /* Detecting the number of cores */
     switch (c->x86_vendor) {
     case X86_VENDOR_AMD:
@@ -435,17 +599,12 @@ void set_generic_info(struct cpuinfo_x86 *c, s_cpu * cpu)
 void detect_cpu(s_cpu * cpu)
 {
     struct cpuinfo_x86 c;
+    memset(&c,0,sizeof(c));
     c.x86_clflush_size = 32;
-    c.x86_l1_data_cache_size = 0;
-    c.x86_l1_instruction_cache_size = 0;
-    c.x86_l2_cache_size = 0;
     c.x86_vendor = X86_VENDOR_UNKNOWN;
     c.cpuid_level = -1;                /* CPUID not detected */
-    c.x86_model = c.x86_mask = 0;      /* So far unknown... */
     c.x86_num_cores = 1;
-    memset(&c.x86_capability, 0, sizeof(c.x86_capability));
-    memset(&c.x86_vendor_id, 0, sizeof(c.x86_vendor_id));
-    memset(&c.x86_model_id, 0, sizeof(c.x86_model_id));
+    memset(&cpu->flags, 0, sizeof(s_cpu_flags));
 
     if (!have_cpuid_p())
        return;
diff --git a/com32/gpllib/zzjson/zzjson_create.c b/com32/gpllib/zzjson/zzjson_create.c
new file mode 100644 (file)
index 0000000..7e6bd5b
--- /dev/null
@@ -0,0 +1,240 @@
+/* JSON Create ZZJSON structures
+ * ZZJSON - Copyright (C) 2008 by Ivo van Poorten
+ * License: GNU Lesser General Public License version 2.1
+ */
+
+#include "zzjson.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#ifdef CONFIG_NO_ERROR_MESSAGES
+#define ERROR(x...)
+#else
+#define ERROR(x...)     config->error(config->ehandle, ##x)
+#endif
+#define MEMERROR()      ERROR("out of memory")
+
+static ZZJSON *zzjson_create_templ(ZZJSON_CONFIG *config, ZZJSON_TYPE type) {
+    ZZJSON *zzjson = config->calloc(1, sizeof(ZZJSON));
+    if (!zzjson) MEMERROR();
+    else         zzjson->type = type;
+    return zzjson;
+}
+
+ZZJSON *zzjson_create_true(ZZJSON_CONFIG *config) {
+    return zzjson_create_templ(config, ZZJSON_TRUE);
+}
+
+ZZJSON *zzjson_create_false(ZZJSON_CONFIG *config) {
+    return zzjson_create_templ(config, ZZJSON_FALSE);
+}
+
+ZZJSON *zzjson_create_null(ZZJSON_CONFIG *config) {
+    return zzjson_create_templ(config, ZZJSON_NULL);
+}
+
+ZZJSON *zzjson_create_number_d(ZZJSON_CONFIG *config, double d) {
+    ZZJSON *zzjson = zzjson_create_templ(config, ZZJSON_NUMBER_DOUBLE);
+    if (zzjson)
+        zzjson->value.number.val.dval = d;
+    return zzjson;
+}
+
+ZZJSON *zzjson_create_number_i(ZZJSON_CONFIG *config, long long i) {
+    ZZJSON *zzjson = zzjson_create_templ(config, ZZJSON_NUMBER_NEGINT);
+    if (zzjson) {
+        zzjson->type = i<0LL ? ZZJSON_NUMBER_NEGINT : ZZJSON_NUMBER_POSINT;
+        zzjson->value.number.val.ival = llabs(i);
+    }
+    return zzjson;
+}
+
+/* sdup mimics strdup, but avoids having another function pointer in config */
+static char *sdup(ZZJSON_CONFIG *config, char *s) {
+    size_t slen = strlen(s)+1;
+    char *scopy = config->malloc(slen);
+
+    if (!scopy) MEMERROR();
+    else        memcpy(scopy, s, slen);
+    return scopy;
+}
+
+ZZJSON *zzjson_create_string(ZZJSON_CONFIG *config, char *s) {
+    ZZJSON *zzjson = NULL;
+    char *scopy;
+        
+    if (!(scopy = sdup(config,s))) return zzjson;
+
+    if ((zzjson = zzjson_create_templ(config, ZZJSON_STRING)))
+        zzjson->value.string.string = scopy;
+    else
+        config->free(scopy);
+
+    return zzjson;
+}
+
+ZZJSON *zzjson_create_array(ZZJSON_CONFIG *config, ...) {
+    ZZJSON *zzjson, *retval, *val;
+    va_list ap;
+
+    if (!(zzjson = zzjson_create_templ(config, ZZJSON_ARRAY))) return zzjson;
+    retval = zzjson;
+
+    va_start(ap, config);
+    val = va_arg(ap, ZZJSON *);
+    while (val) {
+        zzjson->value.array.val = val;
+        val = va_arg(ap, ZZJSON *);
+
+        if (val) {
+            ZZJSON *next = zzjson_create_templ(config, ZZJSON_ARRAY);
+            if (!next) {
+                while (retval) {
+                    next = retval->next;
+                    config->free(retval);
+                    retval = next;
+                }
+                break;
+            }
+            zzjson->next = next;
+            zzjson = next;
+        }
+    }
+    va_end(ap);
+    return retval;
+}
+
+ZZJSON *zzjson_create_object(ZZJSON_CONFIG *config, ...) {
+    ZZJSON *zzjson, *retval, *val;
+    char *label, *labelcopy;
+    va_list ap;
+
+    if (!(zzjson = zzjson_create_templ(config, ZZJSON_OBJECT))) return zzjson;
+    retval = zzjson;
+
+    va_start(ap, config);
+    label = va_arg(ap, char *);
+    while (label) {
+        val = va_arg(ap, ZZJSON *);
+        labelcopy = sdup(config, label);
+
+        if (!labelcopy) {
+            zzjson_free(config, retval);
+            retval = NULL;
+            break;
+        }
+
+        zzjson->value.object.label  = labelcopy;
+        zzjson->value.object.val    = val;
+
+        label = va_arg(ap, char *);
+
+        if (label) {
+            ZZJSON *next = zzjson_create_templ(config, ZZJSON_OBJECT);
+            if (!next) {
+                while (retval) {
+                    next = retval->next;
+                    config->free(retval->value.object.label);
+                    config->free(retval);
+                    retval = next;
+                }
+                break;
+            }
+            zzjson->next = next;
+            zzjson = next;
+        }
+    }
+    va_end(ap);
+    return retval;
+}
+
+ZZJSON *zzjson_array_prepend(ZZJSON_CONFIG *config, ZZJSON *array,
+                                                    ZZJSON *val) {
+    ZZJSON *zzjson;
+
+    if (!array->value.array.val) { /* empty array */
+        array->value.array.val = val;
+        return array;
+    }
+
+    zzjson = zzjson_create_templ(config, ZZJSON_ARRAY);
+    if (zzjson) {
+        zzjson->value.array.val = val;
+        zzjson->next = array;
+    }
+    return zzjson;
+}
+
+ZZJSON *zzjson_array_append(ZZJSON_CONFIG *config, ZZJSON *array,
+                                                   ZZJSON *val) {
+    ZZJSON *retval = array, *zzjson;
+
+    if (!array->value.array.val) { /* empty array */
+        array->value.array.val = val;
+        return array;
+    }
+
+    zzjson = zzjson_create_templ(config, ZZJSON_ARRAY);
+    if (!zzjson) return NULL;
+
+    while (array->next) array = array->next;
+
+    zzjson->value.array.val = val;
+    array->next = zzjson;
+
+    return retval;
+}
+
+ZZJSON *zzjson_object_prepend(ZZJSON_CONFIG *config, ZZJSON *object,
+                              char *label, ZZJSON *val) {
+    ZZJSON *zzjson = NULL;
+    char *labelcopy = sdup(config, label);
+
+    if (!labelcopy) return zzjson;
+
+    if (!object->value.object.label) { /* empty object */
+        object->value.object.label  = labelcopy;
+        object->value.object.val    = val;
+        return object;
+    }
+
+    zzjson = zzjson_create_templ(config, ZZJSON_OBJECT);
+    if (zzjson) {
+        zzjson->value.object.label  = labelcopy;
+        zzjson->value.object.val    = val;
+        zzjson->next = object;
+    } else {
+        config->free(labelcopy);
+    }
+    return zzjson;
+}
+
+ZZJSON *zzjson_object_append(ZZJSON_CONFIG *config, ZZJSON *object,
+                             char *label, ZZJSON *val) {
+    ZZJSON *retval = object, *zzjson = NULL;
+    char *labelcopy = sdup(config, label);
+
+    if (!labelcopy) return zzjson;
+
+    if (!object->value.object.label) { /* empty object */
+        object->value.object.label  = labelcopy;
+        object->value.object.val    = val;
+        return object;
+    }
+
+    zzjson = zzjson_create_templ(config, ZZJSON_OBJECT);
+    if (!zzjson) {
+        config->free(labelcopy);
+        return NULL;
+    }
+
+    while (object->next) object = object->next;
+
+    zzjson->value.object.label  = labelcopy;
+    zzjson->value.object.val    = val;
+    object->next = zzjson;
+
+    return retval;
+}
+
diff --git a/com32/gpllib/zzjson/zzjson_free.c b/com32/gpllib/zzjson/zzjson_free.c
new file mode 100644 (file)
index 0000000..01dfd24
--- /dev/null
@@ -0,0 +1,29 @@
+/* JSON free
+ * ZZJSON - Copyright (C) 2008 by Ivo van Poorten
+ * License: GNU Lesser General Public License version 2.1
+ */
+
+#include "zzjson.h"
+
+void zzjson_free(ZZJSON_CONFIG *config, ZZJSON *zzjson) {
+    while (zzjson) {
+        ZZJSON *next;
+        switch(zzjson->type) {
+            case ZZJSON_OBJECT:
+                config->free(zzjson->value.object.label);
+                zzjson_free(config, zzjson->value.object.val);
+                break;
+            case ZZJSON_ARRAY:
+                zzjson_free(config, zzjson->value.array.val);
+                break;
+            case ZZJSON_STRING:
+                config->free(zzjson->value.string.string);
+                break;
+            default:
+                break;
+        }
+        next = zzjson->next;
+        config->free(zzjson);
+        zzjson = next;
+    }
+}
diff --git a/com32/gpllib/zzjson/zzjson_parse.c b/com32/gpllib/zzjson/zzjson_parse.c
new file mode 100644 (file)
index 0000000..ecb6f61
--- /dev/null
@@ -0,0 +1,490 @@
+/* JSON Parser
+ * ZZJSON - Copyright (C) 2008-2009 by Ivo van Poorten
+ * License: GNU Lesser General Public License version 2.1
+ */
+
+#include "zzjson.h"
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+#include <stdio.h>
+
+#define GETC()          config->getchar(config->ihandle)
+#define UNGETC(c)       config->ungetchar(c, config->ihandle)
+#define SKIPWS()        skipws(config)
+#ifdef CONFIG_NO_ERROR_MESSAGES
+#define ERROR(x...)
+#else
+#define ERROR(x...)     config->error(config->ehandle, ##x)
+#endif
+#define MEMERROR()      ERROR("out of memory")
+
+#define ALLOW_EXTRA_COMMA    (config->strictness & ZZJSON_ALLOW_EXTRA_COMMA)
+#define ALLOW_ILLEGAL_ESCAPE (config->strictness & ZZJSON_ALLOW_ILLEGAL_ESCAPE)
+#define ALLOW_CONTROL_CHARS  (config->strictness & ZZJSON_ALLOW_CONTROL_CHARS)
+#define ALLOW_GARBAGE_AT_END (config->strictness & ZZJSON_ALLOW_GARBAGE_AT_END)
+#define ALLOW_COMMENTS       (config->strictness & ZZJSON_ALLOW_COMMENTS)
+
+static ZZJSON *parse_array(ZZJSON_CONFIG *config);
+static ZZJSON *parse_object(ZZJSON_CONFIG *config);
+
+static void skipws(ZZJSON_CONFIG *config) {
+    int d, c = GETC();
+morews:
+    while (isspace(c)) c = GETC();
+    if (!ALLOW_COMMENTS) goto endws;
+    if (c != '/') goto endws;
+    d = GETC();
+    if (d != '*') goto endws; /* pushing back c will generate a parse error */
+    c = GETC();
+morecomments:
+    while (c != '*') {
+        if (c == EOF) goto endws;
+        c = GETC();
+    }
+    c = GETC();
+    if (c != '/') goto morecomments;
+    c = GETC();
+    if (isspace(c) || c == '/') goto morews;
+endws:
+    UNGETC(c);
+}
+
+static char *parse_string(ZZJSON_CONFIG *config) {
+    unsigned int len = 16, pos = 0;
+    int c;
+    char *str = NULL;
+
+    SKIPWS();
+    c = GETC();
+    if (c != '"') {
+        ERROR("string: expected \" at the start");
+        return NULL;
+    }
+
+    str = config->malloc(len);
+    if (!str) {
+        MEMERROR();
+        return NULL;
+    }
+    c = GETC();
+    while (c > 0 && c != '"') {
+        if (!ALLOW_CONTROL_CHARS && c >= 0 && c <= 31) {
+            ERROR("string: control characters not allowed");
+            goto errout;
+        }
+        if (c == '\\') {
+            c = GETC();
+            switch (c) {
+                case 'b': c = '\b'; break;
+                case 'f': c = '\f'; break;
+                case 'n': c = '\n'; break;
+                case 'r': c = '\r'; break;
+                case 't': c = '\t'; break;
+                case 'u': {
+                    UNGETC(c);    /* ignore \uHHHH, copy verbatim */
+                    c = '\\';
+                    break;
+                }
+                case '\\': case '/': case '"':
+                          break;
+                default:
+                    if (!ALLOW_ILLEGAL_ESCAPE) {
+                        ERROR("string: illegal escape character");
+                        goto errout;
+                    }
+            }
+        }
+        str[pos++] = c;
+        if (pos == len-1) {
+            void *tmp = str;
+            len *= 2;
+            str = config->realloc(str, len);
+            if (!str) {
+                MEMERROR();
+                str = tmp;
+                goto errout;
+            }
+        }
+        c = GETC();
+    }
+    if (c != '"') {
+        ERROR("string: expected \" at the end");
+        goto errout;
+    }
+    str[pos] = 0;
+    return str;
+
+errout:
+    config->free(str);
+    return NULL;
+}
+
+static ZZJSON *parse_string2(ZZJSON_CONFIG *config) {
+    ZZJSON *zzjson = NULL;
+    char *str;
+
+    str = parse_string(config);
+    if (str) {
+        zzjson = config->calloc(1, sizeof(ZZJSON));
+        if (!zzjson) {
+            MEMERROR();
+            config->free(str);
+            return NULL;
+        }
+        zzjson->type = ZZJSON_STRING;
+        zzjson->value.string.string = str;
+    }
+    return zzjson;
+}
+
+static ZZJSON *parse_number(ZZJSON_CONFIG *config) {
+    ZZJSON *zzjson;
+    unsigned long long ival = 0, expo = 0;
+    double dval = 0.0, frac = 0.0, fracshft = 10.0;
+    int c, dbl = 0, sign = 1, signexpo = 1;
+
+    SKIPWS();
+    c = GETC();
+    if (c == '-') {
+        sign = -1;
+        c = GETC();
+    }
+    if (c == '0') {
+        c = GETC();
+        goto skip;
+    }
+
+    if (!isdigit(c)) {
+        ERROR("number: digit expected");
+        return NULL;
+    }
+
+    while (isdigit(c)) {
+        ival *= 10;
+        ival += c - '0';
+        c = GETC();
+    }
+
+skip:
+    if (c != '.') goto skipfrac;
+
+    dbl = 1;
+
+    c = GETC();
+    if (!isdigit(c)) {
+        ERROR("number: digit expected");
+        return NULL;
+    }
+
+    while (isdigit(c)) {
+        frac += (double)(c - '0') / fracshft;
+        fracshft *= 10.0;
+        c = GETC();
+    }
+
+skipfrac:
+    if (c != 'e' && c != 'E') goto skipexpo;
+
+    dbl = 1;
+
+    c = GETC();
+    if (c == '+')
+        c = GETC();
+    else if (c == '-') {
+        signexpo = -1;
+        c = GETC();
+    }
+
+    if (!isdigit(c)) {
+        ERROR("number: digit expected");
+        return NULL;
+    }
+
+    while (isdigit(c)) {
+        expo *= 10;
+        expo += c - '0';
+        c = GETC();
+    }
+
+skipexpo:
+    UNGETC(c);
+
+    if (dbl) {
+        dval = sign * (long long) ival;
+        dval += sign * frac;
+        dval *= pow(10.0, (double) signexpo * expo);
+    }
+
+    zzjson = config->calloc(1, sizeof(ZZJSON));
+    if (!zzjson) {
+        MEMERROR();
+        return NULL;
+    }
+    if (dbl) {
+        zzjson->type = ZZJSON_NUMBER_DOUBLE;
+        zzjson->value.number.val.dval = dval;
+    } else {
+        zzjson->type = sign < 0 ? ZZJSON_NUMBER_NEGINT : ZZJSON_NUMBER_POSINT;
+        zzjson->value.number.val.ival = ival;
+    }
+    
+    return zzjson;
+}
+
+static ZZJSON *parse_literal(ZZJSON_CONFIG *config, char *s, ZZJSON_TYPE t) {
+    char b[strlen(s)+1];
+    unsigned int i;
+
+    for (i=0; i<strlen(s); i++) b[i] = GETC();
+    b[i] = 0;
+
+    if (!strcmp(b,s)) {
+        ZZJSON *zzjson;
+        zzjson = config->calloc(1, sizeof(ZZJSON));
+        if (!zzjson) {
+            MEMERROR();
+            return NULL;
+        }
+        zzjson->type = t;
+        return zzjson;
+    }
+    ERROR("literal: expected %s", s);
+    return NULL;
+}
+
+static ZZJSON *parse_true(ZZJSON_CONFIG *config) {
+    return parse_literal(config, (char *)"true", ZZJSON_TRUE);
+}
+
+static ZZJSON *parse_false(ZZJSON_CONFIG *config) {
+    return parse_literal(config, (char *)"false", ZZJSON_FALSE);
+}
+
+static ZZJSON *parse_null(ZZJSON_CONFIG *config) {
+    return parse_literal(config, (char *)"null", ZZJSON_NULL);
+}
+
+static ZZJSON *parse_value(ZZJSON_CONFIG *config) {
+    ZZJSON *retval = NULL;
+    int c;
+
+    SKIPWS();
+    c = GETC();
+    UNGETC(c);
+    switch (c) {
+        case '"':   retval = parse_string2(config); break;
+        case '0': case '1': case '2': case '3': case '4': case '5':
+        case '6': case '7': case '8': case '9': case '-':
+                    retval = parse_number(config); break;
+        case '{':   retval = parse_object(config); break;
+        case '[':   retval = parse_array(config); break;
+        case 't':   retval = parse_true(config); break;
+        case 'f':   retval = parse_false(config); break;
+        case 'n':   retval = parse_null(config); break;
+    }
+
+    if (!retval) {
+        ERROR("value: invalid value");
+        return retval;
+    }
+
+    return retval;
+}
+
+static ZZJSON *parse_array(ZZJSON_CONFIG *config) {
+    ZZJSON *retval = NULL, **next = &retval;
+    int c;
+
+    SKIPWS();
+    c = GETC();
+    if (c != '[') {
+        ERROR("array: expected '['");
+        return NULL;
+    }
+
+    SKIPWS();
+    c = GETC();
+    while (c > 0 && c != ']') {
+        ZZJSON *zzjson = NULL, *val = NULL;
+
+        UNGETC(c);
+
+        SKIPWS();
+        val = parse_value(config);
+        if (!val) {
+            ERROR("array: value expected");
+            goto errout;
+        }
+
+        SKIPWS();
+        c = GETC();
+        if (c != ',' && c != ']') {
+            ERROR("array: expected ',' or ']'");
+errout_with_val:
+            zzjson_free(config, val);
+            goto errout;
+        }
+        if (c == ',') {
+            SKIPWS();
+            c = GETC();
+            if (c == ']' && !ALLOW_EXTRA_COMMA) {
+                ERROR("array: expected value after ','");
+                goto errout_with_val;
+            }
+        }
+        UNGETC(c);
+
+        zzjson = config->calloc(1, sizeof(ZZJSON));
+        if (!zzjson) {
+            MEMERROR();
+            zzjson_free(config, val);
+            goto errout_with_val;
+        }
+        zzjson->type            = ZZJSON_ARRAY;
+        zzjson->value.array.val = val;
+        *next = zzjson;
+        next = &zzjson->next;
+
+        c = GETC();
+    }
+
+    if (c != ']') {
+        ERROR("array: expected ']'");
+        goto errout;
+    }
+
+    if (!retval) {  /* empty array, [ ] */
+        retval = config->calloc(1, sizeof(ZZJSON));
+        if (!retval) {
+            MEMERROR();
+            return NULL;
+        }
+        retval->type = ZZJSON_ARRAY;
+    }
+            
+    return retval;
+
+errout:
+    zzjson_free(config, retval);
+    return NULL;
+}
+
+static ZZJSON *parse_object(ZZJSON_CONFIG *config) {
+    ZZJSON *retval = NULL;
+    int c;
+    ZZJSON **next = &retval;
+
+    SKIPWS();
+    c = GETC();
+    if (c != '{') {
+        ERROR("object: expected '{'");
+        return NULL;
+    }
+
+    SKIPWS();
+    c = GETC();
+    while (c > 0 && c != '}') {
+        ZZJSON *zzjson = NULL, *val = NULL;
+        char *str;
+
+        UNGETC(c);
+
+        str = parse_string(config);
+        if (!str) {
+            ERROR("object: expected string");
+errout_with_str:
+            config->free(str);
+            goto errout;
+        }
+
+        SKIPWS();
+        c = GETC();
+        if (c != ':') {
+            ERROR("object: expected ':'");
+            goto errout_with_str;
+        }
+
+        SKIPWS();
+        val = parse_value(config);
+        if (!val) {
+            ERROR("object: value expected");
+            goto errout_with_str;
+        }
+
+        SKIPWS();
+        c = GETC();
+        if (c != ',' && c != '}') {
+            ERROR("object: expected ',' or '}'");
+errout_with_str_and_val:
+            zzjson_free(config, val);
+            goto errout_with_str;
+        }
+        if (c == ',') {
+            SKIPWS();
+            c = GETC();
+            if (c == '}' && !ALLOW_EXTRA_COMMA) {
+                ERROR("object: expected pair after ','");
+                goto errout_with_str_and_val;
+            }
+        }
+        UNGETC(c);
+
+        zzjson = config->calloc(1, sizeof(ZZJSON));
+        if (!zzjson) {
+            MEMERROR();
+            goto errout_with_str_and_val;
+        }
+        zzjson->type                = ZZJSON_OBJECT;
+        zzjson->value.object.label  = str;
+        zzjson->value.object.val    = val;
+        *next = zzjson;
+        next = &zzjson->next;
+
+        c = GETC();
+    }
+
+    if (c != '}') {
+        ERROR("object: expected '}'");
+        goto errout;
+    }
+
+    if (!retval) {  /* empty object, { } */
+        retval = config->calloc(1, sizeof(ZZJSON));
+        if (!retval) {
+            MEMERROR();
+            return NULL;
+        }
+        retval->type = ZZJSON_OBJECT;
+    }
+            
+    return retval;
+
+errout:
+    zzjson_free(config, retval);
+    return NULL;
+}
+
+ZZJSON *zzjson_parse(ZZJSON_CONFIG *config) {
+    ZZJSON *retval;
+    int c;
+
+    SKIPWS();   
+    c = GETC();
+    UNGETC(c);
+    if (c == '[')       retval = parse_array(config);
+    else if (c == '{')  retval = parse_object(config);
+    else                { ERROR("expected '[' or '{'"); return NULL; }
+
+    if (!retval) return NULL;
+
+    SKIPWS();
+    c = GETC();
+    if (c >= 0 && !ALLOW_GARBAGE_AT_END) {
+        ERROR("parse: garbage at end of file");
+        zzjson_free(config, retval);
+        return NULL;
+    }
+
+    return retval;
+}
diff --git a/com32/gpllib/zzjson/zzjson_print.c b/com32/gpllib/zzjson/zzjson_print.c
new file mode 100644 (file)
index 0000000..a59b3b0
--- /dev/null
@@ -0,0 +1,110 @@
+/* JSON Printer
+ * ZZJSON - Copyright (C) 2008 by Ivo van Poorten
+ * License: GNU Lesser General Public License version 2.1
+ */
+
+#include "zzjson.h"
+
+#define PRINT(fmt...) if (config->print(config->ohandle, ##fmt) < 0) return -1;
+//#define PUTC(c)       if (config->putchar(c, config->ohandle) < 0) return -1;
+#define PUTC(c)       PRINT("%c",c)
+#define INC 4
+
+static int print_string(ZZJSON_CONFIG *config, char *s) {
+    int c, bs;
+    if (!s) return 0;
+    while ((c = *s++)) {
+        bs = 1;
+        switch (c) {
+//            case '/':                 // useless escape of forward slash
+            case '\\':
+                if (*s == 'u') bs = 0;  // copy \uHHHH verbatim
+                break;
+            case '"':               break;
+            case '\b':  c = 'b';    break;
+            case '\f':  c = 'f';    break;
+            case '\n':  c = 'n';    break;
+            case '\r':  c = 'r';    break;
+            case '\t':  c = 't';    break;
+            default:    bs = 0;     break;
+        }
+        if (bs) PUTC('\\');
+        PUTC(c);
+    }
+    return 0;
+}
+
+static int zzjson_print2(ZZJSON_CONFIG *config, ZZJSON *zzjson,
+                 unsigned int indent, unsigned int objval) {
+    char c = 0, d = 0;
+    if (!zzjson) return -1;
+
+    switch(zzjson->type) {
+        case ZZJSON_OBJECT: c = '{'; d = '}'; break;
+        case ZZJSON_ARRAY:  c = '['; d = ']'; break;
+        default: break;
+    }
+
+    if (c) PRINT("%s%*s%c", indent ? "\n" : "", indent, "", c);
+
+    while (zzjson) {
+        switch(zzjson->type) {
+        case ZZJSON_OBJECT:
+            if (zzjson->value.object.val) {
+                PRINT("\n%*s\"", indent+INC, "");
+                if (print_string(config, zzjson->value.object.label) < 0)
+                    return -1;
+                PRINT("\" :");
+                if (zzjson_print2(config, zzjson->value.object.val,
+                                                indent+INC, 1) < 0) return -1;
+            }
+            break;
+        case ZZJSON_ARRAY:
+            if (zzjson->value.array.val)
+                if (zzjson_print2(config, zzjson->value.array.val,
+                                                indent+INC, 0) < 0) return -1;
+            break;
+        case ZZJSON_STRING:
+            PRINT(objval ? " \"" : "\n%*s\"", indent, "");
+            if (print_string(config, zzjson->value.string.string)<0) return -1;
+            PUTC('"');
+            break;
+        case ZZJSON_FALSE:
+            PRINT(objval ? " false" : "\n%*sfalse", indent, "");
+            break;
+        case ZZJSON_NULL:
+            PRINT(objval ? " null" : "\n%*snull", indent, "");
+            break;
+        case ZZJSON_TRUE:
+            PRINT(objval ? " true" : "\n%*strue", indent, "");
+            break;
+        case ZZJSON_NUMBER_NEGINT:
+        case ZZJSON_NUMBER_POSINT:
+        case ZZJSON_NUMBER_DOUBLE:
+            PRINT(objval ? " " : "\n%*s", indent, "");
+            if (zzjson->type == ZZJSON_NUMBER_DOUBLE) {
+                PRINT("%16.16e", zzjson->value.number.val.dval);
+            } else {
+                if (zzjson->type == ZZJSON_NUMBER_NEGINT) PUTC('-');
+                PRINT("%llu", zzjson->value.number.val.ival);
+            }
+        default:
+            break;
+        }
+        zzjson = zzjson->next;
+        if (zzjson) PUTC(',');
+    }
+
+    if (d) PRINT("\n%*s%c", indent, "", d);
+
+    return 0;
+}
+
+int zzjson_print(ZZJSON_CONFIG *config, ZZJSON *zzjson) {
+    int retval = zzjson_print2(config, zzjson, 0, 0);
+//    if (retval >= 0) retval = config->putchar('\n', config->ohandle);
+#ifndef CONFIG_NO_ERROR_MESSAGES
+    if (retval <  0) config->error(config->ehandle, "print: unable to print");
+#endif
+    return retval;
+}
diff --git a/com32/gpllib/zzjson/zzjson_query.c b/com32/gpllib/zzjson/zzjson_query.c
new file mode 100644 (file)
index 0000000..35ba7b7
--- /dev/null
@@ -0,0 +1,63 @@
+/* JSON query
+ * ZZJSON - Copyright (C) 2008 by Ivo van Poorten
+ * License: GNU Lesser General Public License version 2.1
+ */
+
+#include "zzjson.h"
+#include <string.h>
+#include <stdarg.h>
+
+ZZJSON *zzjson_object_find_label(ZZJSON *zzjson, char *label) {
+    if (zzjson->type != ZZJSON_OBJECT) return NULL;
+
+    while (zzjson) {
+        char *string = zzjson->value.object.label;
+
+        if (zzjson->type != ZZJSON_OBJECT) return NULL;
+        if (!string)                       return NULL;
+
+        if (!strcmp(string, label))
+            return zzjson->value.object.val;
+        zzjson = zzjson->next;
+    }
+    return NULL;
+}
+
+ZZJSON *zzjson_object_find_labels(ZZJSON *zzjson, ...) {
+    va_list ap;
+    char *lbl;
+
+    va_start(ap, zzjson);
+    lbl = va_arg(ap, char *);
+    while (lbl) {
+        zzjson = zzjson_object_find_label(zzjson, lbl);
+        if (!zzjson) break;
+        lbl = va_arg(ap, char *);
+    }
+    va_end(ap);
+
+    return zzjson;
+}
+
+unsigned int zzjson_object_count(ZZJSON *zzjson) {
+    unsigned int count = 1;
+
+    if (zzjson->type != ZZJSON_OBJECT) return 0;
+    if (!zzjson->value.object.label)   return 0; /* empty { } */
+
+    while ((zzjson = zzjson->next)) count++;
+
+    return count;
+}
+
+unsigned int zzjson_array_count(ZZJSON *zzjson) {
+    unsigned int count = 1;
+
+    if (zzjson->type != ZZJSON_ARRAY) return 0;
+    if (!zzjson->value.array.val)     return 0; /* empty [ ] */
+
+    while ((zzjson = zzjson->next)) count++;
+
+    return count;
+}
+
index 40ea3ac..f187346 100644 (file)
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
-LIBS      = ../cmenu/libmenu/libmenu.a ../libutil/libutil_com.a \
-            ../lib/libcom32.a $(LIBGCC)
-CFLAGS    += -I$(com32)/cmenu/libmenu
+LIBS      = ../cmenu/libmenu/libmenu.a ../libupload/libcom32upload.a
+CFLAGS    += -I$(com32)/cmenu/libmenu -I$(com32)
 
 MODULES          = hdt.c32
 TESTFILES =
@@ -28,7 +28,8 @@ TESTFILES =
 OBJS     = $(patsubst %.c,%.o,$(wildcard *.c))
 VERSION   = $(shell $(SED) -n 's/\#define VERSION \"\(.*\)\"/\1/p' hdt.h)
 CODENAME  = $(shell $(SED) -n 's/\#define CODENAME \"\(.*\)\"/\1/p' hdt.h)
-VERSION_C32 = $(shell echo $(VERSION) | $(SED) -e 's/-/_/g' | $(SED) -e 's/\./_/g')
+NODASH_VERSION = $(shell echo $(VERSION) | $(SED) -e 's/-/_/g' | $(SED) -e 's/\./_/g')
+SUM_FILE  = hdt-$(VERSION).checksums
 
 MEMTEST_URL = http://memtest.org/download/4.20/memtest86+-4.20.bin
 MEMTEST     = memtest.bin
@@ -44,6 +45,7 @@ FLOPPY_DIR            ?= floppy
 PCI_IDS_FILE            ?= $(PWD)/$(FLOPPY_DIR)/pci.ids
 GZ_PCI_IDS_FILE         ?= $(PCI_IDS_FILE).gz
 MENU_COM32              ?= $(com32)/menu/menu.c32
+CHAIN_COM32             ?= $(com32)/modules/chain.c32
 ART_DIR                 ?= art/
 QEMU                   ?= qemu-kvm
 
@@ -55,11 +57,11 @@ hdt.elf : $(OBJS) $(LIBS) $(C_LIBS)
 memtest:
        -[ ! -f $(FLOPPY_DIR)/$(MEMTEST) ] && $(WGET) $(MEMTEST_URL) -O $(FLOPPY_DIR)/$(MEMTEST)
 
-hdt.img: hdt.c32 $(FLOPPY_DIR)/hdt.cfg $(FLOPPY_DIR)/mtools.conf $(topdir)/mtools/syslinux $(MENU_COM32) memtest
+hdt.img: hdt.c32 $(FLOPPY_DIR)/hdt.cfg $(FLOPPY_DIR)/mtools.conf $(topdir)/mtools/syslinux $(MENU_COM32) memtest $(CHAIN_COM32)
        rm -f hdt*.img
        $(SED) -e 's/%VERSION%/$(VERSION)/g' $(FLOPPY_DIR)/hdt.cfg |\
        $(SED) -e 's/%CODENAME%/$(CODENAME)/g' > $(FLOPPY_DIR)/syslinux.cfg
-       MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MFORMAT) -v HDT_$(VERSION) -f 1440 -C a:
+       MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MFORMAT) -v HDT_$(NODASH_VERSION) -f 1440 -C a:
        $(topdir)/mtools/syslinux hdt.img
        -[ ! -f $(GZ_PCI_IDS_FILE) ] && cp /usr/share/hwdata/pci.ids $(PCI_IDS_FILE) && $(GZIPPROG) $(PCI_IDS_FILE)
        -[ ! -f $(GZ_PCI_IDS_FILE) ] && cp /usr/share/pci.ids $(PCI_IDS_FILE) && $(GZIPPROG) $(PCI_IDS_FILE)
@@ -67,6 +69,7 @@ hdt.img: hdt.c32 $(FLOPPY_DIR)/hdt.cfg $(FLOPPY_DIR)/mtools.conf $(topdir)/mtool
        -[ -f $(MODULES_PCIMAP_FILE) ] && cat $(MODULES_PCIMAP_FILE) | $(GZIPPROG) - -f | MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) - a:modules.pcimap
        MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) hdt.c32 a:
        MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) $(MENU_COM32) a:
+       MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) $(CHAIN_COM32) a:
        @ [ -f $(GZ_PCI_IDS_FILE) ] && MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) $(GZ_PCI_IDS_FILE) a:pci.ids || printf "\nThe $(GZ_PCI_IDS_FILE) file is missing and can be downloaded from http://pciids.sourceforge.net and gzipped in\nthe ./com32/hdt/$(FLOPPY_DIR) directory of the extracted Syslinux source.\n\n"
        MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) $(FLOPPY_DIR)/syslinux.cfg a:
        MTOOLSRC=$(PWD)/$(FLOPPY_DIR)/mtools.conf $(MCOPY) $(FLOPPY_DIR)/$(MEMTEST) a:
@@ -89,6 +92,7 @@ hdt.iso: hdt.c32 $(topdir)/core/isolinux.bin $(FLOPPY_DIR)/hdt.cfg memtest
        cp hdt.c32 $(ISO_DIR)/$(ISOLINUX_DIR)
        cp $(FLOPPY_DIR)/$(MEMTEST) $(ISO_DIR)/$(ISOLINUX_DIR)
        cp $(MENU_COM32) $(ISO_DIR)/$(ISOLINUX_DIR)
+       cp $(CHAIN_COM32) $(ISO_DIR)/$(ISOLINUX_DIR)
        cp -av $(ART_DIR)/backgnd.png $(ISO_DIR)/$(ISOLINUX_DIR)
        -[ ! -f $(GZ_PCI_IDS_FILE) ] && cp /usr/share/hwdata/pci.ids $(PCI_IDS_FILE) && $(GZIPPROG) $(PCI_IDS_FILE)
        -[ ! -f $(GZ_PCI_IDS_FILE) ] && cp /usr/share/pci.ids $(PCI_IDS_FILE) && $(GZIPPROG) $(PCI_IDS_FILE)
@@ -107,7 +111,11 @@ hdt.iso: hdt.c32 $(topdir)/core/isolinux.bin $(FLOPPY_DIR)/hdt.cfg memtest
        ln -sf hdt-$(VERSION).iso hdt.iso
 
 release: spotless hdt.c32 hdt.img hdt.img.gz hdt.iso
-       mv hdt.c32 hdt_$(VERSION_C32).c32
+       mv hdt.c32 hdt_$(NODASH_VERSION).c32
+       md5sum hdt_$(NODASH_VERSION).c32 >$(SUM_FILE)
+       md5sum hdt-$(VERSION).iso >>$(SUM_FILE)
+       md5sum hdt-$(VERSION).img >>$(SUM_FILE)
+       md5sum hdt-$(VERSION).img.gz >>$(SUM_FILE)
 
 test: hdt.img
        $(QEMU) -fda hdt.img
@@ -123,6 +131,7 @@ spotless: clean
        rm -rf $(ISO_DIR)
        rm -rf $(FLOPPY_DIR)/$(MEMTEST)
        rm -rf $(FLOPPY_DIR)/pci.ids*
+       rm -rf hdt-*checksums
        rm -f *~ \#*
 
 install:
index f72a213..c876d23 100644 (file)
@@ -77,6 +77,15 @@ ENDTEXT
 COM32 hdt.c32
 APPEND modules_pcimap=modules.pcimap modules_alias=modules.alias pciids=pci.ids verbose nomenu
 
+LABEL dump
+MENU LABEL Dump hardware config to TFTP server 
+TEXT HELP
+ Starts HDT using the Command Line Interface (CLI) and run 'dump'
+ VESA mode is enabled
+ENDTEXT
+COM32 hdt.c32
+APPEND modules_pcimap=modules.pcimap modules_alias=modules.alias pciids=pci.ids quiet vesa nomenu auto='dump'
+
 MENU SEPARATOR
 
 LABEL memtest
index 1b608c2..a978bb3 100644 (file)
@@ -37,7 +37,7 @@
 /* Print ACPI's table header in a defined formating */
 static void show_header(void *address, s_acpi_description_header * h)
 {
-    more_printf("%-4s v%03x %-6s %-7s 0x%08x %-4s    0x%08x @ 0x%p\n",
+    more_printf("%-4s v%03x %-6s %-8s 0x%08x %-7s 0x%08x @ 0x%p\n",
                h->signature, h->revision, h->oem_id, h->oem_table_id,
                h->oem_revision, h->creator_id, h->creator_revision, address)
 }
@@ -158,25 +158,6 @@ static void show_local_apic(s_madt * madt)
     }
 }
 
-/* M1PS flags have to be interpreted as strings */
-static char *flags_to_string(char *buffer, uint16_t flags)
-{
-    memset(buffer, 0, sizeof(buffer));
-    strcpy(buffer, "default");
-    if ((flags & POLARITY_ACTIVE_HIGH) == POLARITY_ACTIVE_HIGH)
-       strcpy(buffer, "high");
-    else if ((flags & POLARITY_ACTIVE_LOW) == POLARITY_ACTIVE_LOW)
-       strcpy(buffer, "low");
-    if ((flags & TRIGGER_EDGE) == TRIGGER_EDGE)
-       strncat(buffer, " edge", 5);
-    else if ((flags & TRIGGER_LEVEL) == TRIGGER_LEVEL)
-       strncat(buffer, " level", 6);
-    else
-       strncat(buffer, " default", 8);
-
-    return buffer;
-}
-
 /* Display the local apic NMI configuration */
 static void show_local_apic_nmi(s_madt * madt)
 {
@@ -225,7 +206,7 @@ static void show_io_apic(s_madt * madt)
            break;
        }
 
-       more_printf("IO_APIC[%d] : apic_id[0x%02x] adress[0x%08x] %s\n",
+       more_printf("IO_APIC[%d] : apic_id[0x%02x] address[0x%08x] %s\n",
                    i, sio->io_apic_id, sio->io_apic_address, buffer);
     }
 }
index 6506823..e975261 100644 (file)
@@ -250,6 +250,15 @@ static void do_reboot(int argc __unused, char **argv __unused,
     syslinux_reboot(1);
 }
 
+/**
+ * do_dump - dump info
+ **/
+static void do_dump(int argc __unused, char **argv __unused,
+                     struct s_hardware *hardware)
+{
+    dump(hardware);
+}
+
 /* Default hdt mode */
 struct cli_callback_descr list_hdt_default_modules[] = {
     {
@@ -277,6 +286,10 @@ struct cli_callback_descr list_hdt_default_modules[] = {
      .exec = print_history,
      },
     {
+     .name = CLI_DUMP,
+     .exec = do_dump,
+     },
+    {
      .name = NULL,
      .exec = NULL},
 };
index 8b5335e..330f93c 100644 (file)
@@ -738,8 +738,7 @@ void start_auto_mode(struct s_hardware *hardware)
     int nb_commands = 0;
     char *commands[MAX_NB_AUTO_COMMANDS];
 
-    if (!quiet)
-       more_printf("\nEntering Auto mode\n");
+    more_printf("\nEntering Auto mode\n");
 
     /* Protecting the auto_label from the strtok modifications */
     char *temp = strdup(hardware->auto_label);
index 1329109..68b3315 100644 (file)
@@ -65,6 +65,7 @@
 #define CLI_ACPI "acpi"
 #define CLI_ENABLE "enable"
 #define CLI_DISABLE "disable"
+#define CLI_DUMP "dump"
 
 typedef enum {
     INVALID_MODE,
index f1557b8..aac50eb 100644 (file)
@@ -106,6 +106,12 @@ void detect_parameters(const int argc, const char *argv[],
            max_console_lines = MAX_CLI_LINES;
        } else if (!strncmp(argv[i], "nomenu", 6)) {
            menumode = false;
+       } else if (!strncmp(argv[i], "dump_path=", 10)) {
+           strlcpy(hardware->dump_path, argv[i] + 10,
+                   sizeof(hardware->dump_path));
+       } else if (!strncmp(argv[i], "tftp_ip=", 8)) {
+           strlcpy(hardware->tftp_ip, argv[i] + 8,
+                   sizeof(hardware->tftp_ip));
        } else if (!strncmp(argv[i], "auto=", 5)) {
            /* The auto= parameter is separated in several argv[]
             * as it can contains spaces.
@@ -115,25 +121,19 @@ void detect_parameters(const int argc, const char *argv[],
             */
 
            automode=true;
+           char *argument = (char*)argv[i]+6;
            /* Extracting the first parameter */
-           strcpy(hardware->auto_label, argv[i] + 6);
-           strcat(hardware->auto_label, " ");
-           char *pos;
-           i++;
+           strcpy(hardware->auto_label, argument);
 
            /* While we can't find the other AUTO_DELIMITER, let's process the argv[] */
-           while (((pos = strstr(argv[i], AUTO_DELIMITER)) == NULL)
-                  && (i < argc)) {
-               strcat(hardware->auto_label, argv[i]);
-               strcat(hardware->auto_label, " ");
+           while ((strchr(argument, AUTO_DELIMITER) == NULL) && (i+1<argc)) {
                i++;
-           }
+               argument = (char *)argv[i];
+               strcat(hardware->auto_label, " ");
+               strcat(hardware->auto_label, argument);
+           } 
 
-           /* If we didn't reach the end of the line, let's grab the last item */
-           if (i < argc) {
-               strcat(hardware->auto_label, argv[i]);
-               hardware->auto_label[strlen(hardware->auto_label) - 1] = 0;
-           }
+            hardware->auto_label[strlen(hardware->auto_label) - 1] = 0;
        }
     }
 }
@@ -203,7 +203,10 @@ void init_hardware(struct s_hardware *hardware)
           sizeof hardware->modules_alias_path);
     memset(hardware->memtest_label, 0, sizeof hardware->memtest_label);
     memset(hardware->auto_label, 0, sizeof hardware->auto_label);
+    memset(hardware->dump_path, 0, sizeof hardware->dump_path);
     memset(hardware->vesa_background, 0, sizeof hardware->vesa_background);
+    memset(hardware->tftp_ip, 0, sizeof hardware->tftp_ip);
+    strcat(hardware->dump_path, "hdt");
     strcat(hardware->pciids_path, "pci.ids");
     strcat(hardware->modules_pcimap_path, "modules.pcimap");
     strcat(hardware->modules_alias_path, "modules.alias");
@@ -652,7 +655,7 @@ char *del_multi_spaces(char *p)
      * As we search for a double spacing
      * we have to be sure then string is
      * long enough to be processed */
-    while (*p && *p + 1) {
+    while (*p && *(p + 1)) {
 
        /* If we have two consecutive spaces */
        if ((*p == ' ') && (*(p + 1) == ' ')) {
index df7d2c9..d37fcc8 100644 (file)
 #include "cpuid.h"
 #include "dmi/dmi.h"
 #include "hdt-ata.h"
-#include "../lib/sys/vesa/vesa.h"
+#include <lib/sys/vesa/vesa.h>
 #include <vpd/vpd.h>
 #include <libansi.h>
 #include <acpi/acpi.h>
+#include <libupload/upload_backend.h>
 
 /* Declare a variable or data structure as unused. */
 #define __unused __attribute__ (( unused ))
 
 /* This two values are used for switching for the menu to the CLI mode */
 #define HDT_SWITCH_TO_CLI "hdt_switch_to_cli"
+#define HDT_DUMP "hdt_dump"
 #define HDT_RETURN_TO_CLI 100
 #define MAX_VESA_MODES 255
 
@@ -71,7 +73,7 @@
 /* The char that separate two commands */
 #define AUTO_SEPARATOR ";"
 /* The char that surround the list of commands */
-#define AUTO_DELIMITER "'"
+#define AUTO_DELIMITER '\'' 
 
 /* Graphic to load in background when using the vesa mode */
 #define CLI_DEFAULT_BACKGROUND "backgnd.png"
@@ -80,6 +82,8 @@
 #define MAX_CLI_LINES 20
 #define MAX_VESA_CLI_LINES 24
 
+struct upload_backend *upload;
+
 /* Defines if the cli is quiet*/
 bool quiet;
 
@@ -209,6 +213,8 @@ struct s_hardware {
     char modules_pcimap_path[255];
     char modules_alias_path[255];
     char pciids_path[255];
+    char dump_path[255]; /* Dump path on the tftp server */
+    char tftp_ip[255];   /* IP address of tftp server (dump mode) */
     char memtest_label[255];
     char auto_label[AUTO_COMMAND_SIZE];
     char vesa_background[255];
@@ -236,4 +242,5 @@ int detect_vesa(struct s_hardware *hardware);
 void detect_memory(struct s_hardware *hardware);
 void init_console(struct s_hardware *hardware);
 void detect_hardware(struct s_hardware *hardware);
+void dump(struct s_hardware *hardware);
 #endif
diff --git a/com32/hdt/hdt-dump-acpi.c b/com32/hdt/hdt-dump-acpi.c
new file mode 100644 (file)
index 0000000..4cbaf66
--- /dev/null
@@ -0,0 +1,600 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void show_header(char *name, void *address, s_acpi_description_header *h, ZZJSON_CONFIG *config, ZZJSON **item)
+{
+       char signature[10]={0};
+       char revision[10]={0};
+       char s_address[16]={0};
+       char oem_id[16]={0};
+       char oem_table_id[16]={0};
+       char oem_revision[16]={0};
+       char creator_revision[16]={0};
+       char creator_id[16]={0};
+       snprintf(signature,sizeof(signature),"%s",h->signature);
+       snprintf(revision,sizeof(revision),"0x%03x",h->revision);
+       snprintf(oem_id,sizeof(oem_id),"%s",h->oem_id);
+       snprintf(oem_table_id,sizeof(oem_table_id),"%s",h->oem_table_id);
+       snprintf(creator_id,sizeof(creator_id),"%s",h->creator_id);
+       snprintf(oem_revision,sizeof(oem_revision),"0x%08x",h->oem_revision);
+       snprintf(creator_revision,sizeof(creator_revision),"0x%08x",h->creator_revision);
+       snprintf(s_address,sizeof(s_address),"%p",address);
+
+       char address_name[32]={0};
+       char signature_name[32]={0};
+       char revision_name[32]={0};
+       char oem_id_name[32]={0};
+       char oem_table_id_name[32]={0};
+       char oem_revision_name[32]={0};
+       char creator_revision_name[32]={0};
+       char creator_id_name[32]={0};
+       snprintf(signature_name,sizeof(signature_name),"acpi.%s.signature",name);
+       snprintf(revision_name,sizeof(revision_name),"acpi.%s.revision",name);
+       snprintf(address_name,sizeof(address_name),"acpi.%s.address",name);
+       snprintf(oem_id_name,sizeof(oem_id_name),"acpi.%s.oem_id",name);
+       snprintf(oem_table_id_name,sizeof(oem_table_id_name),"acpi.%s.oem_table_id",name);
+       snprintf(oem_revision_name,sizeof(oem_revision_name),"acpi.%s.oem_revision",name);
+       snprintf(creator_revision_name,sizeof(creator_revision_name),"acpi.%s.creator_revision",name);
+       snprintf(creator_id_name,sizeof(creator_id_name),"acpi.%s.creator_id",name);
+
+       APPEND_ARRAY
+               add_as(signature_name,signature)
+               add_as(revision_name,revision)
+               add_as(oem_id_name,oem_id)
+               add_as(oem_table_id_name,oem_table_id)
+               add_as(oem_revision_name,oem_revision)
+               add_as(creator_id_name,creator_id)
+               add_as(creator_revision_name,creator_revision)
+               add_as(address_name,s_address)
+       END_OF_APPEND;
+
+       FLUSH_OBJECT;
+
+}
+
+void dump_rsdt(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->rsdt.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","rsdt")
+               add_as("acpi.rsdt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->rsdt.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("rsdt",acpi->rsdt.address, &acpi->rsdt.header, config, item);       
+}
+
+void dump_xsdt(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->xsdt.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","xsdt")
+               add_as("acpi.xsdt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->xsdt.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("xsdt",acpi->xsdt.address, &acpi->xsdt.header, config, item);       
+}
+
+void dump_fadt(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->rsdt.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","fadt")
+               add_as("acpi.fadt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->fadt.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("fadt",acpi->fadt.address, &acpi->fadt.header, config, item);       
+}
+
+void dump_dsdt(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->dsdt.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","dsdt")
+               add_as("acpi.dsdt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->dsdt.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("dsdt",acpi->dsdt.address, &acpi->dsdt.header, config, item);       
+}
+
+void dump_sbst(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->sbst.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","sbst")
+               add_as("acpi.sbst.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->sbst.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("sbst",acpi->sbst.address, &acpi->sbst.header, config, item);       
+}
+
+void dump_ecdt(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->ecdt.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","ecdt")
+               add_as("acpi.ecdt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->ecdt.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("ecdt",acpi->ecdt.address, &acpi->ecdt.header, config, item);       
+}
+
+void dump_hpet(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->hpet.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","hpet")
+               add_as("acpi.hpet.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->hpet.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("hpet",acpi->hpet.address, &acpi->hpet.header, config, item);       
+}
+
+void dump_tcpa(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->tcpa.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","tcpa")
+               add_as("acpi.tcpa.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->tcpa.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("tcpa",acpi->tcpa.address, &acpi->tcpa.header, config, item);       
+}
+
+void dump_mcfg(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->mcfg.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","mcfg")
+               add_as("acpi.mcfg.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->mcfg.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("mcfg",acpi->mcfg.address, &acpi->mcfg.header, config, item);       
+}
+
+void dump_slic(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->slic.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","slic")
+               add_as("acpi.slic.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->slic.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("slic",acpi->slic.address, &acpi->slic.header, config, item);       
+}
+
+
+void dump_boot(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->boot.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","boot")
+               add_as("acpi.boot.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->boot.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("boot",acpi->boot.address, &acpi->boot.header, config, item);       
+}
+
+void dump_madt(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->madt.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","madt")
+               add_as("acpi.madt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->madt.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("madt",acpi->madt.address, &acpi->madt.header, config, item);       
+}
+
+void dump_ssdt(s_ssdt *ssdt, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (ssdt->valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","ssdt")
+               add_as("acpi.ssdt.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (ssdt->valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       show_header("ssdt",ssdt->address, &ssdt->header, config, item); 
+}
+
+void dump_rsdp(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->rsdp.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","rsdp")
+               add_as("acpi.rsdp.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->rsdp.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       s_rsdp *r = &acpi->rsdp;
+       char revision[10]={0};
+       char address[16]={0};
+       char oem_id[16]={0};
+       snprintf(revision,sizeof(revision),"0x%03x",r->revision);
+       snprintf(address,sizeof(address),"%p",r->address);
+       snprintf(oem_id,sizeof(oem_id),"%s",r->oem_id);
+       APPEND_ARRAY
+               add_as("acpi.rsdp.revision",revision)
+               add_as("acpi.rsdp.oem_id",oem_id)
+               add_as("acpi.rsdp.address",address)
+       END_OF_APPEND;
+
+       FLUSH_OBJECT;
+
+}
+
+void dump_facs(s_acpi * acpi, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+       char valid[8]={0};
+       snprintf(valid,sizeof(valid),"%s","false");
+       if (acpi->facs.valid) {
+               snprintf(valid,sizeof(valid),"%s","true");
+       }
+       CREATE_ARRAY
+               add_as("acpi.item","facs")
+               add_as("acpi.facs.is_valid",valid)
+       END_OF_ARRAY;
+       
+       if (acpi->facs.valid==false) {
+               FLUSH_OBJECT;
+               return;
+       }
+
+       s_facs *fa = &acpi->facs;
+       char address[16]={0};
+       snprintf(address,sizeof(address),"%p",fa->address);
+       APPEND_ARRAY
+               add_as("acpi.facs.address",address)
+       END_OF_APPEND;
+
+       FLUSH_OBJECT;
+
+}
+
+void dump_interrupt_source_override(s_madt * madt, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+    CREATE_ARRAY
+       add_as("acpi.item","interrupt_source_override")
+       add_ai("acpi.interrupt_source_override.count", madt->interrupt_source_override_count)
+    END_OF_ARRAY;
+
+    if (madt->interrupt_source_override_count == 0) {
+           FLUSH_OBJECT;
+           return;
+    }
+
+    /* Let's process each interrupt source override */
+    for (int i = 0; i < madt->interrupt_source_override_count; i++) {
+       s_interrupt_source_override *siso = &madt->interrupt_source_override[i];
+       char buffer[20] = {0};
+       char bus_type[10]= {0};
+       
+       /* Spec report bus type 0 as ISA */
+       if (siso->bus == 0)
+           strcpy(bus_type, "ISA");
+       else
+           strcpy(bus_type, "unknown");
+
+       APPEND_ARRAY
+               add_as("acpi.interrupt_source_override.bus_type",bus_type)
+               add_ai("acpi.interrupt_source_override.bus",siso->bus)
+               add_ai("acpi.interrupt_source_override.bus_irq",siso->source)
+               add_ai("acpi.interrupt_source_override.global_irq",siso->global_system_interrupt)
+               add_as("acpi.interrupt_source_override.flags",flags_to_string(buffer,siso->flags))
+       END_OF_APPEND;
+    }
+    FLUSH_OBJECT;
+}
+
+void dump_io_apic(s_madt * madt, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+    CREATE_ARRAY
+       add_as("acpi.item","io_apic")
+       add_ai("acpi.io_apic.count", madt->io_apic_count)
+    END_OF_ARRAY;
+
+    if (madt->io_apic_count == 0) {
+           FLUSH_OBJECT;
+           return;
+    }
+
+    /* For all IO APICS */
+    for (int i = 0; i < madt->io_apic_count; i++) {
+       s_io_apic *sio = &madt->io_apic[i];
+       char buffer[15]={0};
+       memset(buffer, 0, sizeof(buffer));
+       /* GSI base reports the GSI configuration
+        * Let's interpret it as string */
+       switch (sio->global_system_interrupt_base) {
+       case 0:
+           strcpy(buffer, "0-23");
+           break;
+       case 24:
+           strcpy(buffer,"24-39");
+           break;
+       case 40:
+           strcpy(buffer, "40-55");
+           break;
+       default:
+           strcpy(buffer,"Unknown");
+           break;
+       }
+
+       char apic_id[16] = { 0 };
+       char address[16] = { 0 };
+       snprintf(apic_id,sizeof(apic_id),"0x%02x",sio->io_apic_id);
+       snprintf(address,sizeof(address),"0x%08x",sio->io_apic_address);
+       APPEND_ARRAY
+               add_ai("acpi.io_apic.number",i)
+               add_as("acpi.io_apic.apic_id",apic_id)
+               add_as("acpi.io_apic.adress",address)
+               add_as("acpi.io_apic.gsi",buffer)
+       END_OF_APPEND;
+    }
+    FLUSH_OBJECT;
+}
+
+void dump_local_apic_nmi(s_madt * madt, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+    CREATE_ARRAY
+       add_as("acpi.item","local_apic_nmi")
+       add_ai("acpi.local_apic_nmi.count", madt->local_apic_nmi_count)
+    END_OF_ARRAY;
+
+    if (madt->local_apic_nmi_count == 0) {
+           FLUSH_OBJECT;
+           return;
+    }
+
+    for (int i = 0; i < madt->local_apic_nmi_count; i++) {
+       s_local_apic_nmi *slan = &madt->local_apic_nmi[i];
+       char buffer[20]={0};
+       char acpi_id[16] = { 0 };
+       char local_apic_lint[16] = { 0 };
+       snprintf(acpi_id, sizeof(acpi_id), "0x%02x", slan->acpi_processor_id);
+       snprintf(local_apic_lint, sizeof(local_apic_lint), "0x%02x", slan->local_apic_lint);
+       APPEND_ARRAY
+               add_as("acpi.processor_id", acpi_id)
+               add_as("acpi.local_apic_nmi.flags", flags_to_string(buffer,slan->flags))
+               add_as("acpi.local_apic_nmi.lint",local_apic_lint)
+       END_OF_APPEND;
+    }
+
+    FLUSH_OBJECT;
+}
+
+void dump_local_apic(s_madt * madt, ZZJSON_CONFIG * config, ZZJSON ** item)
+{
+    char buffer[16] = { 0 };
+    snprintf(buffer, sizeof(buffer), "0x%08x", madt->local_apic_address);
+
+    CREATE_ARRAY
+       add_as("acpi.item","local_apic")
+       add_as("acpi.local_apic.address", buffer)
+       add_ai("acpi.processor_local_apic.count", madt->processor_local_apic_count)
+    END_OF_ARRAY;
+
+    if (madt->processor_local_apic_count ==0) {
+        FLUSH_OBJECT;
+       return;
+    }
+
+    /* For all detected logical CPU */
+    for (int i = 0; i < madt->processor_local_apic_count; i++) {
+       s_processor_local_apic *sla = &madt->processor_local_apic[i];
+       char lapic_status[16] = { 0 };
+       char acpi_id[16] = { 0 };
+       char apic_id[16] = { 0 };
+
+       snprintf(lapic_status,sizeof(lapic_status),"%s","disabled");
+       /* Let's check if the flags reports the cpu as enabled */
+       if ((sla->flags & PROCESSOR_LOCAL_APIC_ENABLE) ==
+           PROCESSOR_LOCAL_APIC_ENABLE)
+           snprintf(lapic_status,sizeof(lapic_status),"%s","enabled");
+       snprintf(acpi_id, sizeof(acpi_id), "0x%02x", sla->acpi_id);
+       snprintf(apic_id, sizeof(apic_id), "0x%02x", sla->apic_id);
+       APPEND_ARRAY
+               add_ai("acpi.cpu.apic_id", sla->apic_id)
+               add_as("acpi.cpu.apic_id (hex)", apic_id)
+               add_as("acpi.cpu.acpi_id (hex)", acpi_id)
+               add_as("acpi.lapic.enabled", lapic_status)
+       END_OF_APPEND;
+    }
+    FLUSH_OBJECT;
+}
+
+void dump_acpi(struct s_hardware *hardware, ZZJSON_CONFIG * config,
+              ZZJSON ** item)
+{
+    CREATE_NEW_OBJECT;
+    add_hb(is_acpi_valid);
+    if (hardware->is_acpi_valid == false)
+       goto exit;
+
+    s_madt *madt = &hardware->acpi.madt;
+    add_b("acpi.apic.detected", madt->valid);
+    if (madt->valid == false) {
+       goto exit;
+    }
+
+    FLUSH_OBJECT;
+
+    dump_local_apic(madt, config, item);
+    dump_local_apic_nmi(madt, config, item);
+    dump_io_apic(madt, config, item);
+    dump_interrupt_source_override(madt, config, item);
+
+    dump_rsdp(&hardware->acpi,config,item);
+    dump_rsdt(&hardware->acpi,config,item);
+    dump_xsdt(&hardware->acpi,config,item);
+    dump_fadt(&hardware->acpi,config,item);
+    dump_dsdt(&hardware->acpi,config,item);
+    dump_sbst(&hardware->acpi,config,item);
+    dump_ecdt(&hardware->acpi,config,item);
+    dump_hpet(&hardware->acpi,config,item);
+    dump_tcpa(&hardware->acpi,config,item);
+    dump_mcfg(&hardware->acpi,config,item);
+    dump_slic(&hardware->acpi,config,item);
+    dump_boot(&hardware->acpi,config,item);
+    dump_madt(&hardware->acpi,config,item);
+    for (int i = 0; i < hardware->acpi.ssdt_count; i++) {
+            if ((hardware->acpi.ssdt[i] != NULL) && (hardware->acpi.ssdt[i]->valid))
+                   dump_ssdt(hardware->acpi.ssdt[i], config, item);
+    }
+    dump_facs(&hardware->acpi,config,item);
+
+exit:
+    to_cpio("acpi");
+}
diff --git a/com32/hdt/hdt-dump-cpu.c b/com32/hdt/hdt-dump-cpu.c
new file mode 100644 (file)
index 0000000..33d561c
--- /dev/null
@@ -0,0 +1,53 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void dump_cpu(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+        CREATE_NEW_OBJECT;
+       add_hs(cpu.vendor);
+       add_hs(cpu.model);
+       add_hi(cpu.vendor_id);
+       add_hi(cpu.family);
+       add_hi(cpu.model_id);
+       add_hi(cpu.stepping);
+       add_hi(cpu.num_cores);
+       add_hi(cpu.l1_data_cache_size);
+       add_hi(cpu.l1_instruction_cache_size);
+       add_hi(cpu.l2_cache_size);
+       size_t i;
+       for (i = 0; i < cpu_flags_count; i++) {
+               char temp[128]={0};
+               snprintf(temp,sizeof(temp),"cpu.flags.%s",cpu_flags_names[i]);
+               add_b(temp,get_cpu_flag_value_from_name(&hardware->cpu,cpu_flags_names[i]));
+       }
+       FLUSH_OBJECT;
+       to_cpio("cpu");
+}
diff --git a/com32/hdt/hdt-dump-disks.c b/com32/hdt/hdt-dump-disks.c
new file mode 100644 (file)
index 0000000..dcbcaa9
--- /dev/null
@@ -0,0 +1,137 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+#include "hdt-util.h"
+
+ZZJSON_CONFIG *config;
+ZZJSON **item;
+
+static void show_partition_information(struct driveinfo *drive_info,
+                                       struct part_entry *ptab,
+                                       int partition_offset,
+                                       int nb_partitions_seen) {
+    char size[11] = {0};
+    char bootloader_name[9] = {0};
+    char ostype[64]={0};
+    char *parttype;
+    unsigned int start, end;
+
+    int i = nb_partitions_seen;
+    start = partition_offset;
+    end = start + ptab->length - 1;
+
+    if (ptab->length > 0)
+        sectors_to_size(ptab->length, size);
+
+    get_label(ptab->ostype, &parttype);
+    get_bootloader_string(drive_info, ptab, bootloader_name, 9);
+
+    snprintf(ostype,sizeof(ostype),"%02X",ptab->ostype);
+
+    APPEND_ARRAY
+           add_ai("partition->number",i)
+           add_ai("partition->sector_start",start)
+           add_ai("partition->sector_end",end)
+           add_as("partition->size",size)
+           add_as("partition->type",parttype)
+           add_as("partition->os_type",ostype)
+    END_OF_APPEND;
+    free(parttype);
+}
+
+
+
+void show_disk(struct s_hardware *hardware, ZZJSON_CONFIG *conf, ZZJSON **it, int drive) {
+       config=conf;
+       item=it;
+       int i = drive - 0x80;
+       struct driveinfo *d = &hardware->disk_info[i];
+       char mbr_name[50]={0};
+       char disk_size[11]={0};
+
+       get_mbr_string(hardware->mbr_ids[i], &mbr_name,sizeof(mbr_name));
+       if ((int)d->edd_params.sectors > 0)
+               sectors_to_size((int)d->edd_params.sectors, disk_size);
+
+       char disk[5]={0};
+       char edd_version[5]={0};
+       snprintf(disk,sizeof(disk),"0x%X",d->disk);
+       snprintf(edd_version,sizeof(edd_version),"%X",d->edd_version);
+       zzjson_print(config, *item);
+       zzjson_free(config, *item);
+
+       CREATE_ARRAY
+               add_as("disk->number",disk) 
+               add_ai("disk->cylinders",d->legacy_max_cylinder +1) 
+               add_ai("disk->heads",d->legacy_max_head +1)
+               add_ai("disk->sectors_per_track",d->legacy_sectors_per_track)
+               add_as("disk->edd_version",edd_version)
+               add_as("disk->size",disk_size)
+               add_ai("disk->bytes_per_sector",(int)d->edd_params.bytes_per_sector)
+               add_ai("disk->sectors_per_track",(int)d->edd_params.sectors_per_track)
+               add_as("disk->host_bus",remove_spaces((char *)d->edd_params.host_bus_type))
+               add_as("disk->interface_type",remove_spaces((char *)d->edd_params.interface_type))
+               add_as("disk->mbr_name",mbr_name)
+               add_ai("disk->mbr_id",hardware->mbr_ids[i])
+       END_OF_ARRAY;
+
+       if (parse_partition_table(d, &show_partition_information)) {
+               if (errno_disk) { 
+                       APPEND_ARRAY
+                               add_as("disk->error", "IO Error")
+                       END_OF_APPEND;
+               } else  {
+                       APPEND_ARRAY
+                               add_as("disk->error", "Unrecognized Partition Layout")
+                       END_OF_APPEND;
+               }
+       }
+}
+
+void dump_disks(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       bool found=false;
+       for (int drive = 0x80; drive < 0xff; drive++) {
+               if (hardware->disk_info[drive - 0x80].cbios) {
+                       if (found==false) {
+                               CREATE_NEW_OBJECT;
+                               add_b("disks->is_valid",true);
+                                       found=true;
+                       }
+                       show_disk(hardware, config, item, drive);
+               }
+       }
+
+       if (found==false) {
+               CREATE_NEW_OBJECT;
+               add_b("disks->is_valid",false);
+               FLUSH_OBJECT;
+       }
+       to_cpio("disks");
+}
diff --git a/com32/hdt/hdt-dump-dmi.c b/com32/hdt/hdt-dump-dmi.c
new file mode 100644 (file)
index 0000000..6e5c1ce
--- /dev/null
@@ -0,0 +1,447 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void dump_hardware_security(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (!hardware->dmi.hardware_security.filled) {
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning","No hardware security structure found");
+                       FLUSH_OBJECT;
+                       return;
+       }
+       
+       CREATE_NEW_OBJECT;
+               add_s("dmi.item","hardware_security");
+               add_hs(dmi.hardware_security.power_on_passwd_status);
+               add_hs(dmi.hardware_security.keyboard_passwd_status);
+               add_hs(dmi.hardware_security.administrator_passwd_status);
+               add_hs(dmi.hardware_security.front_panel_reset_status);
+       FLUSH_OBJECT;
+}
+
+void dump_oem_strings(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (strlen(hardware->dmi.oem_strings) == 0) {
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning","No OEM structure found");
+                       FLUSH_OBJECT;
+                       return;
+       }
+       CREATE_NEW_OBJECT;
+               add_s("dmi.item","OEM");
+               add_hs(dmi.oem_strings);
+       FLUSH_OBJECT;
+}
+
+void dump_memory_size(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       CREATE_NEW_OBJECT;
+               add_s("dmi.item","memory size");
+               add_i("dmi.memory_size (KB)",hardware->detected_memory_size);
+               add_i("dmi.memory_size (MB)",(hardware->detected_memory_size + (1 << 9)) >> 10);
+       FLUSH_OBJECT;
+}
+
+void dump_memory_modules(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       if (hardware->dmi.memory_module_count == 0) {
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning","No memory module structure found");
+                       FLUSH_OBJECT;
+                       return;
+       }
+
+       for (int module=0; module<hardware->dmi.memory_module_count;module++) {
+               if (hardware->dmi.memory_module[module].filled == false) {
+                       char msg[64]={0};
+                       snprintf(msg,sizeof(msg),"Module %d doesn't contain any information", module);
+
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning",msg);
+                       FLUSH_OBJECT;
+                       continue;
+               }
+
+               CREATE_NEW_OBJECT;
+               add_i("Memory module", module);
+               add_s("dmi.memory_module.socket_designation", hardware->dmi.memory_module[module].socket_designation);
+               add_s("dmi.memory_module.bank_connections", hardware->dmi.memory_module[module].bank_connections);
+               add_s("dmi.memory_module.speed", hardware->dmi.memory_module[module].speed);
+               add_s("dmi.memory_module.type", hardware->dmi.memory_module[module].type);
+               add_s("dmi.memory_module.installed_size", hardware->dmi.memory_module[module].installed_size);
+               add_s("dmi.memory_module.enabled_size", hardware->dmi.memory_module[module].enabled_size);
+               add_s("dmi.memory_module.error_status", hardware->dmi.memory_module[module].error_status);
+               FLUSH_OBJECT;
+       }
+}
+       
+void dump_cache(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       if (hardware->dmi.cache_count == 0) {
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning","No cache structure found");
+                       FLUSH_OBJECT;
+                       return;
+       }
+
+       for (int cache=0; cache<hardware->dmi.cache_count;cache++) {
+               CREATE_NEW_OBJECT;
+               add_i("Cache", cache);
+               add_s("dmi.cache.socket_designation", hardware->dmi.cache[cache].socket_designation);
+               add_s("dmi.cache.configuration", hardware->dmi.cache[cache].configuration);
+               add_s("dmi.cache.mode", hardware->dmi.cache[cache].mode);
+               add_s("dmi.cache.location", hardware->dmi.cache[cache].location);
+               add_i("dmi.cache.installed_size (KB)", hardware->dmi.cache[cache].installed_size);
+               add_i("dmi.cache.max_size (KB)", hardware->dmi.cache[cache].max_size);
+               add_s("dmi.cache.supported_sram_types", hardware->dmi.cache[cache].supported_sram_types);
+               add_s("dmi.cache.installed_sram_types", hardware->dmi.cache[cache].installed_sram_types);
+               add_i("dmi.cache.speed (ns)", hardware->dmi.cache[cache].speed);
+               add_s("dmi.cache.error_correction_type", hardware->dmi.cache[cache].error_correction_type);
+               add_s("dmi.cache.system_type", hardware->dmi.cache[cache].system_type);
+               add_s("dmi.cache.associativity", hardware->dmi.cache[cache].associativity);
+               FLUSH_OBJECT;
+       }
+}
+void dump_memory_banks(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       if (hardware->dmi.memory_count == 0) {
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning","No memory bank structure found");
+                       FLUSH_OBJECT;
+                       return;
+       }
+
+       for (int bank=0; bank<hardware->dmi.memory_count;bank++) {
+
+               if (hardware->dmi.memory[bank].filled == false) {
+                       char msg[64]={0};
+                       snprintf(msg,sizeof(msg),"Bank %d doesn't contain any information", bank);
+
+                       CREATE_NEW_OBJECT;
+                               add_s("dmi.warning",msg);
+                       FLUSH_OBJECT;
+                       continue;
+               }
+
+               CREATE_NEW_OBJECT;
+               add_i("Memory Bank", bank);
+               add_s("dmi.memory.form_factor", hardware->dmi.memory[bank].form_factor);
+               add_s("dmi.memory.type", hardware->dmi.memory[bank].type);
+               add_s("dmi.memory.type_detail", hardware->dmi.memory[bank].type_detail);
+               add_s("dmi.memory.speed", hardware->dmi.memory[bank].speed);
+               add_s("dmi.memory.size", hardware->dmi.memory[bank].size);
+               add_s("dmi.memory.device_set", hardware->dmi.memory[bank].device_set);
+               add_s("dmi.memory.device_locator", hardware->dmi.memory[bank].device_locator);
+               add_s("dmi.memory.bank_locator", hardware->dmi.memory[bank].bank_locator);
+               add_s("dmi.memory.total_width", hardware->dmi.memory[bank].total_width);
+               add_s("dmi.memory.data_width", hardware->dmi.memory[bank].data_width);
+               add_s("dmi.memory.error", hardware->dmi.memory[bank].error);
+               add_s("dmi.memory.vendor", hardware->dmi.memory[bank].manufacturer);
+               add_s("dmi.memory.serial", hardware->dmi.memory[bank].serial);
+               add_s("dmi.memory.asset_tag", hardware->dmi.memory[bank].asset_tag);
+               add_s("dmi.memory.part_number", hardware->dmi.memory[bank].part_number);
+               FLUSH_OBJECT;
+       }
+}
+
+void dump_processor(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (hardware->dmi.processor.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no processor structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+
+       char voltage[16]={0};
+       snprintf(voltage,sizeof(voltage),"%d.%02d",
+               hardware->dmi.processor.voltage_mv / 1000,
+               hardware->dmi.processor.voltage_mv - ((hardware->dmi.processor.voltage_mv / 1000) * 1000));
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","processor");
+       add_hs(dmi.processor.socket_designation);
+       add_hs(dmi.processor.type);
+       add_hs(dmi.processor.family);
+       add_hs(dmi.processor.manufacturer);
+       add_hs(dmi.processor.version);
+       add_hi(dmi.processor.external_clock);
+       add_hi(dmi.processor.max_speed);
+       add_hi(dmi.processor.current_speed);
+       add_hi(dmi.processor.signature.type);
+       add_hi(dmi.processor.signature.family);
+       add_hi(dmi.processor.signature.model);
+       add_hi(dmi.processor.signature.stepping);
+       add_hi(dmi.processor.signature.minor_stepping);
+       add_s("dmi.processor.voltage",voltage);
+       add_hs(dmi.processor.status);
+       add_hs(dmi.processor.upgrade);
+       add_hs(dmi.processor.cache1);
+       add_hs(dmi.processor.cache2);
+       add_hs(dmi.processor.cache3);
+       add_hs(dmi.processor.serial);
+       add_hs(dmi.processor.part_number);
+       add_hi(dmi.processor.core_count);
+       add_hi(dmi.processor.core_enabled);
+       add_hi(dmi.processor.thread_count);
+       add_hs(dmi.processor.id);
+       for (int i = 0; i < PROCESSOR_FLAGS_ELEMENTS; i++) {
+               if (((bool *) (&hardware->dmi.processor.cpu_flags))[i] == true) {
+                   add_s("dmi.processor.flag",(char *)cpu_flags_strings[i]);
+               }
+       }
+       FLUSH_OBJECT;
+}
+
+void dump_battery(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (hardware->dmi.battery.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no battery structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","battery");
+       add_hs(dmi.battery.manufacturer);
+       add_hs(dmi.battery.manufacture_date);
+       add_hs(dmi.battery.serial);
+       add_hs(dmi.battery.name);
+       add_hs(dmi.battery.chemistry);
+       add_hs(dmi.battery.design_capacity);
+       add_hs(dmi.battery.design_voltage);
+       add_hs(dmi.battery.sbds);
+       add_hs(dmi.battery.sbds_manufacture_date);
+       add_hs(dmi.battery.sbds_chemistry);
+       add_hs(dmi.battery.maximum_error);
+       add_hs(dmi.battery.oem_info);
+       FLUSH_OBJECT;
+}
+
+void dump_ipmi(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (hardware->dmi.ipmi.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no IPMI structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+
+       char spec_ver[16]={0};
+       char i2c[16]={0};
+       char base[16]={0};
+       snprintf(spec_ver,sizeof(spec_ver),"%u.%u",
+                       hardware->dmi.ipmi.major_specification_version,
+                       hardware->dmi.ipmi.minor_specification_version);
+
+       snprintf(i2c,sizeof(i2c),"0x%02x", hardware->dmi.ipmi.I2C_slave_address);
+       snprintf(base,sizeof(base),"%08X%08X",
+                       (uint32_t)(hardware->dmi.ipmi.base_address >> 32),
+                       (uint32_t)((hardware->dmi.ipmi.base_address & 0xFFFF) & ~1));
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","ipmi");
+       add_hs(dmi.ipmi.interface_type);
+       add_s("dmi.ipmi.spec_version",spec_ver);
+       add_hi(dmi.ipmi.I2C_slave_address);
+       add_hi(dmi.ipmi.nv_address);
+       add_s("dmi.ipmi.base_address",base);
+       add_hi(dmi.ipmi.irq);
+       FLUSH_OBJECT;
+}
+
+void dump_chassis(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (hardware->dmi.chassis.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no chassis structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","bios");
+       add_hs(dmi.chassis.manufacturer);
+       add_hs(dmi.chassis.type);
+       add_hs(dmi.chassis.lock);
+       add_hs(dmi.chassis.version);
+       add_hs(dmi.chassis.serial);
+       add_s("dmi.chassis.asset_tag",del_multi_spaces(hardware->dmi.chassis.asset_tag));
+       add_hs(dmi.chassis.boot_up_state);
+       add_hs(dmi.chassis.power_supply_state);
+       add_hs(dmi.chassis.thermal_state);
+       add_hs(dmi.chassis.security_status);
+       add_hs(dmi.chassis.oem_information);
+       add_hi(dmi.chassis.height);
+       add_hi(dmi.chassis.nb_power_cords);
+       FLUSH_OBJECT;
+}
+
+void dump_bios(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       if (hardware->dmi.bios.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no bios structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+       char address[16]={0};
+       char runtime[16]={0};
+       char rom[16]={0};
+       snprintf(address,sizeof(address),"0x%04X0",hardware->dmi.bios.address);
+       snprintf(runtime,sizeof(runtime),"%u %s",hardware->dmi.bios.runtime_size, hardware->dmi.bios.runtime_size_unit);
+       snprintf(rom,sizeof(rom),"%u %s",hardware->dmi.bios.rom_size, hardware->dmi.bios.rom_size_unit);
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","bios");
+       add_hs(dmi.bios.vendor);
+       add_hs(dmi.bios.version);
+       add_hs(dmi.bios.release_date);
+       add_hs(dmi.bios.bios_revision);
+       add_hs(dmi.bios.firmware_revision);
+       add_s("dmi.bios.address",address);
+       add_s("dmi.bios.runtime_size",runtime);
+       add_s("dmi.bios.rom_size",rom);
+       for (int i = 0; i < BIOS_CHAR_NB_ELEMENTS; i++) {
+               if (((bool *) (&hardware->dmi.bios.characteristics))[i] == true) {
+                       add_s("dmi.bios.characteristics",(char *)bios_charac_strings[i]);
+               }
+       }
+       
+       for (int i = 0; i < BIOS_CHAR_X1_NB_ELEMENTS; i++) {
+               if (((bool *) (&hardware->dmi.bios.characteristics_x1))[i] == true) {
+                       add_s("dmi.bios.characteristics",(char *)bios_charac_x1_strings[i]);
+               }
+       }
+
+       for (int i = 0; i < BIOS_CHAR_X2_NB_ELEMENTS; i++) {
+               if (((bool *) (&hardware->dmi.bios.characteristics_x2))[i] == true) {
+                       add_s("dmi.bios.characteristics",(char *)bios_charac_x2_strings[i]);
+               }
+       }
+       FLUSH_OBJECT;
+}
+
+void dump_system(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       if (hardware->dmi.system.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no system structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+       char system_reset_status[10]={0};
+       char watchdog_timer[15]={0};
+       snprintf(system_reset_status,sizeof(system_reset_status),"%s", (hardware->dmi.system.system_reset.status ? "Enabled" :"Disabled"));
+       snprintf(watchdog_timer,sizeof(watchdog_timer),"%s", (hardware->dmi.system.system_reset.watchdog ? "Present" :"Not Present"));
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","system");
+       add_hs(dmi.system.manufacturer);
+       add_hs(dmi.system.product_name);
+       add_hs(dmi.system.version);
+       add_hs(dmi.system.serial);
+       add_hs(dmi.system.uuid);
+       add_hs(dmi.system.wakeup_type);
+       add_hs(dmi.system.sku_number);
+       add_hs(dmi.system.family);
+       add_hs(dmi.system.configuration_options);
+       add_s("dmi.system.system_reset.status",system_reset_status);
+       add_s("dmi.system.system_reset.watchdog",watchdog_timer);
+       add_hs(dmi.system.system_reset.boot_option);
+       add_hs(dmi.system.system_reset.boot_option_on_limit);
+       add_hs(dmi.system.system_reset.reset_count);
+       add_hs(dmi.system.system_reset.reset_limit);
+       add_hs(dmi.system.system_reset.timer_interval);
+       add_hs(dmi.system.system_reset.timeout);
+       add_hs(dmi.system.system_boot_status);
+       FLUSH_OBJECT;
+}
+
+void dump_base_board(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       if (hardware->dmi.base_board.filled == false) {
+               CREATE_NEW_OBJECT;
+                       add_s("dmi.warning","no base_board structure found");
+               FLUSH_OBJECT;
+               return;
+       }
+
+       CREATE_NEW_OBJECT;
+       add_s("dmi.item","base_board");
+       add_hs(dmi.base_board.manufacturer);
+       add_hs(dmi.base_board.product_name);
+       add_hs(dmi.base_board.version);
+       add_hs(dmi.base_board.serial);
+       add_hs(dmi.base_board.asset_tag);
+       add_hs(dmi.base_board.location);
+       add_hs(dmi.base_board.type);
+       for (int i = 0; i < BASE_BOARD_NB_ELEMENTS; i++) {
+               if (((bool *) (&hardware->dmi.base_board.features))[i] == true) {
+                       add_s("dmi.base_board.features",(char *)base_board_features_strings[i]);
+               }
+       }
+
+       for (unsigned int i = 0; i < sizeof hardware->dmi.base_board.devices_information /
+                        sizeof *hardware->dmi.base_board.devices_information; i++) {
+               if (strlen(hardware->dmi.base_board.devices_information[i].type)) {
+                       add_s("dmi.base_board.devices_information.type", hardware->dmi.base_board.devices_information[i].type);
+                       add_i("dmi.base_board.devices_information.status", hardware->dmi.base_board.devices_information[i].status);
+                       add_s("dmi.base_board.devices_information.description", hardware->dmi.base_board.devices_information[i].description);
+               }
+       }
+       FLUSH_OBJECT;
+}
+
+void dump_dmi(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       CREATE_NEW_OBJECT;
+       add_hb(is_dmi_valid);
+
+       if (hardware->is_dmi_valid == false) {
+               FLUSH_OBJECT;
+               goto exit;
+       } else {
+               char buffer[8]={0};
+               snprintf(buffer,sizeof(buffer),"%d.%d",hardware->dmi.dmitable.major_version, hardware->dmi.dmitable.minor_version);
+               add_s("dmi.version",buffer);
+               FLUSH_OBJECT;
+       }
+
+       dump_base_board(hardware,config,item);
+       dump_system(hardware,config,item);
+       dump_bios(hardware,config,item);
+       dump_chassis(hardware,config,item);
+       dump_ipmi(hardware,config,item);
+       dump_battery(hardware,config,item);
+       dump_processor(hardware,config,item);
+       dump_cache(hardware,config,item);
+       dump_memory_banks(hardware,config,item);
+       dump_memory_modules(hardware,config,item);
+       dump_memory_size(hardware,config,item);
+       dump_oem_strings(hardware,config,item);
+       dump_hardware_security(hardware,config,item);
+exit:
+       to_cpio("dmi");
+}
diff --git a/com32/hdt/hdt-dump-hdt.c b/com32/hdt/hdt-dump-hdt.c
new file mode 100644 (file)
index 0000000..d081ebd
--- /dev/null
@@ -0,0 +1,50 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+#include <syslinux/config.h>
+
+void dump_hdt(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       (void) hardware;
+       CREATE_NEW_OBJECT;
+       add_s("hdt.product_name",PRODUCT_NAME);
+       add_s("hdt.version",VERSION);
+       add_s("hdt.code_name",CODENAME);
+       add_s("hdt.author", AUTHOR);
+       add_s("hdt.core_developer", CORE_DEVELOPER);
+       char *contributors[NB_CONTRIBUTORS] = CONTRIBUTORS;
+       for (int c = 0; c < NB_CONTRIBUTORS; c++) {
+               add_s("hdt.contributor", contributors[c]);
+       }
+       add_s("hdt.website",WEBSITE_URL);
+       add_s("hdt.irc_channel",IRC_CHANNEL);
+       FLUSH_OBJECT
+       to_cpio("hdt");
+}
diff --git a/com32/hdt/hdt-dump-kernel.c b/com32/hdt/hdt-dump-kernel.c
new file mode 100644 (file)
index 0000000..e0df832
--- /dev/null
@@ -0,0 +1,69 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void dump_kernel(struct s_hardware *hardware, ZZJSON_CONFIG * config,
+                ZZJSON ** item)
+{
+    struct pci_device *pci_device = NULL;
+    CREATE_ARRAY
+           add_as("Linux Kernel modules", "")
+    END_OF_ARRAY;
+
+    if (hardware->pci_ids_return_code == -ENOPCIIDS) {
+       APPEND_ARRAY 
+               add_as("Error", "No pci.ids file")
+       END_OF_APPEND FLUSH_OBJECT;
+       return;
+    }
+
+    if ((hardware->modules_pcimap_return_code == -ENOMODULESPCIMAP)
+       &&(hardware->modules_pcimap_return_code == -ENOMODULESALIAS)) {
+       APPEND_ARRAY
+               add_as("Error", "No modules.pcimap or modules.alias file")
+       END_OF_APPEND FLUSH_OBJECT;
+       return;
+
+       }
+
+    /* For every detected pci device, compute its submenu */
+    for_each_pci_func(pci_device, hardware->pci_domain) {
+       if (pci_device == NULL)
+           continue;
+       for (int kmod = 0;
+            kmod < pci_device->dev_info->linux_kernel_module_count; kmod++) {
+           APPEND_ARRAY
+                   add_as(pci_device->dev_info->category_name, pci_device->dev_info->linux_kernel_module[kmod])
+           END_OF_APPEND;
+       }
+    }
+    FLUSH_OBJECT;
+    to_cpio("kernel");
+}
diff --git a/com32/hdt/hdt-dump-memory.c b/com32/hdt/hdt-dump-memory.c
new file mode 100644 (file)
index 0000000..5095d3c
--- /dev/null
@@ -0,0 +1,133 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include <memory.h>
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void dump_88(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       (void) hardware;
+       int mem_size = 0;
+       CREATE_NEW_OBJECT;
+       if (detect_memory_88(&mem_size)) {
+               add_s("memory.error","8800h memory configuration is invalid");
+               FLUSH_OBJECT
+               return;
+       }
+
+       add_s("dmi.item","memory via 88");
+       add_i("memory.size (KiB)", mem_size);
+       add_i("memory.size (MiB)", mem_size >> 10);
+       FLUSH_OBJECT;
+}
+
+void dump_e801(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       (void) hardware;
+       int mem_low, mem_high = 0;
+       CREATE_NEW_OBJECT;
+       if (detect_memory_e801(&mem_low,&mem_high)) {
+               add_s("memory.error","e801 memory configuration is invalid");
+               FLUSH_OBJECT;
+               return;
+       }
+
+       add_s("dmi.item","memory via e801");
+       add_i("memory.total.size (KiB)", mem_low + (mem_high << 6));
+       add_i("memory.total.size (MiB)", (mem_low >> 10) + (mem_high >> 4));
+       add_i("memory.low.size (KiB)", mem_low );
+       add_i("memory.low.size (MiB)", mem_low >> 10);
+       add_i("memory.high.size (KiB)", mem_high << 6);
+       add_i("memory.high.size (MiB)", mem_high >> 4);
+       FLUSH_OBJECT;
+
+}
+void dump_e820(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+    
+       (void) hardware;
+       struct e820entry map[E820MAX];
+       struct e820entry nm[E820MAX];
+       unsigned long memsize = 0;
+       int count = 0;
+       char type[14] = {0};
+       
+       detect_memory_e820(map, E820MAX, &count);
+       memsize = memsize_e820(map, count);
+       
+       CREATE_NEW_OBJECT;
+               add_s("dmi.item","memory via e820");
+               add_i("memory.total.size (KiB)", memsize);
+               add_i("memory.total.size (MiB)", (memsize + (1 << 9)) >> 10);
+       FLUSH_OBJECT;
+
+       for (int i = 0; i < count; i++) {
+               get_type(map[i].type, type, sizeof(type));
+               char begin[24]={0};
+               char size[24]={0};
+               char end[24]={0};
+               snprintf(begin,sizeof(begin),"0x%016llx",map[i].addr);
+               snprintf(size,sizeof(size),"0x%016llx",map[i].size);
+               snprintf(end,sizeof(end),"0x%016llx",map[i].addr+map[i].size);
+               CREATE_NEW_OBJECT;
+                       add_s("memory.segment.start",begin);
+                       add_s("memory.segment.size ",size);
+                       add_s("memory.segment.end  ",end);
+                       add_s("memory.segment.type ",remove_spaces(type));
+               FLUSH_OBJECT;
+       }
+
+       int nr = sanitize_e820_map(map, nm, count);
+       for (int i = 0; i < nr; i++) {
+               get_type(nm[i].type, type, sizeof(type));
+               char begin[24]={0};
+               char size[24]={0};
+               char end[24]={0};
+               snprintf(begin,sizeof(begin),"0x%016llx",nm[i].addr);
+               snprintf(size,sizeof(size),"0x%016llx",nm[i].size);
+               snprintf(end,sizeof(end),"0x%016llx",nm[i].addr+nm[i].size);
+               CREATE_NEW_OBJECT;
+                       add_s("sanitized_memory.segment.start",begin);
+                       add_s("sanitized_memory.segment.size ",size);
+                       add_s("sanitized_memory.segment.end  ",end);
+                       add_s("sanitized_memory.segment.type ",remove_spaces(type));
+               FLUSH_OBJECT;
+       }
+}
+
+void dump_memory(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       CREATE_NEW_OBJECT;
+               add_s("Memory configuration","true");
+       FLUSH_OBJECT;
+
+       dump_88(hardware,config,item);
+       dump_e801(hardware,config,item);
+       dump_e820(hardware,config,item);
+       to_cpio("memory");
+}
diff --git a/com32/hdt/hdt-dump-pci.c b/com32/hdt/hdt-dump-pci.c
new file mode 100644 (file)
index 0000000..b1f18fd
--- /dev/null
@@ -0,0 +1,136 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void dump_pci(struct s_hardware *hardware, ZZJSON_CONFIG * config,
+             ZZJSON ** item)
+{
+    int i = 1;
+    struct pci_device *pci_device=NULL;
+    char kernel_modules[LINUX_KERNEL_MODULE_SIZE *
+                       MAX_KERNEL_MODULES_PER_PCI_DEVICE];
+    bool nopciids = false;
+    bool nomodulespcimap = false;
+    bool nomodulesalias = false;
+    bool nomodulesfile = false;
+    int bus = 0, slot = 0, func = 0;
+    
+    if (hardware->pci_ids_return_code == -ENOPCIIDS) {
+       nopciids = true;
+    }
+    if (hardware->modules_pcimap_return_code == -ENOMODULESPCIMAP) {
+       nomodulespcimap = true;
+    }
+    if (hardware->modules_pcimap_return_code == -ENOMODULESALIAS) {
+       nomodulesalias = true;
+    }
+
+    nomodulesfile = nomodulespcimap && nomodulesalias;
+
+    CREATE_NEW_OBJECT;
+
+    add_i("pci_device.count", hardware->nb_pci_devices);
+
+    FLUSH_OBJECT;
+    /* For every detected pci device, compute its submenu */
+    for_each_pci_func(pci_device, hardware->pci_domain) {
+       if (pci_device == NULL)
+           continue;
+       char v[10] = { 0 };
+       char sv[10] = { 0 };
+       char p[10] = { 0 };
+       char sp[10] = { 0 };
+       char c[10] = { 0 };
+       char r[10] = { 0 };
+
+       CREATE_NEW_OBJECT;
+       bus = __pci_bus;
+       slot = __pci_slot;
+       func = __pci_func;
+
+       memset(kernel_modules, 0, sizeof kernel_modules);
+       for (int kmod = 0;
+            kmod < pci_device->dev_info->linux_kernel_module_count; kmod++) {
+           if (kmod > 0) {
+               strncat(kernel_modules, " | ", 3);
+           }
+           strncat(kernel_modules,
+                   pci_device->dev_info->linux_kernel_module[kmod],
+                   LINUX_KERNEL_MODULE_SIZE - 1);
+       }
+       if (pci_device->dev_info->linux_kernel_module_count == 0)
+           strlcpy(kernel_modules, "unknown", 7);
+
+       add_i("pci_device.number", i);
+       if (nopciids == false) {
+           add_s("pci_device.vendor_name", pci_device->dev_info->vendor_name);
+           add_s("pci_device.product_name",
+                  pci_device->dev_info->product_name);
+       }
+       if (nomodulesfile == false) {
+           add_s("pci_device.class_name", pci_device->dev_info->class_name);
+           add_s("pci_device.kernel_module", kernel_modules);
+       }
+
+       snprintf(v, sizeof(v), "%04x", pci_device->vendor);
+       snprintf(p, sizeof(p), "%04x", pci_device->product);
+       snprintf(sv, sizeof(sv), "%04x", pci_device->sub_vendor);
+       snprintf(sp, sizeof(sp), "%04x", pci_device->sub_product);
+       snprintf(c, sizeof(c), "%02x.%02x.%02x",
+                pci_device->class[2],
+                pci_device->class[1], pci_device->class[0]);
+       snprintf(r, sizeof(r), "%02x", pci_device->revision);
+       add_s("pci_device.vendor_id", v);
+       add_s("pci_device.product_id", p);
+       add_s("pci_device.sub_vendor_id", sv);
+       add_s("pci_device.sub_product_id", sp);
+       add_s("pci_device.class_id", c);
+       add_s("pci_device.revision", r);
+       if ((pci_device->dev_info->irq > 0)
+           && (pci_device->dev_info->irq < 255))
+           add_i("pci_device.irq", pci_device->dev_info->irq);
+
+       add_i("pci_device.latency", pci_device->dev_info->latency);
+       add_i("pci_device.bus", bus);
+       add_i("pci_device.slot", slot);
+       add_i("pci_device.func", func);
+
+       if (hardware->is_pxe_valid == true) {
+           if ((hardware->pxe.pci_device != NULL)
+               && (hardware->pxe.pci_device == pci_device)) {
+               add_hs(pxe.mac_addr);
+               add_s("pxe", "Current boot device");
+           }
+       }
+       i++;
+       FLUSH_OBJECT;
+    }
+    to_cpio("pci");
+}
diff --git a/com32/hdt/hdt-dump-pxe.c b/com32/hdt/hdt-dump-pxe.c
new file mode 100644 (file)
index 0000000..4e25c94
--- /dev/null
@@ -0,0 +1,80 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+#include <sys/gpxe.h>
+#include <netinet/in.h>
+
+void dump_pxe(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+       struct in_addr in;
+
+       CREATE_NEW_OBJECT;
+       add_hb(is_pxe_valid);
+       if (hardware->is_pxe_valid) {
+               char buffer[32] = {0};
+               snprintf(buffer,sizeof(buffer),"0x%x",hardware->pxe.vendor_id);
+               add_s("pxe.vendor_id",buffer);
+               snprintf(buffer,sizeof(buffer),"0x%x",hardware->pxe.product_id);
+               add_s("pxe.product_id",buffer);
+               snprintf(buffer,sizeof(buffer),"0x%x",hardware->pxe.subvendor_id);
+               add_s("pxe.subvendor_id",buffer);
+               snprintf(buffer,sizeof(buffer),"0x%x",hardware->pxe.subproduct_id);
+               add_s("pxe.subproduct_id",buffer);
+
+               if (hardware->pci_ids_return_code == -ENOPCIIDS || (hardware->pxe.pci_device == NULL)) { 
+                       add_s("Manufacturer_name","no_pci_ids_file or no device found");
+                       add_s("Product_name","no_pci_ids_file or no device found");
+               } else {
+                       add_s("Manufacturer_name", hardware->pxe.pci_device->dev_info->vendor_name);
+                       add_s("Product_name", hardware->pxe.pci_device->dev_info->product_name);
+               }
+
+               add_hi(pxe.rev);
+               add_hi(pxe.pci_bus);
+               add_hi(pxe.pci_dev);
+               add_hi(pxe.pci_func);
+               add_hi(pxe.base_class);
+               add_hi(pxe.sub_class);
+               add_hi(pxe.prog_intf);
+               add_hi(pxe.nictype);
+               add_hs(pxe.mac_addr);
+       
+               in.s_addr = hardware->pxe.dhcpdata.cip;
+               add_s("pxe.client_ip", inet_ntoa(in));
+               in.s_addr = hardware->pxe.dhcpdata.sip;
+               add_s("pxe.next_server_ip",inet_ntoa(in));
+               in.s_addr = hardware->pxe.dhcpdata.gip;
+               add_s("pxe.relay_agent_ip",inet_ntoa(in));
+               memcpy(&in, hardware->pxe.ip_addr, sizeof in);
+               add_s("pxe.ipaddr",inet_ntoa(in));
+               add_b("gpxe_detected",is_gpxe());
+       }
+       FLUSH_OBJECT;
+       to_cpio("pxe");
+}
diff --git a/com32/hdt/hdt-dump-syslinux.c b/com32/hdt/hdt-dump-syslinux.c
new file mode 100644 (file)
index 0000000..7cef925
--- /dev/null
@@ -0,0 +1,43 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+#include <syslinux/config.h>
+
+void dump_syslinux(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       CREATE_NEW_OBJECT;
+       add_hs(syslinux_fs);
+       add_hs(sv->version_string);
+       add_hi(sv->version);
+       add_hi(sv->max_api);
+       add_hs(sv->copyright_string);
+       FLUSH_OBJECT
+       to_cpio("syslinux");
+}
diff --git a/com32/hdt/hdt-dump-vesa.c b/com32/hdt/hdt-dump-vesa.c
new file mode 100644 (file)
index 0000000..97d56c9
--- /dev/null
@@ -0,0 +1,67 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+#include <syslinux/config.h>
+
+void dump_vesa(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       CREATE_NEW_OBJECT;
+       add_hb(is_vesa_valid);
+       if (hardware->is_vesa_valid) {
+               char buffer[64]={0};
+               snprintf(buffer,sizeof(buffer),"%d.%d", hardware->vesa.major_version, hardware->vesa.minor_version);
+               add_s("vesa.version",buffer);
+               add_hs(vesa.vendor);
+               add_hs(vesa.product);
+               add_hs(vesa.product_revision);
+               add_hi(vesa.software_rev);
+               memset(buffer,0,sizeof(buffer));
+               snprintf(buffer,sizeof(buffer),"%d KB",hardware->vesa.total_memory*64);
+               add_s("vesa.memory",buffer);
+               add_i("vesa.modes",hardware->vesa.vmi_count);
+               FLUSH_OBJECT;
+               for (int i = 0; i < hardware->vesa.vmi_count; i++) {
+                       struct vesa_mode_info *mi = &hardware->vesa.vmi[i].mi;
+                       if ((mi->h_res == 0) || (mi->v_res == 0))
+                               continue;
+                       CREATE_NEW_OBJECT;
+                       memset(buffer,0,sizeof(buffer));
+                       snprintf(buffer,sizeof(buffer),"0x%04x",hardware->vesa.vmi[i].mode + 0x200);
+                       add_s("vesa.kernel_mode",buffer);
+                       add_i("vesa.hres",mi->h_res);
+                       add_i("vesa.vres",mi->v_res);
+                       add_i("vesa.bpp",mi->bpp);
+                       FLUSH_OBJECT;
+               }
+       } else {
+               FLUSH_OBJECT;
+       }
+       to_cpio("vesa");
+}
diff --git a/com32/hdt/hdt-dump-vpd.c b/com32/hdt/hdt-dump-vpd.c
new file mode 100644 (file)
index 0000000..36451c8
--- /dev/null
@@ -0,0 +1,47 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+void dump_vpd(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
+
+       CREATE_NEW_OBJECT;
+       add_hb(is_vpd_valid);
+       if (hardware->is_vpd_valid) {
+               add_hs(vpd.bios_build_id);
+               add_hs(vpd.bios_release_date);
+               add_hs(vpd.bios_version);
+               add_hs(vpd.default_flash_filename);
+               add_hs(vpd.box_serial_number);
+               add_hs(vpd.motherboard_serial_number);
+               add_hs(vpd.machine_type_model);
+       }
+       FLUSH_OBJECT;
+       to_cpio("vpd");
+}
diff --git a/com32/hdt/hdt-dump.c b/com32/hdt/hdt-dump.c
new file mode 100644 (file)
index 0000000..8c22140
--- /dev/null
@@ -0,0 +1,169 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <getkey.h>
+#include <syslinux/config.h>
+#include "hdt-common.h"
+#include "hdt-dump.h"
+
+struct print_buf p_buf;
+
+void compute_filename(struct s_hardware *hardware, char *filename, int size) {
+
+   snprintf(filename,size,"%s/",hardware->dump_path);
+
+    if (hardware->is_pxe_valid) {
+           strncat(filename, hardware->pxe.mac_addr, sizeof(hardware->pxe.mac_addr));
+           strncat(filename, "+", 1);
+    } 
+    
+    if (hardware->is_dmi_valid) {
+           strncat(filename, remove_spaces(hardware->dmi.system.product_name), sizeof(hardware->dmi.system.manufacturer));
+           strncat(filename, "+", 1);
+           strncat(filename, remove_spaces(hardware->dmi.system.manufacturer), sizeof(hardware->dmi.system.product_name));
+    }
+
+    /* We replace the ":" in the filename by some "-"
+     * This will avoid Microsoft FS turning crazy */
+    chrreplace(filename,':','-');
+
+    /* Avoid space to make filename easier to manipulate */
+    chrreplace(filename,' ','_');
+
+}
+
+int dumpprintf(FILE *p, const char *format, ...) {
+   va_list ap;
+   int rv;
+
+  (void) p;  
+   va_start(ap, format);
+   rv = vbufprintf(&p_buf,format, ap);
+   va_end(ap);
+   return rv;
+}
+
+void to_cpio(char *filename) { 
+   cpio_writefile(upload,filename,p_buf.buf,p_buf.len);
+   if ((p_buf.buf) && (p_buf.len > 0)){ 
+      memset(p_buf.buf,0,p_buf.len);
+      free(p_buf.buf); 
+      p_buf.buf=NULL;
+      p_buf.size=0;
+      p_buf.len=0;
+   }
+}
+
+void flush (ZZJSON_CONFIG *config, ZZJSON ** item) { 
+   zzjson_print(config, *item);
+   zzjson_free(config, *item);
+   *item=NULL;
+}
+
+/**
+ * dump - dump info
+ **/
+void dump(struct s_hardware *hardware)
+{
+    if (hardware->is_pxe_valid==false) {
+           printf("PXE stack was not detected, Dump feature is not available\n");
+           return;
+    }
+
+    const union syslinux_derivative_info *sdi = syslinux_derivative_info();
+    int err=0;
+    ZZJSON *json = NULL;
+    ZZJSON_CONFIG config = { ZZJSON_VERY_STRICT, NULL,
+               (int(*)(void*)) fgetc,
+               NULL,
+               malloc, calloc, free, realloc,
+               stderr, NULL, stdout,
+               (int(*)(void *,const char*,...)) dumpprintf,
+               (int(*)(int,void*)) fputc 
+    };
+
+    memset(&p_buf,0,sizeof(p_buf));
+
+    /* By now, we only support TFTP reporting */
+    upload=&upload_tftp;
+    upload->name="tftp";
+
+    /* The following defines the behavior of the reporting */
+    char *arg[64];
+    char filename[512]={0};
+    compute_filename(hardware, filename, sizeof(filename));
+
+    /* The filename */
+    arg[0] = filename;
+    /* The server to upload the file */
+    if (strlen(hardware->tftp_ip) != 0) {
+           arg[1] = hardware->tftp_ip;
+           arg[2] = NULL;
+    } else {
+           arg[1] = NULL;
+           snprintf(hardware->tftp_ip, sizeof(hardware->tftp_ip),
+                           "%u.%u.%u.%u",
+                           ((uint8_t *)&sdi->pxe.ipinfo->serverip)[0],
+                           ((uint8_t *)&sdi->pxe.ipinfo->serverip)[1],
+                           ((uint8_t *)&sdi->pxe.ipinfo->serverip)[2],
+                           ((uint8_t *)&sdi->pxe.ipinfo->serverip)[3]);
+
+    }
+
+    /* We initiate the cpio to send */
+    cpio_init(upload,(const char **)arg);
+
+    dump_cpu(hardware, &config, &json);
+    dump_pxe(hardware, &config, &json);
+    dump_syslinux(hardware, &config, &json);
+    dump_vpd(hardware, &config, &json);
+    dump_vesa(hardware, &config, &json);
+    dump_disks(hardware, &config, &json);
+    dump_dmi(hardware, &config, &json);
+    dump_memory(hardware, &config, &json);
+    dump_pci(hardware, &config, &json);
+    dump_acpi(hardware, &config, &json);
+    dump_kernel(hardware, &config, &json);
+    dump_hdt(hardware, &config, &json);
+
+    /* We close & flush the file to send */
+    cpio_close(upload);
+
+    if ((err=flush_data(upload)) != TFTP_OK) {
+       /* As we manage a tftp connection, let's display the associated error message */
+       more_printf("Dump failed !\n");
+       more_printf("TFTP ERROR on  : %s:/%s \n",hardware->tftp_ip, filename);
+       more_printf("TFTP ERROR msg : %s \n",tftp_string_error_message[-err]);
+    } else {
+       more_printf("Dump file sent at %s:/%s\n",hardware->tftp_ip, filename);
+    }
+}
diff --git a/com32/hdt/hdt-dump.h b/com32/hdt/hdt-dump.h
new file mode 100644 (file)
index 0000000..f9669da
--- /dev/null
@@ -0,0 +1,85 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 20011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <bufprintf.h>
+#include <zzjson/zzjson.h>
+#include "hdt-common.h"
+
+// Macros to manipulate Arrays
+#define APPEND_ARRAY ZZJSON *temp_array; temp_array = zzjson_array_append(config, *item, zzjson_create_object(config,
+#define APPEND_OBJECT_ARRAY(value) ZZJSON *temp_ar; temp_ar = zzjson_array_append(config, *item, value); *item=temp_ar; 
+#define CREATE_ARRAY *item = zzjson_create_array(config, zzjson_create_object(config, 
+#define add_ai(name,value) name,zzjson_create_number_i(config,value),
+#define add_ahi(value) add_ai(#value,hardware->value)
+#define add_as(name,value) name,zzjson_create_string(config,value),
+#define add_ahs(value) add_as(#value,hardware->value)
+#define END_OF_ARRAY NULL),NULL)
+#define END_OF_APPEND NULL)); *item=temp_array;
+
+// Macros to manipulate objects
+#define CREATE_NEW_OBJECT   *item = zzjson_create_object(config, NULL);
+#define FLUSH_OBJECT flush(config, item); 
+
+// Macros to manipulate integers as objects
+#define add_i(name,value) *item = zzjson_object_append(config, *item, name, zzjson_create_number_i(config, value))
+#define add_hi(value) add_i(#value,hardware->value)
+
+// Macros to manipulate strings as objects
+#define add_s(name,value) *item = zzjson_object_append(config, *item, name, zzjson_create_string(config, value))
+#define add_hs(value) add_s(#value,(char *)hardware->value)
+
+// Macros to manipulate bool as objects
+#define add_bool_true(name) *item = zzjson_object_append(config, *item, (char *)name, zzjson_create_true(config))
+#define add_bool_false(name) *item = zzjson_object_append(config, *item, (char*)name, zzjson_create_false(config))
+#define add_b(name,value) if (value==true) {add_bool_true(name);} else {add_bool_false(name);}
+#define add_hb(value) add_b(#value,hardware->value)
+
+extern struct print_buf p_buf;
+
+void print_and_flush(ZZJSON_CONFIG *config, ZZJSON **item);
+int dumpprintf(FILE *p, const char *format, ...);
+void flush (ZZJSON_CONFIG *config, ZZJSON ** item);
+void to_cpio(char *filename);
+
+void dump_cpu(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_pxe(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_syslinux(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_vpd(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_vesa(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_disks(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_dmi(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_memory(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_pci(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_acpi(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_kernel(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump_hdt(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item);
+void dump(struct s_hardware *hardware);
index 16bcf73..8e0ba18 100644 (file)
@@ -32,7 +32,7 @@ void compute_table(struct s_my_menu *menu, void *address, s_acpi_description_hea
     char buffer[SUBMENULEN + 1] = { 0 };
     char statbuffer[STATLEN + 1] = { 0 };
 
-    snprintf(buffer, sizeof buffer, "%-4s v%03x %-6s %-7s %-7s %08x", 
+    snprintf(buffer, sizeof buffer, "%-4s v%03x %-6s %-8s %-7s %08x", 
                    h->signature, h->revision, h->oem_id, h->oem_table_id, h->creator_id, h->creator_revision);
     snprintf(statbuffer, sizeof statbuffer, "%-4s v%03x %-6s %-7s 0x%08x %-4s    0x%08x @ 0x%p", 
                    h->signature, h->revision, h->oem_id, h->oem_table_id,
@@ -52,7 +52,7 @@ static void compute_acpi_tables(struct s_my_menu *menu,
 
     char buffer[SUBMENULEN + 1] = { 0 };
 
-    snprintf(buffer, sizeof buffer, "%-4s %-4s %-6s %-7s %-7s %-8s", 
+    snprintf(buffer, sizeof buffer, "%-4s %-4s %-6s %-8s %-7s %-8s", 
                    "ACPI", "rev", "oem", "table_id", "creator", "creator_rev");
     add_item(buffer, "Description", OPT_INACTIVE, NULL, 0);
     menu->items_count++;
index b0b4a5a..0716b43 100644 (file)
@@ -120,9 +120,9 @@ static void compute_partition_information(struct driveinfo *drive_info,
        add_item(buffer, statbuffer, OPT_INACTIVE, NULL, 0);
     }
 
-    snprintf(buffer, sizeof buffer, "Bootable    : %s",
+    snprintf(buffer, sizeof buffer, "Boot Flag   : %s",
             (ptab->active_flag == 0x80) ? "Yes" : "No");
-    snprintf(statbuffer, sizeof statbuffer, "Bootable: %s",
+    snprintf(statbuffer, sizeof statbuffer, "Boot Flag: %s",
             (ptab->active_flag == 0x80) ? "Yes" : "No");
     add_item(buffer, statbuffer, OPT_INACTIVE, NULL, 0);
 
@@ -243,12 +243,12 @@ void compute_disks(struct s_hdt_menu *menu, struct s_hardware *hardware)
     if (hardware->disks_count == 0)
        return;
 
-    for (int i = 0; i < hardware->disks_count; i++) {
-       if (!hardware->disk_info[i].cbios)
+    for (int drive = 0x80; drive < 0xff; drive++) {
+       if (!hardware->disk_info[drive - 0x80].cbios)
            continue;           /* Invalid geometry */
        compute_disk_module
            ((struct s_my_menu *)&(menu->disk_sub_menu), nb_sub_disk_menu,
-            hardware, i);
+            hardware, drive - 0x80);
        nb_sub_disk_menu++;
     }
 
index 426bfe0..12d8b11 100644 (file)
@@ -34,7 +34,7 @@ void compute_PXE(struct s_my_menu *menu, struct s_hardware *hardware)
 {
     char buffer[SUBMENULEN + 1];
     char infobar[STATLEN + 1];
-    char gpxe[4];
+    char gpxe[4]={0};
 
     if (hardware->is_pxe_valid == false)
        return;
@@ -113,8 +113,8 @@ void compute_PXE(struct s_my_menu *menu, struct s_hardware *hardware)
     add_item(buffer, infobar, OPT_INACTIVE, NULL, 0);
     menu->items_count++;
 
-    if (is_gpxe()) strcat(gpxe,"Yes");
-    else strcat (gpxe,"No");
+    if (is_gpxe()) snprintf(gpxe,sizeof(gpxe),"%s","Yes");
+    else snprintf (gpxe, sizeof(gpxe), "%s", "No");
 
     snprintf(buffer, sizeof buffer, "gPXE Detected: %s", gpxe);
     snprintf(infobar, sizeof infobar, "gPXE Detected: %s", gpxe);
index 0fdee03..50b3eaa 100644 (file)
@@ -62,6 +62,12 @@ int start_menu_mode(struct s_hardware *hardware, char *version_string)
                (curr->data, HDT_SWITCH_TO_CLI, sizeof(HDT_SWITCH_TO_CLI))) {
                return HDT_RETURN_TO_CLI;
            }
+           /* Tweak, we want to start the dump mode */
+           if (!strncmp
+               (curr->data, HDT_DUMP, sizeof(HDT_DUMP))) {
+                   dump(hardware);
+               return 0;
+           }
            if (!strncmp
                (curr->data, HDT_REBOOT, sizeof(HDT_REBOOT))) {
                syslinux_reboot(1);
@@ -289,6 +295,12 @@ void compute_main_menu(struct s_hdt_menu *hdt_menu, struct s_hardware *hardware)
 
     add_item("S<w>itch to CLI", "Switch to Command Line", OPT_RUN,
             HDT_SWITCH_TO_CLI, 0);
+
+    if (hardware->is_pxe_valid == true) {
+    add_item("<D>ump to tftp", "Dump to tftp", OPT_RUN,
+            HDT_DUMP, 0);
+    }
+
     add_item("<A>bout", "About Menu", OPT_SUBMENU, NULL,
             hdt_menu->about_menu.menu);
     add_item("<R>eboot", "Reboot", OPT_RUN, HDT_REBOOT, 0);
index ca3835d..dd9f801 100755 (executable)
Binary files a/com32/hdt/hdt.c32 and b/com32/hdt/hdt.c32 differ
index dd48948..7b35236 100644 (file)
@@ -33,8 +33,8 @@
 #define AUTHOR "Erwan Velu"
 #define CORE_DEVELOPER "Pierre-Alexandre Meyer"
 #define CONTACT "hdt@zytor.com"
-#define VERSION "0.4.1"
-#define CODENAME "chouffe"
+#define VERSION "0.5.0"
+#define CODENAME "Van De Keizer"
 #define NB_CONTRIBUTORS 3
 #define CONTRIBUTORS {"Sebastien Gonzalve (Patches)", "Gert Hulselmans (Tests)", "Alexander Andino (Design)"}
 #define WEBSITE_URL "http://hdt-project.org"
index caa5e72..213e8ab 100644 (file)
@@ -6,13 +6,9 @@
 #define _BITSIZE_STDDEF_H
 
 #define _SIZE_T
-#if defined(__s390__) || defined(__hppa__) || defined(__cris__)
-typedef unsigned long size_t;
-#else
 typedef unsigned int size_t;
-#endif
 
 #define _PTRDIFF_T
-typedef signed int ptrdiff_t;
+typedef signed long ptrdiff_t;
 
 #endif /* _BITSIZE_STDDEF_H */
index 8cbfc5d..8e444b6 100644 (file)
@@ -5,24 +5,24 @@
 #ifndef _BITSIZE_STDINT_H
 #define _BITSIZE_STDINT_H
 
-typedef signed char int8_t;
-typedef short int int16_t;
-typedef int int32_t;
-typedef long long int int64_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 short int uint16_t;
-typedef unsigned int uint32_t;
-typedef unsigned long long int uint64_t;
+typedef unsigned char          uint8_t;
+typedef unsigned short int     uint16_t;
+typedef unsigned int           uint32_t;
+typedef unsigned long long int uint64_t;
 
-typedef int int_fast16_t;
-typedef int int_fast32_t;
+typedef int                    int_fast16_t;
+typedef int                    int_fast32_t;
 
-typedef unsigned int uint_fast16_t;
-typedef unsigned int uint_fast32_t;
+typedef unsigned int           uint_fast16_t;
+typedef unsigned int           uint_fast32_t;
 
-typedef int intptr_t;
-typedef unsigned int uintptr_t;
+typedef int                    intptr_t;
+typedef unsigned int           uintptr_t;
 
 #define __INT64_C(c)   c ## LL
 #define __UINT64_C(c)  c ## ULL
@@ -31,4 +31,4 @@ typedef unsigned int uintptr_t;
 #define __PRIFAST_RANK ""
 #define __PRIPTR_RANK  ""
 
-#endif /* _BITSIZE_STDINT_H */
+#endif                         /* _BITSIZE_STDINT_H */
index 8157dd0..7db63bd 100644 (file)
@@ -15,4 +15,4 @@
 #define UINTPTR_C(c)    UINT32_C(c)
 #define PTRDIFF_C(c)     INT32_C(c)
 
-#endif /* _BITSIZE_STDINTCONST_H */
+#endif                         /* _BITSIZE_STDINTCONST_H */
index b44fe01..d85094d 100644 (file)
@@ -19,4 +19,4 @@
 #define PTRDIFF_MIN    INT32_MIN
 #define PTRDIFF_MAX    INT32_MAX
 
-#endif /* _BITSIZE_STDINTLIMITS_H */
+#endif                         /* _BITSIZE_STDINTLIMITS_H */
diff --git a/com32/include/bufprintf.h b/com32/include/bufprintf.h
new file mode 100644 (file)
index 0000000..5cbeaa4
--- /dev/null
@@ -0,0 +1,10 @@
+#define BUFPAD 4096
+
+struct print_buf {
+    char *buf;
+    size_t len;
+    size_t size;
+};
+
+int vbufprintf(struct print_buf *buf, const char *format, va_list ap);
+int bufprintf(struct print_buf *buf, const char *format, ...);
index df9dd3d..83263c2 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef __ASM_I386_CPUFEATURE_H
 #define __ASM_I386_CPUFEATURE_H
 
-#define NCAPINTS       7       /* N 32-bit words worth of info */
+#define NCAPINTS       9       /* N 32-bit words worth of info */
 
 /* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */
 #define X86_FEATURE_FPU                (0*32+ 0)       /* Onboard FPU */
index 83bbda1..6e0645e 100644 (file)
@@ -117,5 +117,6 @@ __ctype_inline int tolower(int __c)
 }
 
 __extern char *skipspace(const char *p);
+__extern void chrreplace(char *source, char old, char new);
 
 #endif /* _CTYPE_H */
index 30a21ad..b8a3b84 100644 (file)
@@ -7,16 +7,30 @@
 
 #ifdef DEBUG
 
-#include <stdio.h>
+# include <stdio.h>
 
+# ifdef DEBUG_STDIO
+#  define dprintf  printf
+#  define vdprintf vprintf
+# else
 void dprintf(const char *, ...);
 void vdprintf(const char *, va_list);
+# endif
 
 #else
 
-#define dprintf(fmt, ...)      ((void)(0))
-#define vdprintf(fmt, ap)      ((void)(0))
+# define dprintf(fmt, ...)     ((void)(0))
+# define vdprintf(fmt, ap)     ((void)(0))
 
 #endif /* DEBUG */
 
+# if DEBUG >= 2
+/* Really verbose debugging... */
+#  define dprintf2  dprintf
+#  define vdprintf2 vdprintf
+# else
+#  define dprintf2(fmt, ...)   ((void)(0))
+#  define vdprintf2(fmt, ap)   ((void)(0))
+# endif
+
 #endif /* _DPRINTF_H */
index ccf0475..d2af351 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <stdint.h>
 #include <klibc/compiler.h>
+#include <klibc/extern.h>
 
 #define __htons_macro(v) ((uint16_t)                                   \
                          (((uint16_t)(v) << 8) |                       \
@@ -53,4 +54,6 @@ struct in_addr {
     in_addr_t s_addr;
 };
 
+__extern char *inet_ntoa(struct in_addr);
+
 #endif /* _NETINET_IN_H */
index a8391bf..f64f027 100644 (file)
 #ifndef _STDINT_H
 #define _STDINT_H
 
-/* Exact types */
+#include <bitsize/stdint.h>
 
-typedef signed char int8_t;
-typedef signed short int16_t;
-typedef signed int int32_t;
-typedef signed long long int64_t;
+typedef int8_t         int_least8_t;
+typedef int16_t                int_least16_t;
+typedef int32_t                int_least32_t;
+typedef int64_t                int_least64_t;
 
-typedef unsigned char uint8_t;
-typedef unsigned short uint16_t;
-typedef unsigned int uint32_t;
-typedef unsigned long long uint64_t;
+typedef uint8_t                uint_least8_t;
+typedef uint16_t       uint_least16_t;
+typedef uint32_t       uint_least32_t;
+typedef uint64_t       uint_least64_t;
 
-/* Small types */
+typedef int8_t         int_fast8_t;
+typedef int64_t                int_fast64_t;
 
-typedef signed char int_least8_t;
-typedef signed short int_least16_t;
-typedef signed int int_least32_t;
-typedef signed long long int_least64_t;
+typedef uint8_t                uint_fast8_t;
+typedef uint64_t       uint_fast64_t;
 
-typedef unsigned char uint_least8_t;
-typedef unsigned short uint_least16_t;
-typedef unsigned int uint_least32_t;
-typedef unsigned long long uint_least64_t;
+typedef int64_t                intmax_t;
+typedef uint64_t       uintmax_t;
 
-/* Fast types */
-
-typedef signed char int_fast8_t;
-typedef signed short int_fast16_t;
-typedef signed int int_fast32_t;
-typedef signed long long int_fast64_t;
-
-typedef unsigned char uint_fast8_t;
-typedef unsigned short uint_fast16_t;
-typedef unsigned int uint_fast32_t;
-typedef unsigned long long uint_fast64_t;
-
-/* Pointer types */
-
-typedef int32_t intptr_t;
-typedef uint32_t uintptr_t;
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS)
 
-/* Maximal types */
+#define INT8_MIN       (-128)
+#define INT16_MIN      (-32768)
+#define INT32_MIN      (-2147483647-1)
+#define INT64_MIN      (__INT64_C(-9223372036854775807)-1)
 
-typedef int64_t intmax_t;
-typedef uint64_t uintmax_t;
+#define INT8_MAX       (127)
+#define INT16_MAX      (32767)
+#define INT32_MAX      (2147483647)
+#define INT64_MAX      (__INT64_C(9223372036854775807))
 
-/*
- * To be strictly correct...
- */
-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS)
+#define UINT8_MAX      (255U)
+#define UINT16_MAX     (65535U)
+#define UINT32_MAX     (4294967295U)
+#define UINT64_MAX     (__UINT64_C(18446744073709551615))
 
-# define INT8_MIN               (-128)
-# define INT16_MIN              (-32767-1)
-# define INT32_MIN              (-2147483647-1)
-# define INT64_MIN              (-9223372036854775807LL-1)
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST16_MIN        INT16_MIN
+#define INT_LEAST32_MIN        INT32_MIN
+#define INT_LEAST64_MIN        INT64_MIN
 
-# define INT8_MAX               (127)
-# define INT16_MAX              (32767)
-# define INT32_MAX              (2147483647)
-# define INT64_MAX              (9223372036854775807LL)
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST16_MAX        INT16_MAX
+#define INT_LEAST32_MAX        INT32_MAX
+#define INT_LEAST64_MAX        INT64_MAX
 
-# define UINT8_MAX              (255U)
-# define UINT16_MAX             (65535U)
-# define UINT32_MAX             (4294967295U)
-# define UINT64_MAX             (18446744073709551615ULL)
+#define UINT_LEAST8_MAX         UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
 
-# define INT_LEAST8_MIN               (-128)
-# define INT_LEAST16_MIN              (-32767-1)
-# define INT_LEAST32_MIN              (-2147483647-1)
-# define INT_LEAST64_MIN              (-9223372036854775807LL-1)
+#define INT_FAST8_MIN  INT8_MIN
+#define INT_FAST64_MIN INT64_MIN
 
-# define INT_LEAST8_MAX               (127)
-# define INT_LEAST16_MAX              (32767)
-# define INT_LEAST32_MAX              (2147483647)
-# define INT_LEAST64_MAX              (9223372036854775807LL)
+#define INT_FAST8_MAX  INT8_MAX
+#define INT_FAST64_MAX INT64_MAX
 
-# define UINT_LEAST8_MAX              (255U)
-# define UINT_LEAST16_MAX             (65535U)
-# define UINT_LEAST32_MAX             (4294967295U)
-# define UINT_LEAST64_MAX             (18446744073709551615ULL)
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_FAST64_MAX UINT64_MAX
 
-# define INT_FAST8_MIN               (-128)
-# define INT_FAST16_MIN              (-32767-1)
-# define INT_FAST32_MIN              (-2147483647-1)
-# define INT_FAST64_MIN              (-9223372036854775807LL-1)
+#define INTMAX_MIN     INT64_MIN
+#define INTMAX_MAX     INT64_MAX
+#define UINTMAX_MAX    UINT64_MAX
 
-# define INT_FAST8_MAX               (127)
-# define INT_FAST16_MAX              (32767)
-# define INT_FAST32_MAX              (2147483647)
-# define INT_FAST64_MAX              (9223372036854775807LL)
+#include <bitsize/stdintlimits.h>
 
-# define UINT_FAST8_MAX              (255U)
-# define UINT_FAST16_MAX             (65535U)
-# define UINT_FAST32_MAX             (4294967295U)
-# define UINT_FAST64_MAX             (18446744073709551615ULL)
+#endif
 
-# define INTPTR_MIN            (-2147483647-1)
-# define INTPTR_MAX            (2147483647)
-# define UINTPTR_MAX           (4294967295U)
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
 
-# define INTMAX_MIN            (-9223372036854775807LL-1)
-# define INTMAX_MAX            (9223372036854775807LL)
-# define UINTMAX_MAX           (18446744073709551615ULL)
+#define INT8_C(c)      c
+#define INT16_C(c)     c
+#define INT32_C(c)     c
+#define INT64_C(c)     __INT64_C(c)
 
-/* ptrdiff_t limit */
-# define PTRDIFF_MIN           (-2147483647-1)
-# define PTRDIFF_MAX           (2147483647)
+#define UINT8_C(c)     c ## U
+#define UINT16_C(c)    c ## U
+#define UINT32_C(c)    c ## U
+#define UINT64_C(c)    __UINT64_C(c)
 
-/* sig_atomic_t limit */
-# define SIG_ATOMIC_MIN         (-2147483647-1)
-# define SIG_ATOMIC_MAX         (2147483647)
+#define INT_LEAST8_C(c)         INT8_C(c)
+#define INT_LEAST16_C(c) INT16_C(c)
+#define INT_LEAST32_C(c) INT32_C(c)
+#define INT_LEAST64_C(c) INT64_C(c)
 
-/* size_t limit */
-# define SIZE_MAX              (4294967295U)
+#define UINT_LEAST8_C(c)  UINT8_C(c)
+#define UINT_LEAST16_C(c) UINT16_C(c)
+#define UINT_LEAST32_C(c) UINT32_C(c)
+#define UINT_LEAST64_C(c) UINT64_C(c)
 
-#endif /* STDC_LIMIT_MACROS */
+#define INT_FAST8_C(c) INT8_C(c)
+#define INT_FAST64_C(c) INT64_C(c)
 
-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS)
+#define UINT_FAST8_C(c)  UINT8_C(c)
+#define UINT_FAST64_C(c) UINT64_C(c)
 
-# define INT8_C(n)     n
-# define INT16_C(n)    n
-# define INT32_C(n)    n
-# define INT64_C(n)    n ## LL
+#define INTMAX_C(c)    INT64_C(c)
+#define UINTMAX_C(c)   UINT64_C(c)
 
-# define UINT8_C(n)    n ## U
-# define UINT16_C(n)   n ## U
-# define UINT32_C(n)   n ## U
-# define UINT64_C(n)   n ## ULL
+#include <bitsize/stdintconst.h>
 
-# define INTMAX_C(n)   n ## LL
-# define UINTMAX_C(n)  n ## ULL
+#endif
 
-#endif /* STDC_CONSTANT_MACROS */
+/* Keep the kernel from trying to define these types... */
+#define __BIT_TYPES_DEFINED__
 
-#endif /* _STDINT_H */
+#endif                         /* _STDINT_H */
index 54ee7ff..8bcdf3e 100644 (file)
@@ -83,7 +83,12 @@ int syslinux_memmap_find(struct syslinux_memmap *list,
                         addr_t * start, addr_t * len, addr_t align);
 
 /* Debugging functions */
-void syslinux_dump_movelist(FILE * file, struct syslinux_movelist *ml);
-void syslinux_dump_memmap(FILE * file, struct syslinux_memmap *memmap);
+#ifdef DEBUG
+void syslinux_dump_movelist(struct syslinux_movelist *ml);
+void syslinux_dump_memmap(struct syslinux_memmap *memmap);
+#else
+#define syslinux_dump_movelist(x) ((void)0)
+#define syslinux_dump_memmap(x)          ((void)0)
+#endif
 
 #endif /* _SYSLINUX_MOVEBITS_H */
index 48a166d..105c2bd 100644 (file)
@@ -4,8 +4,9 @@
 
 # Include configuration rules
 NOGPL := 1
-topdir = ../..
-include MCONFIG
+topdir = ../../
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/lib.mk
 
 LIBOBJS = \
        abort.o atexit.o atoi.o atol.o atoll.o calloc.o creat.o         \
@@ -28,6 +29,9 @@ LIBOBJS = \
        asprintf.o vasprintf.o strlcpy.o strlcat.o                      \
        vsscanf.o zalloc.o                                              \
        skipspace.o                                                     \
+       chrreplace.o                                                    \
+       bufprintf.o                                                     \
+       inet.o                                                          \
        \
        lmalloc.o lstrdup.o                                             \
        \
diff --git a/com32/lib/bufprintf.c b/com32/lib/bufprintf.c
new file mode 100644 (file)
index 0000000..939bcec
--- /dev/null
@@ -0,0 +1,41 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <bufprintf.h>
+
+int vbufprintf(struct print_buf *buf, const char *format, va_list ap)
+{
+    va_list ap2;
+    int rv;
+
+    va_copy(ap2, ap);
+    rv = vsnprintf(NULL, 0, format, ap);
+
+    /* >= to make sure we have space for terminating null */
+    if (rv + buf->len >= buf->size) {
+       size_t newsize = rv + buf->len + BUFPAD;
+       char *newbuf;
+
+       newbuf = realloc(buf->buf, newsize);
+       if (!newbuf)
+           return -1;
+
+       buf->buf = newbuf;
+       buf->size = newsize;
+    }
+
+    rv = vsnprintf(buf->buf + buf->len, buf->size - buf->len, format, ap2);
+    buf->len += rv;
+    return rv;
+}
+
+int bufprintf(struct print_buf *buf, const char *format, ...)
+{
+    va_list ap;
+    int rv;
+
+    va_start(ap, format);
+    rv = vbufprintf(buf, format, ap);
+    va_end(ap);
+    return rv;
+}
diff --git a/com32/lib/chrreplace.c b/com32/lib/chrreplace.c
new file mode 100644 (file)
index 0000000..65786f9
--- /dev/null
@@ -0,0 +1,11 @@
+#include <ctype.h>
+
+/* Replace char 'old' by char 'new' in source */
+void chrreplace(char *source, char old, char new) 
+{
+    while (*source) { 
+       source++;
+       if (source[0] == old) source[0]=new;
+    }
+}
+
index 900c0a4..aad1174 100644 (file)
@@ -9,6 +9,7 @@
 #define DEBUG 1
 #include <dprintf.h>
 
+#ifndef dprintf
 void dprintf(const char *format, ...)
 {
     va_list ap;
@@ -17,3 +18,4 @@ void dprintf(const char *format, ...)
     vdprintf(format, ap);
     va_end(ap);
 }
+#endif
diff --git a/com32/lib/inet.c b/com32/lib/inet.c
new file mode 100644 (file)
index 0000000..133645e
--- /dev/null
@@ -0,0 +1,39 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Erwan Velu - 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.
+ *
+ * -----------------------------------------------------------------------
+ */
+
+#include <stdio.h>
+#include <netinet/in.h>
+
+char *inet_ntoa(struct in_addr addr)
+{
+    static char buf[16];
+    const uint8_t *bytes = (const uint8_t *)&addr.s_addr;
+
+    sprintf(buf, "%u.%u.%u.%u", bytes[0], bytes[1], bytes[2], bytes[3]);
+    return buf;
+}
index c8334b1..e0974f9 100644 (file)
 #include <stdbool.h>
 #include <ctype.h>
 #include <syslinux/zio.h>
-
-#ifdef DEBUG
-# define dprintf printf
-#else
-# define dprintf(...) ((void)0)
-#endif
+#include <dprintf.h>
 
 #define MAX_LINE 512
 
@@ -66,15 +61,6 @@ static int hex_to_int(char *hexa)
     return strtoul(hexa, NULL, 16);
 }
 
-/* Replace char 'old' by char 'new' in source */
-void chr_replace(char *source, char old, char new) 
-{
-    while (*source) { 
-       source++;
-       if (source[0] == old) source[0]=new;
-    }
-}
-
 /* Try to match any pci device to the appropriate kernel module */
 /* it uses the modules.pcimap from the boot device */
 int get_module_name_from_pcimap(struct pci_domain *domain,
@@ -135,7 +121,7 @@ int get_module_name_from_pcimap(struct pci_domain *domain,
          * in the module name whereas modules.alias is only using '_'.
          * To avoid kernel modules duplication, let's rename all '-' in '_' 
          * to match what modules.alias provides */
-        case 0:chr_replace(result,'-','_');strcpy(module_name,result); break;
+        case 0:chrreplace(result,'-','_');strcpy(module_name,result); break;
         case 1:strcpy(vendor_id,result); break;
         case 2:strcpy(product_id,result); break;
         case 3:strcpy(sub_vendor_id,result); break;
index 3f1e340..85638cd 100644 (file)
 /*
  * dump_mmap.c
  *
- * Writes a syslinux_memmap out to a specified file.  This is
- * intended for debugging.
+ * Writes a syslinux_memmap out to a dprintf.
  */
 
 #include <stdio.h>
+#include <dprintf.h>
 #include <syslinux/movebits.h>
 
-void syslinux_dump_memmap(FILE * file, struct syslinux_memmap *memmap)
+#ifdef DEBUG
+void syslinux_dump_memmap(struct syslinux_memmap *memmap)
 {
-    fprintf(file, "%10s %10s %10s\n"
+    dprintf("%10s %10s %10s\n"
            "--------------------------------\n", "Start", "Length", "Type");
     while (memmap->next) {
-       fprintf(file, "0x%08x 0x%08x %10d\n", memmap->start,
+       dprintf("0x%08x 0x%08x %10d\n", memmap->start,
                memmap->next->start - memmap->start, memmap->type);
        memmap = memmap->next;
     }
 }
+#endif
index 282d006..4042ce9 100644 (file)
  */
 
 #include <stdio.h>
+#include <dprintf.h>
 #include <syslinux/movebits.h>
 
-void syslinux_dump_movelist(FILE * file, struct syslinux_movelist *ml)
+#ifdef DEBUG
+void syslinux_dump_movelist(struct syslinux_movelist *ml)
 {
-    fprintf(file, "%10s %10s %10s\n"
+    dprintf("%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);
+       dprintf("0x%08x 0x%08x 0x%08x\n", ml->dst, ml->src, ml->len);
        ml = ml->next;
     }
 }
+#endif
index c1ce875..45cd696 100644 (file)
 #include <syslinux/linux.h>
 #include <syslinux/bootrm.h>
 #include <syslinux/movebits.h>
-
-#ifndef DEBUG
-# define DEBUG 0
-#endif
-#if DEBUG
-# include <stdio.h>
-# define dprintf printf
-#else
-# define dprintf(f, ...) ((void)0)
-#endif
+#include <dprintf.h>
 
 struct linux_header {
     uint8_t boot_sector_1[0x0020];
@@ -318,10 +309,8 @@ int syslinux_boot_linux(void *kernel_buf, size_t kernel_size,
     if (!mmap || !amap)
        goto bail;
 
-#if DEBUG
     dprintf("Initial memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
-#endif
+    syslinux_dump_memmap(mmap);
 
     /* 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
@@ -468,16 +457,14 @@ int syslinux_boot_linux(void *kernel_buf, size_t kernel_size,
     /* Linux is OK with sp = 0 = 64K, but perhaps other things aren't... */
     regs.esp.w[0] = min(cmdline_offset, (size_t) 0xfff0);
 
-#if DEBUG
     dprintf("Final memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
+    syslinux_dump_memmap(mmap);
 
     dprintf("Final available map:\n");
-    syslinux_dump_memmap(stdout, amap);
+    syslinux_dump_memmap(amap);
 
     dprintf("Initial movelist:\n");
-    syslinux_dump_movelist(stdout, fraglist);
-#endif
+    syslinux_dump_movelist(fraglist);
 
     syslinux_shuffle_boot_rm(fraglist, mmap, 0, &regs);
 
index bd5ce0e..7a05f3c 100644 (file)
 #include <stdbool.h>
 
 #include <syslinux/movebits.h>
-
-#ifndef DEBUG
-# ifdef TEST
-#  define DEBUG 1
-# else
-#  define DEBUG 0
-# endif
-#endif
-
-#if DEBUG
-# include <stdio.h>
-# define dprintf printf
-#else
-# define dprintf(...) ((void)0)
-#endif
+#include <dprintf.h>
 
 static jmp_buf new_movelist_bail;
 
@@ -242,10 +228,8 @@ static void shuffle_dealias(struct syslinux_movelist **fraglist,
     addr_t ps, pe, xs, xe, delta;
     bool advance;
 
-#if DEBUG
     dprintf("Before alias resolution:\n");
-    syslinux_dump_movelist(stdout, *fraglist);
-#endif
+    syslinux_dump_movelist(*fraglist);
 
     *postcopy = NULL;
 
@@ -316,12 +300,10 @@ restart:
        ;
     }
 
-#if DEBUG
     dprintf("After alias resolution:\n");
-    syslinux_dump_movelist(stdout, *fraglist);
+    syslinux_dump_movelist(*fraglist);
     dprintf("Post-shuffle copies:\n");
-    syslinux_dump_movelist(stdout, *postcopy);
-#endif
+    syslinux_dump_movelist(*postcopy);
 }
 
 /*
@@ -449,12 +431,10 @@ nomem:
     /* As long as there are unprocessed fragments in the chain... */
     while ((fp = &frags, f = *fp)) {
 
-#if DEBUG
        dprintf("Current free list:\n");
-       syslinux_dump_memmap(stdout, mmap);
+       syslinux_dump_memmap(mmap);
        dprintf("Current frag list:\n");
-       syslinux_dump_movelist(stdout, frags);
-#endif
+       syslinux_dump_movelist(frags);
 
        /* Scan for fragments which can be discarded without action. */
        if (f->src == f->dst) {
@@ -692,16 +672,16 @@ int main(int argc, char *argv[])
 
     *fep = NULL;
 
-    printf("Input move list:\n");
-    syslinux_dump_movelist(stdout, frags);
-    printf("Input free list:\n");
-    syslinux_dump_memmap(stdout, memmap);
+    dprintf("Input move list:\n");
+    syslinux_dump_movelist(frags);
+    dprintf("Input free list:\n");
+    syslinux_dump_memmap(memmap);
 
     if (syslinux_compute_movelist(&moves, frags, memmap)) {
        printf("Failed to compute a move sequence\n");
        return 1;
     } else {
-       printf("Final move list:\n");
+       dprintf("Final move list:\n");
        syslinux_dump_movelist(stdout, moves);
        return 0;
     }
index 54a7e65..e9ee6aa 100644 (file)
 #include <inttypes.h>
 #include <com32.h>
 #include <minmax.h>
+#include <dprintf.h>
 #include <syslinux/movebits.h>
 #include <klibc/compiler.h>
 
-#ifndef DEBUG
-# define DEBUG 0
-#endif
-
-#define dprintf(f, ...) ((void)0)
-#define dprintf2(f, ...) ((void)0)
-
-#if DEBUG
-# include <stdio.h>
-# undef dprintf
-# define dprintf printf
-# if DEBUG > 1
-#  undef dprintf2
-#  define dprintf2 printf
-# endif
-#endif
-
 struct shuffle_descriptor {
     uint32_t dst, src, len;
 };
index b548211..7034c4b 100644 (file)
 #include <stdlib.h>
 #include <syslinux/align.h>
 #include <syslinux/movebits.h>
-
-#ifndef DEBUG
-# ifdef TEST
-#  define DEBUG 1
-# else
-#  define DEBUG 0
-# endif
-#endif
-
-#if DEBUG
-# include <stdio.h>
-# define dprintf printf
-#else
-# define dprintf(...) ((void)0)
-#endif
+#include <dprintf.h>
 
 /*
  * Create an empty syslinux_memmap list.
@@ -96,10 +82,8 @@ int syslinux_add_memmap(struct syslinux_memmap **list,
     struct syslinux_memmap *range;
     enum syslinux_memmap_types oldtype;
 
-#if DEBUG
     dprintf("Input memmap:\n");
-    syslinux_dump_memmap(stdout, *list);
-#endif
+    syslinux_dump_memmap(*list);
 
     /* Remove this to make len == 0 mean all of memory */
     if (len == 0)
@@ -164,10 +148,8 @@ int syslinux_add_memmap(struct syslinux_memmap **list,
        }
     }
 
-#if DEBUG
     dprintf("After adding (%#x,%#x,%d):\n", start, len, type);
-    syslinux_dump_memmap(stdout, *list);
-#endif
+    syslinux_dump_memmap(*list);
 
     return 0;
 }
index d74f278..c1f90a6 100644 (file)
@@ -14,6 +14,8 @@
 #define DEBUG 1
 #include <dprintf.h>
 
+#ifndef vdprintf
+
 #define BUFFER_SIZE    4096
 
 enum serial_port_regs {
@@ -114,3 +116,5 @@ void vdprintf(const char *format, va_list ap)
     while (rv--)
        debug_putc(*p++);
 }
+
+#endif /* vdprintf */
diff --git a/com32/libupload/.gitignore b/com32/libupload/.gitignore
new file mode 100644 (file)
index 0000000..e0292b1
--- /dev/null
@@ -0,0 +1,2 @@
+*.o
+*.a
diff --git a/com32/libupload/Makefile b/com32/libupload/Makefile
new file mode 100644 (file)
index 0000000..8305335
--- /dev/null
@@ -0,0 +1,39 @@
+# Include configuration rules
+topdir = ../..
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
+
+REQFLAGS += -I./
+
+SUBDIRS := . 
+LIBOBJS := $(foreach dir,$(SUBDIRS),$(patsubst %.c,%.o,$(wildcard $(dir)/*.c)))
+
+BINDIR   = /usr/bin
+LIBDIR   = /usr/lib
+DATADIR  = /usr/share
+AUXDIR   = $(DATADIR)/syslinux
+INCDIR   = /usr/include
+COM32DIR = $(AUXDIR)/com32
+
+all: libcom32upload.a
+
+libcom32upload.a : $(LIBOBJS)
+       rm -f $@
+       $(AR) cq $@ $^
+       $(RANLIB) $@
+
+tidy dist clean:
+       find . \( -name \*.o -o -name \*.a -o -name .\*.d -o -name \*.tmp \) -print0 | \
+               xargs -0r rm -f
+
+spotless: clean
+       rm -f *.a
+       rm -f *~ \#* */*~ */\#*
+
+install: all
+       mkdir -m 755 -p $(INSTALLROOT)$(COM32DIR)
+       install -m 644 libcom32upload.a $(INSTALLROOT)$(COM32DIR)
+       mkdir -p $(INSTALLROOT)$(COM32DIR)/include/
+       cp -r *.h $(INSTALLROOT)$(COM32DIR)/include/
+
+-include .*.d */.*.d */*/.*.d
similarity index 75%
rename from com32/sysdump/cpio.c
rename to com32/libupload/cpio.c
index 81d0d4b..25b464d 100644 (file)
@@ -9,10 +9,10 @@
 #include <inttypes.h>
 #include <stdbool.h>
 #include <zlib.h>
-#include "backend.h"
+#include "upload_backend.h"
 #include "ctime.h"
 
-int cpio_pad(struct backend *be)
+int cpio_pad(struct upload_backend *be)
 {
     static char pad[4];                /* Up to 4 zero bytes */
     if (be->dbytes & 3)
@@ -21,7 +21,7 @@ int cpio_pad(struct backend *be)
        return 0;
 }
 
-int cpio_hdr(struct backend *be, uint32_t mode, size_t datalen,
+int cpio_hdr(struct upload_backend *be, uint32_t mode, size_t datalen,
             const char *filename)
 {
     static uint32_t inode = 2;
@@ -31,7 +31,7 @@ int cpio_hdr(struct backend *be, uint32_t mode, size_t datalen,
 
     cpio_pad(be);
 
-    sprintf(hdr, "%06o%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
+    sprintf(hdr, "%06o%08x%08x%08x%08x%08x%08x%08zx%08x%08x%08x%08x%08x%08x",
            070701,             /* c_magic */
            inode++,            /* c_ino */
            mode,               /* c_mode */
@@ -52,12 +52,12 @@ int cpio_hdr(struct backend *be, uint32_t mode, size_t datalen,
     return rv;
 }
 
-int cpio_mkdir(struct backend *be, const char *filename)
+int cpio_mkdir(struct upload_backend *be, const char *filename)
 {
     return cpio_hdr(be, MODE_DIR, 0, filename);
 }
 
-int cpio_writefile(struct backend *be, const char *filename,
+int cpio_writefile(struct upload_backend *be, const char *filename,
                   const void *data, size_t len)
 {
     int rv;
@@ -69,7 +69,7 @@ int cpio_writefile(struct backend *be, const char *filename,
     return rv;
 }
 
-int cpio_close(struct backend *be)
+int cpio_close(struct upload_backend *be)
 {
     return cpio_hdr(be, 0, 0, "TRAILER!!!");
 }
diff --git a/com32/libupload/tftp.h b/com32/libupload/tftp.h
new file mode 100644 (file)
index 0000000..323dc16
--- /dev/null
@@ -0,0 +1,22 @@
+#include <stdint.h>
+
+#ifndef UPLOAD_TFTP
+#define UPLOAD_TFTP
+/* TFTP Error codes */
+enum tftp_error_codes {
+TFTP_ERR_UNKNOWN_ERROR = 0, // We have to use the message from the server
+TFTP_ERR_FILE_NOT_FOUND        = 1, /**< File not found */
+TFTP_ERR_ACCESS_DENIED = 2, /**< Access violation */
+TFTP_ERR_DISK_FULL = 3, /**< Disk full or allocation exceeded */
+TFTP_ERR_ILLEGAL_OP = 4, /**< Illegal TFTP operation */
+TFTP_ERR_UNKNOWN_TID = 5, /**< Unknown transfer ID */
+TFTP_ERR_FILE_EXISTS = 6, /**< File already exists */
+TFTP_ERR_UNKNOWN_USER = 7, /**< No such user */
+TFTP_ERR_BAD_OPTS = 8, /**< Option negotiation failed */
+TFTP_ERR_UNABLE_TO_RESOLVE = 9, // Not in RFC, internal usage 
+TFTP_ERR_UNABLE_TO_CONNECT = 10, // Not in RFC, internal usage
+TFTP_OK        = 11, /* Not in RFC */
+};
+
+extern const char *tftp_string_error_message[];
+#endif
diff --git a/com32/libupload/upload_backend.h b/com32/libupload/upload_backend.h
new file mode 100644 (file)
index 0000000..7ea03e4
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef BACKEND_H
+#define BACKEND_H
+
+#include <stddef.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <zlib.h>
+#include "serial.h"
+#include "tftp.h"
+
+/* Backend flags */
+#define BE_NEEDLEN     0x01
+
+struct upload_backend {
+    const char *name;
+    const char *helpmsg;
+    int minargs;
+
+    size_t dbytes;
+    size_t zbytes;
+    const char **argv;
+
+    uint32_t now;
+
+    int (*write)(struct upload_backend *);
+
+    z_stream zstream;
+    char *outbuf;
+    size_t alloc;
+};
+
+/* zout.c */
+int init_data(struct upload_backend *be, const char *argv[]);
+int write_data(struct upload_backend *be, const void *buf, size_t len);
+int flush_data(struct upload_backend *be);
+
+/* cpio.c */
+#define cpio_init init_data
+int cpio_hdr(struct upload_backend *be, uint32_t mode, size_t datalen,
+            const char *filename);
+int cpio_mkdir(struct upload_backend *be, const char *filename);
+int cpio_writefile(struct upload_backend *be, const char *filename,
+                  const void *data, size_t len);
+int cpio_close(struct upload_backend *be);
+#define MODE_FILE      0100644
+#define MODE_DIR       0040755
+
+/* backends.c */
+struct upload_backend *get_upload_backend(const char *name);
+
+/* backends */
+extern struct upload_backend upload_tftp;
+extern struct upload_backend upload_ymodem;
+extern struct upload_backend upload_srec;
+
+#endif /* BACKEND_H */
similarity index 91%
rename from com32/sysdump/be_srec.c
rename to com32/libupload/upload_srec.c
index fc69c88..c190713 100644 (file)
@@ -6,7 +6,7 @@
 #include <stdio.h>
 #include <inttypes.h>
 #include <minmax.h>
-#include "backend.h"
+#include "upload_backend.h"
 
 /* Write a single S-record */
 static int write_srecord(unsigned int len,  unsigned int alen,
@@ -43,7 +43,7 @@ static int write_srecord(unsigned int len,  unsigned int alen,
     return 0;
 }
 
-static int be_srec_write(struct backend *be)
+static int upload_srec_write(struct upload_backend *be)
 {
     char name[33];
     const char *buf;
@@ -77,9 +77,9 @@ static int be_srec_write(struct backend *be)
     return 0;
 }
 
-struct backend be_srec = {
+struct upload_backend upload_srec = {
     .name       = "srec",
     .helpmsg    = "[filename]",
     .minargs    = 0,
-    .write      = be_srec_write,
+    .write      = upload_srec_write,
 };
similarity index 70%
rename from com32/sysdump/be_tftp.c
rename to com32/libupload/upload_tftp.c
index 36a91eb..5e73c1c 100644 (file)
@@ -8,8 +8,7 @@
 #include <syslinux/config.h>
 #include <netinet/in.h>
 #include <sys/times.h>
-
-#include "backend.h"
+#include "upload_backend.h"
 
 enum tftp_opcode {
     TFTP_RRQ   = 1,
@@ -19,6 +18,12 @@ enum tftp_opcode {
     TFTP_ERROR = 5,
 };
 
+struct tftp_error {
+       uint16_t opcode;
+       uint16_t errcode;
+       char errmsg[0];
+} __attribute__ (( packed ));
+
 struct tftp_state {
     uint32_t my_ip;
     uint32_t srv_ip;
@@ -28,6 +33,21 @@ struct tftp_state {
     uint16_t seq;
 };
 
+const char *tftp_string_error_message[]={
+"",
+"File not found",
+"Access Denied",
+"Disk Full",
+"Illegal Operation",
+"Unknown Transfert ID",
+"File already exists",
+"Unknown User",
+"Negociation failed",
+"Unable to resolve hostname", // not in RFC
+"Unable to connect", // not in RFC
+"No Error",
+};
+
 #define RCV_BUF        2048
 
 static int send_ack_packet(struct tftp_state *tftp,
@@ -51,7 +71,7 @@ static int send_ack_packet(struct tftp_state *tftp,
     ireg.eax.w[0] = 0x0009;
 
     for (timeout = timeouts ; *timeout ; timeout++) {
-       memset(uw, 0, sizeof uw);
+       memset(uw, 0, sizeof *uw);
        memcpy(uw+1, pkt, len);
        uw->ip = tftp->srv_ip;
        uw->gw = tftp->srv_gw;
@@ -69,7 +89,7 @@ static int send_ack_packet(struct tftp_state *tftp,
        start = times(NULL);
 
        do {
-           memset(ur, 0, sizeof ur);
+           memset(ur, 0, sizeof *ur);
            ur->src_ip = tftp->srv_ip;
            ur->dest_ip = tftp->my_ip;
            ur->s_port = tftp->srv_port;
@@ -91,9 +111,14 @@ static int send_ack_packet(struct tftp_state *tftp,
                if (ntohs(xb[0]) == TFTP_ACK &&
                    ntohs(xb[1]) == tftp->seq) {
                    tftp->srv_port = ur->s_port;
-                   err = 0;            /* All good! */
+                   err = TFTP_OK;              /* All good! */
                    goto done;
-               } else if (ntohs(xb[1]) == TFTP_ERROR) {
+               } else if (ntohs(xb[0]) == TFTP_ERROR) {
+                   struct tftp_error *te = (struct tftp_error *)(ur+1);
+                   if (te->errcode == TFTP_ERR_UNKNOWN_ERROR) {
+                       tftp_string_error_message[TFTP_ERR_UNKNOWN_ERROR]=strdup(te->errmsg);
+                   }
+                   err=-ntohs(te->errcode); // Return the associated error code
                    goto done;
                }
            }
@@ -107,12 +132,13 @@ done:
     return err;
 }
 
-static int be_tftp_write(struct backend *be)
+static int upload_tftp_write(struct upload_backend *be)
 {
     static uint16_t local_port = 0x4000;
     struct tftp_state tftp;
     char buffer[512+4+6];
     int nlen;
+    int err=TFTP_OK;
     const union syslinux_derivative_info *sdi =
        syslinux_derivative_info();
     const char *data = be->outbuf;
@@ -129,30 +155,30 @@ static int be_tftp_write(struct backend *be)
     if (be->argv[1]) {
        tftp.srv_ip   = pxe_dns(be->argv[1]);
        if (!tftp.srv_ip) {
-           printf("\nUnable to resolve hostname: %s\n", be->argv[1]);
-           return -1;
+//         printf("\nUnable to resolve hostname: %s\n", be->argv[1]);
+           return -TFTP_ERR_UNABLE_TO_RESOLVE;
        }
     } else {
        tftp.srv_ip   = sdi->pxe.ipinfo->serverip;
        if (!tftp.srv_ip) {
-           printf("\nNo server IP address\n");
-           return -1;
+//         printf("\nNo server IP address\n");
+           return -TFTP_ERR_UNABLE_TO_CONNECT;
        }
     }
 
-    printf("server %u.%u.%u.%u... ",
+/*    printf("server %u.%u.%u.%u... ",
           ((uint8_t *)&tftp.srv_ip)[0],
           ((uint8_t *)&tftp.srv_ip)[1],
           ((uint8_t *)&tftp.srv_ip)[2],
-          ((uint8_t *)&tftp.srv_ip)[3]);
+          ((uint8_t *)&tftp.srv_ip)[3]);*/
 
     buffer[0] = 0;
     buffer[1] = TFTP_WRQ;
     nlen = strlcpy(buffer+2, be->argv[0], 512);
     memcpy(buffer+3+nlen, "octet", 6);
 
-    if (send_ack_packet(&tftp, buffer, 2+nlen+1+6))
-       return -1;
+    if ((err=send_ack_packet(&tftp, buffer, 2+nlen+1+6))!=TFTP_OK)
+       return err;
 
     do {
        chunk = len >= 512 ? 512 : len;
@@ -163,16 +189,16 @@ static int be_tftp_write(struct backend *be)
        data += chunk;
        len -= chunk;
 
-       if (send_ack_packet(&tftp, buffer, chunk+4))
-           return -1;
+       if ((err=send_ack_packet(&tftp, buffer, chunk+4))!=TFTP_OK)
+           return err;
     } while (chunk == 512);
 
-    return 0;
+    return TFTP_OK;
 }
 
-struct backend be_tftp = {
+struct upload_backend upload_tftp = {
     .name       = "tftp",
     .helpmsg    = "filename [tftp_server]",
     .minargs    = 1,
-    .write      = be_tftp_write,
+    .write      = upload_tftp_write,
 };
similarity index 96%
rename from com32/sysdump/be_ymodem.c
rename to com32/libupload/upload_ymodem.c
index 316b3d4..c42327d 100644 (file)
@@ -5,7 +5,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <inttypes.h>
-#include "backend.h"
+#include "upload_backend.h"
 #include "serial.h"
 
 enum {
@@ -98,7 +98,7 @@ static void send_ack(struct ymodem_state *ym, const uint8_t *blk, size_t bytes)
     } while (ack_buf == NAK);
 }
 
-static int be_ymodem_write(struct backend *be)
+static int upload_ymodem_write(struct upload_backend *be)
 {
     static const uint8_t eot_buf = EOT;
     uint8_t ack_buf;
@@ -167,9 +167,9 @@ static int be_ymodem_write(struct backend *be)
     return 0;
 }
 
-struct backend be_ymodem = {
+struct upload_backend upload_ymodem = {
     .name       = "ymodem",
     .helpmsg    = "filename [port [speed]]",
     .minargs    = 1,
-    .write      = be_ymodem_write,
+    .write      = upload_ymodem_write,
 };
similarity index 80%
rename from com32/sysdump/zout.c
rename to com32/libupload/zout.c
index ece934c..47c0d30 100644 (file)
@@ -8,12 +8,12 @@
 #include <inttypes.h>
 #include <stdbool.h>
 #include <zlib.h>
-#include "backend.h"
+#include "upload_backend.h"
 #include "ctime.h"
 
 #define ALLOC_CHUNK    65536
 
-int init_data(struct backend *be, const char *argv[])
+int init_data(struct upload_backend *be, const char *argv[])
 {
     be->now = posix_time();
     be->argv = argv;
@@ -33,7 +33,7 @@ int init_data(struct backend *be, const char *argv[])
     return 0;
 }
 
-static int do_deflate(struct backend *be, int flush)
+static int do_deflate(struct upload_backend *be, int flush)
 {
     int rv;
     char *buf;
@@ -55,7 +55,7 @@ static int do_deflate(struct backend *be, int flush)
 }
 
 
-int write_data(struct backend *be, const void *buf, size_t len)
+int write_data(struct upload_backend *be, const void *buf, size_t len)
 {
     int rv = Z_OK;
 
@@ -75,9 +75,10 @@ int write_data(struct backend *be, const void *buf, size_t len)
 }
 
 /* Output the data and shut down the stream */
-int flush_data(struct backend *be)
+int flush_data(struct upload_backend *be)
 {
     int rv = Z_OK;
+    int err=-1;
 
     while (rv != Z_STREAM_END) {
        rv = do_deflate(be, Z_FINISH);
@@ -85,15 +86,15 @@ int flush_data(struct backend *be)
            return -1;
     }
 
-    printf("Uploading data, %u bytes... ", be->zbytes);
+//    printf("Uploading data, %u bytes... ", be->zbytes);
 
-    if (be->write(be))
-       return -1;
+    if ((err=be->write(be)) != 0)
+       return err;
 
     free(be->outbuf);
     be->outbuf = NULL;
     be->dbytes = be->zbytes = be->alloc = 0;
 
-    printf("done.\n");
+//    printf("done.\n");
     return 0;
 }
index 7a6b527..83e23a0 100644 (file)
@@ -30,7 +30,8 @@
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
 LIBOBJS           = ansiline.o ansiraw.o get_key.o keyname.o \
             sha1hash.o unbase64.o \
index 7b6da05..083bc1b 100644 (file)
Binary files a/com32/libutil/libutil_com.a and b/com32/libutil/libutil_com.a differ
index 1de68ee..dd31840 100644 (file)
Binary files a/com32/libutil/libutil_lnx.a and b/com32/libutil/libutil_lnx.a differ
index 4081bfe..14b0e33 100644 (file)
@@ -16,9 +16,9 @@
 ##
 
 topdir = ../../..
-include ../../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
-LIBS      = ../../lib/libcom32.a $(LIBGCC)
 LNXLIBS           = 
 
 # Temporarily allow warnings not being treated as errors
@@ -54,7 +54,7 @@ $(LIBLUA) : $(LIBLUA_OBJS)
        $(AR) cq $@ $^
        $(RANLIB) $@
 
-lua.elf : $(OBJS) $(LIBLUA) $(LIBS) $(C_LIBS)
+lua.elf : $(OBJS) $(LIBLUA) $(C_LIBS)
        $(LD) $(LDFLAGS) -o $@ $^
 
 tidy dist:
index 11efffb..c37606c 100755 (executable)
Binary files a/com32/lua/src/lua.c32 and b/com32/lua/src/lua.c32 differ
index 7e6c2e9..b7ee115 100644 (file)
@@ -16,9 +16,9 @@
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
-LIBS      = ../libutil/libutil_com.a ../lib/libcom32.a $(LIBGCC)
 LNXLIBS           = ../libutil/libutil_lnx.a
 
 MODULES          = mboot.c32
@@ -28,7 +28,7 @@ OBJS = mboot.o map.o mem.o initvesa.o apm.o solaris.o syslinux.o
 
 all: $(MODULES) $(TESTFILES)
 
-mboot.elf : $(OBJS) $(LIBS) $(C_LIBS)
+mboot.elf : $(OBJS) $(C_LIBS)
        $(LD) $(LDFLAGS) -o $@ $^
 
 tidy dist:
index 0a71d4c..99add30 100644 (file)
@@ -91,10 +91,9 @@ int init_map(void)
        error("Failed to allocate initial memory map!\n");
        return -1;
     }
-#if DEBUG
+
     dprintf("Initial memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
-#endif
+    syslinux_dump_memmap(mmap);
 
     return 0;
 }
index 5a0343a..d60152e 100755 (executable)
Binary files a/com32/mboot/mboot.c32 and b/com32/mboot/mboot.c32 differ
index 2a03272..b67b997 100644 (file)
@@ -15,9 +15,9 @@
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
-LIBS      = ../libutil/libutil_com.a ../lib/libcom32.a $(LIBGCC)
 LNXLIBS           = ../libutil/libutil_lnx.a
 
 MODULES          = menu.c32 vesamenu.c32
@@ -28,10 +28,10 @@ COMMONOBJS = menumain.o readconfig.o passwd.o drain.o printmsg.o colors.o \
 
 all: $(MODULES) $(TESTFILES)
 
-menu.elf : menu.o $(COMMONOBJS) $(LIBS) $(C_LIBS)
+menu.elf : menu.o $(COMMONOBJS) $(C_LIBS)
        $(LD) $(LDFLAGS) -o $@ $^
 
-vesamenu.elf : vesamenu.o $(COMMONOBJS) $(LIBS) $(C_LIBS)
+vesamenu.elf : vesamenu.o $(COMMONOBJS) $(C_LIBS)
        $(LD) $(LDFLAGS) -o $@ $^
 
 tidy dist:
index 488824e..348c6b8 100755 (executable)
Binary files a/com32/menu/menu.c32 and b/com32/menu/menu.c32 differ
index 06119cd..c466582 100755 (executable)
Binary files a/com32/menu/vesamenu.c32 and b/com32/menu/vesamenu.c32 differ
index 2d47913..e9ce1d1 100644 (file)
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
 MODULES          = chain.c32 config.c32 ethersel.c32 dmitest.c32 cpuidtest.c32 \
            disk.c32 pcitest.c32 elf.c32 linux.c32 reboot.c32 pmload.c32 \
            meminfo.c32 sdi.c32 sanboot.c32 ifcpu64.c32 vesainfo.c32 \
            kbdmap.c32 cmd.c32 vpdtest.c32 host.c32 ls.c32 gpxecmd.c32 \
-           ifcpu.c32 cpuid.c32 cat.c32 pwd.c32 ifplop.c32 whichsys.c32
+           ifcpu.c32 cpuid.c32 cat.c32 pwd.c32 ifplop.c32 zzjson.c32 whichsys.c32
 
 TESTFILES =
 
index 804bf62..63a82ad 100755 (executable)
Binary files a/com32/modules/cat.c32 and b/com32/modules/cat.c32 differ
index 48f53ff..2ed0f14 100644 (file)
  *     loads the file <loader> **from the Syslinux filesystem**
  *     instead of loading the boot sector.
  *
- * seg=<segment>
- *     loads at and jumps to <seg>:0000 instead of 0000:7C00.
+ * seg=<segment>[:<offset>][{+@}entry]
+ *     loads at <segment>:<offset> and jumps to <seg>:<entry> instead
+ *     of the default 0000:7C00.  <offset> and <entry> default to 0 and +0
+ *     repectively.  If <entry> start with + (rather than @) then the
+ *     entry point address is added to the offset.
  *
  * isolinux=<loader>
  *     chainload another version/build of the ISOLINUX bootloader and patch
  *
  * keeppxe
  *     keep the PXE and UNDI stacks in memory (PXELINUX only).
+ *
+ * freeldr=<loader>
+ *  loads ReactOS' FreeLdr.sys to 0:8000 and jumps to the PE entry-point
  */
 
 #include <com32.h>
@@ -129,6 +135,8 @@ static struct options {
     const char *loadfile;
     uint16_t keeppxe;
     uint16_t seg;
+    uint16_t offs;
+    uint16_t entry;
     bool isolinux;
     bool cmldr;
     bool grub;
@@ -284,7 +292,7 @@ static void *read_sectors(uint64_t lba, uint8_t count)
        inreg.eax.b[0] = count;
        inreg.eax.b[1] = 0x02;  /* Read */
        inreg.ecx.b[1] = c;
-       inreg.ecx.b[0] = ((c & 0x300) >> 2) | (s+1);
+       inreg.ecx.b[0] = ((c & 0x300) >> 2) | (s + 1);
        inreg.edx.b[1] = h;
        inreg.edx.b[0] = disk_info.disk;
        inreg.ebx.w[0] = OFFS(buf);
@@ -342,7 +350,7 @@ static int write_sector(unsigned int lba, const void *data)
 
        inreg.eax.w[0] = 0x0301;        /* Write one sector */
        inreg.ecx.b[1] = c;
-       inreg.ecx.b[0] = ((c & 0x300) >> 2) | (s+1);
+       inreg.ecx.b[0] = ((c & 0x300) >> 2) | (s + 1);
        inreg.edx.b[1] = h;
        inreg.edx.b[0] = disk_info.disk;
        inreg.ebx.w[0] = OFFS(buf);
@@ -422,10 +430,7 @@ static void mbr_part_dump(const struct part_entry *part)
            chs_head(part->end),
            chs_sector(part->end),
            chs_sector(part->end),
-           part->start_lba,
-           part->start_lba,
-           part->length,
-           part->length);
+           part->start_lba, part->start_lba, part->length, part->length);
 }
 
 /* A DOS MBR */
@@ -564,7 +569,8 @@ static struct disk_part_iter *next_ebr_part(struct disk_part_iter *part)
     }
     /* Success */
     part->lba_data = ebr_table[0].start_lba + ebr_lba;
-    dprintf("Partition %d logical lba %u\n", part->index, part->lba_data);
+    dprintf("Partition %d logical lba %"PRIu64"\n",
+           part->index, part->lba_data);
     part->index++;
     part->record = ebr_table;
     return part;
@@ -625,7 +631,8 @@ static struct disk_part_iter *next_mbr_part(struct disk_part_iter *part)
 
     /* Update parameters to reflect this new partition.  Re-use iterator */
     part->lba_data = table[part->private.mbr_index].start_lba;
-    dprintf("Partition %d primary lba %u\n", part->private.mbr_index, part->lba_data);
+    dprintf("Partition %d primary lba %"PRIu64"\n",
+           part->private.mbr_index, part->lba_data);
     part->index = part->private.mbr_index + 1;
     part->record = table + part->private.mbr_index;
     return part;
@@ -1280,13 +1287,15 @@ Options: file=<loader>      Load and execute file, instead of boot sector\n\
          ntldr=<loader>     Load Windows NTLDR, SETUPLDR.BIN or BOOTMGR\n\
          cmldr=<loader>     Load Recovery Console of Windows NT/2K/XP/2003\n\
          freedos=<loader>   Load FreeDOS KERNEL.SYS\n\
+         freeldr=<loader>   Load ReactOS' FREELDR.SYS\n\
          msdos=<loader>     Load MS-DOS IO.SYS\n\
          pcdos=<loader>     Load PC-DOS IBMBIO.COM\n\
          drmk=<loader>      Load DRMK DELLBIO.BIN\n\
          grub=<loader>      Load GRUB Legacy stage2\n\
          grubcfg=<filename> Set alternative config filename for GRUB Legacy\n\
          grldr=<loader>     Load GRUB4DOS grldr\n\
-         seg=<segment>      Jump to <seg>:0000, instead of 0000:7C00\n\
+         seg=<seg>          Jump to <seg>:0000, instead of 0000:7C00\n\
+         seg=<seg>[:<offs>][{+@}<entry>] also specified offset and entrypoint\n\
          swap               Swap drive numbers, if bootdisk is not fd0/hd0\n\
          hide               Hide primary partitions, except selected partition\n\
          sethidden          Set the FAT/NTFS hidden sectors field\n\
@@ -1322,44 +1331,88 @@ int main(int argc, char *argv[])
     /* Prepare the register set */
     memset(&regs, 0, sizeof regs);
 
+    opt.seg   = 0;
+    opt.offs  = 0x7c00;
+    opt.entry = 0x7c00;
+
     for (i = 1; i < argc; i++) {
        if (!strncmp(argv[i], "file=", 5)) {
            opt.loadfile = argv[i] + 5;
        } else if (!strncmp(argv[i], "seg=", 4)) {
-           uint32_t segval = strtoul(argv[i] + 4, NULL, 0);
-           if (segval < 0x50 || segval > 0x9f000) {
-               error("Invalid segment\n");
+           uint32_t v;
+           bool add_entry = true;
+           char *ep, *p = argv[i] + 4;
+           
+           v = strtoul(p, &ep, 0);
+           if (ep == p || v < 0x50 || v > 0x9f000) {
+               error("seg: Invalid segment\n");
                goto bail;
            }
-           opt.seg = segval;
+           opt.seg = v;
+           opt.offs = opt.entry = 0;
+           if (*ep == ':') {
+               p = ep+1;
+               v = strtoul(p, &ep, 0);
+               if (ep == p) {
+                   error("seg: Invalid offset\n");
+                   goto bail;
+               }
+               opt.offs = v;
+           }
+           if (*ep == '@' || *ep == '+') {
+               add_entry = (*ep == '+');
+               p = ep+1;
+               v = strtoul(p, &ep, 0);
+               if (ep == p) {
+                   error("seg: Invalid entry point\n");
+                   goto bail;
+               }
+               opt.entry = v;
+           }
+           if (add_entry)
+               opt.entry += opt.offs;
        } else if (!strncmp(argv[i], "isolinux=", 9)) {
            opt.loadfile = argv[i] + 9;
            opt.isolinux = true;
        } else if (!strncmp(argv[i], "ntldr=", 6)) {
            opt.seg = 0x2000;   /* NTLDR wants this address */
+           opt.offs = opt.entry = 0;
            opt.loadfile = argv[i] + 6;
            opt.sethidden = true;
        } else if (!strncmp(argv[i], "cmldr=", 6)) {
            opt.seg = 0x2000;   /* CMLDR wants this address */
+           opt.offs = opt.entry = 0;
            opt.loadfile = argv[i] + 6;
            opt.cmldr = true;
            opt.sethidden = true;
        } else if (!strncmp(argv[i], "freedos=", 8)) {
            opt.seg = 0x60;     /* FREEDOS wants this address */
+           opt.offs = opt.entry = 0;
+           opt.loadfile = argv[i] + 8;
+           opt.sethidden = true;
+       } else if (!strncmp(argv[i], "freeldr=", 8)) {
            opt.loadfile = argv[i] + 8;
            opt.sethidden = true;
+           /* The FreeLdr PE wants to be at 0:8000 */
+           opt.seg = 0;
+           opt.offs = 0x8000;
+           /* TODO: Properly parse the PE.  Right now, this is hard-coded */
+           opt.entry = 0x8100;
        } else if (!strncmp(argv[i], "msdos=", 6) ||
                   !strncmp(argv[i], "pcdos=", 6)) {
            opt.seg = 0x70;     /* MS-DOS 2.0+ wants this address */
+           opt.offs = opt.entry = 0;
            opt.loadfile = argv[i] + 6;
            opt.sethidden = true;
        } else if (!strncmp(argv[i], "drmk=", 5)) {
            opt.seg = 0x70;     /* DRMK wants this address */
+           opt.offs = opt.entry = 0;
            opt.loadfile = argv[i] + 5;
            opt.sethidden = true;
            opt.drmk = true;
        } else if (!strncmp(argv[i], "grub=", 5)) {
            opt.seg = 0x800;    /* stage2 wants this address */
+           opt.offs = opt.entry = 0;
            opt.loadfile = argv[i] + 5;
            opt.grub = true;
        } else if (!strncmp(argv[i], "grubcfg=", 8)) {
@@ -1414,11 +1467,20 @@ int main(int argc, char *argv[])
        goto bail;
     }
 
-    if (opt.seg) {
-       regs.es = regs.cs = regs.ss = regs.ds = regs.fs = regs.gs = opt.seg;
-    } else {
-       regs.ip = regs.esp.l = 0x7c00;
-    }
+    /*
+     * Set up initial register values
+     */
+    regs.es = regs.cs = regs.ss = regs.ds = regs.fs = regs.gs = opt.seg;
+    regs.ip = opt.entry;
+
+    /* 
+     * For the special case of the standard 0:7C00 entry point, put
+     * the stack below; otherwise leave the stack pointer at the end
+     * of the segment (sp = 0).
+     */
+    if (opt.seg == 0 && opt.offs == 0x7c00)
+       regs.esp.l = 0x7c00;
+
 
     hd = 0;
     if (!strncmp(drivename, "mbr", 3)) {
@@ -1427,8 +1489,7 @@ int main(int argc, char *argv[])
            error("Unable to find requested MBR signature\n");
            goto bail;
        }
-    } else if (!strncmp(drivename, "guid", 4) ||
-              !strncmp(drivename, "uuid", 4)) {
+    } else if (!strncmp(drivename, "guid", 4) || !strncmp(drivename, "uuid", 4)) {
        if (str_to_guid(drivename + 5, &gpt_guid))
            goto bail;
        drive = find_by_guid(&gpt_guid, &cur_part);
@@ -1530,7 +1591,7 @@ int main(int argc, char *argv[])
     }
 
     /* Do the actual chainloading */
-    load_base = opt.seg ? (opt.seg << 4) : 0x7c00;
+    load_base = (opt.seg << 4) + opt.offs;
 
     if (opt.loadfile) {
        fputs("Loading the boot file...\n", stdout);
@@ -1639,7 +1700,7 @@ int main(int argc, char *argv[])
                char config_file[89];
                /* 0x270: start of code (after jump from 0x200) */
                char codestart[1];
-           } __attribute__ ((packed)) *stage2;
+           } __attribute__ ((packed)) * stage2;
 
            if (data[ndata].size < sizeof(struct grub_stage2_patch_area)) {
                error
@@ -1723,10 +1784,11 @@ int main(int argc, char *argv[])
             * fs_lba should be verified against the disk as some DRMK
             * variants will check and fail if it does not match
             */
-           dprintf("  fs_lba offset is %d\n", fs_lba);
+           dprintf("  fs_lba offset is %"PRIu64"\n", fs_lba);
            /* DRMK only uses a DWORD */
            if (fs_lba > 0xffffffff) {
-               error("LBA very large; Only using lower 32 bits; DRMK will probably fail\n");
+               error
+                   ("LBA very large; Only using lower 32 bits; DRMK will probably fail\n");
            }
            regs.ss = regs.fs = regs.gs = 0;    /* Used before initialized */
            if (!realloc(data[ndata].data, tsize)) {
index 2c97cea..5787c80 100755 (executable)
Binary files a/com32/modules/chain.c32 and b/com32/modules/chain.c32 differ
index 1191710..31dac00 100755 (executable)
Binary files a/com32/modules/config.c32 and b/com32/modules/config.c32 differ
index 97b291e..9b3810d 100755 (executable)
Binary files a/com32/modules/cpuid.c32 and b/com32/modules/cpuid.c32 differ
index c4cff67..3e8c83e 100755 (executable)
Binary files a/com32/modules/cpuidtest.c32 and b/com32/modules/cpuidtest.c32 differ
index da3aa79..3f05cdd 100755 (executable)
Binary files a/com32/modules/disk.c32 and b/com32/modules/disk.c32 differ
index c2343e3..33ae695 100755 (executable)
Binary files a/com32/modules/dmitest.c32 and b/com32/modules/dmitest.c32 differ
index 182afa6..0ac4517 100644 (file)
@@ -120,10 +120,8 @@ int boot_elf(void *ptr, size_t len, char **argv)
     if (!mmap || !amap)
        goto bail;
 
-#if DEBUG
     dprintf("Initial memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
-#endif
+    syslinux_dump_memmap(mmap);
 
     ph = (Elf32_Phdr *) (cptr + eh->e_phoff);
 
@@ -185,10 +183,8 @@ int boot_elf(void *ptr, size_t len, char **argv)
     if (!stack_frame)
        goto bail;
 
-#if DEBUG
     dprintf("Right before syslinux_memmap_largest()...\n");
-    syslinux_dump_memmap(stdout, amap);
-#endif
+    syslinux_dump_memmap(amap);
 
     if (syslinux_memmap_largest(amap, SMT_FREE, &lstart, &llen))
        goto bail;              /* NO free memory?! */
@@ -239,16 +235,14 @@ int boot_elf(void *ptr, size_t len, char **argv)
     regs.eip = eh->e_entry;
     regs.esp = stack_pointer;
 
-#if DEBUG
     dprintf("Final memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
+    syslinux_dump_memmap(mmap);
 
     dprintf("Final available map:\n");
-    syslinux_dump_memmap(stdout, amap);
+    syslinux_dump_memmap(amap);
 
     dprintf("Movelist:\n");
-    syslinux_dump_movelist(stdout, ml);
-#endif
+    syslinux_dump_movelist(ml);
 
     /* This should not return... */
     fputs("Booting...\n", stdout);
index a3c64f8..b8ec063 100755 (executable)
Binary files a/com32/modules/elf.c32 and b/com32/modules/elf.c32 differ
index 5c3cf02..28dc62c 100644 (file)
 #include <com32.h>
 #include <syslinux/boot.h>
 #include <syslinux/config.h>
-
-#ifdef DEBUG
-# define dprintf printf
-#else
-# define dprintf(...) ((void)0)
-#endif
+#include <dprintf.h>
 
 #define MAX_LINE 512
 
index 3455818..86e5862 100755 (executable)
Binary files a/com32/modules/ethersel.c32 and b/com32/modules/ethersel.c32 differ
index 23fdb83..a8731b8 100755 (executable)
Binary files a/com32/modules/host.c32 and b/com32/modules/host.c32 differ
index adca812..0dbaef4 100755 (executable)
Binary files a/com32/modules/ifcpu.c32 and b/com32/modules/ifcpu.c32 differ
diff --git a/com32/modules/ifmemdsk.c b/com32/modules/ifmemdsk.c
new file mode 100644 (file)
index 0000000..cfed87f
--- /dev/null
@@ -0,0 +1,392 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Shao Miller - All Rights Reserved
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ *   Boston MA 02110-1301, USA; either version 2 of the License, or
+ *   (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+/****
+ * @file ifmemdsk.c
+ *
+ * This COM32 module detects if there are MEMDISKs established.
+ */
+
+static const char usage_text[] = "\
+Usage:\n\
+  ifmemdsk.c32 [<option> [...]] --info [<option> [...]]\n\
+  ifmemdsk.c32 [<option> [...]] [<detected_cmd>] -- [<not_detected_cmd>]\n\
+\n\
+Options:\n\
+  --info  . . . . . Displays info about MEMDISK(s)\n\
+  --safe-hooks . .  Will scan INT 13h \"safe hook\" chain\n\
+  --mbfts . . . . . Will scan memory for MEMDISK mBFTs\n\
+  --no-sequential   Suppresses probing all drive numbers\n\
+\n\
+If a MEMDISK is found, or if a particular MEMDISK is sought by the options\n\
+and is found, then the 'detected_cmd' action will be taken, else the\n\
+'not_detected_cmd' action will be taken.\n\
+\n";
+
+#include <stdio.h>
+#include <string.h>
+#include <alloca.h>
+#include <com32.h>
+#include <console.h>
+#include <syslinux/boot.h>
+
+/* Pull in MEMDISK common structures */
+#include "../../memdisk/mstructs.h"
+
+/*** Macros */
+#define M_GET_DRIVE_PARAMS (0x08)
+#define M_SEGOFFTOPTR(seg, off) (((seg) << 4) + (off))
+#define M_INT13H M_SEGOFFTOPTR(0x0000, 0x0013 * 4)
+#define M_FREEBASEMEM M_SEGOFFTOPTR(0x0040, 0x0013)
+#define M_TOP M_SEGOFFTOPTR(0x9FFF, 0x0000)
+
+/*** Object types */
+typedef struct mdi s_mdi;
+typedef real_addr_t u_segoff;
+typedef struct safe_hook s_safe_hook;
+typedef struct mBFT s_mbft;
+
+/*** Function types */
+typedef int f_find(void);
+
+/*** Function declarations */
+static const s_mdi * installation_check(int);
+static f_find scan_drives;
+static f_find walk_safe_hooks;
+static const s_safe_hook * is_safe_hook(const void *);
+static const s_mdi * is_memdisk_hook(const s_safe_hook *);
+static f_find scan_mbfts;
+static const s_mbft * is_mbft(const void *);
+static f_find do_nothing;
+static void memdisk_info(const s_mdi *);
+static void boot_args(char **);
+static const char * bootloadername(uint8_t);
+
+/*** Structure/union definitions */
+
+/*** Objects */
+static int show_info = 0;
+
+/*** Function definitions */
+
+int main(int argc, char ** argv) {
+    static f_find * do_scan_drives = scan_drives;
+    static f_find * do_walk_safe_hooks = do_nothing;
+    static f_find * do_scan_mbfts = do_nothing;
+    char ** detected_cmd;
+    char ** not_detected_cmd;
+    char ** cmd;
+    char ** cur_arg;
+    int show_usage;
+    int found;
+
+    (void) argc;
+
+    openconsole(&dev_null_r, &dev_stdcon_w);
+
+    detected_cmd = NULL;
+    not_detected_cmd = NULL;
+    show_usage = 1;
+    for (cur_arg = argv + 1; *cur_arg; ++cur_arg) {
+        /* Check for command divider */
+        if (!strcmp(*cur_arg, "--")) {
+            show_usage = 0;
+            *cur_arg = NULL;
+            not_detected_cmd = cur_arg + 1;
+            break;
+          }
+
+        /* Check for '--info' */
+        if (!strcmp(*cur_arg, "--info")) {
+            show_usage = 0;
+            show_info = 1;
+            continue;
+          }
+
+        /* Other options */
+        if (!strcmp(*cur_arg, "--no-sequential")) {
+            do_scan_drives = do_nothing;
+            continue;
+          }
+
+        if (!strcmp(*cur_arg, "--safe-hooks")) {
+            do_walk_safe_hooks = walk_safe_hooks;
+            continue;
+          }
+
+        if (!strcmp(*cur_arg, "--mbfts")) {
+            do_scan_mbfts = scan_mbfts;
+            continue;
+          }
+
+        /* Check for invalid option */
+        if (!memcmp(*cur_arg, "--", sizeof "--" - 1)) {
+            puts("Invalid option!");
+            show_usage = 1;
+            break;
+          }
+
+        /* Set 'detected_cmd' if it's null */
+        if (!detected_cmd)
+          detected_cmd = cur_arg;
+
+        continue;
+      }
+
+    if (show_usage) {
+        fprintf(stderr, usage_text);
+        return 1;
+      }
+
+    found = 0;
+    found += do_walk_safe_hooks();
+    found += do_scan_mbfts();
+    found += do_scan_drives();
+
+    cmd = found ? detected_cmd : not_detected_cmd;
+    if (cmd && *cmd)
+      boot_args(cmd);
+
+    return 0;
+  }
+
+static const s_mdi * installation_check(int drive) {
+    com32sys_t params, results;
+    int found;
+
+    /* Set parameters for INT 0x13 call */
+    memset(&params, 0, sizeof params);
+    params.eax.w[0] = M_GET_DRIVE_PARAMS << 8;
+    params.edx.w[0] = drive;
+    /* 'ME' 'MD' 'IS' 'K?' */
+    params.eax.w[1] = 0x454D;
+    params.ecx.w[1] = 0x444D;
+    params.edx.w[1] = 0x5349;
+    params.ebx.w[1] = 0x3F4B;
+
+    /* Perform the call */
+    __intcall(0x13, &params, &results);
+
+    /* Check result */
+    found = (
+        /* '!M' 'EM' 'DI' 'SK' */
+        results.eax.w[1] == 0x4D21 &&
+        results.ecx.w[1] == 0x4D45 &&
+        results.edx.w[1] == 0x4944 &&
+        results.ebx.w[1] == 0x4B53
+      );
+
+    if (found)
+      return MK_PTR(results.es, results.edi.w[0]);
+
+    return NULL;
+  }
+
+static int scan_drives(void) {
+    int found, drive;
+    const s_mdi * mdi;
+
+    for (found = drive = 0; drive <= 0xFF; ++drive) {
+        mdi = installation_check(drive);
+        if (!mdi)
+          continue;
+
+        memdisk_info(mdi);
+        ++found;
+        continue;
+      }
+
+    return found;
+  }
+
+static int walk_safe_hooks(void) {
+    static const u_segoff * const int13 = (void *) M_INT13H;
+    const void * addr;
+    int found;
+    const s_safe_hook * hook;
+    const s_mdi * mdi;
+
+    /* INT 0x13 vector */
+    addr = MK_PTR(int13->seg_off.segment, int13->seg_off.offset);
+    found = 0;
+    while (addr) {
+        hook = is_safe_hook(addr);
+        if (!hook)
+          break;
+
+        mdi = is_memdisk_hook(hook);
+        if (mdi) {
+            memdisk_info(mdi);
+            ++found;
+          }
+
+        addr = MK_PTR(
+            hook->old_hook.seg_off.segment,
+            hook->old_hook.seg_off.offset
+          );
+        continue;
+      }
+    return found;
+  }
+
+static const s_safe_hook * is_safe_hook(const void * addr) {
+    static const char magic[] = "$INT13SF";
+    const s_safe_hook * const test = addr;
+
+    if (memcmp(test->signature, magic, sizeof magic - 1))
+      return NULL;
+
+    return test;
+  }
+
+static const s_mdi * is_memdisk_hook(const s_safe_hook * hook) {
+    static const char magic[] = "MEMDISK";
+    const s_mbft * mbft;
+
+    if (memcmp(hook->vendor, magic, sizeof magic - 1))
+      return NULL;
+
+    /* An mBFT is always aligned */
+    mbft = MK_PTR(hook->mbft >> 4, 0);
+    return &mbft->mdi;
+  }
+
+static int scan_mbfts(void) {
+    static const uint16_t * const free_base_mem = (void *) M_FREEBASEMEM;
+    static const void * const top = (void *) M_TOP;
+    const void * addr;
+    const s_mbft * mbft;
+    int found;
+
+    found = 0;
+    for (addr = MK_PTR(*free_base_mem << 4, 0); addr < top; addr += 1 << 4) {
+        if (!(mbft = is_mbft(addr)))
+          continue;
+
+        memdisk_info(&mbft->mdi);
+        ++found;
+        continue;
+      }
+
+    return found;
+  }
+
+static const s_mbft * is_mbft(const void * addr) {
+    static const char magic[] = "mBFT";
+    const s_mbft * const test = addr;
+    const uint8_t * ptr, * end;
+    uint8_t chksum;
+
+    if (memcmp(test->acpi.signature, magic, sizeof magic - 1))
+      return NULL;
+
+    if (test->acpi.length != sizeof *test)
+      return NULL;
+
+    end = (void *) (test + 1);
+    chksum = 0;
+    for (ptr = addr; ptr < end; ++ptr)
+      chksum += *ptr;
+    if (chksum)
+      return NULL;
+
+    /* Looks like it's an mBFT! */
+    return test;
+  }
+
+static int do_nothing(void) {
+    return 0;
+  }
+
+static void memdisk_info(const s_mdi * mdi) {
+    const char * cmdline;
+
+    if (!show_info)
+      return;
+
+    cmdline = MK_PTR(
+        mdi->cmdline.seg_off.segment,
+        mdi->cmdline.seg_off.offset
+      );
+    printf(
+        "Found MEMDISK version %u.%02u:\n"
+        "  diskbuf == 0x%08X, disksize == %u sectors\n"
+        "  bootloaderid == 0x%02X (%s),\n"
+        "  cmdline: %s\n",
+        mdi->version_major,
+        mdi->version_minor,
+        mdi->diskbuf,
+        mdi->disksize,
+        mdi->bootloaderid,
+        bootloadername(mdi->bootloaderid),
+        cmdline
+      );
+    return;
+  }
+
+/* This function copyright H. Peter Anvin */
+static void boot_args(char **args)
+{
+    int len = 0, a = 0;
+    char **pp;
+    const char *p;
+    char c, *q, *str;
+
+    for (pp = args; *pp; pp++)
+       len += strlen(*pp) + 1;
+
+    q = str = alloca(len);
+    for (pp = args; *pp; pp++) {
+       p = *pp;
+       while ((c = *p++))
+           *q++ = c;
+       *q++ = ' ';
+       a = 1;
+    }
+    q -= a;
+    *q = '\0';
+
+    if (!str[0])
+       syslinux_run_default();
+    else
+       syslinux_run_command(str);
+}
+
+/* This function copyright H. Peter Anvin */
+static const char *bootloadername(uint8_t id)
+{
+    static const struct {
+       uint8_t id, mask;
+       const char *name;
+    } *lp, list[] = {
+       {0x00, 0xf0, "LILO"}, 
+       {0x10, 0xf0, "LOADLIN"},
+       {0x31, 0xff, "SYSLINUX"},
+       {0x32, 0xff, "PXELINUX"},
+       {0x33, 0xff, "ISOLINUX"},
+       {0x34, 0xff, "EXTLINUX"},
+       {0x30, 0xf0, "Syslinux family"},
+       {0x40, 0xf0, "Etherboot"},
+       {0x50, 0xf0, "ELILO"},
+       {0x70, 0xf0, "GrUB"},
+       {0x80, 0xf0, "U-Boot"},
+       {0xA0, 0xf0, "Gujin"},
+       {0xB0, 0xf0, "Qemu"},
+       {0x00, 0x00, "unknown"}
+    };
+
+    for (lp = list;; lp++) {
+       if (((id ^ lp->id) & lp->mask) == 0)
+           return lp->name;
+    }
+}
+
index 6af3d22..a620b61 100755 (executable)
Binary files a/com32/modules/linux.c32 and b/com32/modules/linux.c32 differ
index d91b976..b112057 100755 (executable)
Binary files a/com32/modules/ls.c32 and b/com32/modules/ls.c32 differ
index b57b731..761613a 100755 (executable)
Binary files a/com32/modules/meminfo.c32 and b/com32/modules/meminfo.c32 differ
index 672023a..9921ee6 100644 (file)
 #include <com32.h>
 #include <sys/pci.h>
 #include <stdbool.h>
-
-#ifdef DEBUG
-# define dprintf printf
-#else
-# define dprintf(...) ((void)0)
-#endif
+#include <dprintf.h>
 
 char display_line = 0;
 #define moreprintf(...)                                \
index 447b539..277032c 100755 (executable)
Binary files a/com32/modules/pcitest.c32 and b/com32/modules/pcitest.c32 differ
index 3064a94..4c01db0 100644 (file)
@@ -81,10 +81,8 @@ int boot_raw(void *ptr, size_t len, addr_t where, char **argv)
     if (!mmap || !amap)
        goto bail;
 
-#if DEBUG
     dprintf("Initial memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
-#endif
+    syslinux_dump_memmap(mmap);
 
     dprintf("Segment at 0x%08x len 0x%08x\n", where, len);
 
@@ -119,10 +117,8 @@ int boot_raw(void *ptr, size_t len, addr_t where, char **argv)
     if (!stack_frame)
        goto bail;
 
-#if DEBUG
     dprintf("Right before syslinux_memmap_largest()...\n");
-    syslinux_dump_memmap(stdout, amap);
-#endif
+    syslinux_dump_memmap(amap);
 
     if (syslinux_memmap_largest(amap, SMT_FREE, &lstart, &llen))
        goto bail;              /* NO free memory?! */
@@ -173,16 +169,14 @@ int boot_raw(void *ptr, size_t len, addr_t where, char **argv)
     regs.eip = where;
     regs.esp = stack_pointer;
 
-#if DEBUG
     dprintf("Final memory map:\n");
-    syslinux_dump_memmap(stdout, mmap);
+    syslinux_dump_memmap(mmap);
 
     dprintf("Final available map:\n");
-    syslinux_dump_memmap(stdout, amap);
+    syslinux_dump_memmap(amap);
 
     dprintf("Movelist:\n");
-    syslinux_dump_movelist(stdout, ml);
-#endif
+    syslinux_dump_movelist(ml);
 
     /* This should not return... */
     fputs("Booting...\n", stdout);
index c7c2808..25641ce 100755 (executable)
Binary files a/com32/modules/pmload.c32 and b/com32/modules/pmload.c32 differ
index 7ba57b1..92b4a60 100755 (executable)
Binary files a/com32/modules/sdi.c32 and b/com32/modules/sdi.c32 differ
index ddcb884..d15d8cd 100755 (executable)
Binary files a/com32/modules/vesainfo.c32 and b/com32/modules/vesainfo.c32 differ
index e3f4260..d5fe3f8 100755 (executable)
Binary files a/com32/modules/vpdtest.c32 and b/com32/modules/vpdtest.c32 differ
diff --git a/com32/modules/zzjson.c b/com32/modules/zzjson.c
new file mode 100644 (file)
index 0000000..e2516fa
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Display directory contents
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <console.h>
+#include <string.h>
+#include <com32.h>
+#include <zzjson/zzjson.h>
+#include <stdarg.h>
+
+static void myerror(void *ehandle, const char *format, ...) {
+    va_list ap;
+    fprintf(ehandle, "error: ");
+    va_start(ap, format);
+    vfprintf(ehandle, format, ap);
+    va_end(ap);
+    fputc('\n', ehandle);
+}
+
+
+int main(int argc, char *argv[])
+{
+    openconsole(&dev_rawcon_r, &dev_stdcon_w);
+    (void) argc;
+    (void) argv;
+    ZZJSON  *tmp;
+    ZZJSON_CONFIG config = { ZZJSON_VERY_STRICT, NULL,
+                             (int(*)(void*)) fgetc,
+                             NULL,
+                             malloc, calloc, free, realloc,
+                             stderr, myerror, stdout,
+                             (int(*)(void*,const char*,...)) fprintf,
+                             (int(*)(int,void*)) fputc };
+    
+    do {
+        ZZJSON *tmp2;
+
+        tmp = zzjson_create_array(&config,
+                zzjson_create_number_d(&config, 3.14),
+                zzjson_create_number_i(&config, 1234LL),
+                zzjson_create_number_i(&config, -4321LL),
+                zzjson_create_true(&config),
+                zzjson_create_false(&config),
+                zzjson_create_null(&config),
+                zzjson_create_string(&config, "hello, world"),
+                zzjson_create_object(&config,
+                    "picard", zzjson_create_string(&config, "jean-luc"),
+                    "riker",  zzjson_create_string(&config, "william t."),
+                    NULL),
+                zzjson_create_object(&config, NULL),
+                zzjson_create_array(&config, NULL),
+                NULL );
+
+        if (!tmp) {
+            fprintf(stderr, "error during creation of json tree\n");
+            break;
+        }
+
+        tmp2 = zzjson_array_prepend(&config, tmp,
+                    zzjson_create_string(&config, "prepended string"));
+
+        if (!tmp2) {
+            fprintf(stderr, "error during prepend\n");
+            break;
+        }
+        tmp = tmp2;
+
+        tmp2 = zzjson_array_append(&config, tmp,
+                    zzjson_create_string(&config, "appended string (slow)"));
+
+        if (!tmp2) {
+            fprintf(stderr, "error during append\n");
+            break;
+        }
+        tmp = tmp2;
+
+        zzjson_print(&config, tmp);
+    } while(0);
+    if (tmp) zzjson_free(&config, tmp);
+
+    {
+        tmp = zzjson_create_array(&config, NULL); /* empty array */
+        tmp = zzjson_array_prepend(&config, tmp, zzjson_create_true(&config));
+        zzjson_print(&config, tmp);
+        zzjson_free(&config, tmp);
+    }
+
+    {
+        tmp = zzjson_create_object(&config, NULL); /* empty object */
+        tmp = zzjson_object_prepend(&config, tmp, "hello",
+                                zzjson_create_string(&config, "world"));
+        tmp = zzjson_object_append(&config, tmp, "goodbye",
+                                zzjson_create_string(&config, "cruel world"));
+        zzjson_print(&config, tmp);
+        zzjson_free(&config, tmp);
+    }
+
+    return 0;
+}
+  
index f4b7d86..766f68d 100644 (file)
@@ -17,7 +17,8 @@
 ##
 
 topdir = ../..
-include MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/rosh.mk
 
 # from com32/sysdump/Makefile
 # The DATE is set on the make command line when building binaries for
index 3701488..c699b78 100755 (executable)
Binary files a/com32/rosh/rosh.c32 and b/com32/rosh/rosh.c32 differ
index bee2b99..76986d5 100644 (file)
@@ -15,7 +15,8 @@
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 
 all:   hello.c32 resolv.c32 serialinfo.c32 \
        localboot.c32 \
index 316489c..7466f86 100755 (executable)
Binary files a/com32/samples/advdump.c32 and b/com32/samples/advdump.c32 differ
index 08bc7a9..77cdcb8 100755 (executable)
Binary files a/com32/samples/entrydump.c32 and b/com32/samples/entrydump.c32 differ
index 580ec39..900f680 100755 (executable)
Binary files a/com32/samples/fancyhello.c32 and b/com32/samples/fancyhello.c32 differ
index 3c4f395..1123f62 100755 (executable)
Binary files a/com32/samples/fancyhello.lnx and b/com32/samples/fancyhello.lnx differ
index 5219201..4ef96e0 100755 (executable)
Binary files a/com32/samples/hello.c32 and b/com32/samples/hello.c32 differ
index 5fc14f0..d55ef3e 100755 (executable)
Binary files a/com32/samples/keytest.c32 and b/com32/samples/keytest.c32 differ
index bca1bba..ec504f4 100755 (executable)
Binary files a/com32/samples/keytest.lnx and b/com32/samples/keytest.lnx differ
index c6b9649..eeba5ee 100755 (executable)
Binary files a/com32/samples/resolv.c32 and b/com32/samples/resolv.c32 differ
index 578ffd6..4eebd6b 100755 (executable)
Binary files a/com32/samples/serialinfo.c32 and b/com32/samples/serialinfo.c32 differ
index bffee3a..98e7f15 100644 (file)
 ##
 
 topdir = ../..
-include ../MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/com32.mk
 -include $(topdir)/version.mk
 
-LIBS      = ../libutil/libutil_com.a ../lib/libcom32.a $(LIBGCC)
+LIBS      = ../libupload/libcom32upload.a
 LNXLIBS           = ../libutil/libutil_lnx.a
 
+CFLAGS += -I$(com32) -I$(topdir)
+
 MODULES          = sysdump.c32
 TESTFILES =
 
index 8671fc8..5022233 100644 (file)
@@ -18,7 +18,6 @@
 #include <string.h>
 #include <stdlib.h>
 #include "sysdump.h"
-#include "backend.h"
 #include "rbtree.h"
 
 struct acpi_rsdp {
@@ -151,7 +150,7 @@ static const struct acpi_rsdp *find_rsdp(void)
     return scan_for_rsdp(0xe0000, 0x100000);
 }
 
-static void dump_table(struct backend *be,
+static void dump_table(struct upload_backend *be,
                       const char name[], const void *ptr, uint32_t len)
 {
     char namebuf[64];
@@ -171,7 +170,7 @@ static void dump_table(struct backend *be,
     write_data(be, ptr, len);
 }
 
-static void dump_rsdt(struct backend *be, const struct acpi_rsdp *rsdp)
+static void dump_rsdt(struct upload_backend *be, const struct acpi_rsdp *rsdp)
 {
     const struct acpi_rsdt *rsdt;
     uint32_t i, n;
@@ -196,7 +195,7 @@ static void dump_rsdt(struct backend *be, const struct acpi_rsdp *rsdp)
     }
 }
 
-static void dump_xsdt(struct backend *be, const struct acpi_rsdp *rsdp)
+static void dump_xsdt(struct upload_backend *be, const struct acpi_rsdp *rsdp)
 {
     const struct acpi_xsdt *xsdt;
     uint32_t rsdp_len = rsdp->rev > 0 ? rsdp->len : 20;
@@ -231,7 +230,7 @@ static void dump_xsdt(struct backend *be, const struct acpi_rsdp *rsdp)
     }
 }
 
-void dump_acpi(struct backend *be)
+void dump_acpi(struct upload_backend *be)
 {
     const struct acpi_rsdp *rsdp;
     uint32_t rsdp_len;
diff --git a/com32/sysdump/backend.h b/com32/sysdump/backend.h
deleted file mode 100644 (file)
index f2b3bc2..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef BACKEND_H
-#define BACKEND_H
-
-#include <stddef.h>
-#include <inttypes.h>
-#include <stdbool.h>
-#include <zlib.h>
-#include "serial.h"
-
-/* Backend flags */
-#define BE_NEEDLEN     0x01
-
-struct backend {
-    const char *name;
-    const char *helpmsg;
-    int minargs;
-
-    size_t dbytes;
-    size_t zbytes;
-    const char **argv;
-
-    uint32_t now;
-
-    int (*write)(struct backend *);
-
-    z_stream zstream;
-    char *outbuf;
-    size_t alloc;
-};
-
-/* zout.c */
-int init_data(struct backend *be, const char *argv[]);
-int write_data(struct backend *be, const void *buf, size_t len);
-int flush_data(struct backend *be);
-
-/* cpio.c */
-#define cpio_init init_data
-int cpio_hdr(struct backend *be, uint32_t mode, size_t datalen,
-            const char *filename);
-int cpio_mkdir(struct backend *be, const char *filename);
-int cpio_writefile(struct backend *be, const char *filename,
-                  const void *data, size_t len);
-int cpio_close(struct backend *be);
-#define MODE_FILE      0100644
-#define MODE_DIR       0040755
-
-/* backends.c */
-struct backend *get_backend(const char *name);
-
-/* backends */
-extern struct backend be_tftp;
-extern struct backend be_ymodem;
-extern struct backend be_srec;
-
-#endif /* BACKEND_H */
index 372a70d..e7fc576 100644 (file)
@@ -8,7 +8,6 @@
 #include <com32.h>
 #include <sys/cpu.h>
 #include "sysdump.h"
-#include "backend.h"
 
 struct cpuid_data {
     uint32_t eax, ebx, ecx, edx;
@@ -29,7 +28,7 @@ static void get_cpuid(uint32_t eax, uint32_t ecx, struct cpuid_data *data)
 
 #define CPUID_CHUNK 128
 
-void dump_cpuid(struct backend *be)
+void dump_cpuid(struct upload_backend *be)
 {
     struct cpuid_info *buf = NULL;
     int nentry, nalloc;
diff --git a/com32/sysdump/data.h b/com32/sysdump/data.h
deleted file mode 100644 (file)
index deacf72..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#ifndef DATA_H
-#define DATA_H
index be4cce4..ce25efa 100644 (file)
@@ -6,7 +6,6 @@
 #include <string.h>
 #include <stdlib.h>
 #include "sysdump.h"
-#include "backend.h"
 
 struct dmi_header {
     char signature[5];
@@ -60,7 +59,7 @@ static bool is_smbios(size_t dptr)
        is_old_dmi(dptr+16);
 }
 
-static void dump_smbios(struct backend *be, size_t dptr)
+static void dump_smbios(struct upload_backend *be, size_t dptr)
 {
     const struct smbios_header *smb = (void *)dptr;
     struct smbios_header smx = *smb;
@@ -82,7 +81,7 @@ static void dump_smbios(struct backend *be, size_t dptr)
     write_data(be, (const void *)smb->dmi.tbladdr, smb->dmi.tbllen);
 }
 
-static void dump_old_dmi(struct backend *be, size_t dptr)
+static void dump_old_dmi(struct upload_backend *be, size_t dptr)
 {
     const struct dmi_header *dmi = (void *)dptr;
     struct fake {
@@ -108,7 +107,7 @@ static void dump_old_dmi(struct backend *be, size_t dptr)
     write_data(be, (const void *)dmi->tbladdr, dmi->tbllen);
 }
 
-void dump_dmi(struct backend *be)
+void dump_dmi(struct upload_backend *be)
 {
     size_t dptr;
 
index d0d40a7..f672585 100644 (file)
@@ -19,8 +19,7 @@
 #include <dprintf.h>
 #include <console.h>
 #include <sys/cpu.h>
-#include "../../version.h"
-#include "backend.h"
+#include <version.h>
 #include "sysdump.h"
 
 const char program[] = "sysdump";
@@ -32,7 +31,7 @@ __noreturn die(const char *msg)
     exit(1);
 }
 
-static void dump_all(struct backend *be, const char *argv[])
+static void dump_all(struct upload_backend *be, const char *argv[])
 {
     cpio_init(be, argv);
 
@@ -50,20 +49,20 @@ static void dump_all(struct backend *be, const char *argv[])
     flush_data(be);
 }
 
-static struct backend *backends[] =
+static struct upload_backend *upload_backends[] =
 {
-    &be_tftp,
-    &be_ymodem,
-    &be_srec,
+    &upload_tftp,
+    &upload_ymodem,
+    &upload_srec,
     NULL
 };
 
 __noreturn usage(void)
 {
-    struct backend **bep, *be;
+    struct upload_backend **bep, *be;
 
     printf("Usage:\n");
-    for (bep = backends ; (be = *bep) ; bep++)
+    for (bep = upload_backends ; (be = *bep) ; bep++)
        printf("    %s %s %s\n", program, be->name, be->helpmsg);
 
     exit(1);
@@ -71,7 +70,7 @@ __noreturn usage(void)
 
 int main(int argc, char *argv[])
 {
-    struct backend **bep, *be;
+    struct upload_backend **bep, *be;
 
     openconsole(&dev_null_r, &dev_stdcon_w);
     fputs(version, stdout);
@@ -79,7 +78,7 @@ int main(int argc, char *argv[])
     if (argc < 2)
        usage();
 
-    for (bep = backends ; (be = *bep) ; bep++) {
+    for (bep = upload_backends ; (be = *bep) ; bep++) {
        if (!strcmp(be->name, argv[1]))
            break;
     }
index 251107d..929873f 100644 (file)
@@ -7,7 +7,6 @@
 #include <stdlib.h>
 #include <com32.h>
 #include "sysdump.h"
-#include "backend.h"
 
 #define E820_CHUNK 128
 struct e820_info {
@@ -16,7 +15,7 @@ struct e820_info {
     uint8_t  data[24];
 };
 
-static void dump_e820(struct backend *be)
+static void dump_e820(struct upload_backend *be)
 {
     com32sys_t ireg, oreg;
     struct e820_info *curr;
@@ -63,7 +62,7 @@ static void dump_e820(struct backend *be)
     lfree(curr);
 }
 
-void dump_memory_map(struct backend *be)
+void dump_memory_map(struct upload_backend *be)
 {
     com32sys_t ireg, oreg;
 
index 6552e7f..377f9a9 100644 (file)
@@ -7,7 +7,6 @@
 #include <stdlib.h>
 #include <sys/cpu.h>
 #include "sysdump.h"
-#include "backend.h"
 
 static char *lowmem;
 static size_t lowmem_len;
@@ -29,7 +28,7 @@ void snapshot_lowmem(void)
     }
 }
 
-static void dump_memory_range(struct backend *be, const void *where,
+static void dump_memory_range(struct upload_backend *be, const void *where,
                              const void *addr, size_t len)
 {
     char filename[32];
@@ -38,7 +37,7 @@ static void dump_memory_range(struct backend *be, const void *where,
     cpio_writefile(be, filename, where, len);
 }
 
-void dump_memory(struct backend *be)
+void dump_memory(struct upload_backend *be)
 {
     printf("Dumping memory... ");
 
index 1d68727..9c23a84 100644 (file)
@@ -7,9 +7,8 @@
 #include <stdlib.h>
 #include <sys/pci.h>
 #include "sysdump.h"
-#include "backend.h"
 
-static void dump_pci_device(struct backend *be, pciaddr_t a, uint8_t hdrtype)
+static void dump_pci_device(struct upload_backend *be, pciaddr_t a, uint8_t hdrtype)
 {
     unsigned int bus  = pci_bus(a);
     unsigned int dev  = pci_dev(a);
@@ -31,7 +30,7 @@ static void dump_pci_device(struct backend *be, pciaddr_t a, uint8_t hdrtype)
     cpio_writefile(be, filename, data, sizeof data);
 }
 
-void dump_pci(struct backend *be)
+void dump_pci(struct upload_backend *be)
 {
     int cfgtype;
     unsigned int nbus, ndev, nfunc, maxfunc;
index 2930498..0e2a172 100755 (executable)
Binary files a/com32/sysdump/sysdump.c32 and b/com32/sysdump/sysdump.c32 differ
index a5b963f..72e4875 100644 (file)
@@ -1,15 +1,15 @@
 #ifndef SYSDUMP_H
 #define SYSDUMP_H
 
-struct backend;
+#include <libupload/upload_backend.h>
 
-void dump_memory_map(struct backend *);
+void dump_memory_map(struct upload_backend *);
 void snapshot_lowmem(void);
-void dump_memory(struct backend *);
-void dump_dmi(struct backend *);
-void dump_acpi(struct backend *);
-void dump_cpuid(struct backend *);
-void dump_pci(struct backend *);
-void dump_vesa_tables(struct backend *);
+void dump_memory(struct upload_backend *);
+void dump_dmi(struct upload_backend *);
+void dump_acpi(struct upload_backend *);
+void dump_cpuid(struct upload_backend *);
+void dump_pci(struct upload_backend *);
+void dump_vesa_tables(struct upload_backend *);
 
 #endif /* SYSDUMP_H */
index 017f9e4..42adc3d 100644 (file)
@@ -1,10 +1,9 @@
 #include <string.h>
 #include <stdio.h>
-#include "../lib/sys/vesa/vesa.h"
-#include "backend.h"
+#include <lib/sys/vesa/vesa.h>
 #include "sysdump.h"
 
-void dump_vesa_tables(struct backend *be)
+void dump_vesa_tables(struct upload_backend *be)
 {
     com32sys_t rm;
     struct vesa_info *vip;
index e34296b..7badabd 100644 (file)
@@ -10,8 +10,8 @@
 ##
 ## -----------------------------------------------------------------------
 
-topdir = ../..
-include $(topdir)/MCONFIG.build
+MAKEDIR = ../../mk
+include $(MAKEDIR)/build.mk
 
 BINS    = relocs
 
index 33ad7e9..112fe3a 100644 (file)
@@ -20,7 +20,8 @@ MAKEFLAGS += -r
 MAKE      += -r
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 -include $(topdir)/version.mk
 
 OPTFLAGS =
@@ -109,7 +110,7 @@ ldlinux.bss: ldlinux.bin
        dd if=$< of=$@ bs=512 count=1
 
 ldlinux.sys: ldlinux.bin
-       dd if=$< of=$@ bs=512 skip=1
+       dd if=$< of=$@ bs=512 skip=2
 
 codepage.cp: ../codepage/$(CODEPAGE).cp
        cp -f $< $@
index 68672e4..141986e 100644 (file)
@@ -278,7 +278,7 @@ Sect1Ptr1   equ $-4
                cmp dword [ldlinux_magic+4],LDLINUX_MAGIC^HEXDATE
                jne kaboom
 
-               ; Go for it!  This also normalizes CS:IP.
+               ; Go for it!
                jmp ldlinux_ent
 
 ;
index fc80a15..41391e7 100644 (file)
@@ -30,8 +30,8 @@ LDLINUX_MAGIC equ 0x3eb202fe          ; A random number to identify ourselves with
 ; This indicates the general format of the last few bytes in the boot sector
 BS_MAGIC_VER   equ 0x1b << 9
 
-SECTOR_SHIFT   equ 9
-SECTOR_SIZE    equ (1 << SECTOR_SHIFT)
+MIN_SECTOR_SHIFT       equ 9
+MIN_SECTOR_SIZE                equ (1 << MIN_SECTOR_SHIFT)
 
 ;
 ; The following structure is used for "virtual kernels"; i.e. LILO-style
index 02505a6..b2ef2b6 100644 (file)
@@ -23,6 +23,14 @@ Sect1Ptr1_VAL        equ 0xfeedface
 %include "diskboot.inc"
 
 ; ===========================================================================
+;  Padding after the (minimum) 512-byte boot sector so that the rest of
+;  the file has aligned sectors, even if they are larger than 512 bytes.
+; ===========================================================================
+
+               section .init
+align_pad      zb 512
+
+; ===========================================================================
 ;  Start of LDLINUX.SYS
 ; ===========================================================================
 
@@ -110,13 +118,15 @@ ldlinux_ent:
 ; Checksum data thus far
 ;
                mov si,ldlinux_sys
-               mov cx,SECTOR_SIZE >> 2
+               mov cx,[bsBytesPerSec]
+               shr cx,2
                mov edx,-LDLINUX_MAGIC
 .checksum:
                lodsd
                add edx,eax
                loop .checksum
                mov [CheckSum],edx              ; Save intermediate result
+               movzx ebx,si                    ; Start of the next sector
 
 ;
 ; Tell the user if we're using EBIOS or CBIOS
@@ -132,6 +142,7 @@ print_bios:
                call writestr_early
 
                section .earlybss
+               alignb 2
 %define        HAVE_BIOSNAME 1
 BIOSName       resw 1
 
@@ -140,8 +151,9 @@ BIOSName    resw 1
 ; Now we read the rest of LDLINUX.SYS.
 ;
 load_rest:
+               push bx                         ; LSW of load address
+
                lea esi,[SectorPtrs]
-               mov ebx,TEXT_START+2*SECTOR_SIZE ; Where we start loading
                mov cx,[DataSectors]
                dec cx                          ; Minus this sector
 
@@ -157,7 +169,7 @@ load_rest:
                xor bx,bx
                call getlinsec
                pop ebx
-               shl ebp,SECTOR_SHIFT
+               imul bp,[bsBytesPerSec]         ; Will be < 64K
                add ebx,ebp
                add si,10
                jmp .get_chunk
@@ -170,9 +182,11 @@ load_rest:
 ; by the time we get to the end it should all cancel out.
 ;
 verify_checksum:
-               mov si,ldlinux_sys + SECTOR_SIZE
-               mov ecx,[LDLDwords]
-               sub ecx,SECTOR_SIZE >> 2
+               pop si                          ; LSW of load address
+               movzx eax,word [bsBytesPerSec]
+               shr ax,2
+               mov ecx,[LDLDwords]             ; Total dwords
+               sub ecx,eax                     ; ... minus one sector
                mov eax,[CheckSum]
 .checksum:
                add eax,[si]
@@ -260,7 +274,7 @@ getlinsec_ebios:
                add eax,edi                     ; Advance sector pointer
                adc edx,0
                sub bp,di                       ; Sectors left
-                shl di,SECTOR_SHIFT            ; 512-byte sectors
+               imul di,[bsBytesPerSec]
                 add bx,di                      ; Advance buffer pointer
                 and bp,bp
                 jnz .loop
@@ -350,7 +364,7 @@ getlinsec_cbios:
                jc .error
 .resume:
                movzx ecx,al            ; ECX <- sectors transferred
-               shl ax,SECTOR_SHIFT     ; Convert sectors in AL to bytes in AX
+               imul ax,[bsBytesPerSec] ; Convert sectors in AL to bytes in AX
                pop bx
                add bx,ax
                pop bp
@@ -418,10 +432,10 @@ safedumpregs:
 
 rl_checkpt     equ $                           ; Must be <= 8000h
 
-rl_checkpt_off equ ($-$$)
+rl_checkpt_off equ $-ldlinux_sys
 %ifndef DEPEND
- %if rl_checkpt_off > 3F6h                     ; Need one extent
-  %assign rl_checkpt_overflow rl_checkpt_off - 3F6h
+ %if rl_checkpt_off > 512-10                   ; Need minimum one extent
+  %assign rl_checkpt_overflow rl_checkpt_off - (512-10)
   %error Sector 1 overflow by rl_checkpt_overflow bytes
  %endif
 %endif
@@ -434,8 +448,8 @@ rl_checkpt_off      equ ($-$$)
 ;
                alignz 2
 MaxInitDataSize        equ 96 << 10
-MaxLMA         equ TEXT_START+SECTOR_SIZE+MaxInitDataSize
-SectorPtrs     zb 10*(MaxInitDataSize >> SECTOR_SHIFT)
+MaxLMA         equ LDLINUX_SYS+MaxInitDataSize
+SectorPtrs     zb 10*(MaxInitDataSize >> MIN_SECTOR_SHIFT)
 SectorPtrsEnd  equ $
 
 ; ----------------------------------------------------------------------------
index 18ce132..71eb574 100644 (file)
@@ -20,8 +20,8 @@
 %ifndef _HEAD_INC
 %define _HEAD_INC
 
-%if __NASM_MAJOR__ < 2
- %error "NASM 2.00 or later required to compile correctly"
+%if __NASM_MAJOR__ < 2 || (__NASM_MAJOR__ == 2 && __NASM_MINOR__ < 3)
+ %error "NASM 2.03 or later required to compile correctly"
 %endif
 
 %include "macros.inc"
index e06ca96..8c6a178 100644 (file)
@@ -69,9 +69,15 @@ check_escapes:
                shr edx,10
                cmp ax,dx
                jae enough_ram
-               mov ax,dx
                mov si,err_noram
                mov cl,10
+               push dx
+               div cl
+               add [si+err_noram.need-err_noram+2],ah
+               cbw
+               div cl
+               add [si+err_noram.need-err_noram],ax
+               pop ax
                div cl
                add [si+err_noram.size-err_noram+2],ah
                cbw
@@ -83,15 +89,15 @@ enough_ram:
 skip_checks:
 
                section .data16
-err_noram      db 'It appears your computer has less than '
+err_noram      db 'It appears your computer has only '
 .size          db '000'
-               db 'K of low ("DOS")'
-               db CR, LF
-               db 'RAM.  Syslinux needs at least this amount to boot.  If you get'
-               db CR, LF
-               db 'this message in error, hold down the Ctrl key while'
-               db CR, LF
-               db 'booting, and I will take your word for it.', CR, LF, 0
+               db 'K of low ("DOS") RAM.', CR, LF
+               db 'This version of Syslinux needs '
+.need          db '000'
+               db 'K to boot.  If you get this', CR, LF
+               db 'message in error, hold down the Ctrl key while'
+               db 'booting, and I', CR, LF
+               db 'will take your word for it.', CR, LF, 0
 
                section .text16
 ;
index ef1c759..50d5106 100644 (file)
Binary files a/core/isolinux-debug.bin and b/core/isolinux-debug.bin differ
index ca8ee3a..7a871f0 100644 (file)
@@ -52,22 +52,6 @@ vk_append:   resb max_cmd_len+1      ; Command line
 vk_end:                equ $                   ; Should be <= vk_size
                endstruc
 
-;
-; File structure.  This holds the information for each currently open file.
-;
-               struc open_file_t
-file_sector    resd 1                  ; Sector pointer (0 = structure free)
-file_bytesleft resd 1                  ; Number of bytes left
-file_left      resd 1                  ; Number of sectors left
-               resd 1                  ; Unused
-               endstruc
-
-%ifndef DEPEND
-%if (open_file_t_size & (open_file_t_size-1))
-%error "open_file_t is not a power of 2"
-%endif
-%endif
-
 ; ---------------------------------------------------------------------------
 ;   BEGIN CODE
 ; ---------------------------------------------------------------------------
@@ -1195,138 +1179,6 @@ ROOT_FS_OPS:
 ;
 %include "ui.inc"
 
-;
-; Enable disk emulation.  The kind of disk we emulate is dependent on the
-; size of the file: 1200K, 1440K or 2880K floppy, otherwise harddisk.
-;
-is_disk_image:
-               TRACER CR
-               TRACER LF
-               TRACER 'D'
-               TRACER ':'
-
-               mov edx,eax                     ; File size
-               mov di,img_table
-               mov cx,img_table_count
-               mov eax,[si+file_sector]        ; Starting LBA of file
-               mov [dsp_lba],eax               ; Location of file
-               mov byte [dsp_drive], 0         ; 00h floppy, 80h hard disk
-.search_table:
-               TRACER 't'
-               mov eax,[di+4]
-               cmp edx,[di]
-               je .type_found
-               add di,8
-               loop .search_table
-
-               ; Hard disk image.  Need to examine the partition table
-               ; in order to deduce the C/H/S geometry.  Sigh.
-.hard_disk_image:
-               TRACER 'h'
-               cmp edx,512
-               jb .bad_image
-
-               mov bx,trackbuf
-               mov cx,1                        ; Load 1 sector
-               pm_call getfssec
-
-               cmp word [trackbuf+510],0aa55h  ; Boot signature
-               jne .bad_image          ; Image not bootable
-
-               mov cx,4                        ; 4 partition entries
-               mov di,trackbuf+446             ; Start of partition table
-
-               xor ax,ax                       ; Highest sector(al) head(ah)
-
-.part_scan:
-               cmp byte [di+4], 0
-               jz .part_loop
-               lea si,[di+1]
-               call .hs_check
-               add si,byte 4
-               call .hs_check
-.part_loop:
-               add di,byte 16
-               loop .part_scan
-
-               push eax                        ; H/S
-               push edx                        ; File size
-               mov bl,ah
-               xor bh,bh
-               inc bx                          ; # of heads in BX
-               xor ah,ah                       ; # of sectors in AX
-               cwde                            ; EAX[31:16] <- 0
-               mul bx
-               shl eax,9                       ; Convert to bytes
-               ; Now eax contains the number of bytes per cylinder
-               pop ebx                         ; File size
-               xor edx,edx
-               div ebx
-               and edx,edx
-               jz .no_remainder
-               inc eax                         ; Fractional cylinder...
-               ; Now (e)ax contains the number of cylinders
-.no_remainder: cmp eax,1024
-               jna .ok_cyl
-               mov ax,1024                     ; Max possible #
-.ok_cyl:       dec ax                          ; Convert to max cylinder no
-               pop ebx                         ; S(bl) H(bh)
-               shl ah,6
-               or bl,ah
-               xchg ax,bx
-               shl eax,16
-               mov ah,bl
-               mov al,4                        ; Hard disk boot
-               mov byte [dsp_drive], 80h       ; Drive 80h = hard disk
-
-.type_found:
-               TRACER 'T'
-               mov bl,[sp_media]
-               and bl,0F0h                     ; Copy controller info bits
-               or al,bl
-               mov [dsp_media],al              ; Emulation type
-               shr eax,8
-               mov [dsp_chs],eax               ; C/H/S geometry
-               mov ax,[sp_devspec]             ; Copy device spec
-               mov [dsp_devspec],ax
-               mov al,[sp_controller]          ; Copy controller index
-               mov [dsp_controller],al
-
-               TRACER 'V'
-               call vgaclearmode               ; Reset video
-
-               mov ax,4C00h                    ; Enable emulation and boot
-               mov si,dspec_packet
-               mov dl,[DriveNumber]
-               lss sp,[InitStack]
-               TRACER 'X'
-
-               call int13
-
-               ; If this returns, we have problems
-.bad_image:
-               mov si,err_disk_image
-               call writestr
-               jmp enter_command
-
-;
-; Look for the highest seen H/S geometry
-; We compute cylinders separately
-;
-.hs_check:
-               mov bl,[si]                     ; Head #
-               cmp bl,ah
-               jna .done_track
-               mov ah,bl                       ; New highest head #
-.done_track:   mov bl,[si+1]
-               and bl,3Fh                      ; Sector #
-               cmp bl,al
-               jna .done_sector
-               mov al,bl
-.done_sector:  ret
-
-
-
 ; -----------------------------------------------------------------------------
 ;  Common modules
 ; -----------------------------------------------------------------------------
@@ -1352,33 +1204,8 @@ err_disk_image   db 'Cannot load disk image (invalid file)?', CR, LF, 0
 ;
                alignz 4
 exten_table:   db '.cbt'               ; COMBOOT (specific)
-               db '.img'               ; Disk image
                db '.bin'               ; CD boot sector
                db '.com'               ; COMBOOT (same as DOS)
                db '.c32'               ; COM32
 exten_table_end:
                dd 0, 0                 ; Need 8 null bytes here
-
-;
-; Floppy image table
-;
-               alignz 4
-img_table_count        equ 3
-img_table:
-               dd 1200*1024            ; 1200K floppy
-               db 1                    ; Emulation type
-               db 80-1                 ; Max cylinder
-               db 15                   ; Max sector
-               db 2-1                  ; Max head
-
-               dd 1440*1024            ; 1440K floppy
-               db 2                    ; Emulation type
-               db 80-1                 ; Max cylinder
-               db 18                   ; Max sector
-               db 2-1                  ; Max head
-
-               dd 2880*1024            ; 2880K floppy
-               db 3                    ; Emulation type
-               db 80-1                 ; Max cylinder
-               db 36                   ; Max sector
-               db 2-1                  ; Max head
index 658011d..922c3b0 100644 (file)
Binary files a/core/isolinux.bin and b/core/isolinux.bin differ
index 4f8804c..b7e9532 100644 (file)
Binary files a/core/ldlinux.bin and b/core/ldlinux.bin differ
index 2fde94b..884c5a8 100644 (file)
Binary files a/core/ldlinux.bss and b/core/ldlinux.bss differ
index 7d78187..cee0f82 100644 (file)
Binary files a/core/ldlinux.sys and b/core/ldlinux.sys differ
index 3430ff2..528ad2c 100644 (file)
Binary files a/core/pxelinux.0 and b/core/pxelinux.0 differ
index 3430ff2..528ad2c 100644 (file)
Binary files a/core/pxelinux.bin and b/core/pxelinux.bin differ
index 0a4bb56..631860f 100644 (file)
@@ -681,11 +681,8 @@ is_bad_image:
 %else
 is_bss_sector  equ is_bad_image
 %endif
-%if IS_ISOLINUX
-               ; ok
-%else
-is_disk_image  equ is_bad_image
-%endif
+
+is_disk_image  equ is_bad_image        ; No longer supported
 
                section .data16
 boot_prompt    db 'boot: ', 0
index 6af0d2d..119ccbc 100644 (file)
 #
 
 topdir = ../..
-# include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 coredir = $(topdir)/core
 
-BTARGET = geodsp1s.bin geodspms.bin mk-lba-img \
+BTARGET = geodsp1s.bin geodspms.bin \
        geodsp1s.img.xz geodspms.img.xz
-#      lba-1s.img.xz lba-ms.img.xz
-  # lba-1s.img lba-ms.img
 
 NASMOPT = -i $(coredir)/ -Ox -f bin
 NASMOPT += -w+orphan-labels
+CFLAGS = -g -O
 
 all: $(BTARGET)
 
-.PRECIOUS: %.img
-# .PRECIOUS: lba-%.img
-
 # Higher compression levels result in larger files
-%.img.xz: %.img
-       xz -k0f $<
-
-%.img.gz: %.img
-       gzip -9c $< > $@
+%.img.xz: %.bin mk-lba-img
+       ./mk-lba-img < $< | $(XZ) -0f > $@ || ( rm -f $@ ; false )
 
-%.img: %.bin lba.img
-       (cp -a lba.img $@ && dd conv=notrunc if=$< of=$@) || rm -f $@
+%.img.gz: %.bin mk-lba-img
+       ./mk-lba-img < $< | $(GZIP) -9 > $@ || ( rm -f $@ ; false )
 
 %.bin: %.asm $(coredir)/writehex.inc $(coredir)/macros.inc $(coredir)/diskboot.inc
-       nasm $(NASMOPT) -o $@ -l $(@:.bin=.lst) $<
+       $(NASM) $(NASMOPT) -o $@ -l $(@:.bin=.lst) $<
 
 mk-lba-img: mk-lba-img.c
-       gcc -o $@ $<
-
-lba.img: mk-lba-img
-       ./$< $@
+       $(CC) $(CFLAGS) -o $@ $<
 
 tidy dist:
-       rm -Rf *.img
+       rm -Rf *.lst *.img
+       rm -f mk-lba-img
 
 clean: tidy
-       rm -f *.lst *.bin *_bin.c
 
 spotless: clean
        rm -f $(BTARGET)
diff --git a/diag/geodsp/geodsp1s.lst b/diag/geodsp/geodsp1s.lst
deleted file mode 100644 (file)
index 2a0cc39..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-     1                                  ; -----------------------------------------------------------------------
-     2                                  ;
-     3                                  ;   Copyright 2010 Gene Cumm
-     4                                  ;
-     5                                  ;   Portions from diskstart.inc:
-     6                                  ;   Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
-     7                                  ;   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
-     8                                  ;
-     9                                  ;   This program is free software; you can redistribute it and/or modify
-    10                                  ;   it under the terms of the GNU General Public License as published by
-    11                                  ;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-    12                                  ;   Boston MA 02110-1301, USA; either version 2 of the License, or
-    13                                  ;   (at your option) any later version; incorporated herein by reference.
-    14                                  ;
-    15                                  ; -----------------------------------------------------------------------
-    16                                  
-    17                                  ;
-    18                                  ; geodsp1s.asm
-    19                                  ;
-    20                                  ; Display geometry translation info for diagnosing misconceptions
-    21                                  ; 1 sector variant
-    22                                  ;
-    23                                  ;      nasm -Ox -f bin -o geodsp.bin -l geodsp.lst geodsp.asm
-    24                                  ;
-    25                                  ;      nasm -Ox -f elf -o geodsp.o -l geodsp.lst geodsp.asm
-    26                                  ;      ld -m elf_i386  -T syslinux.ld -M -o geodsp.elf geodsp.o > geodsp.map
-    27                                  ;      objcopy -O binary geodsp.elf geodsp.raw
-    28                                  ;
-    29                                  ;      # OF=/dev/sdb
-    30                                  ;      # dd if=core/geodsp.bin of=$OF
-    31                                  ;      # dd skip=1 seek=1 if=../dbg/lba-img/lba-img.bin of=$OF
-    32                                  ;      # eject $OF
-    33                                  ;      # dd count=$() if=/dev/zero of=$OF
-    34                                  ;
-    35                                  ;      # OF=geo-2.255.63.i
-    36                                  ;      # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((2*255*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF
-    37                                  ;      # OF=geo-20.16.63.i
-    38                                  ;      # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((40*16*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF
-    39                                  ;
-    40                                  
-    41                                  %include "macros.inc"
-    42                              <1> ;; -----------------------------------------------------------------------
-    43                              <1> ;;
-    44                              <1> ;;   Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
-    45                              <1> ;;   Copyright 2009 Intel Corporation; author: H. Peter Anvin
-    46                              <1> ;;
-    47                              <1> ;;   This program is free software; you can redistribute it and/or modify
-    48                              <1> ;;   it under the terms of the GNU General Public License as published by
-    49                              <1> ;;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
-    50                              <1> ;;   Boston MA 02111-1307, USA; either version 2 of the License, or
-    51                              <1> ;;   (at your option) any later version; incorporated herein by reference.
-    52                              <1> ;;
-    53                              <1> ;; -----------------------------------------------------------------------
-    54                              <1> 
-    55                              <1> ;;
-    56                              <1> ;; macros.inc
-    57                              <1> ;;
-    58                              <1> ;; Convenient macros
-    59                              <1> ;;
-    60                              <1> 
-    61                              <1> %ifndef _MACROS_INC
-    62                              <1> %define _MACROS_INC
-    63                              <1> 
-    64                              <1> ;
-    65                              <1> ; Identify the module we're compiling; the "correct" should be defined
-    66                              <1> ; in the module itself to 1
-    67                              <1> ;
-    68                              <1> %ifdef IS_SYSLINUX
-    69                              <1>  %define MY_NAME 'SYSLINUX'
-    70                              <1> %else
-    71                              <1>  %define IS_SYSLINUX 0
-    72                              <1> %endif
-    73                              <1> %ifdef IS_PXELINUX
-    74                              <1>  %define MY_NAME 'PXELINUX'
-    75                              <1> %else
-    76                              <1>  %define IS_PXELINUX 0
-    77                              <1> %endif
-    78                              <1> %ifdef IS_ISOLINUX
-    79                              <1>  %define MY_NAME 'ISOLINUX'
-    80                              <1> %else
-    81                              <1>  %define IS_ISOLINUX 0
-    82                              <1> %endif
-    83                              <1> %ifdef IS_EXTLINUX
-    84                              <1>  %define MY_NAME 'EXTLINUX'
-    85                              <1> %else
-    86                              <1>  %define IS_EXTLINUX 0
-    87                              <1> %endif
-    88                              <1> 
-    89                              <1> ;
-    90                              <1> ; Macros similar to res[bwd], but which works in the code segment (after
-    91                              <1> ; section .text16) or the data segment (section .data16)
-    92                              <1> ;
-    93                              <1> %macro zb      1.nolist
-    94                              <1>        times %1 db 0
-    95                              <1> %endmacro
-    96                              <1> 
-    97                              <1> %macro zw      1.nolist
-    98                              <1>        times %1 dw 0
-    99                              <1> %endmacro
-   100                              <1> 
-   101                              <1> %macro zd      1.nolist
-   102                              <1>        times %1 dd 0
-   103                              <1> %endmacro
-   104                              <1> 
-   105                              <1> ;
-   106                              <1> ; Align with zero bytes in a progbits segment
-   107                              <1> ;
-   108                              <1> %macro alignz  1.nolist
-   109                              <1>        times (((%1) - (($-$$) % (%1))) % (%1)) db 0
-   110                              <1> %endmacro
-   111                              <1> 
-   112                              <1> ;
-   113                              <1> ; Macro to emit an unsigned decimal number as a string
-   114                              <1> ;
-   115                              <1> %macro asciidec        1.nolist
-   116                              <1>   %ifndef DEPEND       ; Not safe for "depend"
-   117                              <1>     %push asciidec
-   118                              <1>       %assign %$v %1
-   119                              <1>       %if %$v == 0
-   120                              <1>         db '0'
-   121                              <1>       %else
-   122                              <1>         %assign %$dcount 0
-   123                              <1>         %assign %$n %$v
-   124                              <1>         %assign %$d 1
-   125                              <1>         %rep 20
-   126                              <1>           %if %$n != 0
-   127                              <1>             %assign %$dcount %$dcount + 1
-   128                              <1>             %assign %$n %$n / 10
-   129                              <1>             %assign %$d %$d * 10
-   130                              <1>           %endif
-   131                              <1>         %endrep
-   132                              <1>         %rep %$dcount
-   133                              <1>          %assign %$d %$d / 10
-   134                              <1>           db ((%$v / %$d) % 10) + '0'
-   135                              <1>         %endrep
-   136                              <1>       %endif
-   137                              <1>     %pop
-   138                              <1>   %endif
-   139                              <1> %endmacro
-   140                              <1> 
-   141                              <1> ;
-   142                              <1> ; Macros for network byte order of constants
-   143                              <1> ;
-   144                              <1> %define htons(x)  ( ( ((x) & 0FFh) << 8 ) + ( ((x) & 0FF00h) >> 8 ) )
-   145                              <1> %define ntohs(x) htons(x)
-   146                              <1> %define htonl(x)  ( ( ((x) & 0FFh) << 24) + ( ((x) & 0FF00h) << 8 ) + ( ((x) & 0FF0000h) >> 8 ) + ( ((x) & 0FF000000h) >> 24) )
-   147                              <1> %define ntohl(x) htonl(x)
-   148                              <1> 
-   149                              <1> ;
-   150                              <1> ; ASCII
-   151                              <1> ;
-   152                              <1> CR             equ 13          ; Carriage Return
-   153                              <1> LF             equ 10          ; Line Feed
-   154                              <1> FF             equ 12          ; Form Feed
-   155                              <1> BS             equ  8          ; Backspace
-   156                              <1> 
-   157                              <1> %endif ; _MACROS_INC
-   158                                  ; %include "layout.inc"
-   159                                  
-   160                                  ;              global STACK_LEN, STACK_TOP, STACK_BASE
-   161                                  ; STACK_LEN    equ 4096
-   162                                  STACK_TOP      equ 7c00h
-   163                                  ; STACK_BASE   equ STACK_TOP - STACK_LEN
-   164                                  
-   165                                  StackBuf       equ STACK_TOP-44-92     ; Start the stack here (grow down - 4K)
-   166                                  DriveNumber    equ StackBuf-4          ; Drive number
-   167                                  m_CHS0         equ 00534843h           ;'CHS',0
-   168                                  m_EDD0         equ 00444445h           ;'EDD',0
-   169                                  m_EDD_SP       equ 20444445h           ;'EDD '
-   170                                  retry_count    equ 16
-   171                                  dbuf           equ 8000h
-   172                                  int13_ret      equ 7e00h
-   173                                  
-   174                                  
-   175                                  
-   176                                  ;              extern  real_mode_seg
-   177                                  ;              section .real_mode      write nobits align=65536
-   178                                  ;              global  core_real_mode
-   179                                  ; core_real_mode       resb 65536
-   180                                  ;              extern  xfer_buf_seg
-   181                                  ;              section .xfer_buf       write nobits align=65536
-   182                                  ;              global  core_xfer_buf
-   183                                  ; core_xfer_buf        resb 65536
-   184                                  
-   185                                                 section .text
-   186                                                 org STACK_TOP
-   187                                  
-   188                                  
-   189                                                 global _start
-   190                                  bootsec                equ $
-   191                                  _start:
-   192                                                         ; In case we want to pull more of the standard diskstart stuff in
-   193                                  ;              jmp short start         ; 2 bytes
-   194                                  ;              nop                     ; 1 byte
-   195                                  start:
-   196 00000000 FA                                     cli
-   197 00000001 FC                                     cld
-   198 00000002 31C9                                   xor cx,cx
-   199 00000004 8ED1                                   mov ss,cx
-   200 00000006 BC767B                                 mov sp,StackBuf-2       ; Just below BSS (-2 for alignment)
-   201 00000009 52                                     push dx                 ; Save drive number (in DL)
-   202                                                         ; Kill everything else and let the BIOS sort it out later
-   203 0000000A 8EC1                                   mov es,cx
-   204 0000000C 8ED9                                   mov ds,cx
-   205 0000000E FB                                     sti
-   206                                  
-   207                                  get_geo:               ; DL and ES ready
-   208 0000000F B408                                   mov ah,08h
-   209 00000011 BF0000                                 mov di,0
-   210 00000014 CD13                                   int 13h
-   211                                  write_geo:
-   212 00000016 720E                                   jc .bad_geo
-   213 00000018 BE[A801]                               mov si,s_chs
-   214 0000001B E8C700                                 call writestr_early
-   215 0000001E E8F000                                 call write_chs
-   216 00000021 E82F01                                 call crlf
-   217 00000024 EB00                                   jmp short .done
-   218                                  .bad_geo:
-   219                                  .done:
-   220                                  
-   221 00000026 BB0080                                 mov bx,dbuf
-   222                                  get_h1c:               ; 0,1,1
-   223 00000029 B90100                                 mov cx,0001h
-   224 0000002C B601                                   mov dh,01h
-   225 0000002E E88D00                                 call getonesec_chs
-   226 00000031 E8C000                                 call write_chs_lba
-   227                                  get_c1c:               ; 1,0,1
-   228 00000034 B90101                                 mov cx,0101h
-   229 00000037 B600                                   mov dh,00h
-   230 00000039 E88200                                 call getonesec_chs
-   231 0000003C E8B500                                 call write_chs_lba
-   232                                  
-   233                                  ;
-   234                                  ; Do we have EBIOS (EDD)?
-   235                                  ;
-   236                                  edd:
-   237                                  .check:
-   238 0000003F BBAA55                                 mov bx,55AAh
-   239 00000042 B441                                   mov ah,41h              ; EDD existence query
-   240 00000044 8A16747B                               mov dl,[DriveNumber]
-   241 00000048 CD13                                   int 13h
-   242 0000004A 723F                                   jc .noedd
-   243 0000004C 81FB55AA                               cmp bx,0AA55h
-   244 00000050 7539                                   jne .noedd
-   245 00000052 F6C101                                 test cl,1               ; Extended disk access functionality set
-   246 00000055 7434                                   jz .noedd
-   247                                                 ;
-   248                                                 ; We have EDD support...
-   249                                                 ;
-   250 00000057 BB0080                                 mov bx,dbuf
-   251 0000005A 6631D2                                 xor edx,edx
-   252 0000005D 66C706[A801]454444-                    mov dword [s_chs],m_EDD_SP
-   253 00000065 20                 
-   254                                  .get_lba63:
-   255 00000066 66B83F000000                           mov eax,63      ; Same length as mov al,64; movzx eax,al
-   256 0000006C E82400                                 call getonesec_ebios
-   257 0000006F 721A                                   jc .bad_edd     ;read error
-   258 00000071 E8C200                                 call write_edd_lba
-   259                                  .get_lba16065:
-   260 00000074 66B8C13E0000                           mov eax,16065
-   261 0000007A E81600                                 call getonesec_ebios
-   262 0000007D 720C                                   jc .bad_edd     ;read error
-   263 0000007F E8B400                                 call write_edd_lba
-   264                                  .good_edd:
-   265 00000082 66C706[AF01]454444-                    mov dword [s_type],m_EDD0
-   266 0000008A 00                 
-   267                                  .bad_edd:
-   268                                  .noedd:
-   269                                  .end:
-   270                                  
-   271                                  write_final_type:
-   272 0000008B BE[AD01]                               mov si,s_typespec
-   273 0000008E E85400                                 call writestr_early
-   274                                  
-   275 00000091 EB38                                   jmp short kaboom
-   276                                  
-   277                                  ;
-   278                                  ; getonesec_ebios:
-   279                                  ;
-   280                                  ; getonesec implementation for EBIOS (EDD)
-   281                                  ;
-   282                                  getonesec_ebios:
-   283 00000093 B91000                                 mov cx,retry_count
-   284                                  .retry:
-   285                                                 ; Form DAPA on stack
-   286 00000096 6652                                   push edx
-   287 00000098 6650                                   push eax
-   288 0000009A 06                                     push es
-   289 0000009B 53                                     push bx
-   290 0000009C 6A01                                   push word 1
-   291 0000009E 6A10                                   push word 16
-   292 000000A0 89E6                                   mov si,sp
-   293 000000A2 6660                                   pushad
-   294 000000A4 B442                                    mov ah,42h                      ; Extended Read
-   295 000000A6 E83200                                 call xint13
-   296 000000A9 6661                                   popad
-   297 000000AB 8D6410                                 lea sp,[si+16]                  ; Remove DAPA
-   298 000000AE 7201                                   jc .error
-   299 000000B0 C3                                      ret
-   300                                  
-   301                                  .error:
-   302                                                 ; Some systems seem to get "stuck" in an error state when
-   303                                                 ; using EBIOS.  Doesn't happen when using CBIOS, which is
-   304                                                 ; good, since some other systems get timeout failures
-   305                                                 ; waiting for the floppy disk to spin up.
-   306                                  
-   307 000000B1 6660                                   pushad                          ; Try resetting the device
-   308 000000B3 31C0                                   xor ax,ax
-   309 000000B5 E82300                                 call xint13
-   310 000000B8 6661                                   popad
-   311 000000BA E2DA                                   loop .retry                     ; CX-- and jump if not zero
-   312                                  
-   313                                                 ; Total failure.
-   314 000000BC F9                                     stc
-   315 000000BD C3                                     ret
-   316                                  
-   317                                  ;
-   318                                  ; getonesec_chs:
-   319                                  ;
-   320                                  ; CX,DH specifies CHS address
-   321                                  ;
-   322                                  getonesec_chs: ; We could use an xchg and get a loop
-   323                                  ;              mov cx,retry_count
-   324                                  .retry:
-   325 000000BE 6660                                   pushad
-   326 000000C0 B80102                                 mov ax,0201h            ; Read one sector
-   327 000000C3 E81500                                 call xint13
-   328 000000C6 6661                                   popad
-   329 000000C8 7201                                   jc .error
-   330 000000CA C3                                     ret
-   331                                  
-   332                                  .error:
-   333                                  ;              loop .retry
-   334                                                 ; Fall through to disk_error
-   335                                  ;
-   336                                  ; kaboom: write a message and bail out.
-   337                                  ;
-   338                                                 global kaboom
-   339                                  disk_error:
-   340                                  kaboom:
-   341                                  .patch:
-   342 000000CB BE[B301]                               mov si,bailmsg
-   343 000000CE E81400                                 call writestr_early
-   344 000000D1 6631C0                                 xor eax,eax
-   345 000000D4 CD16                    .again:                int 16h                 ; Wait for keypress
-   346                                                                         ; NB: replaced by int 18h if
-   347                                                                         ; chosen at install time..
-   348 000000D6 CD19                                   int 19h                 ; And try once more to boot...
-   349 000000D8 F4                      .norge:                hlt                     ; If int 19h returned; this is the end
-   350 000000D9 EBFD                                   jmp short .norge
-   351                                  
-   352                                  ;
-   353                                  ; INT 13h wrapper function
-   354                                  ;
-   355                                  xint13:
-   356 000000DB 8A16747B                                mov dl,[DriveNumber]
-   357 000000DF CD13                                   int 13h
-   358 000000E1 A3007E                                 mov [int13_ret],ax
-   359 000000E4 C3                                     ret
-   360                                  
-   361                                  ;
-   362                                  ;
-   363                                  ; writestr_early: write a null-terminated string to the console
-   364                                  ;          This assumes we're on page 0.  This is only used for early
-   365                                  ;           messages, so it should be OK.
-   366                                  ;
-   367                                  writestr_early:
-   368 000000E5 6660                                   pushad
-   369 000000E7 AC                      .loop:         lodsb
-   370 000000E8 20C0                                   and al,al
-   371 000000EA 7405                                    jz .return
-   372 000000EC E86D00                                 call writechr
-   373 000000EF EBF6                                   jmp short .loop
-   374 000000F1 6661                    .return:       popad
-   375 000000F3 C3                                     ret
-   376                                  
-   377                                  %include "geodsplib.inc"
-   378                              <1> ; -----------------------------------------------------------------------
-   379                              <1> ;
-   380                              <1> ;   Copyright 2010 Gene Cumm
-   381                              <1> ;
-   382                              <1> ;   Portions from diskstart.inc:
-   383                              <1> ;   Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
-   384                              <1> ;   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
-   385                              <1> ;
-   386                              <1> ;   This program is free software; you can redistribute it and/or modify
-   387                              <1> ;   it under the terms of the GNU General Public License as published by
-   388                              <1> ;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-   389                              <1> ;   Boston MA 02110-1301, USA; either version 2 of the License, or
-   390                              <1> ;   (at your option) any later version; incorporated herein by reference.
-   391                              <1> ;
-   392                              <1> ; -----------------------------------------------------------------------
-   393                              <1> 
-   394                              <1> ;
-   395                              <1> ; geodsplib.inc
-   396                              <1> ;
-   397                              <1> ; Library file for geodsp*.asm
-   398                              <1> ;
-   399                              <1> 
-   400                              <1>                ; ES:BX points to the buffer with address
-   401                              <1>                ; DX,CX as they should be for INT13h,AH=02
-   402                              <1>                ; For now assume C<256
-   403                              <1> write_chs_lba:
-   404 000000F4 6660                <1>                pushad
-   405 000000F6 BE[A701]            <1>                mov si,s_atchs
-   406 000000F9 E8E9FF              <1>                call writestr_early
-   407 000000FC E81200              <1>                call write_chs
-   408 000000FF B03A                <1>                mov al,':'
-   409 00000101 E85800              <1>                call writechr
-   410 00000104 26668B07            <1>                mov eax,[es:bx]
-   411 00000108 E87700              <1>                call writehex8
-   412 0000010B E84500              <1>                call crlf
-   413 0000010E 6661                <1>                popad
-   414 00000110 C3                  <1>                ret
-   415                              <1> 
-   416                              <1>                ; DX,CX as they should be for INT13h,AH=02
-   417                              <1>                ; For now assume C<256
-   418                              <1> write_chs:
-   419 00000111 6660                <1>                pushad
-   420 00000113 88E8                <1>                mov al,ch
-   421 00000115 88CC                <1>                mov ah,cl
-   422 00000117 C0EC06              <1>                shr ah,6
-   423 0000011A E85800              <1>                call writehex4
-   424 0000011D B02C                <1>                mov al,','
-   425 0000011F E83A00              <1>                call writechr
-   426 00000122 88F0                <1>                mov al,dh
-   427 00000124 E84100              <1>                call writehex2
-   428 00000127 B02C                <1>                mov al,','
-   429 00000129 E83000              <1>                call writechr
-   430 0000012C 88C8                <1>                mov al,cl
-   431 0000012E 243F                <1>                and al,3Fh
-   432 00000130 E83500              <1>                call writehex2
-   433 00000133 6661                <1>                popad
-   434 00000135 C3                  <1>                ret
-   435                              <1> 
-   436                              <1> write_edd_lba:
-   437 00000136 6660                <1>                pushad
-   438 00000138 BE[A701]            <1>                mov si,s_atchs
-   439 0000013B E8A7FF              <1>                call writestr_early
-   440 0000013E E84100              <1>                call writehex8
-   441 00000141 B03A                <1>                mov al,':'
-   442 00000143 E81600              <1>                call writechr
-   443 00000146 26668B07            <1>                mov eax,[es:bx]
-   444 0000014A E83500              <1>                call writehex8
-   445 0000014D E80300              <1>                call crlf
-   446 00000150 6661                <1>                popad
-   447 00000152 C3                  <1>                ret
-   448                              <1> 
-   449                              <1> 
-   450                              <1> crlf:
-   451 00000153 56                  <1>                push si
-   452 00000154 BE[B801]            <1>                mov si,s_crlf
-   453 00000157 E88BFF              <1>                call writestr_early
-   454 0000015A 5E                  <1>                pop si
-   455 0000015B C3                  <1>                ret
-   456                              <1> 
-   457                              <1> writechr:
-   458                              <1> writechr_early:
-   459 0000015C 6660                <1>                pushad
-   460 0000015E B40E                <1>                mov ah,0Eh              ; Write to screen as TTY
-   461 00000160 BB0700              <1>                mov bx,0007h            ; Attribute
-   462 00000163 CD10                <1>                int 10h
-   463 00000165 6661                <1>                popad
-   464 00000167 C3                  <1>                ret
-   465                              <1> 
-   466                              <1> %include "writehex.inc"
-   467                              <2> ;; -----------------------------------------------------------------------
-   468                              <2> ;;
-   469                              <2> ;;   Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
-   470                              <2> ;;
-   471                              <2> ;;   This program is free software; you can redistribute it and/or modify
-   472                              <2> ;;   it under the terms of the GNU General Public License as published by
-   473                              <2> ;;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
-   474                              <2> ;;   Boston MA 02111-1307, USA; either version 2 of the License, or
-   475                              <2> ;;   (at your option) any later version; incorporated herein by reference.
-   476                              <2> ;;
-   477                              <2> ;; -----------------------------------------------------------------------
-   478                              <2> 
-   479                              <2> ;;
-   480                              <2> ;; writehex.inc
-   481                              <2> ;;
-   482                              <2> ;; Write hexadecimal numbers to the console
-   483                              <2> ;;
-   484                              <2> 
-   485                              <2> ;
-   486                              <2> ; writehex[248]: Write a hex number in (AL, AX, EAX) to the console
-   487                              <2> ;
-   488                              <2> writehex2:
-   489 00000168 669C                <2>                pushfd
-   490 0000016A 6660                <2>                pushad
-   491 0000016C 66C1C018            <2>                rol eax,24
-   492 00000170 B90200              <2>                mov cx,2
-   493 00000173 EB14                <2>                jmp short writehex_common
-   494                              <2> writehex4:
-   495 00000175 669C                <2>                pushfd
-   496 00000177 6660                <2>                pushad
-   497 00000179 66C1C010            <2>                rol eax,16
-   498 0000017D B90400              <2>                mov cx,4
-   499 00000180 EB07                <2>                jmp short writehex_common
-   500                              <2> writehex8:
-   501 00000182 669C                <2>                pushfd
-   502 00000184 6660                <2>                pushad
-   503 00000186 B90800              <2>                mov cx,8
-   504                              <2> writehex_common:
-   505 00000189 66C1C004            <2> .loop:         rol eax,4
-   506 0000018D 6650                <2>                push eax
-   507 0000018F 240F                <2>                and al,0Fh
-   508 00000191 3C0A                <2>                cmp al,10
-   509 00000193 7304                <2>                jae .high
-   510 00000195 0430                <2> .low:          add al,'0'
-   511 00000197 EB02                <2>                jmp short .ischar
-   512 00000199 0437                <2> .high:         add al,'A'-10
-   513 0000019B E8BEFF              <2> .ischar:       call writechr
-   514 0000019E 6658                <2>                pop eax
-   515 000001A0 E2E7                <2>                loop .loop
-   516 000001A2 6661                <2>                popad
-   517 000001A4 669D                <2>                popfd
-   518 000001A6 C3                  <2>                ret
-   519                              <1> 
-   520 000001A7 40                  <1> s_atchs:       db '@'
-   521 000001A8 434853              <1> s_chs:         db 'CHS'
-   522 000001AB 2000                <1> s_space:       db ' ', 0
-   523 000001AD 443D                <1> s_typespec:    db 'D='
-   524 000001AF 43485300            <1> s_type:                db 'CHS', 0
-   525 000001B3 0D0A656E64          <1> s_end:         db 0Dh, 0Ah, 'end'
-   526 000001B8 0D0A00              <1> s_crlf:                db 0Dh, 0Ah, 0
-   527                              <1> 
-   528                              <1> ; This indicates the general format of the last few bytes in the boot sector
-   529                              <1> BS_MAGIC_VER   equ 0x1b << 9
-   530                                  bailmsg                equ s_end
-   531                                  
-   532                                                 ; This fails if the boot sector overflowsg
-   533 000001BB 00<rept>                               zb 1BEh-($-$$)
-   534                                  
-   535 000001BE 00<rept>                ptable         zb 40h          ; Partition table
-   536                                  
-   537 000001FE 55AA                    bootsignature  dw 0xAA55
-   538                                  
-   539                                  sector_2:
diff --git a/diag/geodsp/geodspms.lst b/diag/geodsp/geodspms.lst
deleted file mode 100644 (file)
index 66c7cd0..0000000
+++ /dev/null
@@ -1,943 +0,0 @@
-     1                                  ; -----------------------------------------------------------------------
-     2                                  ;
-     3                                  ;   Copyright 2010 Gene Cumm
-     4                                  ;
-     5                                  ;   Portions from diskstart.inc:
-     6                                  ;   Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
-     7                                  ;   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
-     8                                  ;
-     9                                  ;   This program is free software; you can redistribute it and/or modify
-    10                                  ;   it under the terms of the GNU General Public License as published by
-    11                                  ;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-    12                                  ;   Boston MA 02110-1301, USA; either version 2 of the License, or
-    13                                  ;   (at your option) any later version; incorporated herein by reference.
-    14                                  ;
-    15                                  ; -----------------------------------------------------------------------
-    16                                  
-    17                                  ;
-    18                                  ; geodspms.asm
-    19                                  ;
-    20                                  ; Display geometry translation info for diagnosing misconceptions
-    21                                  ; multi-sector variant
-    22                                  ;
-    23                                  ;      nasm -Ox -f bin -o geodsp.bin -l geodsp.lst geodsp.asm
-    24                                  ;
-    25                                  ;      nasm -Ox -f elf -o geodsp.o -l geodsp.lst geodsp.asm
-    26                                  ;      ld -m elf_i386  -T syslinux.ld -M -o geodsp.elf geodsp.o > geodsp.map
-    27                                  ;      objcopy -O binary geodsp.elf geodsp.raw
-    28                                  ;
-    29                                  ;      # OF=/dev/sdb
-    30                                  ;      # dd if=core/geodsp.bin of=$OF
-    31                                  ;      # dd skip=1 seek=1 if=../dbg/lba-img/lba-img.bin of=$OF
-    32                                  ;      # eject $OF
-    33                                  ;      # dd count=$() if=/dev/zero of=$OF
-    34                                  ;
-    35                                  ;      # OF=geo-2.255.63.i
-    36                                  ;      # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((2*255*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF
-    37                                  ;      # OF=geo-20.16.63.i
-    38                                  ;      # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((40*16*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF
-    39                                  ;
-    40                                  
-    41                                  ; Just to define it to look like SYSLINUX
-    42                                  %define IS_SYSLINUX 1
-    43                                  
-    44                                  %include "macros.inc"
-    45                              <1> ;; -----------------------------------------------------------------------
-    46                              <1> ;;
-    47                              <1> ;;   Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
-    48                              <1> ;;   Copyright 2009 Intel Corporation; author: H. Peter Anvin
-    49                              <1> ;;
-    50                              <1> ;;   This program is free software; you can redistribute it and/or modify
-    51                              <1> ;;   it under the terms of the GNU General Public License as published by
-    52                              <1> ;;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
-    53                              <1> ;;   Boston MA 02111-1307, USA; either version 2 of the License, or
-    54                              <1> ;;   (at your option) any later version; incorporated herein by reference.
-    55                              <1> ;;
-    56                              <1> ;; -----------------------------------------------------------------------
-    57                              <1> 
-    58                              <1> ;;
-    59                              <1> ;; macros.inc
-    60                              <1> ;;
-    61                              <1> ;; Convenient macros
-    62                              <1> ;;
-    63                              <1> 
-    64                              <1> %ifndef _MACROS_INC
-    65                              <1> %define _MACROS_INC
-    66                              <1> 
-    67                              <1> ;
-    68                              <1> ; Identify the module we're compiling; the "correct" should be defined
-    69                              <1> ; in the module itself to 1
-    70                              <1> ;
-    71                              <1> %ifdef IS_SYSLINUX
-    72                              <1>  %define MY_NAME 'SYSLINUX'
-    73                              <1> %else
-    74                              <1>  %define IS_SYSLINUX 0
-    75                              <1> %endif
-    76                              <1> %ifdef IS_PXELINUX
-    77                              <1>  %define MY_NAME 'PXELINUX'
-    78                              <1> %else
-    79                              <1>  %define IS_PXELINUX 0
-    80                              <1> %endif
-    81                              <1> %ifdef IS_ISOLINUX
-    82                              <1>  %define MY_NAME 'ISOLINUX'
-    83                              <1> %else
-    84                              <1>  %define IS_ISOLINUX 0
-    85                              <1> %endif
-    86                              <1> %ifdef IS_EXTLINUX
-    87                              <1>  %define MY_NAME 'EXTLINUX'
-    88                              <1> %else
-    89                              <1>  %define IS_EXTLINUX 0
-    90                              <1> %endif
-    91                              <1> 
-    92                              <1> ;
-    93                              <1> ; Macros similar to res[bwd], but which works in the code segment (after
-    94                              <1> ; section .text16) or the data segment (section .data16)
-    95                              <1> ;
-    96                              <1> %macro zb      1.nolist
-    97                              <1>        times %1 db 0
-    98                              <1> %endmacro
-    99                              <1> 
-   100                              <1> %macro zw      1.nolist
-   101                              <1>        times %1 dw 0
-   102                              <1> %endmacro
-   103                              <1> 
-   104                              <1> %macro zd      1.nolist
-   105                              <1>        times %1 dd 0
-   106                              <1> %endmacro
-   107                              <1> 
-   108                              <1> ;
-   109                              <1> ; Align with zero bytes in a progbits segment
-   110                              <1> ;
-   111                              <1> %macro alignz  1.nolist
-   112                              <1>        times (((%1) - (($-$$) % (%1))) % (%1)) db 0
-   113                              <1> %endmacro
-   114                              <1> 
-   115                              <1> ;
-   116                              <1> ; Macro to emit an unsigned decimal number as a string
-   117                              <1> ;
-   118                              <1> %macro asciidec        1.nolist
-   119                              <1>   %ifndef DEPEND       ; Not safe for "depend"
-   120                              <1>     %push asciidec
-   121                              <1>       %assign %$v %1
-   122                              <1>       %if %$v == 0
-   123                              <1>         db '0'
-   124                              <1>       %else
-   125                              <1>         %assign %$dcount 0
-   126                              <1>         %assign %$n %$v
-   127                              <1>         %assign %$d 1
-   128                              <1>         %rep 20
-   129                              <1>           %if %$n != 0
-   130                              <1>             %assign %$dcount %$dcount + 1
-   131                              <1>             %assign %$n %$n / 10
-   132                              <1>             %assign %$d %$d * 10
-   133                              <1>           %endif
-   134                              <1>         %endrep
-   135                              <1>         %rep %$dcount
-   136                              <1>          %assign %$d %$d / 10
-   137                              <1>           db ((%$v / %$d) % 10) + '0'
-   138                              <1>         %endrep
-   139                              <1>       %endif
-   140                              <1>     %pop
-   141                              <1>   %endif
-   142                              <1> %endmacro
-   143                              <1> 
-   144                              <1> ;
-   145                              <1> ; Macros for network byte order of constants
-   146                              <1> ;
-   147                              <1> %define htons(x)  ( ( ((x) & 0FFh) << 8 ) + ( ((x) & 0FF00h) >> 8 ) )
-   148                              <1> %define ntohs(x) htons(x)
-   149                              <1> %define htonl(x)  ( ( ((x) & 0FFh) << 24) + ( ((x) & 0FF00h) << 8 ) + ( ((x) & 0FF0000h) >> 8 ) + ( ((x) & 0FF000000h) >> 24) )
-   150                              <1> %define ntohl(x) htonl(x)
-   151                              <1> 
-   152                              <1> ;
-   153                              <1> ; ASCII
-   154                              <1> ;
-   155                              <1> CR             equ 13          ; Carriage Return
-   156                              <1> LF             equ 10          ; Line Feed
-   157                              <1> FF             equ 12          ; Form Feed
-   158                              <1> BS             equ  8          ; Backspace
-   159                              <1> 
-   160                              <1> %endif ; _MACROS_INC
-   161                                  ; %include "layout.inc"
-   162                                  
-   163                                  m_CHS0         equ 00534843h           ;'CHS',0
-   164                                  m_EDD0         equ 00444445h           ;'EDD',0
-   165                                  m_EDD_SP       equ 20444445h           ;'EDD '
-   166                                  retry_count    equ 16
-   167                                  dbuf           equ 8000h
-   168                                  ; int13_ret    equ 7e00h
-   169                                  LDLINUX_MAGIC  equ 0x3eb202fe          ; A random number to identify ourselves with
-   170                                  
-   171                                  Sect1Ptr0_VAL  equ 1
-   172                                  Sect1Ptr1_VAL  equ 0
-   173                                  
-   174                                  ;              global STACK_LEN, STACK_TOP, STACK_BASE
-   175                                  ; STACK_LEN    equ 4096
-   176                                  STACK_TOP      equ 7c00h
-   177                                  ; STACK_BASE   equ STACK_TOP - STACK_LEN
-   178                                                 section .init
-   179                                                 org STACK_TOP
-   180                                  geodsp_start:
-   181                                  
-   182                                  %include "diskboot.inc"
-   183                              <1> ; -----------------------------------------------------------------------
-   184                              <1> ;
-   185                              <1> ;   Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
-   186                              <1> ;   Copyright 2009-2011 Intel Corporation; author: H. Peter Anvin
-   187                              <1> ;
-   188                              <1> ;   This program is free software; you can redistribute it and/or modify
-   189                              <1> ;   it under the terms of the GNU General Public License as published by
-   190                              <1> ;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-   191                              <1> ;   Boston MA 02110-1301, USA; either version 2 of the License, or
-   192                              <1> ;   (at your option) any later version; incorporated herein by reference.
-   193                              <1> ;
-   194                              <1> ; -----------------------------------------------------------------------
-   195                              <1> 
-   196                              <1> ;
-   197                              <1> ; diskboot.inc
-   198                              <1> ;
-   199                              <1> ; Common boot sector code for harddisk-based Syslinux derivatives.
-   200                              <1> ;
-   201                              <1> ; Requires macros z[bwd], labels ldlinux_ent, ldlinux_magic, ldlinux_sys
-   202                              <1> ; and constants BS_MAGIC_VER, LDLINUX_MAGIC, retry_count, Sect1Ptr[01]_VAL,
-   203                              <1> ; STACK_TOP
-   204                              <1> ;
-   205                              <1> 
-   206                              <1>                section .init
-   207                              <1> ;
-   208                              <1> ; Some of the things that have to be saved very early are saved
-   209                              <1> ; "close" to the initial stack pointer offset, in order to
-   210                              <1> ; reduce the code size...
-   211                              <1> ;
-   212                              <1> 
-   213                              <1> StackBuf       equ STACK_TOP-44-92     ; Start the stack here (grow down - 4K)
-   214                              <1> PartInfo       equ StackBuf
-   215                              <1> .mbr           equ PartInfo
-   216                              <1> .gptlen                equ PartInfo+16
-   217                              <1> .gpt           equ PartInfo+20
-   218                              <1> FloppyTable    equ PartInfo+76
-   219                              <1> ; Total size of PartInfo + FloppyTable == 76+16 = 92 bytes
-   220                              <1> Hidden         equ StackBuf-24         ; Partition offset (qword)
-   221                              <1> OrigFDCTabPtr  equ StackBuf-16         ; Original FDC table
-   222                              <1> OrigDSSI       equ StackBuf-12         ; DS:SI -> partinfo
-   223                              <1> OrigESDI       equ StackBuf-8          ; ES:DI -> $PnP structure
-   224                              <1> DriveNumber    equ StackBuf-4          ; Drive number
-   225                              <1> StackHome      equ Hidden              ; The start of the canonical stack
-   226                              <1> 
-   227                              <1> ;
-   228                              <1> ; Primary entry point.  Tempting as though it may be, we can't put the
-   229                              <1> ; initial "cli" here; the jmp opcode in the first byte is part of the
-   230                              <1> ; "magic number" (using the term very loosely) for the DOS superblock.
-   231                              <1> ;
-   232                              <1> bootsec                equ $
-   233 00000000 EB58                <1> _start:                jmp short start         ; 2 bytes
-   234 00000002 90                  <1>                nop                     ; 1 byte
-   235                              <1> ;
-   236                              <1> ; "Superblock" follows -- it's in the boot sector, so it's already
-   237                              <1> ; loaded and ready for us
-   238                              <1> ;
-   239 00000003 5359534C494E5558    <1> bsOemName      db MY_NAME              ; The SYS command sets this, so...
-   240                              <1>                zb 8-($-bsOemName)
-   241                              <1> 
-   242                              <1> ;
-   243                              <1> ; These are the fields we actually care about.  We end up expanding them
-   244                              <1> ; all to dword size early in the code, so generate labels for both
-   245                              <1> ; the expanded and unexpanded versions.
-   246                              <1> ;
-   247                              <1> %macro         superb 1
-   248                              <1> bx %+ %1       equ SuperInfo+($-superblock)*8+4
-   249                              <1> bs %+ %1       equ $
-   250                              <1>                zb 1
-   251                              <1> %endmacro
-   252                              <1> %macro         superw 1
-   253                              <1> bx %+ %1       equ SuperInfo+($-superblock)*8
-   254                              <1> bs %+ %1       equ $
-   255                              <1>                zw 1
-   256                              <1> %endmacro
-   257                              <1> %macro         superd 1
-   258                              <1> bx %+ %1       equ $                   ; no expansion for dwords
-   259                              <1> bs %+ %1       equ $
-   260                              <1>                zd 1
-   261                              <1> %endmacro
-   262                              <1> superblock     equ $
-   263                              <1>                superw BytesPerSec
-   264                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   265                              <2> bs %+ %1 equ $
-   266 0000000B 0000                <2>  zw 1
-   267                              <1>                superb SecPerClust
-   268                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8+4
-   269                              <2> bs %+ %1 equ $
-   270 0000000D 00                  <2>  zb 1
-   271                              <1>                superw ResSectors
-   272                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   273                              <2> bs %+ %1 equ $
-   274 0000000E 0000                <2>  zw 1
-   275                              <1>                superb FATs
-   276                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8+4
-   277                              <2> bs %+ %1 equ $
-   278 00000010 00                  <2>  zb 1
-   279                              <1>                superw RootDirEnts
-   280                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   281                              <2> bs %+ %1 equ $
-   282 00000011 0000                <2>  zw 1
-   283                              <1>                superw Sectors
-   284                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   285                              <2> bs %+ %1 equ $
-   286 00000013 0000                <2>  zw 1
-   287                              <1>                superb Media
-   288                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8+4
-   289                              <2> bs %+ %1 equ $
-   290 00000015 00                  <2>  zb 1
-   291                              <1>                superw FATsecs
-   292                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   293                              <2> bs %+ %1 equ $
-   294 00000016 0000                <2>  zw 1
-   295                              <1>                superw SecPerTrack
-   296                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   297                              <2> bs %+ %1 equ $
-   298 00000018 0000                <2>  zw 1
-   299                              <1>                superw Heads
-   300                              <2> bx %+ %1 equ SuperInfo+($-superblock)*8
-   301                              <2> bs %+ %1 equ $
-   302 0000001A 0000                <2>  zw 1
-   303                              <1> superinfo_size equ ($-superblock)-1    ; How much to expand
-   304                              <1>                superd Hidden
-   305                              <2> bx %+ %1 equ $
-   306                              <2> bs %+ %1 equ $
-   307 0000001C 00000000            <2>  zd 1
-   308                              <1>                superd HugeSectors
-   309                              <2> bx %+ %1 equ $
-   310                              <2> bs %+ %1 equ $
-   311 00000020 00000000            <2>  zd 1
-   312                              <1>                ;
-   313                              <1>                ; This is as far as FAT12/16 and FAT32 are consistent
-   314                              <1>                ;
-   315                              <1>                ; FAT12/16 need 26 more bytes,
-   316                              <1>                ; FAT32 need 54 more bytes
-   317                              <1>                ;
-   318                              <1> superblock_len_fat16   equ $-superblock+26
-   319                              <1> superblock_len_fat32   equ $-superblock+54
-   320 00000024 00<rept>            <1>                zb 54                   ; Maximum needed size
-   321                              <1> superblock_max equ $-superblock
-   322                              <1> 
-   323                              <1>                global SecPerClust
-   324                              <1> SecPerClust    equ bxSecPerClust
-   325                              <1> 
-   326                              <1> ;
-   327                              <1> ; Note we don't check the constraints above now; we did that at install
-   328                              <1> ; time (we hope!)
-   329                              <1> ;
-   330                              <1> start:
-   331 0000005A FA                  <1>                cli                     ; No interrupts yet, please
-   332 0000005B FC                  <1>                cld                     ; Copy upwards
-   333                              <1> ;
-   334                              <1> ; Set up the stack
-   335                              <1> ;
-   336 0000005C 31C9                <1>                xor cx,cx
-   337 0000005E 8ED1                <1>                mov ss,cx
-   338 00000060 BC767B              <1>                mov sp,StackBuf-2       ; Just below BSS (-2 for alignment)
-   339 00000063 52                  <1>                push dx                 ; Save drive number (in DL)
-   340 00000064 06                  <1>                push es                 ; Save initial ES:DI -> $PnP pointer
-   341 00000065 57                  <1>                push di
-   342 00000066 1E                  <1>                push ds                 ; Save original DS:SI -> partinfo
-   343 00000067 56                  <1>                push si
-   344 00000068 8EC1                <1>                mov es,cx
-   345                              <1> 
-   346                              <1> ;
-   347                              <1> ; DS:SI may contain a partition table entry and possibly a GPT entry.
-   348                              <1> ; Preserve it for us.  This saves 56 bytes of the GPT entry, which is
-   349                              <1> ; currently the maximum we care about.  Total is 76 bytes.
-   350                              <1> ;
-   351 0000006A B126                <1>                mov cl,(16+4+56)/2      ; Save partition info
-   352 0000006C BF787B              <1>                mov di,PartInfo
-   353 0000006F F3A5                <1>                rep movsw               ; This puts CX back to zero
-   354                              <1> 
-   355 00000071 8ED9                <1>                mov ds,cx               ; Now we can initialize DS...
-   356                              <1> 
-   357                              <1> ;
-   358                              <1> ; Now sautee the BIOS floppy info block to that it will support decent-
-   359                              <1> ; size transfers; the floppy block is 11 bytes and is stored in the
-   360                              <1> ; INT 1Eh vector (brilliant waste of resources, eh?)
-   361                              <1> ;
-   362                              <1> ; Of course, if BIOSes had been properly programmed, we wouldn't have
-   363                              <1> ; had to waste precious space with this code.
-   364                              <1> ;
-   365 00000073 BB7800              <1>                mov bx,fdctab
-   366 00000076 0FB437              <1>                lfs si,[bx]             ; FS:SI -> original fdctab
-   367 00000079 0FA0                <1>                push fs                 ; Save on stack in case we need to bail
-   368 0000007B 56                  <1>                push si
-   369                              <1> 
-   370                              <1>                ; Save the old fdctab even if hard disk so the stack layout
-   371                              <1>                ; is the same.  The instructions above do not change the flags
-   372 0000007C 20D2                <1>                and dl,dl               ; If floppy disk (00-7F), assume no
-   373                              <1>                                        ; partition table
-   374 0000007E 781B                <1>                js harddisk
-   375                              <1> 
-   376                              <1> floppy:
-   377 00000080 31C0                <1>                xor ax,ax
-   378 00000082 B106                <1>                mov cl,6                ; 12 bytes (CX == 0)
-   379                              <1>                ; es:di -> FloppyTable already
-   380                              <1>                ; This should be safe to do now, interrupts are off...
-   381 00000084 893F                <1>                mov [bx],di             ; FloppyTable
-   382 00000086 894702              <1>                mov [bx+2],ax           ; Segment 0
-   383 00000089 F364A5              <1>                fs rep movsw            ; Faster to move words
-   384 0000008C 8A0E[1800]          <1>                mov cl,[bsSecPerTrack]  ; Patch the sector count
-   385 00000090 884DF8              <1>                mov [di-12+4],cl
-   386                              <1> 
-   387 00000093 50                  <1>                push ax                 ; Partition offset == 0
-   388 00000094 50                  <1>                push ax
-   389 00000095 50                  <1>                push ax
-   390 00000096 50                  <1>                push ax
-   391                              <1> 
-   392 00000097 CD13                <1>                int 13h                 ; Some BIOSes need this
-   393                              <1>                        ; Using xint13 costs +1B
-   394 00000099 EB62                <1>                jmp short not_harddisk
-   395                              <1> ;
-   396                              <1> ; The drive number and possibly partition information was passed to us
-   397                              <1> ; by the BIOS or previous boot loader (MBR).  Current "best practice" is to
-   398                              <1> ; trust that rather than what the superblock contains.
-   399                              <1> ;
-   400                              <1> ; Note: di points to beyond the end of PartInfo
-   401                              <1> ; Note: false negatives might slip through the handover area's sanity checks,
-   402                              <1> ;       if the region is very close (less than a paragraph) to
-   403                              <1> ;       PartInfo ; no false positives are possible though
-   404                              <1> ;
-   405                              <1> harddisk:
-   406 0000009B 8B55AA              <1>                mov dx,[di-76-10]       ; Original DS
-   407 0000009E 8B75A8              <1>                mov si,[di-76-12]       ; Original SI
-   408 000000A1 C1EE04              <1>                shr si,4
-   409 000000A4 01F2                <1>                add dx,si
-   410 000000A6 83FA4F              <1>                cmp dx,4fh              ; DS:SI < 50h:0 (BDA or IVT) ?
-   411 000000A9 7631                <1>                jbe .no_partition
-   412 000000AB 81FAB207            <1>                cmp dx,(PartInfo-75)>>4 ; DS:SI in overwritten memory?
-   413 000000AF 732B                <1>                jae .no_partition
-   414 000000B1 F645B47F            <1>                test byte [di-76],7Fh   ; Sanity check: "active flag" should
-   415 000000B5 7525                <1>                jnz .no_partition       ; be 00 or 80
-   416 000000B7 384DB8              <1>                cmp [di-76+4],cl        ; Sanity check: partition type != 0
-   417 000000BA 7420                <1>                je .no_partition
-   418 000000BC 663D21475054        <1>                cmp eax,'!GPT'          ; !GPT signature?
-   419 000000C2 7510                <1>                jne .mbr
-   420 000000C4 807DB8ED            <1>                cmp byte [di-76+4],0EDh ; Synthetic GPT partition entry?
-   421 000000C8 750A                <1>                jne .mbr
-   422                              <1> .gpt:                                  ; GPT-style partition info
-   423 000000CA 66FF75EC            <1>                push dword [di-76+20+36]
-   424 000000CE 66FF75E8            <1>                push dword [di-76+20+32]
-   425 000000D2 EB0F                <1>                jmp .gotoffs
-   426                              <1> .mbr:                                  ; MBR-style partition info
-   427 000000D4 51                  <1>                push cx                 ; Upper half partition offset == 0
-   428 000000D5 51                  <1>                push cx
-   429 000000D6 66FF75BC            <1>                push dword [di-76+8]    ; Partition offset (dword)
-   430 000000DA EB07                <1>                jmp .gotoffs
-   431                              <1> .no_partition:
-   432                              <1> ;
-   433                              <1> ; No partition table given... assume that the Hidden field in the boot sector
-   434                              <1> ; tells the truth (in particular, is zero if this is an unpartitioned disk.)
-   435                              <1> ;
-   436 000000DC 51                  <1>                push cx
-   437 000000DD 51                  <1>                push cx
-   438 000000DE 66FF36[1C00]        <1>                push dword [bsHidden]
-   439                              <1> .gotoffs:
-   440                              <1> ;
-   441                              <1> ; Get disk drive parameters (don't trust the superblock.)  Don't do this for
-   442                              <1> ; floppy drives -- INT 13:08 on floppy drives will (may?) return info about
-   443                              <1> ; what the *drive* supports, not about the *media*.  Fortunately floppy disks
-   444                              <1> ; tend to have a fixed, well-defined geometry which is stored in the superblock.
-   445                              <1> ;
-   446                              <1>                ; DL == drive # still
-   447 000000E3 B408                <1>                mov ah,08h
-   448 000000E5 E8E900              <1>                call xint13
-   449 000000E8 7213                <1>                jc no_driveparm
-   450 000000EA 20E4                <1>                and ah,ah
-   451 000000EC 750F                <1>                jnz no_driveparm
-   452 000000EE C1EA08              <1>                shr dx,8
-   453 000000F1 42                  <1>                inc dx                  ; Contains # of heads - 1
-   454 000000F2 8916[1A00]          <1>                mov [bsHeads],dx
-   455 000000F6 83E13F              <1>                and cx,3fh
-   456 000000F9 890E[1800]          <1>                mov [bsSecPerTrack],cx
-   457                              <1> no_driveparm:
-   458                              <1> not_harddisk:
-   459                              <1> ;
-   460                              <1> ; Ready to enable interrupts, captain
-   461                              <1> ;
-   462 000000FD FB                  <1>                sti
-   463                              <1> 
-   464                              <1> ;
-   465                              <1> ; Do we have EBIOS (EDD)?
-   466                              <1> ;
-   467                              <1> eddcheck:
-   468 000000FE BBAA55              <1>                mov bx,55AAh
-   469 00000101 B441                <1>                mov ah,41h              ; EDD existence query
-   470 00000103 E8CB00              <1>                call xint13
-   471 00000106 7210                <1>                jc .noedd
-   472 00000108 81FB55AA            <1>                cmp bx,0AA55h
-   473 0000010C 750A                <1>                jne .noedd
-   474 0000010E F6C101              <1>                test cl,1               ; Extended disk access functionality set
-   475 00000111 7405                <1>                jz .noedd
-   476                              <1>                ;
-   477                              <1>                ; We have EDD support...
-   478                              <1>                ;
-   479 00000113 C606[4601]00        <1>                mov byte [getonesec.jmp+1],(getonesec_ebios-(getonesec.jmp+2))
-   480                              <1> .noedd:
-   481                              <1> 
-   482                              <1> ;
-   483                              <1> ; Load the first sector of LDLINUX.SYS; this used to be all proper
-   484                              <1> ; with parsing the superblock and root directory; it doesn't fit
-   485                              <1> ; together with EBIOS support, unfortunately.
-   486                              <1> ;
-   487                              <1> Sect1Load:
-   488 00000118 66B801000000        <1>                mov eax,strict dword Sect1Ptr0_VAL      ; 0xdeadbeef
-   489                              <1> Sect1Ptr0      equ $-4
-   490 0000011E 66BA00000000        <1>                mov edx,strict dword Sect1Ptr1_VAL      ; 0xfeedface
-   491                              <1> Sect1Ptr1      equ $-4
-   492 00000124 BB[0002]            <1>                mov bx,ldlinux_sys      ; Where to load it
-   493 00000127 E80E00              <1>                call getonesec
-   494                              <1> 
-   495                              <1>                ; Some modicum of integrity checking
-   496 0000012A 66813E[0402]FF02B2- <1>                cmp dword [ldlinux_magic+4],LDLINUX_MAGIC^HEXDATE
-   497 00000132 3E                  <1>
-   498 00000133 7574                <1>                jne kaboom
-   499                              <1> 
-   500                              <1>                ; Go for it!  This also normalizes CS:IP.
-   501 00000135 E9D000              <1>                jmp ldlinux_ent
-   502                              <1> 
-   503                              <1> ;
-   504                              <1> ; getonesec: load a single disk linear sector EDX:EAX into the buffer
-   505                              <1> ;           at ES:BX.
-   506                              <1> ;
-   507                              <1> ;            This routine assumes CS == DS == SS, and trashes most registers.
-   508                              <1> ;
-   509                              <1> ; Stylistic note: use "xchg" instead of "mov" when the source is a register
-   510                              <1> ; that is dead from that point; this saves space.  However, please keep
-   511                              <1> ; the order to dst,src to keep things sane.
-   512                              <1> ;
-   513                              <1> getonesec:
-   514 00000138 660306607B          <1>                add eax,[Hidden]                ; Add partition offset
-   515 0000013D 661316647B          <1>                adc edx,[Hidden+4]
-   516 00000142 B91000              <1>                mov cx,retry_count
-   517 00000145 EB2B                <1> .jmp:          jmp strict short getonesec_cbios
-   518                              <1> 
-   519                              <1> ;
-   520                              <1> ; getonesec_ebios:
-   521                              <1> ;
-   522                              <1> ; getonesec implementation for EBIOS (EDD)
-   523                              <1> ;
-   524                              <1> getonesec_ebios:
-   525                              <1> .retry:
-   526                              <1>                ; Form DAPA on stack
-   527 00000147 6652                <1>                push edx
-   528 00000149 6650                <1>                push eax
-   529 0000014B 06                  <1>                push es
-   530 0000014C 53                  <1>                push bx
-   531 0000014D 6A01                <1>                push word 1
-   532 0000014F 6A10                <1>                push word 16
-   533 00000151 89E6                <1>                mov si,sp
-   534 00000153 6660                <1>                pushad
-   535 00000155 B442                <1>                 mov ah,42h                      ; Extended Read
-   536 00000157 E87700              <1>                call xint13
-   537 0000015A 6661                <1>                popad
-   538 0000015C 8D6410              <1>                lea sp,[si+16]                  ; Remove DAPA
-   539 0000015F 7201                <1>                jc .error
-   540 00000161 C3                  <1>                 ret
-   541                              <1> 
-   542                              <1> .error:
-   543                              <1>                ; Some systems seem to get "stuck" in an error state when
-   544                              <1>                ; using EBIOS.  Doesn't happen when using CBIOS, which is
-   545                              <1>                ; good, since some other systems get timeout failures
-   546                              <1>                ; waiting for the floppy disk to spin up.
-   547                              <1> 
-   548 00000162 6660                <1>                pushad                          ; Try resetting the device
-   549 00000164 31C0                <1>                xor ax,ax
-   550 00000166 E86800              <1>                call xint13
-   551 00000169 6661                <1>                popad
-   552 0000016B E2DA                <1>                loop .retry                     ; CX-- and jump if not zero
-   553                              <1> 
-   554                              <1>                ; Total failure.  Try falling back to CBIOS.
-   555 0000016D C606[4601]2B        <1>                mov byte [getonesec.jmp+1],(getonesec_cbios-(getonesec.jmp+2))
-   556                              <1> 
-   557                              <1> ;
-   558                              <1> ; getonesec_cbios:
-   559                              <1> ;
-   560                              <1> ; getlinsec implementation for legacy CBIOS
-   561                              <1> ;
-   562                              <1> getonesec_cbios:
-   563                              <1> .retry:
-   564 00000172 6660                <1>                pushad
-   565                              <1> 
-   566 00000174 660FB736[1800]      <1>                movzx esi,word [bsSecPerTrack]
-   567 0000017A 660FB73E[1A00]      <1>                movzx edi,word [bsHeads]
-   568                              <1>                ;
-   569                              <1>                ; Dividing by sectors to get (track,sector): we may have
-   570                              <1>                ; up to 2^18 tracks, so we need to use 32-bit arithmetric.
-   571                              <1>                ;
-   572 00000180 66F7F6              <1>                div esi
-   573 00000183 31C9                <1>                xor cx,cx
-   574 00000185 87CA                <1>                xchg cx,dx              ; CX <- sector index (0-based)
-   575                              <1>                                        ; EDX <- 0
-   576                              <1>                ; eax = track #
-   577 00000187 66F7F7              <1>                div edi                 ; Convert track to head/cyl
-   578                              <1> 
-   579 0000018A 663DFF030000        <1>                cmp eax,1023            ; Outside the CHS range?
-   580 00000190 7717                <1>                ja kaboom
-   581                              <1> 
-   582                              <1>                ;
-   583                              <1>                ; Now we have AX = cyl, DX = head, CX = sector (0-based),
-   584                              <1>                ; SI = bsSecPerTrack, ES:BX = data target
-   585                              <1>                ;
-   586 00000192 C0E406              <1>                shl ah,6                ; Because IBM was STOOPID
-   587                              <1>                                        ; and thought 8 bits were enough
-   588                              <1>                                        ; then thought 10 bits were enough...
-   589 00000195 41                  <1>                inc cx                  ; Sector numbers are 1-based, sigh
-   590 00000196 08E1                <1>                or cl,ah
-   591 00000198 88C5                <1>                mov ch,al
-   592 0000019A 88D6                <1>                mov dh,dl
-   593 0000019C B80102              <1>                mov ax,0201h            ; Read one sector
-   594 0000019F E82F00              <1>                call xint13
-   595 000001A2 6661                <1>                popad
-   596 000001A4 7201                <1>                jc .error
-   597 000001A6 C3                  <1>                ret
-   598                              <1> 
-   599                              <1> .error:
-   600 000001A7 E2C9                <1>                loop .retry
-   601                              <1>                ; Fall through to disk_error
-   602                              <1> 
-   603                              <1> ;
-   604                              <1> ; kaboom: write a message and bail out.
-   605                              <1> ;
-   606                              <1>                global kaboom
-   607                              <1> disk_error:
-   608                              <1> kaboom:
-   609 000001A9 31F6                <1>                xor si,si
-   610 000001AB 8ED6                <1>                mov ss,si
-   611 000001AD BC687B              <1>                mov sp,OrigFDCTabPtr    ; Reset stack
-   612 000001B0 8EDE                <1>                mov ds,si               ; Reset data segment
-   613 000001B2 668F067800          <1>                pop dword [fdctab]      ; Restore FDC table
-   614                              <1> .patch:                                        ; When we have full code, intercept here
-   615 000001B7 BE[DA01]            <1>                mov si,bailmsg
-   616 000001BA AC                  <1> .loop:         lodsb
-   617 000001BB 20C0                <1>                and al,al
-   618 000001BD 7409                <1>                 jz .done
-   619 000001BF B40E                <1>                mov ah,0Eh              ; Write to screen as TTY
-   620 000001C1 BB0700              <1>                mov bx,0007h            ; Attribute
-   621 000001C4 CD10                <1>                int 10h
-   622 000001C6 EBF2                <1>                jmp short .loop
-   623                              <1> 
-   624                              <1> .done:
-   625 000001C8 31C0                <1>                xor ax,ax
-   626 000001CA CD16                <1> .again:                int 16h                 ; Wait for keypress
-   627                              <1>                                        ; NB: replaced by int 18h if
-   628                              <1>                                        ; chosen at install time..
-   629 000001CC CD19                <1>                int 19h                 ; And try once more to boot...
-   630 000001CE F4                  <1> .norge:                hlt                     ; If int 19h returned; this is the end
-   631 000001CF EBFD                <1>                jmp short .norge
-   632                              <1> 
-   633                              <1> ;
-   634                              <1> ; INT 13h wrapper function
-   635                              <1> ;
-   636                              <1> xint13:
-   637 000001D1 8A16747B            <1>                mov dl,[DriveNumber]
-   638 000001D5 06                  <1>                push es         ; ES destroyed by INT 13h AH 08h
-   639 000001D6 CD13                <1>                int 13h
-   640 000001D8 07                  <1>                pop es
-   641 000001D9 C3                  <1>                ret
-   642                              <1> 
-   643                              <1> ;
-   644                              <1> ; Error message on failure
-   645                              <1> ;
-   646 000001DA 426F6F74206572726F- <1> bailmsg:       db 'Boot error', 0Dh, 0Ah, 0
-   647 000001E3 720D0A00            <1>
-   648                              <1> 
-   649                              <1>                ; This fails if the boot sector overflowsg
-   650 000001E7 00<rept>            <1>                zb 1F8h-($-$$)
-   651                              <1> 
-   652 000001F8 FE02B23E            <1> bs_magic       dd LDLINUX_MAGIC
-   653 000001FC 1837                <1> bs_link                dw (Sect1Load - bootsec) | BS_MAGIC_VER
-   654 000001FE 55AA                <1> bootsignature  dw 0xAA55
-   655                              <1> 
-   656                              <1> ;
-   657                              <1> ; ===========================================================================
-   658                              <1> ;  End of boot sector
-   659                              <1> ; ===========================================================================
-   660                                  
-   661                                  HEXDATE                equ 1
-   662                                  
-   663                                                 section .init
-   664                                  sector_1:
-   665                                  ldlinux_sys:
-   666                                                 alignz 8
-   667 00000200 FE02B23E                ldlinux_magic  dd LDLINUX_MAGIC
-   668 00000204 FF02B23E                               dd LDLINUX_MAGIC^HEXDATE
-   669                                  
-   670                                  
-   671                                  ldlinux_ent:
-   672                                  
-   673                                  get_geo:               ; DL and ES ready
-   674 00000208 B408                                   mov ah,08h
-   675 0000020A BF0000                                 mov di,0
-   676 0000020D E8C1FF                                 call xint13
-   677                                  write_geo:
-   678 00000210 720E                                   jc .bad_geo
-   679 00000212 BE[4F03]                               mov si,s_chs
-   680 00000215 E84A01                                 call writestr_early
-   681 00000218 E89D00                                 call write_chs
-   682 0000021B E8DC00                                 call crlf
-   683 0000021E EB00                                   jmp short .done
-   684                                  .bad_geo:
-   685                                  .done:
-   686                                  
-   687 00000220 BB0080                                 mov bx,dbuf
-   688                                  get_h1c:               ; 0,1,1
-   689 00000223 B90100                                 mov cx,0001h
-   690 00000226 B601                                   mov dh,01h
-   691 00000228 E86000                                 call getonesec_chs
-   692 0000022B E86D00                                 call write_chs_lba
-   693                                  get_c1c:               ; 1,0,1
-   694 0000022E B90101                                 mov cx,0101h
-   695 00000231 B600                                   mov dh,00h
-   696 00000233 E85500                                 call getonesec_chs
-   697 00000236 E86200                                 call write_chs_lba
-   698                                  
-   699                                  
-   700                                  
-   701                                  ; Do we have EBIOS (EDD)?
-   702                                  ;
-   703                                  edd:
-   704                                  .check:
-   705 00000239 BBAA55                                 mov bx,55AAh
-   706 0000023C B441                                   mov ah,41h              ; EDD existence query
-   707 0000023E E890FF                                 call xint13
-   708 00000241 723F                                   jc .noedd
-   709 00000243 81FB55AA                               cmp bx,0AA55h
-   710 00000247 7539                                   jne .noedd
-   711 00000249 F6C101                                 test cl,1               ; Extended disk access functionality set
-   712 0000024C 7434                                   jz .noedd
-   713                                                 ;
-   714                                                 ; We have EDD support...
-   715                                                 ;
-   716 0000024E BB0080                                 mov bx,dbuf     ; ES should still be safe.
-   717 00000251 6631D2                                 xor edx,edx
-   718 00000254 66C706[4F03]454444-                    mov dword [s_chs],m_EDD_SP
-   719 0000025C 20                 
-   720                                  .get_lba63:
-   721 0000025D 66B83F000000                           mov eax,63      ; Same length as mov al,64; movzx eax,al
-   722 00000263 E8E1FE                                 call getonesec_ebios
-   723 00000266 721A                                   jc .bad_edd     ;read error
-   724 00000268 E87200                                 call write_edd_lba
-   725                                  .get_lba16065:
-   726 0000026B 66B8C13E0000                           mov eax,16065
-   727 00000271 E8D3FE                                 call getonesec_ebios
-   728 00000274 720C                                   jc .bad_edd     ;read error
-   729 00000276 E86400                                 call write_edd_lba
-   730                                  .good_edd:
-   731 00000279 66C706[5603]454444-                    mov dword [s_type],m_EDD0
-   732 00000281 00                 
-   733                                  .bad_edd:
-   734                                  .noedd:
-   735                                  .end:
-   736                                  
-   737                                  write_final_type:
-   738 00000282 BE[5403]                               mov si,s_typespec
-   739 00000285 E8DA00                                 call writestr_early
-   740 00000288 E91EFF                                 jmp kaboom
-   741                                  
-   742                                  ;
-   743                                  ; getonesec_chs:
-   744                                  ;
-   745                                  ; CX,DH specifies CHS address
-   746                                  ;
-   747                                  getonesec_chs: ; We could use an xchg and get a loop
-   748                                  ;              mov cx,retry_count
-   749                                  .retry:
-   750 0000028B 6660                                   pushad
-   751 0000028D B80102                                 mov ax,0201h            ; Read one sector
-   752 00000290 E83EFF                                 call xint13
-   753 00000293 6661                                   popad
-   754 00000295 7201                                   jc .error
-   755 00000297 C3                                     ret
-   756                                  
-   757                                  .error:
-   758                                  ;              loop .retry
-   759                                                 ; Fall through to disk_error
-   760 00000298 E90EFF                                 jmp disk_error
-   761                                  
-   762                                  %include "geodsplib.inc"
-   763                              <1> ; -----------------------------------------------------------------------
-   764                              <1> ;
-   765                              <1> ;   Copyright 2010 Gene Cumm
-   766                              <1> ;
-   767                              <1> ;   Portions from diskstart.inc:
-   768                              <1> ;   Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
-   769                              <1> ;   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
-   770                              <1> ;
-   771                              <1> ;   This program is free software; you can redistribute it and/or modify
-   772                              <1> ;   it under the terms of the GNU General Public License as published by
-   773                              <1> ;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-   774                              <1> ;   Boston MA 02110-1301, USA; either version 2 of the License, or
-   775                              <1> ;   (at your option) any later version; incorporated herein by reference.
-   776                              <1> ;
-   777                              <1> ; -----------------------------------------------------------------------
-   778                              <1> 
-   779                              <1> ;
-   780                              <1> ; geodsplib.inc
-   781                              <1> ;
-   782                              <1> ; Library file for geodsp*.asm
-   783                              <1> ;
-   784                              <1> 
-   785                              <1>                ; ES:BX points to the buffer with address
-   786                              <1>                ; DX,CX as they should be for INT13h,AH=02
-   787                              <1>                ; For now assume C<256
-   788                              <1> write_chs_lba:
-   789 0000029B 6660                <1>                pushad
-   790 0000029D BE[4E03]            <1>                mov si,s_atchs
-   791 000002A0 E8BF00              <1>                call writestr_early
-   792 000002A3 E81200              <1>                call write_chs
-   793 000002A6 B03A                <1>                mov al,':'
-   794 000002A8 E85800              <1>                call writechr
-   795 000002AB 26668B07            <1>                mov eax,[es:bx]
-   796 000002AF E87700              <1>                call writehex8
-   797 000002B2 E84500              <1>                call crlf
-   798 000002B5 6661                <1>                popad
-   799 000002B7 C3                  <1>                ret
-   800                              <1> 
-   801                              <1>                ; DX,CX as they should be for INT13h,AH=02
-   802                              <1>                ; For now assume C<256
-   803                              <1> write_chs:
-   804 000002B8 6660                <1>                pushad
-   805 000002BA 88E8                <1>                mov al,ch
-   806 000002BC 88CC                <1>                mov ah,cl
-   807 000002BE C0EC06              <1>                shr ah,6
-   808 000002C1 E85800              <1>                call writehex4
-   809 000002C4 B02C                <1>                mov al,','
-   810 000002C6 E83A00              <1>                call writechr
-   811 000002C9 88F0                <1>                mov al,dh
-   812 000002CB E84100              <1>                call writehex2
-   813 000002CE B02C                <1>                mov al,','
-   814 000002D0 E83000              <1>                call writechr
-   815 000002D3 88C8                <1>                mov al,cl
-   816 000002D5 243F                <1>                and al,3Fh
-   817 000002D7 E83500              <1>                call writehex2
-   818 000002DA 6661                <1>                popad
-   819 000002DC C3                  <1>                ret
-   820                              <1> 
-   821                              <1> write_edd_lba:
-   822 000002DD 6660                <1>                pushad
-   823 000002DF BE[4E03]            <1>                mov si,s_atchs
-   824 000002E2 E87D00              <1>                call writestr_early
-   825 000002E5 E84100              <1>                call writehex8
-   826 000002E8 B03A                <1>                mov al,':'
-   827 000002EA E81600              <1>                call writechr
-   828 000002ED 26668B07            <1>                mov eax,[es:bx]
-   829 000002F1 E83500              <1>                call writehex8
-   830 000002F4 E80300              <1>                call crlf
-   831 000002F7 6661                <1>                popad
-   832 000002F9 C3                  <1>                ret
-   833                              <1> 
-   834                              <1> 
-   835                              <1> crlf:
-   836 000002FA 56                  <1>                push si
-   837 000002FB BE[5F03]            <1>                mov si,s_crlf
-   838 000002FE E86100              <1>                call writestr_early
-   839 00000301 5E                  <1>                pop si
-   840 00000302 C3                  <1>                ret
-   841                              <1> 
-   842                              <1> writechr:
-   843                              <1> writechr_early:
-   844 00000303 6660                <1>                pushad
-   845 00000305 B40E                <1>                mov ah,0Eh              ; Write to screen as TTY
-   846 00000307 BB0700              <1>                mov bx,0007h            ; Attribute
-   847 0000030A CD10                <1>                int 10h
-   848 0000030C 6661                <1>                popad
-   849 0000030E C3                  <1>                ret
-   850                              <1> 
-   851                              <1> %include "writehex.inc"
-   852                              <2> ;; -----------------------------------------------------------------------
-   853                              <2> ;;
-   854                              <2> ;;   Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
-   855                              <2> ;;
-   856                              <2> ;;   This program is free software; you can redistribute it and/or modify
-   857                              <2> ;;   it under the terms of the GNU General Public License as published by
-   858                              <2> ;;   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
-   859                              <2> ;;   Boston MA 02111-1307, USA; either version 2 of the License, or
-   860                              <2> ;;   (at your option) any later version; incorporated herein by reference.
-   861                              <2> ;;
-   862                              <2> ;; -----------------------------------------------------------------------
-   863                              <2> 
-   864                              <2> ;;
-   865                              <2> ;; writehex.inc
-   866                              <2> ;;
-   867                              <2> ;; Write hexadecimal numbers to the console
-   868                              <2> ;;
-   869                              <2> 
-   870                              <2> ;
-   871                              <2> ; writehex[248]: Write a hex number in (AL, AX, EAX) to the console
-   872                              <2> ;
-   873                              <2> writehex2:
-   874 0000030F 669C                <2>                pushfd
-   875 00000311 6660                <2>                pushad
-   876 00000313 66C1C018            <2>                rol eax,24
-   877 00000317 B90200              <2>                mov cx,2
-   878 0000031A EB14                <2>                jmp short writehex_common
-   879                              <2> writehex4:
-   880 0000031C 669C                <2>                pushfd
-   881 0000031E 6660                <2>                pushad
-   882 00000320 66C1C010            <2>                rol eax,16
-   883 00000324 B90400              <2>                mov cx,4
-   884 00000327 EB07                <2>                jmp short writehex_common
-   885                              <2> writehex8:
-   886 00000329 669C                <2>                pushfd
-   887 0000032B 6660                <2>                pushad
-   888 0000032D B90800              <2>                mov cx,8
-   889                              <2> writehex_common:
-   890 00000330 66C1C004            <2> .loop:         rol eax,4
-   891 00000334 6650                <2>                push eax
-   892 00000336 240F                <2>                and al,0Fh
-   893 00000338 3C0A                <2>                cmp al,10
-   894 0000033A 7304                <2>                jae .high
-   895 0000033C 0430                <2> .low:          add al,'0'
-   896 0000033E EB02                <2>                jmp short .ischar
-   897 00000340 0437                <2> .high:         add al,'A'-10
-   898 00000342 E8BEFF              <2> .ischar:       call writechr
-   899 00000345 6658                <2>                pop eax
-   900 00000347 E2E7                <2>                loop .loop
-   901 00000349 6661                <2>                popad
-   902 0000034B 669D                <2>                popfd
-   903 0000034D C3                  <2>                ret
-   904                              <1> 
-   905 0000034E 40                  <1> s_atchs:       db '@'
-   906 0000034F 434853              <1> s_chs:         db 'CHS'
-   907 00000352 2000                <1> s_space:       db ' ', 0
-   908 00000354 443D                <1> s_typespec:    db 'D='
-   909 00000356 43485300            <1> s_type:                db 'CHS', 0
-   910 0000035A 0D0A656E64          <1> s_end:         db 0Dh, 0Ah, 'end'
-   911 0000035F 0D0A00              <1> s_crlf:                db 0Dh, 0Ah, 0
-   912                              <1> 
-   913                              <1> ; This indicates the general format of the last few bytes in the boot sector
-   914                              <1> BS_MAGIC_VER   equ 0x1b << 9
-   915                                  
-   916                                  ;
-   917                                  ;
-   918                                  ; writestr_early: write a null-terminated string to the console
-   919                                  ;          This assumes we're on page 0.  This is only used for early
-   920                                  ;           messages, so it should be OK.
-   921                                  ;
-   922                                  writestr_early:
-   923 00000362 6660                                   pushad
-   924 00000364 AC                      .loop:         lodsb
-   925 00000365 20C0                                   and al,al
-   926 00000367 7409                                    jz .return
-   927 00000369 B40E                                   mov ah,0Eh              ; Write to screen as TTY
-   928 0000036B BB0700                                 mov bx,0007h            ; Attribute
-   929 0000036E CD10                                   int 10h
-   930 00000370 EBF2                                   jmp short .loop
-   931 00000372 6661                    .return:       popad
-   932 00000374 C3                                     ret
-   933                                  
-   934 00000375 00000000<rept>          SuperInfo:     zd 32                   ; The first 16 bytes expanded 8 times
-   935                                  
-   936                                                 ; This fails if the sector overflowsg
-   937 000003F5 00<rept>                               zb 400h-($-$$)
-   938                                  end:
-   939                                  
-   940                                                 absolute 4*1Eh
-   941                                  fdctab         equ $
-   942 00000078 <res 00000002>          fdctab1                resw 1
-   943 0000007A <res 00000002>          fdctab2                resw 1
diff --git a/diag/geodsp/mk-lba-img b/diag/geodsp/mk-lba-img
deleted file mode 100755 (executable)
index 8d7864c..0000000
Binary files a/diag/geodsp/mk-lba-img and /dev/null differ
index 795de1a..eb1c339 100644 (file)
 
 #define NUM_SECT (256*63+1)
 #define BPS (512)
-#define SECT_INT (512 / sizeof(int))
+#define SECT_INT (BPS / sizeof(unsigned int))
 
 typedef unsigned char uint8_t;
 typedef unsigned int uint32_t;
 
-const char DEF_FN[] = "lba.img";
+const char DEF_FN[] = "-";
 
 int main(int argc, char *argv[])
 {
-       int i, j, b[SECT_INT], rv = 0, one = 0;
+       int i, rv = 0, one = 0;
+       unsigned int lba, b[SECT_INT];
+       int len;
        FILE *f;
        uint8_t tt = 0;
        const char *fn;
@@ -53,23 +55,40 @@ int main(int argc, char *argv[])
                fn = DEF_FN;
        }
 
-       f = fopen(fn, "w");
+       if (!strcmp(fn, "-"))
+               f = stdout;
+       else
+               f = fopen(fn, "w");
 
-       if (f) {
-               for (i = 0; i < NUM_SECT; i++) {
-                       if (one) {
-                               b[0] = i;
-                       } else {
-                               for (j = 0; j < (512 / sizeof(int)); j++) {
-                                       b[j] = i;
-                               }
-                       }
-                       fwrite(b, 512, 1, f);
+       if (!f) {
+               fprintf(stderr, "%s: %s: unable to open for writing: %s\n",
+                       argv[0], fn, strerror(errno));
+               return 1;
+       }
+
+       lba = 0;
+       while ((len = fread(b, 1, BPS, stdin))) {
+               if (len < BPS)
+                       memset((char *)b + len, 0, BPS - len);
+               fwrite(b, 1, BPS, f);
+               lba++;
+       }
+
+       memset(b, 0, sizeof b);
+
+       while (lba < NUM_SECT) {
+               if (one) {
+                       b[0] = lba;
+               } else {
+                       for (i = 0; i < SECT_INT; i++)
+                               b[i] = lba;
                }
-               fclose(f);
-       } else {
-               puts("Unable to open for writing");
-               rv = 1;
+               fwrite(b, 1, BPS, f);
+               lba++;
        }
+
+       if (f != stdout)
+               fclose(f);
+
        return rv;
 }
index a94253a..79ff9f0 100644 (file)
@@ -17,7 +17,8 @@
 
 topdir = ../..
 mbrdir = $(topdir)/mbr
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 
 all:   handoff.bin
 
index eca2a97..807c631 100644 (file)
@@ -100,34 +100,3 @@ The ISO 9660 filesystem is encapsulated in a partition (which starts
 at offset zero, which may confuse some systems.)  This makes it
 possible for the operating system, once booted, to use the remainder
 of the device for persistent storage by creating a second partition.
-
-
-      ++++ BOOTING DOS (OR OTHER SIMILAR OPERATING SYSTEMS) ++++
-
-WARNING: This feature depends on BIOS functionality which is
-apparently broken in a very large number of BIOSes.  Therefore, this
-may not work on any particular system.  No workaround is possible; if
-you find that it doesn't work please complain to your vendor and
-indicate that "BIOS INT 13h AX=4C00h fails."
-
-To boot DOS, or other real-mode operating systems (protected-mode
-operating systems may or may not work correctly), using ISOLINUX, you
-need to prepare a disk image (usually a floppy image, but a hard disk
-image can be used on *most* systems) with the relevant operating
-system.  This file should be included on the CD-ROM in the /isolinux
-directory, and have a .img extension.  The ".img" extension does not
-have to be specified on the command line, but has to be explicitly
-specified if used in a "kernel" statement in isolinux.cfg.
-
-For a floppy image, the size of the image should be exactly one of the
-following:
-
-       1,228,800 bytes         - For a 1200K floppy image
-       1,474,560 bytes         - For a 1440K floppy image
-       2,949,120 bytes         - For a 2880K floppy image
-
-Any other size is assumed to be a hard disk image.  In order to work
-on as many systems as possible, a hard disk image should have exactly
-one partition, marked active, that covers the entire size of the disk
-image file.  Even so, hard disk images are not supported on all
-BIOSes.
diff --git a/doc/logo/syslinux-100.png b/doc/logo/syslinux-100.png
new file mode 100644 (file)
index 0000000..647635a
Binary files /dev/null and b/doc/logo/syslinux-100.png differ
index 2667de8..5e5fc63 100644 (file)
@@ -15,7 +15,8 @@
 ##
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 
 CFLAGS += -D__MSDOS__
 # CFLAGS  += -DDEBUG
index fdf09bd..49f62ef 100755 (executable)
Binary files a/dos/syslinux.com and b/dos/syslinux.com differ
index fc10ff9..5746e86 100644 (file)
@@ -2,7 +2,8 @@
 # OpenWatcom compile and link utility
 #
 topdir = ..
-include $(topdir)/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/syslinux.mk
 
 WCL    = wcl
 WCLOPT = -6 -osx -mt -bt=DOS -l=COM
index 83cf1a5..12213d8 100644 (file)
 ##
 
 topdir = ..
-include $(topdir)/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/syslinux.mk
 
 OPTFLAGS = -g -Os
 INCLUDES = -I. -I.. -I../libinstaller
 CFLAGS  = $(GCCWARN) -Wno-sign-compare -D_FILE_OFFSET_BITS=64 \
           $(OPTFLAGS) $(INCLUDES)
-LDFLAGS         = # -s
+LDFLAGS         = 
 
 SRCS     = main.c \
           ../libinstaller/syslxmod.c \
@@ -53,6 +54,9 @@ installer: extlinux
 extlinux: $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $^
 
+strip:
+       $(STRIP) extlinux
+
 %.o: %.c
        $(CC) $(UMAKEDEPS) $(CFLAGS) -c -o $@ $<
 %.i: %.c
index 39a861a..be0c24e 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef _BTRFS_H_
 #define _BTRFS_H_
 
+#include <asm/types.h>
+#include <linux/ioctl.h>
+
 #define BTRFS_SUPER_MAGIC 0x9123683E
 #define BTRFS_SUPER_INFO_OFFSET (64 * 1024)
 #define BTRFS_SUPER_INFO_SIZE 4096
@@ -8,6 +11,40 @@
 #define BTRFS_CSUM_SIZE 32
 #define BTRFS_FSID_SIZE 16
 
+typedef __u64 u64;
+typedef __u32 u32;
+typedef __u16 u16;
+typedef __u8 u8;
+typedef u64 __le64;
+typedef u16 __le16;
+
+#define BTRFS_ROOT_BACKREF_KEY  144
+#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
+#define BTRFS_DIR_ITEM_KEY      84
+
+/*
+ *  * this is used for both forward and backward root refs
+ *   */
+struct btrfs_root_ref {
+        __le64 dirid;
+        __le64 sequence;
+        __le16 name_len;
+} __attribute__ ((__packed__));
+
+struct btrfs_disk_key {
+        __le64 objectid;
+        u8 type;
+        __le64 offset;
+} __attribute__ ((__packed__));
+
+struct btrfs_dir_item {
+        struct btrfs_disk_key location;
+        __le64 transid;
+        __le16 data_len;
+        __le16 name_len;
+        u8 type;
+} __attribute__ ((__packed__));
+
 struct btrfs_super_block {
        unsigned char csum[BTRFS_CSUM_SIZE];
        /* the first 3 fields must match struct btrfs_header */
@@ -19,4 +56,72 @@ struct btrfs_super_block {
        u64 magic;
 } __attribute__ ((__packed__));
 
+
+#define BTRFS_IOCTL_MAGIC 0x94
+#define BTRFS_VOL_NAME_MAX 255
+#define BTRFS_PATH_NAME_MAX 4087
+
+struct btrfs_ioctl_vol_args {
+       __s64 fd;
+       char name[BTRFS_PATH_NAME_MAX + 1];
+};
+
+struct btrfs_ioctl_search_key {
+       /* which root are we searching.  0 is the tree of tree roots */
+       __u64 tree_id;
+
+       /* keys returned will be >= min and <= max */
+       __u64 min_objectid;
+       __u64 max_objectid;
+
+       /* keys returned will be >= min and <= max */
+       __u64 min_offset;
+       __u64 max_offset;
+
+       /* max and min transids to search for */
+       __u64 min_transid;
+       __u64 max_transid;
+
+       /* keys returned will be >= min and <= max */
+       __u32 min_type;
+       __u32 max_type;
+
+       /*
+        * how many items did userland ask for, and how many are we
+        * returning
+        */
+       __u32 nr_items;
+
+       /* align to 64 bits */
+       __u32 unused;
+
+       /* some extra for later */
+       __u64 unused1;
+       __u64 unused2;
+       __u64 unused3;
+       __u64 unused4;
+};
+
+struct btrfs_ioctl_search_header {
+       __u64 transid;
+       __u64 objectid;
+       __u64 offset;
+       __u32 type;
+       __u32 len;
+} __attribute__((may_alias));
+
+#define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key))
+/*
+ * the buf is an array of search headers where
+ * each header is followed by the actual item
+ * the type field is expanded to 32 bits for alignment
+ */
+struct btrfs_ioctl_search_args {
+       struct btrfs_ioctl_search_key key;
+       char buf[BTRFS_SEARCH_ARGS_BUFSIZE];
+};
+
+#define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \
+                                   struct btrfs_ioctl_search_args)
+
 #endif
index 9e07d16..dbbb8fd 100755 (executable)
Binary files a/extlinux/extlinux and b/extlinux/extlinux differ
index e5212a9..e574051 100755 (executable)
 #define  _GNU_SOURCE           /* Enable everything */
 #include <inttypes.h>
 /* This is needed to deal with the kernel headers imported into glibc 3.3.3. */
-typedef uint64_t u64;
 #include <alloca.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <dirent.h>
 #ifndef __KLIBC__
 #include <mntent.h>
 #endif
@@ -65,7 +65,6 @@ typedef uint64_t u64;
    boot image, the boot sector is from 0~512, the boot image starts after */
 #define BTRFS_BOOTSECT_AREA    65536
 #define BTRFS_EXTLINUX_OFFSET  SECTOR_SIZE
-#define BTRFS_SUBVOL_OPT "subvol="
 #define BTRFS_SUBVOL_MAX 256   /* By btrfs specification */
 static char subvol[BTRFS_SUBVOL_MAX];
 
@@ -112,7 +111,7 @@ static int sysfs_get_offset(int devfd, unsigned long *start)
 
     if ((size_t)snprintf(sysfs_name, sizeof sysfs_name,
                         "/sys/dev/block/%u:%u/start",
-                        major(st.st_dev), minor(st.st_dev))
+                        major(st.st_rdev), minor(st.st_rdev))
        >= sizeof sysfs_name)
        return -1;
 
@@ -153,7 +152,7 @@ int get_geometry(int devfd, uint64_t totalbytes, struct hd_geometry *geo)
 
     memset(geo, 0, sizeof *geo);
 
-    if (!ioctl(devfd, HDIO_GETGEO, &geo)) {
+    if (!ioctl(devfd, HDIO_GETGEO, geo)) {
        goto ok;
     } else if (!ioctl(devfd, FDGETPRM, &fd_str)) {
        geo->heads = fd_str.head;
@@ -347,9 +346,7 @@ int install_bootblock(int fd, const char *device)
                perror("reading fat superblock");
                return 1;
        }
-       if (sb3.bsResSectors && sb3.bsFATs &&
-           (strstr(sb3.bs16.FileSysType, "FAT") ||
-            strstr(sb3.bs32.FileSysType, "FAT")))
+       if (fat_check_sb_fields(&sb3))
                ok = true;
     }
     if (!ok) {
@@ -494,6 +491,267 @@ int btrfs_install_file(const char *path, int devfd, struct stat *rst)
     return 0;
 }
 
+/*
+ *  * test if path is a subvolume:
+ *   * this function return
+ *    * 0-> path exists but it is not a subvolume
+ *     * 1-> path exists and it is  a subvolume
+ *      * -1 -> path is unaccessible
+ *       */
+static int test_issubvolume(char *path)
+{
+
+        struct stat     st;
+        int             res;
+
+        res = stat(path, &st);
+        if(res < 0 )
+                return -1;
+
+        return (st.st_ino == 256) && S_ISDIR(st.st_mode);
+
+}
+
+/*
+ * Get file handle for a file or dir
+ */
+static int open_file_or_dir(const char *fname)
+{
+        int ret;
+        struct stat st;
+        DIR *dirstream;
+        int fd;
+
+        ret = stat(fname, &st);
+        if (ret < 0) {
+                return -1;
+        }
+        if (S_ISDIR(st.st_mode)) {
+                dirstream = opendir(fname);
+                if (!dirstream) {
+                        return -2;
+                }
+                fd = dirfd(dirstream);
+        } else {
+                fd = open(fname, O_RDWR);
+        }
+        if (fd < 0) {
+                return -3;
+        }
+        return fd;
+}
+
+/*
+ * Get the default subvolume of a btrfs filesystem
+ *   rootdir: btrfs root dir
+ *   subvol:  this function will save the default subvolume name here
+ */
+static char * get_default_subvol(char * rootdir, char * subvol)
+{
+    struct btrfs_ioctl_search_args args;
+    struct btrfs_ioctl_search_key *sk = &args.key;
+    struct btrfs_ioctl_search_header *sh;
+    int ret, i;
+    int fd;
+    struct btrfs_root_ref *ref;
+    struct btrfs_dir_item *dir_item;
+    unsigned long off = 0;
+    int name_len;
+    char *name;
+    char dirname[4096];
+    u64 defaultsubvolid = 0;
+
+    ret = test_issubvolume(rootdir);
+    if (ret == 1) {
+        fd = open_file_or_dir(rootdir);
+        if (fd < 0) {
+            fprintf(stderr, "ERROR: failed to open %s\n", rootdir);
+        }
+        ret = fd;
+    }
+    if (ret <= 0) {
+        subvol[0] = '\0';
+        return NULL;
+    }
+
+    memset(&args, 0, sizeof(args));
+
+   /* search in the tree of tree roots */
+   sk->tree_id = 1;
+
+   /*
+    * set the min and max to backref keys.  The search will
+    * only send back this type of key now.
+    */
+   sk->max_type = BTRFS_DIR_ITEM_KEY;
+   sk->min_type = BTRFS_DIR_ITEM_KEY;
+
+   /*
+    * set all the other params to the max, we'll take any objectid
+    * and any trans
+    */
+   sk->min_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
+   sk->max_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
+
+   sk->max_offset = (u64)-1;
+   sk->min_offset = 0;
+   sk->max_transid = (u64)-1;
+
+   /* just a big number, doesn't matter much */
+   sk->nr_items = 4096;
+
+   while(1) {
+       ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+       if (ret < 0) {
+           fprintf(stderr, "ERROR: can't perform the search\n");
+           subvol[0] = '\0';
+           return NULL;
+       }
+       /* the ioctl returns the number of item it found in nr_items */
+       if (sk->nr_items == 0) {
+           break;
+       }
+
+       off = 0;
+
+       /*
+        * for each item, pull the key out of the header and then
+        * read the root_ref item it contains
+        */
+       for (i = 0; i < sk->nr_items; i++) {
+           sh = (struct btrfs_ioctl_search_header *)(args.buf + off);
+           off += sizeof(*sh);
+           if (sh->type == BTRFS_DIR_ITEM_KEY) {
+               dir_item = (struct btrfs_dir_item *)(args.buf + off);
+               name_len = dir_item->name_len;
+               name = (char *)(dir_item + 1);
+
+
+               /*add_root(&root_lookup, sh->objectid, sh->offset,
+                        dir_id, name, name_len);*/
+               strncpy(dirname, name, name_len);
+               dirname[name_len] = '\0';
+               if (strcmp(dirname, "default") == 0) {
+                   defaultsubvolid = dir_item->location.objectid;
+                   break;
+               }
+           }
+           off += sh->len;
+
+           /*
+            * record the mins in sk so we can make sure the
+            * next search doesn't repeat this root
+            */
+           sk->min_objectid = sh->objectid;
+           sk->min_type = sh->type;
+           sk->max_type = sh->type;
+           sk->min_offset = sh->offset;
+       }
+       if (defaultsubvolid != 0)
+           break;
+       sk->nr_items = 4096;
+       /* this iteration is done, step forward one root for the next
+        * ioctl
+        */
+       if (sk->min_objectid < (u64)-1) {
+           sk->min_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
+           sk->max_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
+           sk->max_type = BTRFS_ROOT_BACKREF_KEY;
+           sk->min_type = BTRFS_ROOT_BACKREF_KEY;
+           sk->min_offset = 0;
+       } else
+           break;
+   }
+
+   if (defaultsubvolid == 0) {
+       subvol[0] = '\0';
+       return NULL;
+   }
+
+   memset(&args, 0, sizeof(args));
+
+   /* search in the tree of tree roots */
+   sk->tree_id = 1;
+
+   /*
+    * set the min and max to backref keys.  The search will
+    * only send back this type of key now.
+    */
+   sk->max_type = BTRFS_ROOT_BACKREF_KEY;
+   sk->min_type = BTRFS_ROOT_BACKREF_KEY;
+
+   /*
+    * set all the other params to the max, we'll take any objectid
+    * and any trans
+    */
+   sk->max_objectid = (u64)-1;
+   sk->max_offset = (u64)-1;
+   sk->max_transid = (u64)-1;
+
+   /* just a big number, doesn't matter much */
+   sk->nr_items = 4096;
+
+   while(1) {
+       ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+       if (ret < 0) {
+           fprintf(stderr, "ERROR: can't perform the search\n");
+           subvol[0] = '\0';
+           return NULL;
+       }
+       /* the ioctl returns the number of item it found in nr_items */
+       if (sk->nr_items == 0)
+           break;
+
+       off = 0;
+
+       /*
+        * for each item, pull the key out of the header and then
+        * read the root_ref item it contains
+        */
+       for (i = 0; i < sk->nr_items; i++) {
+           sh = (struct btrfs_ioctl_search_header *)(args.buf + off);
+           off += sizeof(*sh);
+           if (sh->type == BTRFS_ROOT_BACKREF_KEY) {
+               ref = (struct btrfs_root_ref *)(args.buf + off);
+               name_len = ref->name_len;
+               name = (char *)(ref + 1);
+
+               if (sh->objectid == defaultsubvolid) {
+                   strncpy(subvol, name, name_len);
+                   subvol[name_len] = '\0';
+                   dprintf("The default subvolume: %s, ID: %llu\n",
+                          subvol, sh->objectid);
+                   break;
+               }
+
+           }
+
+           off += sh->len;
+
+           /*
+            * record the mins in sk so we can make sure the
+            * next search doesn't repeat this root
+            */
+           sk->min_objectid = sh->objectid;
+           sk->min_type = sh->type;
+           sk->min_offset = sh->offset;
+       }
+       if (subvol[0] != '\0')
+           break;
+       sk->nr_items = 4096;
+       /* this iteration is done, step forward one root for the next
+        * ioctl
+        */
+       if (sk->min_objectid < (u64)-1) {
+           sk->min_objectid++;
+           sk->min_type = BTRFS_ROOT_BACKREF_KEY;
+           sk->min_offset = 0;
+       } else
+           break;
+   }
+   return subvol;
+}
+
 int install_file(const char *path, int devfd, struct stat *rst)
 {
        if (fs_type == EXT2 || fs_type == VFAT)
@@ -548,19 +806,9 @@ static const char *find_device(const char *mtab_file, dev_t dev)
                if (!strcmp(mnt->mnt_type, "btrfs") &&
                    !stat(mnt->mnt_dir, &dst) &&
                    dst.st_dev == dev) {
-                   char *opt = strstr(mnt->mnt_opts, BTRFS_SUBVOL_OPT);
-
-                   if (opt) {
-                       if (!subvol[0]) {
-                           char *tmp;
-
-                           strcpy(subvol, opt + sizeof(BTRFS_SUBVOL_OPT) - 1);
-                           tmp = strchr(subvol, 32);
-                           if (tmp)
-                               *tmp = '\0';
-                       }
-                       break; /* should break and let upper layer try again */
-                   } else
+                       if (!subvol[0]) {
+                           get_default_subvol(mnt->mnt_dir, subvol);
+                        }
                        done = true;
                }
                break;
@@ -625,24 +873,10 @@ static const char *get_devname(const char *path)
 
 #else
 
-    /* check /etc/mtab first, since btrfs subvol info is only in here */
-    devname = find_device("/etc/mtab", st.st_dev);
-    if (subvol[0] && !devname) { /* we just find it is a btrfs subvol */
-       char parent[256];
-       char *tmp;
-
-       strcpy(parent, path);
-       tmp = strrchr(parent, '/');
-       if (tmp) {
-           *tmp = '\0';
-           fprintf(stderr, "%s is subvol, try its parent dir %s\n", path, parent);
-           devname = get_devname(parent);
-       } else
-           devname = NULL;
-    }
+    devname = find_device("/proc/mounts", st.st_dev);
     if (!devname) {
-       /* Didn't find it in /etc/mtab, try /proc/mounts */
-       devname = find_device("/proc/mounts", st.st_dev);
+       /* Didn't find it in /proc/mounts, try /etc/mtab */
+        devname = find_device("/etc/mtab", st.st_dev);
     }
     if (!devname) {
        fprintf(stderr, "%s: cannot find device for path %s\n", program, path);
index 8cc5cc3..3384b20 100644 (file)
Binary files a/gpxe/gpxelinux.0 and b/gpxe/gpxelinux.0 differ
index cfa625f..6999d4b 100644 (file)
Binary files a/gpxe/gpxelinuxk.0 and b/gpxe/gpxelinuxk.0 differ
index 2beb931..e67a468 100644 (file)
@@ -26,3 +26,5 @@ clean: tidy
 dist: tidy
 
 spotless: clean
+
+strip:
index 80c40f7..7c9da51 100644 (file)
@@ -247,4 +247,13 @@ struct boot_sector {
 #define bsCodeLen   (offsetof(struct boot_sector, bsSignature) - \
                     offsetof(struct boot_sector, bsCode))
 
+static inline int fat_check_sb_fields(const struct boot_sector *sb)
+{
+    return sb->bsResSectors && sb->bsFATs &&
+            (!memcmp(sb->bs16.FileSysType, "FAT12   ", 8) ||
+             !memcmp(sb->bs16.FileSysType, "FAT16   ", 8) ||
+             !memcmp(sb->bs16.FileSysType, "FAT     ", 8) ||
+             !memcmp(sb->bs32.FileSysType, "FAT32   ", 8));
+}
+
 #endif /* SYSLXINT_H */
index a68f19f..8847b73 100644 (file)
 static void generate_extents(struct syslinux_extent *ex, int nptrs,
                             const sector_t *sectp, int nsect)
 {
-    uint32_t addr = 0x7c00 + 2*SECTOR_SIZE;
+    uint32_t addr = 0x8000;    /* ldlinux.sys starts loading here */
     uint32_t base;
     sector_t sect, lba;
     unsigned int len;
 
-    len = lba = base = 0;
+    base = addr;
+    len = lba = 0;
 
     memset(ex, 0, nptrs * sizeof *ex);
 
     while (nsect) {
        sect = *sectp++;
 
-       if (len && sect == lba + len &&
-           ((addr ^ (base + len * SECTOR_SIZE)) & 0xffff0000) == 0) {
-           /* We can add to the current extent */
-           len++;
-           goto next;
-       }
-
        if (len) {
+           uint32_t xbytes = (len + 1) * SECTOR_SIZE;
+
+           if (sect == lba + len && xbytes < 65536 &&
+               ((addr ^ (base + xbytes - 1)) & 0xffff0000) == 0) {
+               /* We can add to the current extent */
+               len++;
+               goto next;
+           }
+
            set_64_sl(&ex->lba, lba);
            set_16_sl(&ex->len, len);
            ex++;
index ffe2272..82bf111 100644 (file)
 ##
 
 topdir = ..
-include $(topdir)/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/syslinux.mk
 
-OPTFLAGS = -g -O0 -Dalloca=malloc
+OPTFLAGS = -g -Os
 INCLUDES = -I. -I.. -I../libinstaller
 CFLAGS  = $(GCCWARN) -D_FILE_OFFSET_BITS=64 $(OPTFLAGS) $(INCLUDES)
 LDFLAGS         = 
@@ -56,6 +57,9 @@ syslinux: $(OBJS)
 syslinux-nomtools: syslinux
        ln -f $< $@
 
+strip:
+       $(STRIP) syslinux syslinux-nomtools
+
 %.o: %.c
        $(CC) $(UMAKEDEPS) $(CFLAGS) -c -o $@ $<
 %.i: %.c
index b3be75e..1d5016f 100755 (executable)
Binary files a/linux/syslinux and b/linux/syslinux differ
index b3be75e..1d5016f 100755 (executable)
Binary files a/linux/syslinux-nomtools and b/linux/syslinux-nomtools differ
index d88279d..cf8f985 100644 (file)
@@ -11,7 +11,8 @@
 ## -----------------------------------------------------------------------
 
 topdir = ..
-include $(topdir)/MCONFIG.build
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/build.mk
 
 INCLUDES += -I./include
 
index c3eb97a..993bb10 100644 (file)
@@ -16,7 +16,8 @@
 #
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 
 all:   mbr.bin   altmbr.bin   gptmbr.bin   isohdpfx.bin   isohdppx.bin \
        mbr_c.bin altmbr_c.bin gptmbr_c.bin isohdpfx_c.bin isohdppx_c.bin \
index 2784fb8..17e1efe 100644 (file)
@@ -66,6 +66,37 @@ bootsec:
        .globl  _start
 _start:
        .byte   0x33, 0xed      /* xorw %bp, %bp */
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       nop
+       .byte   0x33, 0xed      /* xorw %bp, %bp */
        cli
        movw    %bp, %ss
        movw    $stack, %sp
index fa46fb4..8937173 100644 (file)
Binary files a/mbr/isohdpfx.bin and b/mbr/isohdpfx.bin differ
index 128b485..56f300a 100644 (file)
Binary files a/mbr/isohdpfx_c.bin and b/mbr/isohdpfx_c.bin differ
index b28cbf0..3c94aca 100644 (file)
Binary files a/mbr/isohdpfx_f.bin and b/mbr/isohdpfx_f.bin differ
index 7f3ab12..fd063f6 100644 (file)
Binary files a/mbr/isohdppx.bin and b/mbr/isohdppx.bin differ
index 6655c86..d5473df 100644 (file)
Binary files a/mbr/isohdppx_c.bin and b/mbr/isohdppx_c.bin differ
index 3320fa4..0d9dcd3 100644 (file)
Binary files a/mbr/isohdppx_f.bin and b/mbr/isohdppx_f.bin differ
index 92f565a..5475b44 100644 (file)
@@ -12,7 +12,8 @@
 ## -----------------------------------------------------------------------
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 -include $(topdir)/version.mk
 
 INCLUDES = -I$(topdir)/com32/include
index e9fb3f1..30cadbf 100644 (file)
Binary files a/memdisk/memdisk and b/memdisk/memdisk differ
index e56c7bd..6a30431 100644 (file)
@@ -15,7 +15,8 @@
 ##
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 
 OPTFLAGS = 
 INCLUDES = -include code16.h -I.
index 636b597..bf9770a 100755 (executable)
Binary files a/memdump/memdump.com and b/memdump/memdump.com differ
similarity index 97%
rename from MCONFIG.build
rename to mk/build.mk
index d1abff2..0ca82be 100644 (file)
@@ -14,7 +14,7 @@
 ## Right now we don't distinguish between "build" system and the "host"
 ## system, although we really should...
 ##
-include $(topdir)/MCONFIG
+include $(MAKEDIR)/syslinux.mk
 
 OPTFLAGS   = -g -Os
 INCLUDES   =
similarity index 98%
rename from com32/MCONFIG
rename to mk/com32.mk
index a74ed32..4a6caae 100644 (file)
@@ -15,7 +15,7 @@
 ## COM32 common configurables
 ##
 
-include $(topdir)/MCONFIG
+include $(MAKEDIR)/syslinux.mk
 
 GCCOPT := $(call gcc_ok,-std=gnu99,)
 GCCOPT += $(call gcc_ok,-m32,)
similarity index 98%
rename from MCONFIG.embedded
rename to mk/embedded.mk
index 9f5846d..e8f3ae3 100644 (file)
@@ -14,7 +14,7 @@
 ## Make configuration for embedded directories
 ##
 
-include $(topdir)/MCONFIG
+include $(MAKEDIR)/syslinux.mk
 
 GCCOPT    := $(call gcc_ok,-m32,)
 GCCOPT    += $(call gcc_ok,-ffreestanding,)
similarity index 98%
rename from com32/lib/MCONFIG
rename to mk/lib.mk
index 44278bd..48b2a13 100644 (file)
+++ b/mk/lib.mk
@@ -1,6 +1,6 @@
 # -*- makefile -*-
 
-include $(topdir)/MCONFIG
+include $(MAKEDIR)/syslinux.mk
 
 GCCOPT := $(call gcc_ok,-std=gnu99,)
 GCCOPT += $(call gcc_ok,-m32,)
similarity index 97%
rename from com32/rosh/MCONFIG
rename to mk/rosh.mk
index 25c4139..7fdba0f 100644 (file)
@@ -15,7 +15,7 @@
 ##
 
 ## Include the COM32 common configurables
-include ../MCONFIG
+include $(MAKEDIR)/com32.mk
 
 # CFLAGS     = $(GCCOPT) $(GCCWARN) -march=i386 \
 #           -fomit-frame-pointer -D__COM32__ \
similarity index 96%
rename from MCONFIG
rename to mk/syslinux.mk
index a71fd13..6d87187 100644 (file)
--- a/MCONFIG
@@ -53,7 +53,9 @@ OBJCOPY  = objcopy
 AR       = ar
 NM       = nm
 RANLIB   = ranlib
+STRIP   = strip
 GZIPPROG = gzip
+XZ      = xz
 PNGTOPNM = pngtopnm
 MCOPY    = mcopy
 MFORMAT  = mformat
@@ -77,7 +79,7 @@ UMAKEDEPS = -Wp,-MT,$@,-MMD,$(dir $@).$(notdir $@).d
 
 # Items that are only appropriate during development; this file is
 # removed when tarballs are generated.
--include $(topdir)/MCONFIG.devel
+-include $(MAKEDIR)/devel.mk
 
 # Local additions, like -DDEBUG can go here
--include $(topdir)/MCONFIG.local
+-include $(MAKEDIR)/local.mk
index 9b50bb2..f878c70 100644 (file)
@@ -15,7 +15,8 @@
 ##
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 
 INCLUDES   = -I$(com32)/include
 
index 6164d24..3e172fd 100755 (executable)
@@ -1,10 +1,11 @@
 topdir = ..
-include $(topdir)/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/syslinux.mk
 
 OPTFLAGS = -g -Os
 INCLUDES = -I. -I.. -I../libfat -I../libinstaller
 CFLAGS  = $(GCCWARN) -D_FILE_OFFSET_BITS=64 $(OPTFLAGS) $(INCLUDES)
-LDFLAGS         = -s
+LDFLAGS         = 
 
 SRCS     = syslinux.c \
           ../libinstaller/fat.c \
@@ -36,6 +37,9 @@ installer: syslinux
 syslinux: $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $^
 
+strip:
+       $(STRIP) syslinux
+
 %.o: %.c
        $(CC) $(UMAKEDEPS) $(CFLAGS) -c -o $@ $<
 %.i: %.c
index 7a7bf75..6a7f2b4 100755 (executable)
Binary files a/mtools/syslinux and b/mtools/syslinux differ
diff --git a/packaging/0001-btrfs-Correctly-determine-the-installation-subvolume.patch b/packaging/0001-btrfs-Correctly-determine-the-installation-subvolume.patch
deleted file mode 100644 (file)
index c5c941f..0000000
+++ /dev/null
@@ -1,493 +0,0 @@
-From c46d7f1567870b9a2bb0a946af741a585e96fe67 Mon Sep 17 00:00:00 2001
-From: Yi Yang <yi.y.yang@intel.com>
-Date: Tue, 12 Jul 2011 14:53:50 +0800
-Subject: [PATCH] btrfs: Correctly determine the installation subvolume
-
-There are multiple ways to set up subvolumes in btrfs.  Use a general
-determination method which works for all schemes.
-
-Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
----
- extlinux/btrfs.h |  105 +++++++++++++++++++
- extlinux/main.c  |  303 ++++++++++++++++++++++++++++++++++++++++++++++++------
- 2 files changed, 376 insertions(+), 32 deletions(-)
-
-diff --git a/extlinux/btrfs.h b/extlinux/btrfs.h
-index 39a861a..be0c24e 100644
---- a/extlinux/btrfs.h
-+++ b/extlinux/btrfs.h
-@@ -1,6 +1,9 @@
- #ifndef _BTRFS_H_
- #define _BTRFS_H_
-+#include <asm/types.h>
-+#include <linux/ioctl.h>
-+
- #define BTRFS_SUPER_MAGIC 0x9123683E
- #define BTRFS_SUPER_INFO_OFFSET (64 * 1024)
- #define BTRFS_SUPER_INFO_SIZE 4096
-@@ -8,6 +11,40 @@
- #define BTRFS_CSUM_SIZE 32
- #define BTRFS_FSID_SIZE 16
-+typedef __u64 u64;
-+typedef __u32 u32;
-+typedef __u16 u16;
-+typedef __u8 u8;
-+typedef u64 __le64;
-+typedef u16 __le16;
-+
-+#define BTRFS_ROOT_BACKREF_KEY  144
-+#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
-+#define BTRFS_DIR_ITEM_KEY      84
-+
-+/*
-+ *  * this is used for both forward and backward root refs
-+ *   */
-+struct btrfs_root_ref {
-+        __le64 dirid;
-+        __le64 sequence;
-+        __le16 name_len;
-+} __attribute__ ((__packed__));
-+
-+struct btrfs_disk_key {
-+        __le64 objectid;
-+        u8 type;
-+        __le64 offset;
-+} __attribute__ ((__packed__));
-+
-+struct btrfs_dir_item {
-+        struct btrfs_disk_key location;
-+        __le64 transid;
-+        __le16 data_len;
-+        __le16 name_len;
-+        u8 type;
-+} __attribute__ ((__packed__));
-+
- struct btrfs_super_block {
-       unsigned char csum[BTRFS_CSUM_SIZE];
-       /* the first 3 fields must match struct btrfs_header */
-@@ -19,4 +56,72 @@ struct btrfs_super_block {
-       u64 magic;
- } __attribute__ ((__packed__));
-+
-+#define BTRFS_IOCTL_MAGIC 0x94
-+#define BTRFS_VOL_NAME_MAX 255
-+#define BTRFS_PATH_NAME_MAX 4087
-+
-+struct btrfs_ioctl_vol_args {
-+      __s64 fd;
-+      char name[BTRFS_PATH_NAME_MAX + 1];
-+};
-+
-+struct btrfs_ioctl_search_key {
-+      /* which root are we searching.  0 is the tree of tree roots */
-+      __u64 tree_id;
-+
-+      /* keys returned will be >= min and <= max */
-+      __u64 min_objectid;
-+      __u64 max_objectid;
-+
-+      /* keys returned will be >= min and <= max */
-+      __u64 min_offset;
-+      __u64 max_offset;
-+
-+      /* max and min transids to search for */
-+      __u64 min_transid;
-+      __u64 max_transid;
-+
-+      /* keys returned will be >= min and <= max */
-+      __u32 min_type;
-+      __u32 max_type;
-+
-+      /*
-+       * how many items did userland ask for, and how many are we
-+       * returning
-+       */
-+      __u32 nr_items;
-+
-+      /* align to 64 bits */
-+      __u32 unused;
-+
-+      /* some extra for later */
-+      __u64 unused1;
-+      __u64 unused2;
-+      __u64 unused3;
-+      __u64 unused4;
-+};
-+
-+struct btrfs_ioctl_search_header {
-+      __u64 transid;
-+      __u64 objectid;
-+      __u64 offset;
-+      __u32 type;
-+      __u32 len;
-+} __attribute__((may_alias));
-+
-+#define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key))
-+/*
-+ * the buf is an array of search headers where
-+ * each header is followed by the actual item
-+ * the type field is expanded to 32 bits for alignment
-+ */
-+struct btrfs_ioctl_search_args {
-+      struct btrfs_ioctl_search_key key;
-+      char buf[BTRFS_SEARCH_ARGS_BUFSIZE];
-+};
-+
-+#define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \
-+                                   struct btrfs_ioctl_search_args)
-+
- #endif
-diff --git a/extlinux/main.c b/extlinux/main.c
-index e5212a9..201fb02 100755
---- a/extlinux/main.c
-+++ b/extlinux/main.c
-@@ -20,12 +20,12 @@
- #define  _GNU_SOURCE          /* Enable everything */
- #include <inttypes.h>
- /* This is needed to deal with the kernel headers imported into glibc 3.3.3. */
--typedef uint64_t u64;
- #include <alloca.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <unistd.h>
-+#include <dirent.h>
- #ifndef __KLIBC__
- #include <mntent.h>
- #endif
-@@ -65,7 +65,6 @@ typedef uint64_t u64;
-    boot image, the boot sector is from 0~512, the boot image starts after */
- #define BTRFS_BOOTSECT_AREA   65536
- #define BTRFS_EXTLINUX_OFFSET SECTOR_SIZE
--#define BTRFS_SUBVOL_OPT "subvol="
- #define BTRFS_SUBVOL_MAX 256  /* By btrfs specification */
- static char subvol[BTRFS_SUBVOL_MAX];
-@@ -494,6 +493,270 @@ int btrfs_install_file(const char *path, int devfd, struct stat *rst)
-     return 0;
- }
-+/*
-+ *  * test if path is a subvolume:
-+ *   * this function return
-+ *    * 0-> path exists but it is not a subvolume
-+ *     * 1-> path exists and it is  a subvolume
-+ *      * -1 -> path is unaccessible
-+ *       */
-+static int test_issubvolume(char *path)
-+{
-+
-+        struct stat     st;
-+        int             res;
-+
-+        res = stat(path, &st);
-+        if(res < 0 )
-+                return -1;
-+
-+        return (st.st_ino == 256) && S_ISDIR(st.st_mode);
-+
-+}
-+
-+/*
-+ * Get file handle for a file or dir
-+ */
-+static int open_file_or_dir(const char *fname)
-+{
-+        int ret;
-+        struct stat st;
-+        DIR *dirstream;
-+        int fd;
-+
-+        ret = stat(fname, &st);
-+        if (ret < 0) {
-+                return -1;
-+        }
-+        if (S_ISDIR(st.st_mode)) {
-+                dirstream = opendir(fname);
-+                if (!dirstream) {
-+                        return -2;
-+                }
-+                fd = dirfd(dirstream);
-+        } else {
-+                fd = open(fname, O_RDWR);
-+        }
-+        if (fd < 0) {
-+                return -3;
-+        }
-+        return fd;
-+}
-+
-+/*
-+ * Get the default subvolume of a btrfs filesystem
-+ *   rootdir: btrfs root dir
-+ *   subvol:  this function will save the default subvolume name here
-+ */
-+static char * get_default_subvol(char * rootdir, char * subvol)
-+{
-+    struct btrfs_ioctl_search_args args;
-+    struct btrfs_ioctl_search_key *sk = &args.key;
-+    struct btrfs_ioctl_search_header *sh;
-+    int ret, i;
-+    int fd;
-+    struct btrfs_root_ref *ref;
-+    struct btrfs_dir_item *dir_item;
-+    unsigned long off = 0;
-+    int name_len;
-+    char *name;
-+    u64 dir_id;
-+    char dirname[4096];
-+    u64 defaultsubvolid = 0;
-+
-+    ret = test_issubvolume(rootdir);
-+    if (ret == 1) {
-+        fd = open_file_or_dir(rootdir);
-+        if (fd < 0) {
-+            fprintf(stderr, "ERROR: failed to open %s\n", rootdir);
-+        }
-+        ret = fd;
-+    }
-+    if (ret <= 0) {
-+        subvol[0] = '\0';
-+        return NULL;
-+    }
-+
-+    memset(&args, 0, sizeof(args));
-+
-+   /* search in the tree of tree roots */
-+   sk->tree_id = 1;
-+
-+   /*
-+    * set the min and max to backref keys.  The search will
-+    * only send back this type of key now.
-+    */
-+   sk->max_type = BTRFS_DIR_ITEM_KEY;
-+   sk->min_type = BTRFS_DIR_ITEM_KEY;
-+
-+   /*
-+    * set all the other params to the max, we'll take any objectid
-+    * and any trans
-+    */
-+   sk->min_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
-+   sk->max_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
-+
-+   sk->max_offset = (u64)-1;
-+   sk->min_offset = 0;
-+   sk->max_transid = (u64)-1;
-+
-+   /* just a big number, doesn't matter much */
-+   sk->nr_items = 4096;
-+
-+   while(1) {
-+       ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
-+       if (ret < 0) {
-+           fprintf(stderr, "ERROR: can't perform the search\n");
-+           subvol[0] = '\0';
-+           return NULL;
-+       }
-+       /* the ioctl returns the number of item it found in nr_items */
-+       if (sk->nr_items == 0) {
-+           break;
-+       }
-+
-+       off = 0;
-+
-+       /*
-+        * for each item, pull the key out of the header and then
-+        * read the root_ref item it contains
-+        */
-+       for (i = 0; i < sk->nr_items; i++) {
-+           sh = (struct btrfs_ioctl_search_header *)(args.buf + off);
-+           off += sizeof(*sh);
-+           if (sh->type == BTRFS_DIR_ITEM_KEY) {
-+               dir_item = (struct btrfs_dir_item *)(args.buf + off);
-+               name_len = dir_item->name_len;
-+               name = (char *)(dir_item + 1);
-+
-+
-+               /*add_root(&root_lookup, sh->objectid, sh->offset,
-+                        dir_id, name, name_len);*/
-+               strncpy(dirname, name, name_len);
-+               dirname[name_len] = '\0';
-+               if (strcmp(dirname, "default") == 0) {
-+                   defaultsubvolid = dir_item->location.objectid;
-+                   break;
-+               }
-+           }
-+           off += sh->len;
-+
-+           /*
-+            * record the mins in sk so we can make sure the
-+            * next search doesn't repeat this root
-+            */
-+           sk->min_objectid = sh->objectid;
-+           sk->min_type = sh->type;
-+           sk->max_type = sh->type;
-+           sk->min_offset = sh->offset;
-+       }
-+       if (defaultsubvolid != 0)
-+           break;
-+       sk->nr_items = 4096;
-+       /* this iteration is done, step forward one root for the next
-+        * ioctl
-+        */
-+       if (sk->min_objectid < (u64)-1) {
-+           sk->min_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
-+           sk->max_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
-+           sk->max_type = BTRFS_ROOT_BACKREF_KEY;
-+           sk->min_type = BTRFS_ROOT_BACKREF_KEY;
-+           sk->min_offset = 0;
-+       } else
-+           break;
-+   }
-+
-+   if (defaultsubvolid == 0) {
-+       subvol[0] = '\0';
-+       return NULL;
-+   }
-+
-+   memset(&args, 0, sizeof(args));
-+
-+   /* search in the tree of tree roots */
-+   sk->tree_id = 1;
-+
-+   /*
-+    * set the min and max to backref keys.  The search will
-+    * only send back this type of key now.
-+    */
-+   sk->max_type = BTRFS_ROOT_BACKREF_KEY;
-+   sk->min_type = BTRFS_ROOT_BACKREF_KEY;
-+
-+   /*
-+    * set all the other params to the max, we'll take any objectid
-+    * and any trans
-+    */
-+   sk->max_objectid = (u64)-1;
-+   sk->max_offset = (u64)-1;
-+   sk->max_transid = (u64)-1;
-+
-+   /* just a big number, doesn't matter much */
-+   sk->nr_items = 4096;
-+
-+   while(1) {
-+       ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
-+       if (ret < 0) {
-+           fprintf(stderr, "ERROR: can't perform the search\n");
-+           subvol[0] = '\0';
-+           return NULL;
-+       }
-+       /* the ioctl returns the number of item it found in nr_items */
-+       if (sk->nr_items == 0)
-+           break;
-+
-+       off = 0;
-+
-+       /*
-+        * for each item, pull the key out of the header and then
-+        * read the root_ref item it contains
-+        */
-+       for (i = 0; i < sk->nr_items; i++) {
-+           sh = (struct btrfs_ioctl_search_header *)(args.buf + off);
-+           off += sizeof(*sh);
-+           if (sh->type == BTRFS_ROOT_BACKREF_KEY) {
-+               ref = (struct btrfs_root_ref *)(args.buf + off);
-+               name_len = ref->name_len;
-+               name = (char *)(ref + 1);
-+               dir_id = ref->dirid;
-+
-+               /*add_root(&root_lookup, sh->objectid, sh->offset,
-+                        dir_id, name, name_len);*/
-+               if (sh->objectid == defaultsubvolid) {
-+                   strncpy(subvol, name, name_len);
-+                   subvol[name_len] = '\0';
-+                   dprintf("The default subvolume: %s, ID: %llu\n", subvol, sh->objectid);
-+                   break;
-+               }
-+
-+           }
-+
-+           off += sh->len;
-+
-+           /*
-+            * record the mins in sk so we can make sure the
-+            * next search doesn't repeat this root
-+            */
-+           sk->min_objectid = sh->objectid;
-+           sk->min_type = sh->type;
-+           sk->min_offset = sh->offset;
-+       }
-+       if (subvol[0] != '\0')
-+           break;
-+       sk->nr_items = 4096;
-+       /* this iteration is done, step forward one root for the next
-+        * ioctl
-+        */
-+       if (sk->min_objectid < (u64)-1) {
-+           sk->min_objectid++;
-+           sk->min_type = BTRFS_ROOT_BACKREF_KEY;
-+           sk->min_offset = 0;
-+       } else
-+           break;
-+   }
-+   return subvol;
-+}
-+
- int install_file(const char *path, int devfd, struct stat *rst)
- {
-       if (fs_type == EXT2 || fs_type == VFAT)
-@@ -548,19 +811,9 @@ static const char *find_device(const char *mtab_file, dev_t dev)
-               if (!strcmp(mnt->mnt_type, "btrfs") &&
-                   !stat(mnt->mnt_dir, &dst) &&
-                   dst.st_dev == dev) {
--                  char *opt = strstr(mnt->mnt_opts, BTRFS_SUBVOL_OPT);
--
--                  if (opt) {
--                      if (!subvol[0]) {
--                          char *tmp;
--
--                          strcpy(subvol, opt + sizeof(BTRFS_SUBVOL_OPT) - 1);
--                          tmp = strchr(subvol, 32);
--                          if (tmp)
--                              *tmp = '\0';
--                      }
--                      break; /* should break and let upper layer try again */
--                  } else
-+                      if (!subvol[0]) {
-+                          get_default_subvol(mnt->mnt_dir, subvol);
-+                        }
-                       done = true;
-               }
-               break;
-@@ -625,24 +878,10 @@ static const char *get_devname(const char *path)
- #else
--    /* check /etc/mtab first, since btrfs subvol info is only in here */
--    devname = find_device("/etc/mtab", st.st_dev);
--    if (subvol[0] && !devname) { /* we just find it is a btrfs subvol */
--      char parent[256];
--      char *tmp;
--
--      strcpy(parent, path);
--      tmp = strrchr(parent, '/');
--      if (tmp) {
--          *tmp = '\0';
--          fprintf(stderr, "%s is subvol, try its parent dir %s\n", path, parent);
--          devname = get_devname(parent);
--      } else
--          devname = NULL;
--    }
-+    devname = find_device("/proc/mounts", st.st_dev);
-     if (!devname) {
--      /* Didn't find it in /etc/mtab, try /proc/mounts */
--      devname = find_device("/proc/mounts", st.st_dev);
-+      /* Didn't find it in /proc/mounts, try /etc/mtab */
-+        devname = find_device("/etc/mtab", st.st_dev);
-     }
-     if (!devname) {
-       fprintf(stderr, "%s: cannot find device for path %s\n", program, path);
--- 
-1.7.2.5
-
diff --git a/packaging/correct-uuid-link-lib.patch b/packaging/correct-uuid-link-lib.patch
new file mode 100644 (file)
index 0000000..9360773
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/utils/Makefile b/utils/Makefile
+index 44cb54f..be73993 100644
+--- a/utils/Makefile
++++ b/utils/Makefile
+@@ -51,7 +51,7 @@ isohdpfx.c: $(ISOHDPFX) isohdpfxarray.pl
+       $(PERL) isohdpfxarray.pl $(ISOHDPFX) > $@
+ isohybrid: isohybrid.o isohdpfx.o
+-      $(CC) $(LDFLAGS) -luuid -o $@ $^
++      $(CC) $(LDFLAGS) -o $@ $^ -luuid
+ gethostip: gethostip.o
+       $(CC) $(LDFLAGS) -o $@ $^
diff --git a/packaging/syslinux.manifest b/packaging/syslinux.manifest
deleted file mode 100644 (file)
index 017d22d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<manifest>
- <request>
-    <domain name="_"/>
- </request>
-</manifest>
index 3c46974..9ee43d0 100644 (file)
@@ -1,24 +1,29 @@
 # -*- rpm -*-
 Summary: Kernel loader which uses a FAT, ext2/3 or iso9660 filesystem or a PXE network
 Name: syslinux
-Version: 4.04
-Release: 1
+Version: 4.05
+Release: 1.2
+%if 0%{?suse_version}
+Vendor: openSUSE
+%endif
 License: GPLv2
 Url: http://syslinux.zytor.com/
 Group: System/Boot
-Source0: ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/%{name}-%{version}.tar.gz
+#Source0: ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/%{name}-%{version}.tar.gz
+Source0: %{name}-%{version}.tar.gz
+Patch0: correct-uuid-link-lib.patch 
 ExclusiveArch: %{ix86} x86_64
 Buildroot: %{_tmppath}/%{name}-%{version}-root
-BuildRequires: nasm >= 0.98.39, perl
+BuildRequires: nasm >= 0.98.39, perl, libuuid-devel
+%if 0%{?suse_version}
+BuildRequires: libuuid1
+%else
+BuildRequires: libuuid
+%endif
 Source101: syslinux-rpmlintrc
-Source1001: packaging/syslinux.manifest 
-# >> gbp-patch-tags         # auto-added by gbp
-Patch0:    0001-btrfs-Correctly-determine-the-installation-subvolume.patch
-# << gbp-patch-tags         # auto-added by gbp
-
 Autoreq: 0
 %ifarch x86_64
-Requires: mtools
+Requires: mtools, libc.so.6()(64bit)
 %define my_cc gcc
 %else
 Requires: mtools, libc.so.6
@@ -29,17 +34,17 @@ Requires: mtools, libc.so.6
 # a system bootloader, and may be necessary for system recovery.
 %define _sbindir /sbin
 
+%package devel
+Summary: Development environment for SYSLINUX add-on modules
+Group: Development/Libraries
+Requires: syslinux
+
 %description
 SYSLINUX is a suite of bootloaders, currently supporting DOS FAT
 filesystems, Linux ext2/ext3 filesystems (EXTLINUX), PXE network boots
 (PXELINUX), or ISO 9660 CD-ROMs (ISOLINUX).  It also includes a tool,
 MEMDISK, which loads legacy operating systems from these media.
 
-%package devel
-Summary: Development environment for SYSLINUX add-on modules
-Group: Development/Libraries
-Requires: syslinux
-
 %description devel
 The SYSLINUX boot loader contains an API, called COM32, for writing
 sophisticated add-on modules.  This package contains the libraries
@@ -65,13 +70,9 @@ booting in the /var/lib/tftpboot directory.
 
 %prep
 %setup -q -n syslinux-%{version}
-
-# >> gbp-apply-patches    # auto-added by gbp
 %patch0 -p1
-# << gbp-apply-patches    # auto-added by gbp
 
 %build
-cp %{SOURCE1001} .
 make CC='%{my_cc}' clean
 make CC='%{my_cc}' installer
 make CC='%{my_cc}' -C sample tidy
@@ -89,9 +90,11 @@ make CC='%{my_cc}' -C sample tidy
 rm -rf %{buildroot}
 
 %files
-%manifest syslinux.manifest
 %defattr(-,root,root)
-%{_bindir}
+%doc COPYING NEWS doc/*
+%doc sample
+%doc %{_mandir}/man*/*
+%{_bindir}/*
 %dir %{_datadir}/syslinux
 %{_datadir}/syslinux/*.com
 %{_datadir}/syslinux/*.exe
@@ -99,28 +102,27 @@ rm -rf %{buildroot}
 %{_datadir}/syslinux/*.bin
 %{_datadir}/syslinux/*.0
 %{_datadir}/syslinux/memdisk
-%{_datadir}/syslinux/dosutil
+%dir %{_datadir}/syslinux/dosutil
+%{_datadir}/syslinux/dosutil/*
+%dir %{_datadir}/syslinux/diag
+%{_datadir}/syslinux/diag/*
+%{_sbindir}/extlinux
+/boot/extlinux
 
 %files devel
-%manifest syslinux.manifest
 %defattr(-,root,root)
-%doc COPYING NEWS README doc/*
-%doc sample
-%doc %{_mandir}/man*/*
 %{_datadir}/syslinux/com32
-%{_datadir}/syslinux/diag
 
 %files extlinux
-%manifest syslinux.manifest
 %defattr(-,root,root)
 %{_sbindir}/extlinux
 /boot/extlinux
 
 %files tftpboot
-%manifest syslinux.manifest
 %defattr(-,root,root)
 /var/lib/tftpboot
 
+
 %post extlinux
 # If we have a /boot/extlinux.conf file, assume extlinux is our bootloader
 # and update it.
index d7f439c..9e504d9 100644 (file)
@@ -15,7 +15,8 @@
 ##
 
 topdir = ..
-include $(topdir)/MCONFIG.embedded
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/embedded.mk
 
 PPMTOLSS16 = $(topdir)/utils/ppmtolss16
 
index 169640d..2fea49c 100644 (file)
@@ -1,17 +1,26 @@
 # -*- rpm -*-
-%define RPMVERSION 4.04
-%define VERSION    4.04
 Summary: Kernel loader which uses a FAT, ext2/3 or iso9660 filesystem or a PXE network
 Name: syslinux
-Version: %{RPMVERSION}
-Release: 1
-License: GPL
+Version: 4.05
+Release: 1.2
+%if 0%{?suse_version}
+Vendor: openSUSE
+%endif
+License: GPLv2
+Url: http://syslinux.zytor.com/
 Group: System/Boot
-Source0: ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/%{name}-%{VERSION}.tar.gz
-ExclusiveArch: i386 i486 i586 i686 athlon pentium4 x86_64
-Packager: H. Peter Anvin <hpa@zytor.com>
-Buildroot: %{_tmppath}/%{name}-%{VERSION}-root
-BuildRequires: nasm >= 2.03, perl
+#Source0: ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/%{name}-%{version}.tar.gz
+Source0: %{name}-%{version}.tar.gz
+Patch0: correct-uuid-link-lib.patch 
+ExclusiveArch: %{ix86} x86_64
+Buildroot: %{_tmppath}/%{name}-%{version}-root
+BuildRequires: nasm >= 0.98.39, perl, libuuid-devel
+%if 0%{?suse_version}
+BuildRequires: libuuid1
+%else
+BuildRequires: libuuid
+%endif
+Source101: syslinux-rpmlintrc
 Autoreq: 0
 %ifarch x86_64
 Requires: mtools, libc.so.6()(64bit)
@@ -41,26 +50,29 @@ The SYSLINUX boot loader contains an API, called COM32, for writing
 sophisticated add-on modules.  This package contains the libraries
 necessary to compile such modules.
 
+%if "0%{?meego_version}" != "0" || 0%{?moblin_version} || 0%{?fedora_version} > 13
 %package extlinux
-Summary: The EXTLINUX bootloader, for booting the local system.
+Summary: The EXTLINUX bootloader, for booting the local system
 Group: System/Boot
 Requires: syslinux
 
 %description extlinux
 The EXTLINUX bootloader, for booting the local system, as well as all
 the SYSLINUX/PXELINUX modules in /boot.
+%endif
 
 %package tftpboot
-Summary: SYSLINUX modules in /tftpboot, available for network booting
+Summary: SYSLINUX modules in /var/lib/tftpboot, available for network booting
 Group: Applications/Internet
 Requires: syslinux
 
 %description tftpboot
 All the SYSLINUX/PXELINUX modules directly available for network
-booting in the /tftpboot directory.
+booting in the /var/lib/tftpboot directory.
 
 %prep
-%setup -q -n syslinux-%{VERSION}
+%setup -q -n syslinux-%{version}
+%patch0 -p1
 
 %build
 make CC='%{my_cc}' clean
@@ -73,10 +85,8 @@ make CC='%{my_cc}' install-all \
        INSTALLROOT=%{buildroot} BINDIR=%{_bindir} SBINDIR=%{_sbindir} \
        LIBDIR=%{_libdir} DATADIR=%{_datadir} \
        MANDIR=%{_mandir} INCDIR=%{_includedir} \
-       TFTPBOOT=/tftpboot EXTLINUXDIR=/boot/extlinux
+       TFTPBOOT=/var/lib/tftpboot EXTLINUXDIR=/boot/extlinux
 make CC='%{my_cc}' -C sample tidy
-mkdir -p %{buildroot}/etc
-( cd %{buildroot}/etc && ln -s ../boot/extlinux/extlinux.conf . )
 
 %clean
 rm -rf %{buildroot}
@@ -85,186 +95,49 @@ rm -rf %{buildroot}
 %defattr(-,root,root)
 %doc COPYING NEWS doc/*
 %doc sample
-%{_mandir}/man*/*
+%doc %{_mandir}/man*/*
 %{_bindir}/*
+%dir %{_datadir}/syslinux
 %{_datadir}/syslinux/*.com
 %{_datadir}/syslinux/*.exe
 %{_datadir}/syslinux/*.c32
 %{_datadir}/syslinux/*.bin
 %{_datadir}/syslinux/*.0
 %{_datadir}/syslinux/memdisk
+%dir %{_datadir}/syslinux/dosutil
 %{_datadir}/syslinux/dosutil/*
+%dir %{_datadir}/syslinux/diag
 %{_datadir}/syslinux/diag/*
+%if 0%{?fedora_version} || 0%{?suse_version}
+%{_sbindir}/extlinux/*
+/boot/extlinux
+%endif
 
 %files devel
+%defattr(-,root,root)
 %{_datadir}/syslinux/com32
 
+%if "0%{?meego_version}" != "0" || 0%{?moblin_version} || 0%{?fedora_version} > 13
 %files extlinux
-%{_sbindir}/extlinux
+%defattr(-,root,root)
+%{_sbindir}/extlinux/*
 /boot/extlinux
-%config /etc/extlinux.conf
+%endif
 
 %files tftpboot
-/tftpboot
+%defattr(-,root,root)
+/var/lib/tftpboot
 
+%if "0%{?meego_version}" != "0" || 0%{?moblin_version} || 0%{?fedora_version} > 13
 %post extlinux
 # If we have a /boot/extlinux.conf file, assume extlinux is our bootloader
 # and update it.
 if [ -f /boot/extlinux/extlinux.conf ]; then \
+       ln -sf /boot/extlinux/extlinux.conf /etc/extlinux.conf; \
        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
-* Fri Dec 18 2009 H. Peter Anvin <hpa@zytor.com>
-- Require NASM 2.03
-- Package dosutil
-
-* Thu May 29 2008 H. Peter Anvin <hpa@zytor.com>
-- Use install targets; clean up various paths.
-
-* Thu Jan 10 2008 H. Peter Anvin <hpa@zytor.com>
-- Add man pages.
-
-* Mon Nov 19 2007 Bernard Li <bernard@vanhpc.org>
-- Added netpbm-progs (provides pngtopnm) to BuildPrereq (this should be
-  changed to BuildRequires since it is deprecated...)
-
-* Thu Mar 15 2007 H. Peter Anvin <hpa@zytor.com>
-- Move extlinux /boot stuff into /boot/extlinux.
-
-* Thu Jan 25 2007 H. Peter Anvin <hpa@zytor.com>
-- Hacks to make the 32-bit version build correctly on 64-bit machines.
-
-* Mon Sep 19 2006 H. Peter Anvin <hpa@zytor.com>
-- Add a syslinux-tftpboot module.
-- Factor extlinux into its own package.
-- Move to %{_datadir} (/usr/share).
-
-* Wed Sep 21 2005 H. Peter Anvin <hpa@zytor.com>
-- If /boot/extlinux.conf exist, run extlinux --update.
-
-* Fri Sep  9 2005 H. Peter Anvin <hpa@zytor.com>
-- Copy, don't link, *.c32 into /boot; rpm doesn't like breaking links.
-
-* Tue Aug 23 2005 H. Peter Anvin <hpa@zytor.com>
-- Put *.c32 into /boot.
-
-* Thu Dec 30 2004 H. Peter Anvin <hpa@zytor.com>
-- libsyslinux dropped in syslinux 3.00.
-- Additional documentation.
-- Add extlinux.
-
-* Tue Dec 14 2004 H. Peter Anvin <hpa@zytor.com>
-- Add a devel package for the com32 library added in 2.12.
-
-* Wed Apr 16 2003 H. Peter Anvin <hpa@zytor.com> 2.04-1
-- 2.04 release
-- Add support for libsyslinux.so*
-- Templatize for inclusion in CVS tree
-
-* Thu Apr 10 2003 H. Peter Anvin <hpa@zytor.com>
-- 2.03 release
-- Add support for libsyslinux.a
-- Add keytab-lilo.pl to the /usr/lib/syslinux directory
-- Modernize syntax
-- Support building on x86-64
-
-* Thu Feb 13 2003 H. Peter Anvin <hpa@zytor.com>
-- 2.02 release; no longer setuid
-
-* Thu Jan 30 2003 H. Peter Anvin <hpa@zytor.com>
-- Prepare for 2.01 release; make /usr/bin/syslinux setuid root
-
-* Fri Oct 25 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 2.00.
-
-* Tue Aug 27 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.76.
-
-* Fri Jun 14 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.75.
-
-* Sat Jun  1 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.74.
-
-* Sun May 26 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.73.
-
-* Tue Apr 23 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.72.
-
-* Wed Apr 17 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.71.
-- Update the title.
-
-* Wed Apr 17 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.70.
-
-* Sat Feb  3 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.67.
-
-* Tue Jan  1 2002 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.66.
-
-* Sat Dec 15 2001 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.65; make appropriate changes.
-
-* Sat Aug 24 2001 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.64.
-
-* Mon Aug  6 2001 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.63.
-- Use make install since the stock SYSLINUX distribution now supports
-  INSTALLROOT.
-
-* Sat Apr 24 2001 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.62.
-
-* Sat Apr 14 2001 H. Peter Anvin <hpa@zytor.com>
-- Fix missing %files; correct modes.
-
-* Fri Apr 13 2001 H. Peter Anvin <hpa@zytor.com>
-- Upgrade to 1.61
-- Install auxilliary programs in /usr/lib/syslinux
-
-* Sat Feb 10 2001 Matt Wilson <msw@redhat.com>
-- 1.52
-
-* Wed Jan 24 2001 Matt Wilson <msw@redhat.com>
-- 1.51pre7
-
-* Mon Jan 22 2001 Matt Wilson <msw@redhat.com>
-- 1.51pre5
-
-* Fri Jan 19 2001 Matt Wilson <msw@redhat.com>
-- 1.51pre3, with e820 detection
-
-* Tue Dec 12 2000 Than Ngo <than@redhat.com>
-- rebuilt with fixed fileutils
-
-* Thu Nov 9 2000 Than Ngo <than@redhat.com>
-- update to 1.49
-- update ftp site
-- clean up specfile
-- add some useful documents
-
-* Tue Jul 18 2000 Nalin Dahyabhai <nalin@redhat.com>
-- add %%defattr (release 4)
-
-* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
-- automatic rebuild
-
-* Thu Jul 06 2000 Trond Eivind Glomsrød <teg@redhat.com>
-- use %%{_tmppath}
-- change application group (Applications/Internet doesn't seem
-  right to me)
-- added BuildRequires
-
-* Tue Apr 04 2000 Erik Troan <ewt@redhat.com>
-- initial packaging
+%endif
index 455eb82..44cb54f 100644 (file)
 #
 
 topdir = ..
-include $(topdir)/MCONFIG
+MAKEDIR = $(topdir)/mk
+include $(MAKEDIR)/syslinux.mk
 
 CFLAGS   = $(GCCWARN) -Os -fomit-frame-pointer -D_FILE_OFFSET_BITS=64
-LDFLAGS  = -O2 -s
+LDFLAGS  = -O2
 
-TARGETS         = mkdiskimage isohybrid gethostip memdiskfind
-TARGETS += isohybrid.pl  # about to be obsoleted
-ASIS     = keytab-lilo lss16toppm md5pass ppmtolss16 sha1pass syslinux2ansi \
-          pxelinux-options
+C_TARGETS       = isohybrid gethostip memdiskfind
+SCRIPT_TARGETS  = mkdiskimage
+SCRIPT_TARGETS += isohybrid.pl  # about to be obsoleted
+ASIS            = keytab-lilo lss16toppm md5pass ppmtolss16 sha1pass \
+                  syslinux2ansi pxelinux-options
+
+TARGETS = $(C_TARGETS) $(SCRIPT_TARGETS)
 
 ISOHDPFX = ../mbr/isohdpfx.bin ../mbr/isohdpfx_f.bin ../mbr/isohdpfx_c.bin \
           ../mbr/isohdppx.bin ../mbr/isohdppx_f.bin ../mbr/isohdppx_c.bin
@@ -47,7 +51,7 @@ isohdpfx.c: $(ISOHDPFX) isohdpfxarray.pl
        $(PERL) isohdpfxarray.pl $(ISOHDPFX) > $@
 
 isohybrid: isohybrid.o isohdpfx.o
-       $(CC) $(LDFLAGS) -o $@ $^
+       $(CC) $(LDFLAGS) -luuid -o $@ $^
 
 gethostip: gethostip.o
        $(CC) $(LDFLAGS) -o $@ $^
@@ -69,4 +73,7 @@ install: installer
        mkdir -m 755 -p $(INSTALLROOT)$(BINDIR)
        install -m 755 $(TARGETS) $(ASIS) $(INSTALLROOT)$(BINDIR)
 
+strip:
+       $(STRIP) $(C_TARGETS)
+
 -include .*.d
index bb35c23..81f29ef 100755 (executable)
Binary files a/utils/gethostip and b/utils/gethostip differ
index b57b99d..52bbe86 100755 (executable)
Binary files a/utils/isohybrid and b/utils/isohybrid differ
index 7ee9a7f..1dcbaa1 100644 (file)
 #include <unistd.h>
 #include <sys/stat.h>
 #include <inttypes.h>
+#include <uuid/uuid.h>
 
 #include "isohybrid.h"
 
 char *prog = NULL;
 extern int opterr, optind;
+struct stat isostat;
+unsigned int padding = 0;
+
+uuid_t disk_uuid, part_uuid, iso_uuid;
 
 uint8_t mode = 0;
-enum { VERBOSE = 1 };
+enum { VERBOSE = 1 , EFI = 2 , MAC = 4};
 
 /* user options */
 uint16_t head = 64;             /* 1 <= head <= 256 */
@@ -61,10 +66,150 @@ uint16_t ve[16];
 uint32_t catoffset = 0;
 uint32_t c = 0, cc = 0, cs = 0;
 
+uint32_t psize = 0, isosize = 0;
+
 /* boot catalogue parameters */
 uint32_t de_lba = 0;
 uint16_t de_seg = 0, de_count = 0, de_mbz2 = 0;
 uint8_t de_boot = 0, de_media = 0, de_sys = 0, de_mbz1 = 0;
+uint32_t efi_lba = 0, mac_lba = 0;
+uint16_t efi_count = 0, mac_count = 0;
+uint8_t efi_boot = 0, efi_media = 0, efi_sys = 0;
+
+int apm_parts = 3;
+
+uint8_t afp_header[] = { 0x45, 0x52, 0x08, 0x00, 0x00, 0x00, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+uuid_t efi_system_partition = {0xC1, 0x2A, 0x73, 0x28, 0xF8, 0x1F, 0x11, 0xD2, 0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B};
+uuid_t basic_partition = {0xEB,0xD0,0xA0,0xA2,0xB9,0xE5,0x44,0x33,0x87,0xC0,0x68,0xB6,0xB7,0x26,0x99,0xC7};
+uuid_t hfs_partition = {0x48, 0x46, 0x53, 0x00, 0x00, 0x00, 0x11, 0xAA, 0xAA, 0x11, 0x00, 0x30, 0x65, 0x43, 0xEC, 0xAC};
+
+uint32_t crc_tab[256] =
+{
+    0, 0x77073096, 0xEE0E612C, 0x990951BA,
+    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
+    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
+    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
+    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
+    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
+    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
+    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
+    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
+    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
+    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
+    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
+    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
+    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
+    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
+    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
+    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
+    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
+    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
+    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
+    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
+    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
+    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
+    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
+    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
+    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
+    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
+    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
+    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
+    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
+    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
+    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
+    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
+    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
+    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
+    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
+    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
+    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
+    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
+    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
+    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
+    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
+    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
+    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
+    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
+    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
+    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
+    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
+    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
+    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
+    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
+    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
+    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
+    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
+    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
+    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
+    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
+    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
+    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
+};
+
+struct iso_primary_descriptor {
+    uint8_t ignore [80];
+    uint32_t size;
+    uint8_t ignore2 [44];
+    uint16_t block_size;
+};
+
+struct gpt_header {
+    uint64_t signature;
+    uint32_t revision;
+    uint32_t headerSize;
+    uint32_t headerCRC;
+    uint32_t reserved;
+    uint64_t currentLBA;
+    uint64_t backupLBA;
+    uint64_t firstUsableLBA;
+    uint64_t lastUsableLBA;
+    uuid_t diskGUID;
+    uint64_t partitionEntriesLBA;
+    uint32_t numParts;
+    uint32_t sizeOfPartitionEntries;
+    uint32_t partitionEntriesCRC;
+    uint8_t reserved2[420];
+};
+
+struct gpt_part_header {
+    uuid_t partTypeGUID;
+    uuid_t partGUID;
+    uint64_t firstLBA;
+    uint64_t lastLBA;
+    uint64_t attributes;
+    uint16_t name[36];
+};
+
+#define APM_OFFSET 2048
+
+struct apple_part_header {
+    uint16_t        signature;      /* expected to be MAC_PARTITION_MAGIC */
+    uint16_t        res1;
+    uint32_t        map_count;      /* # blocks in partition map */
+    uint32_t        start_block;    /* absolute starting block # of partition */
+    uint32_t        block_count;    /* number of blocks in partition */
+    char            name[32];       /* partition name */
+    char            type[32];       /* string type description */
+    uint32_t        data_start;     /* rel block # of first data block */
+    uint32_t        data_count;     /* number of data blocks */
+    uint32_t        status;         /* partition status bits */
+    uint32_t        boot_start;
+    uint32_t        boot_count;
+    uint32_t        boot_load;
+    uint32_t        boot_load2;
+    uint32_t        boot_entry;
+    uint32_t        boot_entry2;
+    uint32_t        boot_cksum;
+    char            processor[16];  /* Contains 680x0, x=0,2,3,4; or empty */
+    uint32_t        driver_sig;
+    char            _padding[372];
+};
 
 
 void
@@ -89,6 +234,8 @@ printh(void)
     printf(FMT, "   -o --offset", "Specify partition offset (default 0)");
     printf(FMT, "   -t --type", "Specify partition type (default 0x17)");
     printf(FMT, "   -i --id", "Specify MBR ID (default random)");
+    printf(FMT, "   -u --uefi", "Build EFI bootable image");
+    printf(FMT, "   -m --mac", "Add AFP table support");
 
     printf("\n");
     printf(FMT, "   --forcehd0", "Assume we are loaded as disk ID 0");
@@ -108,6 +255,7 @@ printh(void)
 int
 check_option(int argc, char *argv[])
 {
+    char *err = NULL;
     int n = 0, ind = 0;
 
     const char optstr[] = ":h:s:e:o:t:i:fcp?vV";
@@ -121,6 +269,8 @@ check_option(int argc, char *argv[])
         { "forcehd0", no_argument, NULL, 'f' },
         { "ctrlhd0", no_argument, NULL, 'c' },
         { "partok", no_argument, NULL, 'p'},
+       { "uefi", no_argument, NULL, 'u'},
+       { "mac", no_argument, NULL, 'm'},
 
         { "help", no_argument, NULL, '?' },
         { "verbose", no_argument, NULL, 'v' },
@@ -135,32 +285,38 @@ check_option(int argc, char *argv[])
         switch (n)
         {
         case 'h':
-            if (!sscanf(optarg, "%hu", &head) || head < 1 || head > 256)
+            head = strtoul(optarg, &err, 0);
+            if (head < 1 || head > 256)
                 errx(1, "invalid head: `%s', 1 <= head <= 256", optarg);
             break;
 
         case 's':
-            if (!sscanf(optarg, "%hhu", &sector) || sector < 1 || sector > 63)
+            sector = strtoul(optarg, &err, 0);
+            if (sector < 1 || sector > 63)
                 errx(1, "invalid sector: `%s', 1 <= sector <= 63", optarg);
             break;
 
         case 'e':
-            if (!sscanf(optarg, "%hhu", &entry) || entry < 1 || entry > 4)
+            entry = strtoul(optarg, &err, 0);
+            if (entry < 1 || entry > 4)
                 errx(1, "invalid entry: `%s', 1 <= entry <= 4", optarg);
             break;
 
         case 'o':
-            if (!sscanf(optarg, "%hhu", &offset) || offset > 64)
+            offset = strtoul(optarg, &err, 0);
+            if (*err || offset > 64)
                 errx(1, "invalid offset: `%s', 0 <= offset <= 64", optarg);
             break;
 
         case 't':
-            if (!sscanf(optarg, "%hu", &type) || type > 255)
+            type = strtoul(optarg, &err, 0);
+            if (*err || type > 255)
                 errx(1, "invalid type: `%s', 0 <= type <= 255", optarg);
             break;
 
         case 'i':
-            if (!sscanf(optarg, "%u", &id))
+            id = strtoul(optarg, &err, 0);
+            if (*err)
                 errx(1, "invalid id: `%s'", optarg);
             break;
 
@@ -176,6 +332,14 @@ check_option(int argc, char *argv[])
             partok = 1;
             break;
 
+       case 'u':
+           mode |= EFI;
+           break;
+
+       case 'm':
+           mode |= MAC;
+           break;
+
         case 'v':
             mode |= VERBOSE;
             break;
@@ -200,6 +364,33 @@ check_option(int argc, char *argv[])
     return optind;
 }
 
+uint16_t
+bendian_short(const uint16_t s)
+{
+    uint16_t r = 1;
+
+    if (!*(uint8_t *)&r)
+        return s;
+
+    r = (s & 0x00FF) << 8 | (s & 0xFF00) >> 8;
+
+    return r;
+}
+
+
+uint32_t
+bendian_int(const uint32_t s)
+{
+    uint32_t r = 1;
+
+    if (!*(uint8_t *)&r)
+        return s;
+
+    r = (s & 0x000000FF) << 24 | (s & 0xFF000000) >> 24
+        | (s & 0x0000FF00) << 8 | (s & 0x00FF0000) >> 8;
+
+    return r;
+}
 
 uint16_t
 lendian_short(const uint16_t s)
@@ -229,6 +420,22 @@ lendian_int(const uint32_t s)
     return r;
 }
 
+uint64_t
+lendian_64(const uint64_t s)
+{
+       uint64_t r = 1;
+
+       if (*(uint8_t *)&r)
+               return s;
+
+       r = (s & 0x00000000000000FF) << 56 | (s & 0xFF00000000000000) >> 56
+            | (s & 0x000000000000FF00) << 40 | (s & 0x00FF000000000000) >> 40
+            | (s & 0x0000000000FF0000) << 24 | (s & 0x0000FF0000000000) >> 24
+            | (s & 0x00000000FF000000) << 8 | (s & 0x000000FF00000000) >> 8;
+
+       return r;
+}
+
 
 int
 check_banner(const uint8_t *buf)
@@ -307,6 +514,43 @@ read_catalogue(const uint8_t *buf)
 }
 
 
+int
+read_efi_section(const uint8_t *buf)
+{
+       unsigned char header_indicator;
+       unsigned char platform_id;
+       short count;
+
+       memcpy(&header_indicator, buf++, 1);
+       memcpy(&platform_id, buf++, 1);
+
+       memcpy(&count, buf, 2);
+       count = lendian_short(count);
+       buf += 2;
+
+       if (platform_id == 0xef)
+               return 0;
+
+       return 1;
+}
+
+int
+read_efi_catalogue(const uint8_t *buf, uint16_t *count, uint32_t *lba)
+{
+    buf += 6;
+
+    memcpy(count, buf, 2);
+    *count = lendian_short(*count);
+    buf += 2;
+
+    memcpy(lba, buf, 4);
+    *lba = lendian_int(*lba);
+    buf += 6;
+
+    return 0;
+}
+
+
 void
 display_catalogue(void)
 {
@@ -320,12 +564,11 @@ display_catalogue(void)
     printf("de_mbz2: %hu\n", de_mbz2);
 }
 
-
 int
 initialise_mbr(uint8_t *mbr)
 {
     int i = 0;
-    uint32_t psize = 0, tmp = 0;
+    uint32_t tmp = 0;
     uint8_t ptype = 0, *rbm = mbr;
     uint8_t bhead = 0, bsect = 0, bcyle = 0;
     uint8_t ehead = 0, esect = 0, ecyle = 0;
@@ -333,6 +576,11 @@ initialise_mbr(uint8_t *mbr)
     extern unsigned char isohdpfx[][MBRSIZE];
 
     memcpy(mbr, &isohdpfx[hd0 + 3 * partok], MBRSIZE);
+
+    if (mode & MAC) {
+       memcpy(mbr, afp_header, sizeof(afp_header));
+    }
+
     mbr += MBRSIZE;                                 /* offset 432 */
 
     tmp = lendian_int(de_lba * 4);
@@ -394,7 +642,6 @@ initialise_mbr(uint8_t *mbr)
     return mbr - rbm;
 }
 
-
 void
 display_mbr(const uint8_t *mbr, size_t len)
 {
@@ -424,14 +671,179 @@ display_mbr(const uint8_t *mbr, size_t len)
 }
 
 
+uint32_t chksum_crc32 (unsigned char *block, unsigned int length)
+{
+       register unsigned long crc;
+       unsigned long i;
+
+       crc = 0xFFFFFFFF;
+       for (i = 0; i < length; i++)
+       {
+               crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
+       }
+       return (crc ^ 0xFFFFFFFF);
+}
+
+void
+reverse_uuid(uuid_t uuid)
+{
+       uint8_t t, *p = (uint8_t *)uuid;
+
+       t = p[0]; p[0] = p[3]; p[3] = t;
+       t = p[1]; p[1] = p[2]; p[2] = t;
+       t = p[4]; p[4] = p[5]; p[5] = t;
+       t = p[6]; p[6] = p[7]; p[7] = t;
+}
+
+void
+initialise_gpt(uint8_t *gpt, uint32_t current, uint32_t alternate, int primary)
+{
+    struct gpt_header *header = (struct gpt_header *)gpt;
+    struct gpt_part_header *part;
+    int hole = 0;
+    int gptsize = 128 / 4 + 2;
+
+    if (mac_lba) {
+       /* 2048 bytes per partition, plus round to 2048 boundary */
+       hole = (apm_parts * 4) + 2;
+    }
+
+    if (primary) {
+       uuid_generate(disk_uuid);
+       reverse_uuid(disk_uuid);
+    }
+
+    header->signature = lendian_64(0x5452415020494645);
+    header->revision = lendian_int(0x010000);
+    header->headerSize = lendian_int(0x5c);
+    header->currentLBA = lendian_64(current);
+    header->backupLBA = lendian_64(alternate);
+    header->firstUsableLBA = lendian_64(gptsize + hole);
+    header->lastUsableLBA = lendian_64((isostat.st_size + padding)/512 -
+                                      gptsize);
+    if (primary)
+       header->partitionEntriesLBA = lendian_64(0x02 + hole);
+    else
+       header->partitionEntriesLBA = lendian_64(current - (128 / 4));
+    header->numParts = lendian_int(0x80);
+    header->sizeOfPartitionEntries = lendian_int(0x80);
+    memcpy(header->diskGUID, disk_uuid, sizeof(uuid_t));
+
+    if (primary)
+       gpt += sizeof(struct gpt_header) + hole * 512;
+    else
+       gpt -= header->sizeOfPartitionEntries * header->numParts;
+
+    part = (struct gpt_part_header *)gpt;
+    if (primary) {
+       uuid_generate(part_uuid);
+       uuid_generate(iso_uuid);
+       reverse_uuid(part_uuid);
+       reverse_uuid(iso_uuid);
+    }
+
+    memcpy(part->partGUID, iso_uuid, sizeof(uuid_t));
+    memcpy(part->partTypeGUID, basic_partition, sizeof(uuid_t));
+    part->firstLBA = lendian_64(0);
+    part->lastLBA = lendian_64(psize);
+    memcpy(part->name, "ISOHybrid ISO", 28);
+
+    gpt += sizeof(struct gpt_part_header);
+    part++;
+
+    memcpy(part->partGUID, part_uuid, sizeof(uuid_t));
+    memcpy(part->partTypeGUID, basic_partition, sizeof(uuid_t));
+    part->firstLBA = lendian_64(efi_lba * 4);
+    part->lastLBA = lendian_64(part->firstLBA + efi_count - 1);
+    memcpy(part->name, "ISOHybrid", 20);
+
+    gpt += sizeof(struct gpt_part_header);
+
+    if (mac_lba) {
+       gpt += sizeof(struct gpt_part_header);
+
+       part++;
+
+       memcpy(part->partGUID, part_uuid, sizeof(uuid_t));
+       memcpy(part->partTypeGUID, hfs_partition, sizeof(uuid_t));
+       part->firstLBA = lendian_64(mac_lba * 4);
+       part->lastLBA = lendian_64(part->firstLBA + mac_count - 1);
+       memcpy(part->name, "ISOHybrid", 20);
+
+       part--;
+    }
+
+    part--;
+
+    header->partitionEntriesCRC = lendian_int (chksum_crc32((uint8_t *)part,
+                          header->numParts * header->sizeOfPartitionEntries));
+
+    header->headerCRC = lendian_int(chksum_crc32((uint8_t *)header,
+                                                header->headerSize));
+}
+
+void
+initialise_apm(uint8_t *gpt, uint32_t start)
+{
+    struct apple_part_header *part = (struct apple_part_header *)gpt;
+
+    part->signature = bendian_short(0x504d);
+    part->map_count = bendian_int(apm_parts);
+    part->start_block = bendian_int(1);
+    part->block_count = bendian_int(0x10);
+    strcpy(part->name, "Apple");
+    strcpy(part->type, "Apple_partition_map");
+    part->data_start = bendian_int(0);
+    part->data_count = bendian_int(10);
+    part->status = bendian_int(0x03);
+
+    part = (struct apple_part_header *)(gpt + 2048);
+
+    part->signature = bendian_short(0x504d);
+    part->map_count = bendian_int(3);
+    part->start_block = bendian_int(efi_lba);
+    part->block_count = bendian_int(efi_count);
+    strcpy(part->name, "EFI");
+    strcpy(part->type, "Apple_HFS");
+    part->data_start = bendian_int(0);
+    part->data_count = bendian_int(efi_count);
+    part->status = bendian_int(0x33);
+
+    part = (struct apple_part_header *)(gpt + 4096);
+
+    if (mac_lba)
+    {
+       part->signature = bendian_short(0x504d);
+       part->map_count = bendian_int(3);
+       part->start_block = bendian_int(mac_lba);
+       part->block_count = bendian_int(mac_count);
+       strcpy(part->name, "EFI");
+       strcpy(part->type, "Apple_HFS");
+       part->data_start = bendian_int(0);
+       part->data_count = bendian_int(mac_count);
+       part->status = bendian_int(0x33);
+    } else {
+       part->signature = bendian_short(0x504d);
+       part->map_count = bendian_int(3);
+       part->start_block = bendian_int((start/2048) + 10);
+       part->block_count = bendian_int(efi_lba - start/2048 - 10);
+       strcpy(part->name, "ISO");
+       strcpy(part->type, "Apple_Free");
+       part->data_start = bendian_int(0);
+       part->data_count = bendian_int(efi_lba - start/2048 - 10);
+       part->status = bendian_int(0x01);
+    }
+}
+
 int
 main(int argc, char *argv[])
 {
     int i = 0;
     FILE *fp = NULL;
-    struct stat isostat;
     uint8_t *buf = NULL, *bufz = NULL;
-    int cylsize = 0, frac = 0, padding = 0;
+    int cylsize = 0, frac = 0;
+    size_t orig_gpt_size, free_space, gpt_size;
+    struct iso_primary_descriptor descriptor;
 
     prog = strcpy(alloca(strlen(argv[0]) + 1), argv[0]);
     i = check_option(argc, argv);
@@ -443,10 +855,21 @@ main(int argc, char *argv[])
         usage();
         return 1;
     }
+
+    if ((mode & EFI) && offset)
+       errx(1, "%s: --offset is invalid with UEFI images\n", argv[0]);
+
     srand(time(NULL) << (getppid() << getpid()));
 
     if (!(fp = fopen(argv[0], "r+")))
         err(1, "could not open file `%s'", argv[0]);
+
+    if (fseek(fp, (16 << 11), SEEK_SET))
+        err(1, "%s: seek error - 0", argv[0]);
+
+    if (fread(&descriptor, sizeof(char), sizeof(descriptor), fp) != sizeof(descriptor))
+        err(1, "%s: read error - 0", argv[0]);
+
     if (fseek(fp, 17 * 2048, SEEK_SET))
         err(1, "%s: seek error - 1", argv[0]);
 
@@ -478,6 +901,40 @@ main(int argc, char *argv[])
     if (mode & VERBOSE)
         display_catalogue();
 
+    buf += 32;
+
+    if (mode & EFI)
+    {
+       if (!read_efi_section(buf)) {
+           buf += 32;
+           if (!read_efi_catalogue(buf, &efi_count, &efi_lba) && efi_lba) {
+               offset = 1;
+               type = 0xee;
+           } else {
+               errx(1, "%s: invalid efi catalogue", argv[0]);
+           }
+       } else {
+           errx(1, "%s: unable to find efi image", argv[0]);
+       }
+    }
+
+    buf += 32;
+
+    if (mode & MAC)
+    {
+       if (!read_efi_section(buf)) {
+           buf += 32;
+           if (!read_efi_catalogue(buf, &mac_count, &mac_lba) && mac_lba) {
+               offset = 1;
+               type = 0xee;
+           } else {
+               errx(1, "%s: invalid efi catalogue", argv[0]);
+           }
+       } else {
+           errx(1, "%s: unable to find mac efi image", argv[0]);
+       }
+    }
+
     if (fseek(fp, (de_lba * 2048 + 0x40), SEEK_SET))
         err(1, "%s: seek error - 3", argv[0]);
 
@@ -494,6 +951,9 @@ main(int argc, char *argv[])
     if (stat(argv[0], &isostat))
         err(1, "%s", argv[0]);
 
+    isosize = lendian_int(descriptor.size) * lendian_short(descriptor.block_size);
+    free_space = isostat.st_size - isosize;
+
     cylsize = head * sector * 512;
     frac = isostat.st_size % cylsize;
     padding = (frac > 0) ? cylsize - frac : 0;
@@ -501,7 +961,7 @@ main(int argc, char *argv[])
     if (mode & VERBOSE)
         printf("imgsize: %zu, padding: %d\n", (size_t)isostat.st_size, padding);
 
-    cc = c = (isostat.st_size + padding) / cylsize;
+    cc = c = ( isostat.st_size + padding) / cylsize;
     if (c > 1024)
     {
         warnx("Warning: more than 1024 cylinders: %d", c);
@@ -541,6 +1001,62 @@ main(int argc, char *argv[])
     if (fwrite(buf, sizeof(char), i, fp) != (size_t)i)
         err(1, "%s: write error - 1", argv[0]);
 
+    if (efi_lba) {
+       reverse_uuid(basic_partition);
+       reverse_uuid(hfs_partition);
+
+       /* 512 byte header, 128 entries of 128 bytes */
+       orig_gpt_size = gpt_size = 512 + (128 * 128);
+
+       /* Leave space for the APM if necessary */
+       if (mac_lba)
+           gpt_size += (4 * 2048);
+
+       buf = calloc(gpt_size, sizeof(char));
+       memset(buf, 0, gpt_size);
+
+       /*
+        * We need to ensure that we have enough space for the secondary GPT.
+        * Unlike the primary, this doesn't need a hole for the APM. We still
+        * want to be 1MB aligned so just bump the padding by a megabyte.
+        */
+       if (free_space < orig_gpt_size && padding < orig_gpt_size) {
+           padding += 1024 * 1024;
+       }
+
+       /*
+        * Determine the size of the ISO filesystem. This will define the size
+        * of the partition that covers it.
+        */
+       psize = isosize / 512;
+
+       /*
+        * Primary GPT starts at sector 1, secondary GPT starts at 1 sector
+        * before the end of the image
+        */
+       initialise_gpt(buf, 1, (isostat.st_size + padding - 1024) / 512, 1);
+
+       if (fseek(fp, 512, SEEK_SET))
+           err(1, "%s: seek error - 6", argv[0]);
+
+       if (fwrite(buf, sizeof(char), gpt_size, fp) != (size_t)gpt_size)
+           err(1, "%s: write error - 2", argv[0]);
+    }
+
+    if (mac_lba)
+    {
+       /* Apple partition entries filling 2048 bytes each */
+       int apm_size = apm_parts * 2048;
+
+       buf = realloc(buf, apm_size);
+       memset(buf, 0, apm_size);
+
+       initialise_apm(buf, APM_OFFSET);
+
+       fseek(fp, APM_OFFSET, SEEK_SET);
+       fwrite(buf, sizeof(char), apm_size, fp);
+    }
+
     if (padding)
     {
         if (fsync(fileno(fp)))
@@ -550,6 +1066,30 @@ main(int argc, char *argv[])
             err(1, "%s: could not add padding bytes", argv[0]);
     }
 
+    if (efi_lba) {
+       buf = realloc(buf, orig_gpt_size);
+       memset(buf, 0, orig_gpt_size);
+
+       buf += orig_gpt_size - sizeof(struct gpt_header);
+
+       initialise_gpt(buf, (isostat.st_size + padding - 1024) / 512, 1, 0);
+
+       /* Shift back far enough to write the 128 GPT entries */
+       buf -= 128 * sizeof(struct gpt_part_header);
+
+       /*
+        * Seek far enough back that the gpt header is 512 bytes before the
+        * end of the image
+        */
+
+       if (fseek(fp, (isostat.st_size + padding) - orig_gpt_size - 512,
+                 SEEK_SET))
+           err(1, "%s: seek error - 8", argv[0]);
+
+       if (fwrite(buf, sizeof(char), orig_gpt_size, fp) != orig_gpt_size)
+           err(1, "%s: write error - 4", argv[0]);
+    }
+
     free(buf);
     fclose(fp);
 
index 826e90c..eecf1ca 100644 (file)
@@ -20,7 +20,7 @@
  *
  */
 
-#define VERSION     "0.11"
+#define VERSION     "0.12"
 #define BUFSIZE     2048
 #define MBRSIZE      432
 
index 333a2dd..9bbd7d0 100755 (executable)
@@ -256,43 +256,11 @@ close(FILE);
 
 exit 0;
 __END__
-33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53 66 51 6 57 8e dd 8e c5
-52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 2b 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9
-cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 d1 6 b4 42 eb 15 eb 0 5a
-51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66
-a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75
-9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20
-6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2
-66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8
-7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd
-13 8d 64 10 66 61 c3 e8 1e 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 d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10
-3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-*
-33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53 66 51 6 57 8e dd 8e c5
-b2 80 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 2d 6 0 0 52 b4 41 bb aa 55 31 c9 30
-f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 d3 6 b4 42 eb 15
-eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c
-b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb
-c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e
-62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66
-60 66 31 d2 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6
-66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a
-16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e 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 d a 5e ac b4 e 8a 3e 62
-4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 
-*
-33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53 66 51 6 57 8e dd 8e c5
-f6 6 17 4 4 74 2 b2 80 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 34 6 0 0 52 b4 41
+33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53
+66 51 6 57 8e dd 8e c5 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 4b 6 0 0 52 b4 41
 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6
-da 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1
+f1 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1
 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66
 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c
 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75
@@ -303,47 +271,48 @@ da 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1
 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 *
-33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6 74 26 f6 4 7f 75 21 38
-4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a 66 8b 4c 34 66 8b 5c 38
-eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 52 be 0 7c bf 0 6 b9 0 1 f3 a5
-ea 55 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10
-83 e1 1 74 b 66 c7 6 fb 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51
-f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66
-40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0
-e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f
-72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16 fc
-7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92
-f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e
-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 d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd
+33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53
+66 51 6 57 8e dd 8e c5 b2 80 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 4d 6 0 0 52
+b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66
+c7 6 f3 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7
+e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2
+66 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f
+6c 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72
+75 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53
+6a 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8
+e1 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e 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 d a 5e ac
+b4 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 0 0 0 0 
 *
-33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6 74 26 f6 4 7f 75 21 38
-4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a 66 8b 4c 34 66 8b 5c 38
-eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 b2 80 52 be 0 7c bf 0 6 b9 0
-1 f3 a5 ea 57 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55
-aa 75 10 83 e1 1 74 b 66 c7 6 fd 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1
-3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f
-82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea
-44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e
-67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66
-13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1
-88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61
-c3 e8 1e 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 d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18
-f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 66 53
+66 51 6 57 8e dd 8e c5 f6 6 17 4 4 74 2 b2 80 52 be 0 7c bf 0 6 b9 0 1 f3
+a5 ea 54 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75
+10 83 e1 1 74 b 66 c7 6 fa 6 b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b
+51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80
+0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c
+0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20
+6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16
+fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5
+92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8
+1e 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 d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb
+fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 *
-33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6 74 26 f6 4 7f 75 21 38
-4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a 66 8b 4c 34 66 8b 5c 38
-eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 f6 6 17 4 4 74 2 b2 80 52 be
-0 7c bf 0 6 b9 0 1 f3 a5 ea 5e 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13
-72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 4 7 b4 42 eb 15 eb 0 5a 51 b4
+33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6
+74 26 f6 4 7f 75 21 38 4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a
+66 8b 4c 34 66 8b 5c 38 eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 52 be
+0 7c bf 0 6 b9 0 1 f3 a5 ea 75 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13
+72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 1b 7 b4 42 eb 15 eb 0 5a 51 b4
 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66 a1 b0
 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75 9 fa
 bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20 6d 69
@@ -353,6 +322,39 @@ e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd 13 8d
 64 10 66 61 c3 e8 1e 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 d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10 3c a
 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+*
+33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6
+74 26 f6 4 7f 75 21 38 4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a
+66 8b 4c 34 66 8b 5c 38 eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 b2 80
+52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 77 6 0 0 52 b4 41 bb aa 55 31 c9 30 f6 f9
+cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 1d 7 b4 42 eb 15 eb 0 5a
+51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52 50 bb 0 7c b9 4 0 66
+a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e 40 7c fb c0 78 70 75
+9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e 75 78 2e 62 69 6e 20
+6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 2e d a 66 60 66 31 d2
+66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a 10 89 e6 66 f7 36 e8
+7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8 1 2 8a 16 f2 7b cd
+13 8d 64 10 66 61 c3 e8 1e 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 d a 5e ac b4 e 8a 3e 62 4 b3 7 cd 10
+3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+*
+33 ed 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+90 90 90 90 90 90 90 33 ed fa 8e d5 bc 0 7c fb fc 66 31 db 66 31 c9 21 f6
+74 26 f6 4 7f 75 21 38 4c 4 74 1c 66 3d 21 47 50 58 75 10 80 7c 4 ed 75 a
+66 8b 4c 34 66 8b 5c 38 eb 4 66 8b 4c 8 66 53 66 51 6 57 8e dd 8e c5 f6 6
+17 4 4 74 2 b2 80 52 be 0 7c bf 0 6 b9 0 1 f3 a5 ea 7e 6 0 0 52 b4 41 bb aa
+55 31 c9 30 f6 f9 cd 13 72 16 81 fb 55 aa 75 10 83 e1 1 74 b 66 c7 6 24 7
+b4 42 eb 15 eb 0 5a 51 b4 8 cd 13 83 e1 3f 5b 51 f b6 c6 40 50 f7 e1 53 52
+50 bb 0 7c b9 4 0 66 a1 b0 7 e8 44 0 f 82 80 0 66 40 80 c7 2 e2 f2 66 81 3e
+40 7c fb c0 78 70 75 9 fa bc ec 7b ea 44 7c 0 0 e8 83 0 69 73 6f 6c 69 6e
+75 78 2e 62 69 6e 20 6d 69 73 73 69 6e 67 20 6f 72 20 63 6f 72 72 75 70 74
+2e d a 66 60 66 31 d2 66 3 6 f8 7b 66 13 16 fc 7b 66 52 66 50 6 53 6a 1 6a
+10 89 e6 66 f7 36 e8 7b c0 e4 6 88 e1 88 c5 92 f6 36 ee 7b 88 c6 8 e1 41 b8
+1 2 8a 16 f2 7b cd 13 8d 64 10 66 61 c3 e8 1e 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 d a 5e ac b4 e 8a
+3e 62 4 b3 7 cd 10 3c a 75 f1 cd 18 f4 eb fd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 *
index 3b9c054..8a4f57e 100755 (executable)
Binary files a/utils/memdiskfind and b/utils/memdiskfind differ
index 5af9083..ae2d546 100755 (executable)
@@ -229,7 +229,7 @@ for ( $y = 0 ; $y < $ysize ; $y++ ) {
     start_new_row();
     for ( $x = 0 ; $x < $xsize ; $x++ ) {
        die "$0: Premature EOF at ($x,$y) of ($xsize,$ysize)\n"
-           if ( !defined(@pnmrgb = getrgb($form)) );
+           if ( !scalar(@pnmrgb = getrgb($form)) );
        # Convert to 6-bit representation
        $rgb = rgbconvert($pnmrgb[0], $pnmrgb[1], $pnmrgb[2], $maxmult);
        $color_count{$rgb}++;
diff --git a/version b/version
index 427de92..c85bb01 100644 (file)
--- a/version
+++ b/version
@@ -1 +1 @@
-4.04 2011
+4.05 2011
index 86f40d5..2e64b09 100644 (file)
@@ -1,6 +1,6 @@
-%define VERSION 4.04
-%define VERSION_STR "4.04"
+%define VERSION 4.05
+%define VERSION_STR "4.05"
 %define VERSION_MAJOR 4
-%define VERSION_MINOR 4
+%define VERSION_MINOR 5
 %define YEAR 2011
 %define YEAR_STR "2011"
index 6613499..3f2bd85 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
-#define VERSION 4.04
-#define VERSION_STR "4.04"
+#define VERSION 4.05
+#define VERSION_STR "4.05"
 #define VERSION_MAJOR 4
-#define VERSION_MINOR 4
+#define VERSION_MINOR 5
 #define YEAR 2011
 #define YEAR_STR "2011"
index adcb437..6200f54 100644 (file)
@@ -1,6 +1,6 @@
-VERSION := 4.04
-VERSION_STR := "4.04"
+VERSION := 4.05
+VERSION_STR := "4.05"
 VERSION_MAJOR := 4
-VERSION_MINOR := 4
+VERSION_MINOR := 5
 YEAR := 2011
 YEAR_STR := "2011"
index a67dc0d..9c82cf9 100755 (executable)
Binary files a/win32/syslinux.exe and b/win32/syslinux.exe differ
index f276085..3f34a9d 100755 (executable)
Binary files a/win64/syslinux64.exe and b/win64/syslinux64.exe differ