From f3feb9104cf0d194d6d1c3e0adbb49130aef37bd Mon Sep 17 00:00:00 2001
From: James Meyer <james.meyer@operamail.com>
Date: Sun, 16 Feb 2014 18:07:17 -0600
Subject: syslinux: 6.0.2 update binary path to /usr/bin refs #961

---
 abs/extra/syslinux/PKGBUILD                        | 218 ++++++--
 .../syslinux/syslinux-6.02-fix-bios-isolinux.patch |  12 +
 .../syslinux/syslinux-6.02-fix-chainloading.patch  |  47 ++
 .../syslinux/syslinux-6.02-fix-efi-ovmf.patch      | 621 +++++++++++++++++++++
 .../syslinux-dont-build-dos-windows-targets.patch  |  12 -
 abs/extra/syslinux/syslinux-install_update         | 126 ++---
 abs/extra/syslinux/syslinux.cfg                    |  27 +-
 abs/extra/syslinux/syslinux.install                |  42 +-
 8 files changed, 967 insertions(+), 138 deletions(-)
 create mode 100644 abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch
 create mode 100644 abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch
 create mode 100644 abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch
 delete mode 100644 abs/extra/syslinux/syslinux-dont-build-dos-windows-targets.patch

diff --git a/abs/extra/syslinux/PKGBUILD b/abs/extra/syslinux/PKGBUILD
index f8bcb92..e68cc11 100644
--- a/abs/extra/syslinux/PKGBUILD
+++ b/abs/extra/syslinux/PKGBUILD
@@ -1,51 +1,193 @@
-# $Id: PKGBUILD 155387 2012-04-03 08:18:06Z thomas $
-# Maintainer: Thomas Bächler <thomas@archlinux.org>
-# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
-
-pkgname=syslinux
-pkgver=4.05
-pkgrel=4
-arch=('i686' 'x86_64')
+# Maintainer : Tobias Powalowski <tpowa@archlinux.org>
+# Maintainer : Thomas Bächler <thomas@archlinux.org>
+# Contributor: Keshav Padram Amburay <(the ddoott ridikulus ddoott rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)>
+
+pkgname="syslinux"
+pkgver="6.02"
+pkgrel="8"
+arch=('x86_64' 'i686')
 pkgdesc="Collection of boot loaders that boot from FAT, ext2/3/4 and btrfs filesystems, from CDs and via PXE"
 url="http://syslinux.zytor.com/"
 license=('GPL2')
+options=('!makeflags' '!emptydirs')
+backup=('boot/syslinux/syslinux.cfg')
+makedepends=('python2' 'nasm' 'gnu-efi-libs')
 depends=('perl' 'glibc')
 optdepends=('perl-passwd-md5:  For md5pass'
             'perl-digest-sha1: For sha1pass'
             'mtools:           For mkdiskimage and syslinux support'
-           )
-makedepends=('nasm')
-backup=('boot/syslinux/syslinux.cfg')
-install=syslinux.install
-source=(http://www.kernel.org/pub/linux/utils/boot/syslinux/$pkgname-${pkgver}.tar.bz2
-        syslinux-dont-build-dos-windows-targets.patch
-        syslinux.cfg
-        syslinux-install_update)
-md5sums=('82299242418385da1274c9479a778cb2'
-         '1528c376e43f0eaccaa80d8ad1bc13b4'
-         '832595501944fbcabcdc1207f4724fe7'
-         '680750f73dc2e587ac567d057d485813')
+            'gptfdisk:         For GPT support'
+            'util-linux:       For isohybrid'
+            'efibootmgr:       For EFI support'
+            'dosfstools:       For EFI support')
+install="${pkgname}.install"
+source=("https://www.kernel.org/pub/linux/utils/boot/syslinux/${pkgname}-${pkgver}.tar.xz"
+        'syslinux.cfg'
+        'syslinux-install_update'
+        'syslinux-6.02-fix-chainloading.patch'
+        'syslinux-6.02-fix-bios-isolinux.patch'
+        'syslinux-6.02-fix-efi-ovmf.patch')
+prepare() {
+    
+    cd "${srcdir}/${pkgname}-${pkgver}/"
+    
+    ## Do not try to build the Windows or DOS installers and DIAG files
+    sed 's|diag libinstaller dos win32 win64 dosutil txt|libinstaller txt|g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true
+    sed 's|win32/syslinux.exe win64/syslinux64.exe||g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true
+    sed 's|dosutil/*.com dosutil/*.sys||g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true
+    sed 's|dos/syslinux.com||g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true
+    sed 's|INSTALLSUBDIRS = com32 utils dosutil|INSTALLSUBDIRS = com32 utils|g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true
+    sed 's|install -m 644 -c $(INSTALL_DIAG) $(INSTALLROOT)$(DIAGDIR)|# install -m 644 -c $(INSTALL_DIAG) $(INSTALLROOT)$(DIAGDIR)|g' -i "${srcdir}/${pkgname}-${pkgver}/Makefile" || true
+    
+    ## Fix FHS manpage path
+    sed 's|/usr/man|/usr/share/man|g' -i "${srcdir}/${pkgname}-${pkgver}/mk/syslinux.mk" || true
+    
+    # fix chainloading
+    # http://bugzilla.syslinux.org/show_bug.cgi?id=31
+    # http://www.syslinux.org/archives/2013-October/020971.html
+    patch -Np1 -i "${srcdir}/syslinux-6.02-fix-chainloading.patch"
+    
+    # fix bios booting from isohybrid
+    # http://www.syslinux.org/archives/2013-November/021189.html
+    patch -Np1 -i "${srcdir}/syslinux-6.02-fix-bios-isolinux.patch"
+
+    # fix efi booting in qemu/ovmf
+    # http://bugzilla.syslinux.org/show_bug.cgi?id=23
+    patch -Np1 -i  "${srcdir}/syslinux-6.02-fix-efi-ovmf.patch"
+    
+}
+
+_build_syslinux_bios() {
+    
+    rm -rf "${srcdir}/${pkgname}-${pkgver}-bios/" || true
+    cp -r "${srcdir}/${pkgname}-${pkgver}" "${srcdir}/${pkgname}-${pkgver}-bios"
+    cd "${srcdir}/${pkgname}-${pkgver}-bios/"
+    
+    ## Do not try to build syslinux with our default LDFLAGS, it will fail
+    unset LDFLAGS
+    make PYTHON="python2" bios
+    make PYTHON="python2" bios installer
+    
+}
+
+_build_syslinux_efi64() {
+    
+    rm -rf "${srcdir}/${pkgname}-${pkgver}-efi64/" || true
+    cp -r "${srcdir}/${pkgname}-${pkgver}" "${srcdir}/${pkgname}-${pkgver}-efi64"
+    cd "${srcdir}/${pkgname}-${pkgver}-efi64/"
+    
+    ## Unset all compiler FLAGS for efi64 build
+    unset CFLAGS
+    unset CPPFLAGS
+    unset CXXFLAGS
+    unset LDFLAGS
+    unset MAKEFLAGS
+    
+    make PYTHON="python2" efi64
+    make PYTHON="python2" efi64 installer
+    
+}
+
+_build_syslinux_efi32() {
+    
+    rm -rf "${srcdir}/${pkgname}-${pkgver}-efi32/" || true
+    cp -r "${srcdir}/${pkgname}-${pkgver}" "${srcdir}/${pkgname}-${pkgver}-efi32"
+    cd "${srcdir}/${pkgname}-${pkgver}-efi32/"
+    
+    ## Unset all compiler FLAGS for efi32 build
+    unset CFLAGS
+    unset CPPFLAGS
+    unset CXXFLAGS
+    unset LDFLAGS
+    unset MAKEFLAGS
+    
+    make PYTHON="python2" efi32
+    make PYTHON="python2" efi32 installer
+    
+}
 
 build() {
-  # Do not try to build syslinux with our default LDFLAGS, it will fail
-  unset LDFLAGS
-  cd "$srcdir"/$pkgname-${pkgver}
-  # Do not try to build the Windows or DOS installers
-  patch -p1 -i "$srcdir"/syslinux-dont-build-dos-windows-targets.patch
-  # Fix FHS manpage path
-  sed 's|/usr/man|/usr/share/man|g' -i mk/syslinux.mk
-  make
+    
+    cd "${srcdir}/${pkgname}-${pkgver}/"
+    
+    ## Build syslinux-efi
+    if [[ "${CARCH}" == "x86_64" ]]; then
+        _build_syslinux_efi64
+    fi
+    
+    if [[ "${CARCH}" == "i686" ]]; then
+        _build_syslinux_efi32
+    fi
+    
+    ## Build syslinux-bios
+    _build_syslinux_bios
+    
 }
 
-package() {
-  cd "$srcdir"/$pkgname-${pkgver}
-  make INSTALLROOT="$pkgdir" AUXDIR=/usr/lib/syslinux install
+_package_syslinux_bios() {
+    
+    cd "${srcdir}/${pkgname}-${pkgver}-bios/"
+    
+    ## Install Syslinux bios
+    make INSTALLROOT="${pkgdir}/" AUXDIR="/usr/lib/syslinux/bios/" bios install
+    
+    ## Remove syslinux.exe,syslinux64.exe,syslinux.com and dosutil dir
+    rm "${pkgdir}/usr/lib/syslinux/bios"/syslinux.{com,exe} || true
+    rm "${pkgdir}/usr/lib/syslinux/bios/syslinux64.exe" || true
+    rm -rf "${pkgdir}/usr/lib/syslinux/bios/dosutil/" || true
+    
+    ## Remove com32 and diag dirs
+    rm -rf "${pkgdir}/usr/lib/syslinux/bios/diag/" || true
+    rm -rf "${pkgdir}/usr/lib/syslinux/bios/com32/" || true
+    
+    ## Move extlinux binary to /usr/bin
+    install -d "${pkgdir}/usr/bin"
+    mv "${pkgdir}/sbin/extlinux" "${pkgdir}/usr/bin/extlinux"
+    rm -rf "${pkgdir}/sbin/"
+    
+    ## Install docs
+    install -d "${pkgdir}/usr/share/doc"
+    cp -ar "${srcdir}/${pkgname}-${pkgver}/doc" "${pkgdir}/usr/share/doc/syslinux"
+    
+    ## Install the default configuration
+    install -D -m0644 "${srcdir}/syslinux.cfg" "${pkgdir}/boot/syslinux/syslinux.cfg"
+    
+    ## Install the installation and update script
+    ## This script is maintained at git://gist.github.com/772138.git
+    ## Script not yet updated for syslinux-efi
+    install -D -m0755 "${srcdir}/syslinux-install_update" "${pkgdir}/usr/bin/syslinux-install_update"
+    
+}
 
-  # Install the default configuration
-  install -D -m644 "$srcdir"/syslinux.cfg "$pkgdir"/boot/syslinux/syslinux.cfg
-  # Install the installation and update script
-  # This script is maintained at git://gist.github.com/772138.git
-  install -D -m755 "$srcdir"/syslinux-install_update "$pkgdir"/usr/sbin/syslinux-install_update
-  # move extlinux binary to /usr/sbin
-  mv "$pkgdir"/sbin/extlinux "$pkgdir"/usr/sbin/extlinux
+_package_syslinux_efi() {
+    
+    cd "${srcdir}/${pkgname}-${pkgver}/"
+    
+    if [[ "${CARCH}" == "x86_64" ]]; then
+        cd "${srcdir}/${pkgname}-${pkgver}-efi64/"
+        make INSTALLROOT="${pkgdir}/" AUXDIR="/usr/lib/syslinux/" efi64 install
+    fi
+    
+    if [[ "${CARCH}" == "i686" ]]; then
+        cd "${srcdir}/${pkgname}-${pkgver}-efi32/"
+        make INSTALLROOT="${pkgdir}/" AUXDIR="/usr/lib/syslinux/" efi32 install
+    fi
+    
 }
+
+package() {
+    
+    cd "${srcdir}/${pkgname}-${pkgver}/"
+    
+    _package_syslinux_efi
+    
+    _package_syslinux_bios
+    
+}
+
+md5sums=('6f275813a1b08cf852e55c0a3f8fbc78'
+         '46ca150f53322ff8f1597d9a342f7e40'
+         '9376f18fa3e42fc36cffa4cff0a84c09'
+         '9dbede6b71a4de9e46aac4aad65334d7'
+         'adf71eceb4fccecd9a7efe1ab3d54918'
+         '62d22b101ef2ef53e25b4f86d9f41cb5')
diff --git a/abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch b/abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch
new file mode 100644
index 0000000..48df46f
--- /dev/null
+++ b/abs/extra/syslinux/syslinux-6.02-fix-bios-isolinux.patch
@@ -0,0 +1,12 @@
+diff --git a/core/isolinux.asm b/core/isolinux.asm
+index bd4e9556922d..c4db4133e274 100644
+--- a/core/isolinux.asm
++++ b/core/isolinux.asm
+@@ -420,7 +420,7 @@ MaxLMA		equ 384*1024		; Reasonable limit (384K)
+ 		call getlinsec
+ 		pop eax
+ 		pop cx
+-		mov dx,cx
++		movzx edx,cx
+ 		pop bp
+ 		pop bx
diff --git a/abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch b/abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch
new file mode 100644
index 0000000..6fd7ef4
--- /dev/null
+++ b/abs/extra/syslinux/syslinux-6.02-fix-chainloading.patch
@@ -0,0 +1,47 @@
+Reported-by: Dark Raven <drdarkraven at gmail.com>
+Signed-off-by: Raphael S. Carvalho <raphael.scarv at gmail.com>
+---
+ com32/lib/syslinux/disk.c |   22 ++++++++++++++--------
+ 1 files changed, 14 insertions(+), 8 deletions(-)
+
+diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c
+index 0b0c737..47ecb52 100644
+--- a/com32/lib/syslinux/disk.c
++++ b/com32/lib/syslinux/disk.c
+@@ -171,22 +171,28 @@ out:
+ static void *ebios_setup(const struct disk_info *const diskinfo, com32sys_t *inreg,
+ 			 uint64_t lba, uint8_t count, uint8_t op_code)
+ {
+-    static __lowmem struct disk_ebios_dapa dapa;
++    static struct disk_ebios_dapa *dapa = NULL;
+     void *buf;
+
++    if (!dapa) {
++	dapa = lmalloc(sizeof *dapa);
++	if (!dapa)
++	    return NULL;
++    }
++
+     buf = lmalloc(count * diskinfo->bps);
+     if (!buf)
+ 	return NULL;
+
+-    dapa.len = sizeof(dapa);
+-    dapa.count = count;
+-    dapa.off = OFFS(buf);
+-    dapa.seg = SEG(buf);
+-    dapa.lba = lba;
++    dapa->len = sizeof(*dapa);
++    dapa->count = count;
++    dapa->off = OFFS(buf);
++    dapa->seg = SEG(buf);
++    dapa->lba = lba;
+
+     inreg->eax.b[1] = op_code;
+-    inreg->esi.w[0] = OFFS(&dapa);
+-    inreg->ds = SEG(&dapa);
++    inreg->esi.w[0] = OFFS(dapa);
++    inreg->ds = SEG(dapa);
+     inreg->edx.b[0] = diskinfo->disk;
+
+     return buf;
diff --git a/abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch b/abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch
new file mode 100644
index 0000000..f33f4c1
--- /dev/null
+++ b/abs/extra/syslinux/syslinux-6.02-fix-efi-ovmf.patch
@@ -0,0 +1,621 @@
+The value of the field rva_and_sizes_nr is used by OVMF to check the
+consistency of the PE file with respect to the field optional_hdr_sz. It
+now have the right value.
+
+Signed-off-by: Celelibi <celelibi at gmail.com>
+---
+ efi/wrapper.c |  6 +++---
+ efi/wrapper.h | 28 ++++++++++++++++------------
+ 2 files changed, 19 insertions(+), 15 deletions(-)
+
+diff --git a/efi/wrapper.c b/efi/wrapper.c
+index 04c895f..ec77271 100644
+--- a/efi/wrapper.c
++++ b/efi/wrapper.c
+@@ -102,7 +102,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		e_hdr.image_sz = total_sz;
+ 		e_hdr.headers_sz = 512;
+ 		e_hdr.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
+-		e_hdr.rva_and_sizes_nr = 1;
++		e_hdr.rva_and_sizes_nr = sizeof(e_hdr.data_directory) / sizeof(__uint64_t);
+ 		fwrite(&e_hdr, sizeof(e_hdr), 1, f);
+ 	}
+ 	else if (class == ELFCLASS64) {
+@@ -130,7 +130,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		e_hdr_pe32p.image_sz = total_sz;
+ 		e_hdr_pe32p.headers_sz = 512;
+ 		e_hdr_pe32p.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
+-		e_hdr_pe32p.rva_and_sizes_nr = 1;
++		e_hdr_pe32p.rva_and_sizes_nr = sizeof(e_hdr_pe32p.data_directory) / sizeof(__uint64_t);
+ 		fwrite(&e_hdr_pe32p, sizeof(e_hdr_pe32p), 1, f);
+ 	}
+ 
+@@ -237,7 +237,7 @@ int main(int argc, char **argv)
+ 		fprintf(stderr, "Unsupported architecture\n");
+ 		exit(EXIT_FAILURE);
+ 	}
+-		
++
+ 	if (id[EI_MAG0] != ELFMAG0 ||
+ 	    id[EI_MAG1] != ELFMAG1 ||
+ 	    id[EI_MAG2] != ELFMAG2 ||
+diff --git a/efi/wrapper.h b/efi/wrapper.h
+index 4f76991..0e6b38e 100644
+--- a/efi/wrapper.h
++++ b/efi/wrapper.h
+@@ -102,12 +102,14 @@ struct extra_hdr {
+ 	__uint32_t heap_commit_sz;
+ 	__uint32_t loader_flags;
+ 	__uint32_t rva_and_sizes_nr;
+-	__uint64_t export_table;
+-	__uint64_t import_table;
+-	__uint64_t resource_table;
+-	__uint64_t exception_table;
+-	__uint64_t certification_table;
+-	__uint64_t base_relocation_table;
++	struct {
++		__uint64_t export_table;
++		__uint64_t import_table;
++		__uint64_t resource_table;
++		__uint64_t exception_table;
++		__uint64_t certification_table;
++		__uint64_t base_relocation_table;
++	} data_directory;
+ } __packed;
+ 
+ /* Extra header for PE32+ format 
+@@ -136,12 +138,14 @@ struct extra_hdr_pe32p {
+ 	__uint64_t heap_commit_sz;
+ 	__uint32_t loader_flags;
+ 	__uint32_t rva_and_sizes_nr;
+-	__uint64_t export_table;
+-	__uint64_t import_table;
+-	__uint64_t resource_table;
+-	__uint64_t exception_table;
+-	__uint64_t certification_table;
+-	__uint64_t base_relocation_table;
++	struct {
++		__uint64_t export_table;
++		__uint64_t import_table;
++		__uint64_t resource_table;
++		__uint64_t exception_table;
++		__uint64_t certification_table;
++		__uint64_t base_relocation_table;
++	} data_directory;
+ } __packed;
+ 
+ struct section {
+In the generated PE file, the section header for the .text section used
+to address more than the whole file. Starting at offset 0 (before the
+end of the headers) is illegal and is rejected by OVMF. Giving a size
+greater than the actual file size is also illegal and rejected.
+
+Moreover, the actual data inside the PE file have to be aligned to at
+least 512 bytes. Hence, .text need to be aligned as well.
+
+Signed-off-by: Celelibi <celelibi at gmail.com>
+---
+ efi/wrapper.c | 44 +++++++++++++++++++++++++-------------------
+ 1 file changed, 25 insertions(+), 19 deletions(-)
+
+diff --git a/efi/wrapper.c b/efi/wrapper.c
+index ec77271..bd2c175 100644
+--- a/efi/wrapper.c
++++ b/efi/wrapper.c
+@@ -54,11 +54,15 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 	struct coff_hdr c_hdr;
+ 	struct header hdr;
+ 	struct coff_reloc c_rel;
+-	__uint32_t total_sz = so_size;
++	__uint32_t total_sz = data_size;
+ 	__uint32_t dummy = 0;
+ 	__uint32_t hdr_sz;
+ 	__uint32_t reloc_start, reloc_end;
+ 
++	hdr_sz = 512;
++	total_sz += hdr_sz;
++	entry += hdr_sz;
++
+ 	memset(&hdr, 0, sizeof(hdr));
+ 	hdr.msdos_signature = MSDOS_SIGNATURE;
+ 
+@@ -77,11 +81,6 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 	c_hdr.nr_sections = 2;
+ 	c_hdr.nr_syms = 1;
+ 	if (class == ELFCLASS32) {
+-		hdr_sz = sizeof(o_hdr) + sizeof(t_sec) + sizeof(e_hdr) +
+-				sizeof(r_sec) + sizeof(c_hdr) + sizeof(hdr) + sizeof(c_rel)
+-				+ sizeof(dummy);
+-		total_sz += hdr_sz;
+-		entry += hdr_sz;
+ 		c_hdr.arch = IMAGE_FILE_MACHINE_I386;
+ 		c_hdr.characteristics = IMAGE_FILE_32BIT_MACHINE |
+ 			IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
+@@ -92,25 +91,20 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		o_hdr.format = PE32_FORMAT;
+ 		o_hdr.major_linker_version = 0x02;
+ 		o_hdr.minor_linker_version = 0x14;
+-		o_hdr.code_sz = total_sz;
++		o_hdr.code_sz = data_size;
+ 		o_hdr.entry_point = entry;
+ 		o_hdr.initialized_data_sz = data_size;
+ 		fwrite(&o_hdr, sizeof(o_hdr), 1, f);
+ 		memset(&e_hdr, 0, sizeof(e_hdr));
+ 		e_hdr.section_align = 4096;
+ 		e_hdr.file_align = 512;
+-		e_hdr.image_sz = total_sz;
+-		e_hdr.headers_sz = 512;
++		e_hdr.image_sz = hdr_sz + so_size;
++		e_hdr.headers_sz = hdr_sz;
+ 		e_hdr.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
+ 		e_hdr.rva_and_sizes_nr = sizeof(e_hdr.data_directory) / sizeof(__uint64_t);
+ 		fwrite(&e_hdr, sizeof(e_hdr), 1, f);
+ 	}
+ 	else if (class == ELFCLASS64) {
+-		hdr_sz = sizeof(o_hdr_pe32p) + sizeof(t_sec) + sizeof(e_hdr_pe32p) +
+-				sizeof(r_sec) + sizeof(c_hdr) + sizeof(hdr) + sizeof(c_rel)
+-				+ sizeof(dummy);
+-		total_sz += hdr_sz;
+-		entry += hdr_sz;
+ 		c_hdr.arch = IMAGE_FILE_MACHINE_X86_64;
+ 		c_hdr.characteristics = IMAGE_FILE_DEBUG_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
+ 			IMAGE_FILE_LINE_NUMBERS_STRIPPED;
+@@ -120,15 +114,15 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		o_hdr_pe32p.format = PE32P_FORMAT;
+ 		o_hdr_pe32p.major_linker_version = 0x02;
+ 		o_hdr_pe32p.minor_linker_version = 0x14;
+-		o_hdr_pe32p.code_sz = total_sz;
++		o_hdr_pe32p.code_sz = data_size;
+ 		o_hdr_pe32p.entry_point = entry;
+ 		o_hdr.initialized_data_sz = data_size;
+ 		fwrite(&o_hdr_pe32p, sizeof(o_hdr_pe32p), 1, f);
+ 		memset(&e_hdr_pe32p, 0, sizeof(e_hdr));
+ 		e_hdr_pe32p.section_align = 4096;
+ 		e_hdr_pe32p.file_align = 512;
+-		e_hdr_pe32p.image_sz = total_sz;
+-		e_hdr_pe32p.headers_sz = 512;
++		e_hdr_pe32p.image_sz = hdr_sz + so_size;
++		e_hdr_pe32p.headers_sz = hdr_sz;
+ 		e_hdr_pe32p.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
+ 		e_hdr_pe32p.rva_and_sizes_nr = sizeof(e_hdr_pe32p.data_directory) / sizeof(__uint64_t);
+ 		fwrite(&e_hdr_pe32p, sizeof(e_hdr_pe32p), 1, f);
+@@ -136,8 +130,10 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 
+ 	memset(&t_sec, 0, sizeof(t_sec));
+ 	strcpy((char *)t_sec.name, ".text");
+-	t_sec.virtual_sz = total_sz;
+-	t_sec.raw_data_sz = total_sz;
++	t_sec.virtual_sz = data_size;
++	t_sec.virtual_address = hdr_sz;
++	t_sec.raw_data_sz = t_sec.virtual_sz;
++	t_sec.raw_data = t_sec.virtual_address;
+ 	t_sec.characteristics = IMAGE_SCN_CNT_CODE |
+ 		IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE |
+ 		IMAGE_SCN_MEM_READ;
+@@ -163,6 +159,16 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 	fwrite(&c_rel, sizeof(c_rel), 1, f);
+ 	fwrite(&dummy, sizeof(dummy), 1, f);
+ 
++	/*
++	 * Add some padding to align the ELF as needed
++	 */
++	if (ftell(f) > t_sec.virtual_address) {
++		// A fseek that rewind would be a bug hard to track
++		fprintf(stderr, "PE+ headers are too large.\n");
++		exit(EXIT_FAILURE);
++	}
++
++	fseek(f, t_sec.virtual_address, SEEK_SET);
+ }
+ 
+ static void usage(char *progname)
+There is no need to have a relocation section that nothing points at.
+The image is still seen as relocatable as long as the Characteristics of
+the FileHeader do not say otherwise.
+
+Moreover, the field base_relocation_table wasn't initialized properly
+leading to unpredictable bugs.
+
+Signed-off-by: Celelibi <celelibi at gmail.com>
+---
+
+I'm not 100% positive about the uselessness of the relocation section. However:
+1) it works on my real hardware;
+2) OVMF doesn't check the section headers at all;
+3) all the docs I could find say that the section names are arbitrary;
+4) the only way to make the relocation actually happen is by setting the
+base_relocation_table field of the extra headers to point to this section;
+5) The right way to indicate the image is not relocatable would be by setting
+the characteristics IMAGE_FILE_RELOCS_STRIPPED in the coff header.
+
+Moreover, the relocation entry cannot be inserted before the end of the headers
+(512 bytes), this mean we would have to push everything a few bytes further.
+And I think it's better if it can be avoided. :)
+
+ efi/wrapper.c | 28 +++-------------------------
+ 1 file changed, 3 insertions(+), 25 deletions(-)
+
+diff --git a/efi/wrapper.c b/efi/wrapper.c
+index bd2c175..9652368 100644
+--- a/efi/wrapper.c
++++ b/efi/wrapper.c
+@@ -48,14 +48,12 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ {
+ 	struct optional_hdr o_hdr;
+ 	struct optional_hdr_pe32p o_hdr_pe32p;
+-	struct section t_sec, r_sec;
++	struct section t_sec;
+ 	struct extra_hdr e_hdr;
+ 	struct extra_hdr_pe32p e_hdr_pe32p;
+ 	struct coff_hdr c_hdr;
+ 	struct header hdr;
+-	struct coff_reloc c_rel;
+ 	__uint32_t total_sz = data_size;
+-	__uint32_t dummy = 0;
+ 	__uint32_t hdr_sz;
+ 	__uint32_t reloc_start, reloc_end;
+ 
+@@ -78,7 +76,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 	fwrite(&hdr, sizeof(hdr), 1, f);
+ 
+ 	memset(&c_hdr, 0, sizeof(c_hdr));
+-	c_hdr.nr_sections = 2;
++	c_hdr.nr_sections = 1;
+ 	c_hdr.nr_syms = 1;
+ 	if (class == ELFCLASS32) {
+ 		c_hdr.arch = IMAGE_FILE_MACHINE_I386;
+@@ -118,7 +116,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		o_hdr_pe32p.entry_point = entry;
+ 		o_hdr.initialized_data_sz = data_size;
+ 		fwrite(&o_hdr_pe32p, sizeof(o_hdr_pe32p), 1, f);
+-		memset(&e_hdr_pe32p, 0, sizeof(e_hdr));
++		memset(&e_hdr_pe32p, 0, sizeof(e_hdr_pe32p));
+ 		e_hdr_pe32p.section_align = 4096;
+ 		e_hdr_pe32p.file_align = 512;
+ 		e_hdr_pe32p.image_sz = hdr_sz + so_size;
+@@ -140,26 +138,6 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 	fwrite(&t_sec, sizeof(t_sec), 1, f);
+ 
+ 	/*
+-	 * Write our dummy relocation and reloc section.
+-	 */
+-	memset(&r_sec, 0, sizeof(r_sec));
+-	strcpy((char *)r_sec.name, ".reloc");
+-	r_sec.virtual_sz = sizeof(c_rel);
+-	r_sec.virtual_address = ftell(f) + sizeof(r_sec);
+-	r_sec.raw_data_sz = r_sec.virtual_sz;
+-	r_sec.raw_data = r_sec.virtual_address;
+-	r_sec.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA |
+-		IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_MEM_DISCARDABLE |
+-		IMAGE_SCN_MEM_READ;
+-	fwrite(&r_sec, sizeof(r_sec), 1, f);
+-
+-	memset(&c_rel, 0, sizeof(c_rel));
+-	c_rel.virtual_address = ftell(f) + sizeof(c_rel);
+-	c_rel.symtab_index = 10;
+-	fwrite(&c_rel, sizeof(c_rel), 1, f);
+-	fwrite(&dummy, sizeof(dummy), 1, f);
+-
+-	/*
+ 	 * Add some padding to align the ELF as needed
+ 	 */
+ 	if (ftell(f) > t_sec.virtual_address) {
+PE headers code_sz and image_sz indicate more or less, the size of the
+file and the size of the in-memory image. They are now given the right
+value.
+
+In the ELF format, only the program headers are reliable to determine
+the actually needed part of the file and the in-memory size.
+
+The .bss section should always be marked as NOLOAD for ld since its
+content shouldn't be included into the binary file.
+
+Signed-off-by: Celelibi <celelibi at gmail.com>
+---
+
+Again, I'm not 100% positive about the semantics of NOLOAD in a linker script.
+However I found this make things work better.
+Actually the file core/fs/fs.o have a .bss16 section that is not empty. If I
+understood correctly, only .bss can be empty in a .o. Thus ld generates the
+zeros that belong to that section in the .o. Then, when merging the section
+.bss16 into the .bss of syslinux.so, ld is forced to generate ALL the zeros
+that belong to the .bss section. Marking this section as NOLOAD make ld to
+ignore its content but still produce a PT_LOAD program header with the right
+memory size, as needed for the bss.
+
+ efi/i386/syslinux.ld   |   4 +-
+ efi/wrapper.c          | 138 +++++++++++++++----------------------------------
+ efi/x86_64/syslinux.ld |   4 +-
+ 3 files changed, 45 insertions(+), 101 deletions(-)
+
+diff --git a/efi/i386/syslinux.ld b/efi/i386/syslinux.ld
+index 523a9b9..bab3fc7 100644
+--- a/efi/i386/syslinux.ld
++++ b/efi/i386/syslinux.ld
+@@ -136,7 +136,7 @@ SECTIONS
+ 		*(.strtab)
+ 	}
+ 
+-	.bss : {
++	.bss (NOLOAD) : {
+ 		/* the EFI loader doesn't seem to like a .bss section,
+ 		   so we stick it all into .data: */
+ 		__bss_start = .;
+@@ -153,7 +153,7 @@ SECTIONS
+ 	__bss_dwords = (__bss_len + 3) >> 2;
+ 
+ 	. = ALIGN(128);
+-	
++
+ 	/* Very large objects which don't need to be zeroed */
+ 
+ 	.hugebss : {
+diff --git a/efi/wrapper.c b/efi/wrapper.c
+index 9652368..a5247ae 100644
+--- a/efi/wrapper.c
++++ b/efi/wrapper.c
+@@ -35,7 +35,7 @@ typedef Elf64_Addr Elf_Addr;
+ #endif
+ 
+ /*
+- * 'so_size' is the file size of the ELF shared object.
++ * 'so_memsz' is the size of the ELF shared object once loaded.
+  * 'data_size' is the size of initialised data in the shared object.
+  *  'class' dictates how the header is written
+  * 	For 32bit machines (class == ELFCLASS32), the optional
+@@ -44,7 +44,7 @@ typedef Elf64_Addr Elf_Addr;
+  * 	header includes PE32+header fields
+  */
+ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+-			 __uint32_t so_size, __uint8_t class)
++			 __uint32_t so_memsz, __uint8_t class)
+ {
+ 	struct optional_hdr o_hdr;
+ 	struct optional_hdr_pe32p o_hdr_pe32p;
+@@ -96,7 +96,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		memset(&e_hdr, 0, sizeof(e_hdr));
+ 		e_hdr.section_align = 4096;
+ 		e_hdr.file_align = 512;
+-		e_hdr.image_sz = hdr_sz + so_size;
++		e_hdr.image_sz = hdr_sz + so_memsz;
+ 		e_hdr.headers_sz = hdr_sz;
+ 		e_hdr.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
+ 		e_hdr.rva_and_sizes_nr = sizeof(e_hdr.data_directory) / sizeof(__uint64_t);
+@@ -119,7 +119,7 @@ static void write_header(FILE *f, __uint32_t entry, size_t data_size,
+ 		memset(&e_hdr_pe32p, 0, sizeof(e_hdr_pe32p));
+ 		e_hdr_pe32p.section_align = 4096;
+ 		e_hdr_pe32p.file_align = 512;
+-		e_hdr_pe32p.image_sz = hdr_sz + so_size;
++		e_hdr_pe32p.image_sz = hdr_sz + so_memsz;
+ 		e_hdr_pe32p.headers_sz = hdr_sz;
+ 		e_hdr_pe32p.subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
+ 		e_hdr_pe32p.rva_and_sizes_nr = sizeof(e_hdr_pe32p.data_directory) / sizeof(__uint64_t);
+@@ -157,17 +157,16 @@ static void usage(char *progname)
+ 
+ int main(int argc, char **argv)
+ {
+-	struct stat st;
+ 	Elf32_Ehdr e32_hdr;
+ 	Elf64_Ehdr e64_hdr;
+ 	__uint32_t entry;
+ 	__uint8_t class;
+-	__uint64_t shoff;
+-	__uint16_t shnum, shentsize, shstrndx;
++	__uint64_t phoff = 0;
++	__uint16_t phnum = 0, phentsize = 0;
+ 	unsigned char *id;
+ 	FILE *f_in, *f_out;
+ 	void *buf;
+-	size_t datasz, rv;
++	size_t datasz, memsz, rv;
+ 
+ 	if (argc < 3) {
+ 		usage(argv[0]);
+@@ -180,11 +179,6 @@ int main(int argc, char **argv)
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+-	if (stat(argv[1], &st) != 0) {
+-		perror("stat");
+-		exit(EXIT_FAILURE);
+-	}
+-
+ 	f_out = fopen(argv[2], "w");
+ 	if (!f_out) {
+ 		perror("fopen");
+@@ -194,15 +188,14 @@ int main(int argc, char **argv)
+ 	/*
+ 	 * Parse the ELF header and find the entry point.
+ 	 */
+- 	fread((void *)&e32_hdr, sizeof(e32_hdr), 1, f_in);
++	fread((void *)&e32_hdr, sizeof(e32_hdr), 1, f_in);
+ 	if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS32) {
+ 		id = e32_hdr.e_ident;
+ 		class = ELFCLASS32;
+ 		entry = e32_hdr.e_entry;
+-		shoff = e32_hdr.e_shoff;
+-		shnum = e32_hdr.e_shnum;
+-		shstrndx = e32_hdr.e_shstrndx;
+-		shentsize = e32_hdr.e_shentsize;
++		phoff = e32_hdr.e_phoff;
++		phnum = e32_hdr.e_phnum;
++		phentsize = e32_hdr.e_phentsize;
+ 	}
+ 	else if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS64) {
+ 		/* read the header again for x86_64 
+@@ -213,10 +206,9 @@ int main(int argc, char **argv)
+ 		fread((void *)&e64_hdr, sizeof(e64_hdr), 1, f_in);
+ 		id = e64_hdr.e_ident;
+ 		entry = e64_hdr.e_entry;
+-		shoff = e64_hdr.e_shoff;
+-		shnum = e64_hdr.e_shnum;
+-		shstrndx = e64_hdr.e_shstrndx;
+-		shentsize = e64_hdr.e_shentsize;
++		phoff = e64_hdr.e_phoff;
++		phnum = e64_hdr.e_phnum;
++		phentsize = e64_hdr.e_phentsize;
+ 	} else {
+ 		fprintf(stderr, "Unsupported architecture\n");
+ 		exit(EXIT_FAILURE);
+@@ -230,98 +222,47 @@ int main(int argc, char **argv)
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+-	if (!shoff || !shnum || (shstrndx == SHN_UNDEF)) {
+-		fprintf(stderr, "Cannot find section table\n");
++	if (!phoff || !phnum) {
++		fprintf(stderr, "Cannot find segment table\n");
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+ 	/*
+-	 * Find the beginning of the .bss section. Everything preceding
+-	 * it is copied verbatim to the output file.
++	 * Find the LOAD program header. Everything in this segment
++	 * is copied verbatim to the output file.
++	 * Although there may be several LOAD program headers, only
++	 * one is currently copied.
+ 	 */
+ 	if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS32) {
+-		const char *shstrtab, *name;
+-		Elf32_Shdr shdr;
++		Elf32_Phdr phdr;
+ 		int i;
+-		void *strtab;
+-
+-		fseek(f_in, shoff, SEEK_SET);
+-
+-		/* First find the strtab section */
+-		fseek(f_in, shstrndx * shentsize, SEEK_CUR);
+-		fread(&shdr, sizeof(shdr), 1, f_in);
+ 
+-		strtab = malloc(shdr.sh_size);
+-		if (!strtab) {
+-			fprintf(stderr, "Failed to malloc strtab\n");
+-			exit(EXIT_FAILURE);
+-		}
+-
+-		fseek(f_in, shdr.sh_offset, SEEK_SET);
+-		fread(strtab, shdr.sh_size, 1, f_in);
+-
+-		/* Now search for the .bss section */
+-		fseek(f_in, shoff, SEEK_SET);
+-		for (i = 0; i < shnum; i++) {
+-			rv = fread(&shdr, sizeof(shdr), 1, f_in);
+-			if (!rv) {
+-				fprintf(stderr, "Failed to read section table\n");
+-				exit(EXIT_FAILURE);
+-			}
++		/* Find the first LOAD program header */
++		for (i = 0; i < phnum; i++) {
++			fseek(f_in, phoff + i * phentsize, SEEK_SET);
++			fread(&phdr, sizeof(phdr), 1, f_in);
+ 
+-			name = strtab + shdr.sh_name;
+-			if (!strcmp(name, ".bss"))
++			if (phdr.p_type == PT_LOAD)
+ 				break;
+ 		}
+ 
+-		if (i == shnum) {
+-			fprintf(stderr, "Failed to find .bss section\n");
+-			exit(EXIT_FAILURE);
+-		}
+-
+-		datasz = shdr.sh_offset;
+-	}
+-	else if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS64) {
+-		const char *shstrtab, *name;
+-		Elf64_Shdr shdr;
++		datasz = phdr.p_filesz;
++		memsz = phdr.p_memsz;
++	} else if (e32_hdr.e_ident[EI_CLASS] == ELFCLASS64) {
++		Elf64_Phdr phdr;
+ 		int i;
+-		void *strtab;
+-
+-		fseek(f_in, shoff, SEEK_SET);
+ 
+-		/* First find the strtab section */
+-		fseek(f_in, shstrndx * shentsize, SEEK_CUR);
+-		fread(&shdr, sizeof(shdr), 1, f_in);
+-
+-		strtab = malloc(shdr.sh_size);
+-		if (!strtab) {
+-			fprintf(stderr, "Failed to malloc strtab\n");
+-			exit(EXIT_FAILURE);
+-		}
++		/* Find the first LOAD program header */
++		for (i = 0; i < phnum; i++) {
++			fseek(f_in, phoff + i * phentsize, SEEK_SET);
++			fread(&phdr, sizeof(phdr), 1, f_in);
+ 
+-		fseek(f_in, shdr.sh_offset, SEEK_SET);
+-		fread(strtab, shdr.sh_size, 1, f_in);
+-
+-		/* Now search for the .bss section */
+-		fseek(f_in, shoff, SEEK_SET);
+-		for (i = 0; i < shnum; i++) {
+-			rv = fread(&shdr, sizeof(shdr), 1, f_in);
+-			if (!rv) {
+-				fprintf(stderr, "Failed to read section table\n");
+-				exit(EXIT_FAILURE);
+-			}
+-
+-			name = strtab + shdr.sh_name;
+-			if (!strcmp(name, ".bss"))
++			if (phdr.p_type == PT_LOAD)
+ 				break;
+ 		}
+ 
+-		if (i == shnum) {
+-			fprintf(stderr, "Failed to find .bss section\n");
+-			exit(EXIT_FAILURE);
+-		}
+-
+-		datasz = shdr.sh_offset;
++		datasz = phdr.p_filesz;
++		memsz = phdr.p_memsz;
+ 	}
+ 
+ 	buf = malloc(datasz);
+@@ -330,7 +271,7 @@ int main(int argc, char **argv)
+ 		exit(EXIT_FAILURE);
+ 	}
+ 
+-	write_header(f_out, entry, datasz, st.st_size, class);
++	write_header(f_out, entry, datasz, memsz, class);
+ 
+ 	/* Write out the entire ELF shared object */
+ 	rewind(f_in);
+@@ -341,5 +282,8 @@ int main(int argc, char **argv)
+ 	}
+ 
+ 	fwrite(buf, datasz, rv, f_out);
++	free(buf);
++	fclose(f_out);
++	fclose(f_in);
+ 	return 0;
+ }
+diff --git a/efi/x86_64/syslinux.ld b/efi/x86_64/syslinux.ld
+index 95160bd..450641c 100644
+--- a/efi/x86_64/syslinux.ld
++++ b/efi/x86_64/syslinux.ld
+@@ -136,7 +136,7 @@ SECTIONS
+ 		*(.strtab)
+ 	}
+ 
+-	.bss : {
++	.bss (NOLOAD) : {
+ 		/* the EFI loader doesn't seem to like a .bss section,
+ 		   so we stick it all into .data: */
+ 		__bss_start = .;
+@@ -153,7 +153,7 @@ SECTIONS
+ 	__bss_dwords = (__bss_len + 3) >> 2;
+ 
+ 	. = ALIGN(128);
+-	
++
+ 	/* Very large objects which don't need to be zeroed */
+ 
+ 	.hugebss : {
diff --git a/abs/extra/syslinux/syslinux-dont-build-dos-windows-targets.patch b/abs/extra/syslinux/syslinux-dont-build-dos-windows-targets.patch
deleted file mode 100644
index 2b86ab8..0000000
--- a/abs/extra/syslinux/syslinux-dont-build-dos-windows-targets.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Nur syslinux-4.02.orig//Makefile syslinux-4.02//Makefile
---- syslinux-4.02.orig//Makefile	2010-07-21 21:33:13.000000000 +0200
-+++ syslinux-4.02//Makefile	2010-07-22 11:14:03.325522937 +0200
-@@ -54,7 +54,7 @@
- # files that depend only on the B phase, but may have to be regenerated
- # for "make installer".
- BSUBDIRS = codepage com32 lzo core memdisk modules mbr memdump gpxe sample \
--	   diag libinstaller dos win32 win64 dosutil
-+	   libinstaller
- ITARGET  =
- IOBJECTS = $(ITARGET) \
- 	utils/gethostip utils/isohybrid utils/mkdiskimage \
diff --git a/abs/extra/syslinux/syslinux-install_update b/abs/extra/syslinux/syslinux-install_update
index cd1baa5..3843b5f 100644
--- a/abs/extra/syslinux/syslinux-install_update
+++ b/abs/extra/syslinux/syslinux-install_update
@@ -1,7 +1,8 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
-# Sylinux Installer / Updater Scripts
-# Copyright (C) 2011  Matthew Gyurgyik <pyther@pyther.net>
+# Syslinux Installer / Updater Script (for BIOS only)
+# Copyright (C) 2011-2013  Matthew Gyurgyik <pyther@pyther.net>
+# Copyright (C) 2013  Keshav Padram Amburay <(the) (ddoott) (ridikulus) (ddoott) (rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)>
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -18,21 +19,24 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 #
 #-----------------
+# ChangeLog:
+# 2013-10-23 : Keshav Padram Amburay : Updated script to work with Syslinux 6.02 Arch Linux pkg
+#-----------------
 # Exit Codes:
 #   1 - get_boot_device or other function failed
 #   2 - install/update failed
 #   3 - set_active failed
 #   4 - install_mbr failed
-#
+#-----------------
+
 shopt -s nullglob
 
-libpath="/usr/lib/syslinux"
-bootpath="/boot/syslinux"
-extlinux="/usr/sbin/extlinux"
+bios_libpath="/usr/lib/syslinux/bios"
+bios_bootpath="/boot/syslinux"
+EXTLINUX="/usr/bin/extlinux"
 
-autoupdate_file=/boot/syslinux/SYSLINUX_AUTOUPDATE
-com32_files=(menu.c32 vesamenu.c32 chain.c32 hdt.c32 reboot.c32 poweroff.com)
-pciids_file=/usr/share/hwdata/pci.ids
+bios_autoupdate_file="/boot/syslinux/SYSLINUX_AUTOUPDATE"
+pciids_file="/usr/share/hwdata/pci.ids"
 
 ## Helper functions ##
 # Taken from libui-sh
@@ -120,7 +124,7 @@ usage() {
 cat << EOF
 usage: $0 options
 
-This script will install or upgrade Syslinux
+This script will install or upgrade Syslinux (for BIOS only)
 
 OPTIONS:
   -h    Show this message
@@ -133,16 +137,16 @@ OPTIONS:
  Arguments Required:
   -c    Chroot install (ex: -c /mnt)
 
-Example Usage: syslinux-install_update.sh -i -a -m (install, set boot flag, install mbr)
-               syslinux-install_update.sh -u (update)
+Example Usage: $0 -i -a -m     # (install, set boot flag, install mbr)
+               $0 -u           # (update)
 EOF
 }
 
 # Trys to find the partition that /boot resides on
 # This will either be on /boot or / (root)
 getBoot() {
-    if [[ ! -d "$bootpath" ]]; then
-        echo "Could not find $bootpath"
+    if [[ ! -d "$bios_bootpath" ]]; then
+        echo "Could not find $bios_bootpath"
         echo "Is boot mounted? Is Syslinux installed?"
         exit 1
     fi
@@ -278,9 +282,9 @@ install_mbr() {
         { echo "ABORT! MBR installation to partition ($disk)!"; exit 4;}
 
         if [[ "$ptb" = MBR ]]; then
-            mbrfile="$libpath/mbr.bin"
+            mbrfile="$bios_libpath/mbr.bin"
         elif [[ "$ptb" = GPT ]]; then
-            mbrfile="$libpath/gptmbr.bin"
+            mbrfile="$bios_libpath/gptmbr.bin"
         fi
 
         if dd bs=440 count=1 conv=notrunc if="$mbrfile" of="$disk" &> /dev/null; then
@@ -293,67 +297,53 @@ install_mbr() {
     return 0
 }
 
-_install() {
-    # Copy files to /boot
-    for file in "${com32_files[@]}"; do
-        # Symlink files even if links exist
-        if [[ "$boot" = root ]]; then
-            ln -s "${libpath#$CHROOT}/$file" "$bootpath/$file" &> /dev/null
-        elif [[ "$boot" = boot ]]; then
-            cp "$libpath/$file" "$bootpath/$file"
-        fi
-    done
+install_modules() {
+    # Copy all syslinux *.c32 modules to /boot
+    rm "$bios_bootpath"/*.c32 &> /dev/null
+    cp "$bios_libpath"/*.c32 "$bios_bootpath"/ &> /dev/null
 
-    # Copy / Symlink pci.ids if we copy the com32 module and if pci.ids exists in the FS
-    if check_is_in "hdt.c32" "${com32_files[@]}" && [[ -f $pciids_file ]]; then 
-        if [[ "$boot" = root ]]; then
-            ln -s "$pciids_file" "$bootpath/pci.ids" &> /dev/null
-        elif [[ "$boot" = boot ]]; then
-            cp "$pciids_file" "$bootpath/pci.ids" &> /dev/null
-        fi
+    # Copy / Symlink pci.ids if pci.ids exists on the FS
+    if [[ -f "$pciids_file" ]]; then
+        rm "$bios_bootpath/pci.ids" &> /dev/null
+        cp "$pciids_file" "$bios_bootpath/pci.ids" &> /dev/null
     fi
+}
 
-    if device_is_raid "$bootpart"; then
+_install() {
+    install_modules
+
+    if device_is_raid "$bootpart" ; then
         echo "Detected RAID on /boot - installing Syslinux with --raid"
-        "$extlinux" --install "$bootpath" -r > /dev/null 2>&1
+        "$EXTLINUX" --install "$bios_bootpath" --raid &> /dev/null
     else
-        "$extlinux" --install "$bootpath" > /dev/null 2>&1
+        "$EXTLINUX" --install "$bios_bootpath" &> /dev/null
     fi
 
     if (( $? )); then
-        echo "Syslinux install failed"
+        echo "Syslinux BIOS install failed"
         exit 2
     else
-        echo "Syslinux install successful"
+        echo "Syslinux BIOS install successful"
     fi
 
-    touch "$CHROOT/$autoupdate_file"
+    touch "$CHROOT/$bios_autoupdate_file"
 }
 
 update() {
-    # Update any com and c32 files in /boot
-    if [[ "$boot" = boot ]]; then
-        for file in "$bootpath"/*.{c32,com}; do
-            file=$(basename "$file")
-            cp "$libpath/$file" "$bootpath/$file" &> /dev/null
-        done
-        if [[ -f "$bootpath/pci.ids" ]]; then
-            cp "$pciids_file" "$bootpath/pci.ids" &> /dev/null
-        fi
-    fi
+    install_modules
 
-    if device_is_raid $bootpart; then
-        echo "Detected RAID on /boot - installing Syslinux with --raid"
-        "$extlinux" --update "$bootpath" -r &> /dev/null
+    if device_is_raid "$bootpart" ; then
+        echo "Detected RAID on /boot - updating Syslinux with --raid"
+        "$EXTLINUX" --update "$bios_bootpath" --raid &> /dev/null
     else
-        "$extlinux" --update "$bootpath" &> /dev/null
+        "$EXTLINUX" --update "$bios_bootpath" &> /dev/null
     fi
 
     if (($?)); then
-        echo "Syslinux update failed"
+        echo "Syslinux BIOS update failed"
         exit 2
     else
-        echo "Syslinux update successful"
+        echo "Syslinux BIOS update successful"
     fi
 }
 
@@ -388,7 +378,7 @@ while getopts "c:uihmas" opt; do
             ;;
         s)
             # If AUTOUPDATE_FILE does not exist exit the script
-            if [[ -f $autoupdate_file ]]; then
+            if [[ -f $bios_autoupdate_file ]]; then
                 UPDATE="True"
             else
                 exit 0
@@ -406,28 +396,28 @@ if [[ $USAGE ]]; then
     exit 0
 fi
 
-# Make sure only root can run our script
-if (( $(id -u) != 0 )); then
-    echo "This script must be run as root" 1>&2
-    exit 1
-fi
-
 # Display Usage Information if both Install and Update are passed
 if [[ $INSTALL && $UPDATE ]]; then
     usage
     exit 1
 fi
 
+# Make sure only root can run our script
+if (( $(id -u) != 0 )); then
+    echo "This script must be run as root" 1>&2
+    exit 1
+fi
+
 # If a chroot dir is path set variables to reflect chroot
 if [[ "$CHROOT" ]]; then
-    libpath="$CHROOT$libpath"
-    bootpath="$CHROOT$bootpath"
-    extlinux="$CHROOT$extlinux"
+    bios_libpath="$CHROOT$bios_libpath"
+    bios_bootpath="$CHROOT$bios_bootpath"
+    EXTLINUX="$CHROOT$EXTLINUX"
 fi
 
 # Exit if no /boot path exists
-if ( f=("$bootpath"/*); (( ! ${#f[@]} )) ); then
-    echo "Error: $bootpath is empty!"
+if ( f=("$bios_bootpath"/*); (( ! ${#f[@]} )) ); then
+    echo "Error: $bios_bootpath is empty!"
     echo "Is /boot mounted?"
     exit 1
 fi
diff --git a/abs/extra/syslinux/syslinux.cfg b/abs/extra/syslinux/syslinux.cfg
index 5a588f5..2b77038 100644
--- a/abs/extra/syslinux/syslinux.cfg
+++ b/abs/extra/syslinux/syslinux.cfg
@@ -7,7 +7,6 @@
 #   * chain.c32 - chainload MBRs, partition boot sectors, Windows bootloaders
 #   * hdt.c32 - hardware detection tool
 #   * reboot.c32 - reboots the system
-#   * poweroff.com - shutdown the system
 #
 # To Use: Copy the respective files from /usr/lib/syslinux to /boot/syslinux.
 # If /usr and /boot are on the same file system, symlink the files instead
@@ -50,16 +49,16 @@ MENU COLOR tabmsg       31;40   #30ffffff #00000000 std
 #-*
 
 LABEL arch
-	MENU LABEL Arch Linux
-	LINUX ../vmlinuz-linux
-	APPEND root=/dev/sda3 ro
-	INITRD ../initramfs-linux.img
+    MENU LABEL Arch Linux
+    LINUX ../vmlinuz-linux
+    APPEND root=/dev/sda3 rw
+    INITRD ../initramfs-linux.img
 
 LABEL archfallback
-	MENU LABEL Arch Linux Fallback
-	LINUX ../vmlinuz-linux
-	APPEND root=/dev/sda3 ro
-	INITRD ../initramfs-linux-fallback.img
+    MENU LABEL Arch Linux Fallback
+    LINUX ../vmlinuz-linux
+    APPEND root=/dev/sda3 rw
+    INITRD ../initramfs-linux-fallback.img
 
 #LABEL windows
 #        MENU LABEL Windows
@@ -69,11 +68,11 @@ LABEL archfallback
 LABEL hdt
         MENU LABEL HDT (Hardware Detection Tool)
         COM32 hdt.c32
- 
+
 LABEL reboot
         MENU LABEL Reboot
         COM32 reboot.c32
- 
-LABEL off
-        MENU LABEL Power Off
-        COMBOOT poweroff.com
+
+LABEL poweroff
+        MENU LABEL Poweroff
+        COM32 poweroff.c32
diff --git a/abs/extra/syslinux/syslinux.install b/abs/extra/syslinux/syslinux.install
index 0dc0ece..4bb7f85 100644
--- a/abs/extra/syslinux/syslinux.install
+++ b/abs/extra/syslinux/syslinux.install
@@ -1,13 +1,43 @@
 post_install() {
-  echo "==> If you want to use syslinux as your bootloader"
-  echo "==> edit /boot/syslinux/syslinux.cfg and run"
-  echo "==>   # /usr/sbin/syslinux-install_update -i -a -m"
-  echo "==> to install it."
+  
+  cat << EOF
+
+==> For setting up Syslinux BIOS using the syslinux-install_update script follow 
+    https://wiki.archlinux.org/index.php/Syslinux#Automatic_Install
+EOF
+  
+  ## Message specific to Syslinux 4.xx (or 5.xx) to 6.xx upgrade
+  if [ "$(vercmp $2 6.00)" -lt 0 ]; then
+    
+    cat << EOF
+
+==> If you are upgrading from Syslinux 4.xx or 5.xx, please re-install
+    (not update) Syslinux BIOS manually (not using the install script) once
+    by following https://wiki.archlinux.org/index.php/Syslinux#Manual_install
+
+==> The install script may not properly upgrade Syslinux to 6.xx version
+EOF
+    
+  fi
+  
+  cat << EOF
+
+==> For setting up Syslinux EFI follow
+    https://wiki.archlinux.org/index.php/Syslinux#UEFI_Systems
+
+==> The syslinux-install_update script does not currently support EFI install
+
+EOF
+  
 }
 
 post_upgrade() {
-  # auto-update syslinux if /boot/syslinux/SYSLINUX_AUTOUPDATE exists
-  /usr/sbin/syslinux-install_update -s
+  
+  ## auto-update syslinux if /boot/syslinux/SYSLINUX_AUTOUPDATE exists
+  /usr/bin/syslinux-install_update -s
+  
+  post_install
+  
 }
 
 # vim:set ts=2 sw=2 et:
-- 
cgit v0.12

