From 6bdab42c6f586f3ff18992cfa563877b9cfa45ef Mon Sep 17 00:00:00 2001
From: James Meyer <james.meyer@operamail.com>
Date: Tue, 7 Aug 2012 14:46:02 -0500
Subject: efibootmgr .5.4 -new

---
 abs/extra/efibootmgr/PKGBUILD                      |  52 +++++++
 .../efibootmgr/efibootmgr_after_0.5.4_git.patch    | 159 +++++++++++++++++++++
 .../efibootmgr/efibootmgr_default_to_grub2.patch   |  45 ++++++
 3 files changed, 256 insertions(+)
 create mode 100755 abs/extra/efibootmgr/PKGBUILD
 create mode 100755 abs/extra/efibootmgr/efibootmgr_after_0.5.4_git.patch
 create mode 100755 abs/extra/efibootmgr/efibootmgr_default_to_grub2.patch

diff --git a/abs/extra/efibootmgr/PKGBUILD b/abs/extra/efibootmgr/PKGBUILD
new file mode 100755
index 0000000..0fd7bb2
--- /dev/null
+++ b/abs/extra/efibootmgr/PKGBUILD
@@ -0,0 +1,52 @@
+# $Id: PKGBUILD 156423 2012-04-18 07:53:47Z tpowa $
+# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
+# Contributor : Murtuza Akhtari <inxsible at gmail dot com>
+# Contributor: Keshav P R <skodabenz at rocketmail dot com>
+
+pkgname=efibootmgr
+pkgver=0.5.4
+pkgrel=3
+pkgdesc="Tool to modify UEFI Firmware Boot Manager Variables."
+arch=('i686' 'x86_64')
+url="http://linux.dell.com/efibootmgr/"
+license=('GPL2')
+depends=('zlib' 'pciutils')
+makedepends=()
+provides=()
+options=(strip purge docs zipman !emptydirs)
+
+source=("http://linux.dell.com/efibootmgr/permalink/${pkgname}-${pkgver}.tar.gz"
+	'efibootmgr_after_0.5.4_git.patch' 
+	'efibootmgr_default_to_grub2.patch')
+
+build () {	
+	rm -rf ${srcdir}/efibootmgr-${pkgver}_build/ || true
+	
+	cp -r ${srcdir}/efibootmgr-${pkgver} ${srcdir}/efibootmgr-${pkgver}_build
+	
+	cd ${srcdir}/efibootmgr-${pkgver}_build/
+	
+	patch -Np1 -i ${srcdir}/efibootmgr_after_0.5.4_git.patch
+	patch -Np1 -i ${srcdir}/efibootmgr_default_to_grub2.patch
+	echo
+	
+	CFLAGS= make
+	echo
+	
+}
+
+
+package() {
+	
+	mkdir -p ${pkgdir}/usr/sbin/
+	mkdir -p ${pkgdir}/usr/share/man/man8/
+	
+	cd ${srcdir}/efibootmgr-${pkgver}_build/
+	
+	install -D -m755 ${srcdir}/efibootmgr-${pkgver}_build/src/efibootmgr/efibootmgr ${pkgdir}/usr/sbin/efibootmgr
+	install -D -m644 ${srcdir}/efibootmgr-${pkgver}_build/src/man/man8/efibootmgr.8 ${pkgdir}/usr/share/man/man8/efibootmgr.8
+	
+}
+md5sums=('cfcf24752d6461b73f7ba964bbf73169'
+         '29730052de0d6911457a26011f8ddb6e'
+         'b99b8f79842b96c241a0b0fcfb75c778')
diff --git a/abs/extra/efibootmgr/efibootmgr_after_0.5.4_git.patch b/abs/extra/efibootmgr/efibootmgr_after_0.5.4_git.patch
new file mode 100755
index 0000000..5b9b6f8
--- /dev/null
+++ b/abs/extra/efibootmgr/efibootmgr_after_0.5.4_git.patch
@@ -0,0 +1,159 @@
+diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c
+index 5db0d9e..199af39 100644
+--- a/src/efibootmgr/efibootmgr.c
++++ b/src/efibootmgr/efibootmgr.c
+@@ -328,6 +328,7 @@ add_to_boot_order(uint16_t num)
+ 	/* Now new_data has what we need */
+ 	memcpy(&(boot_order.Data), new_data, new_data_size);
+ 	boot_order.DataSize = new_data_size;
++	free(new_data);
+ 	return create_or_edit_variable(&boot_order);
+ }
+ 
+diff --git a/src/include/disk.h b/src/include/disk.h
+index eb93d10..8aa37d7 100644
+--- a/src/include/disk.h
++++ b/src/include/disk.h
+@@ -65,6 +65,9 @@ enum _interface_type {interface_type_unknown,
+ 		      ata, atapi, scsi, usb,
+ 		      i1394, fibre, i2o, md};
+ 
++
++unsigned int lcm(unsigned int x, unsigned int y);
++
+ int disk_get_pci(int fd,
+ 		 unsigned char *bus,
+ 		 unsigned char *device,
+diff --git a/src/lib/disk.c b/src/lib/disk.c
+index 883864f..8ad590b 100644
+--- a/src/lib/disk.c
++++ b/src/lib/disk.c
+@@ -55,7 +55,7 @@ disk_info_from_fd(int fd,
+ 		return 1;
+ 	}
+ 	major = buf.st_dev >> 8;
+-	minor = buf.st_dev && 0xFF;
++	minor = buf.st_dev & 0xFF;
+ 
+ 	/* IDE disks can have up to 64 partitions, or 6 bits worth,
+ 	 * and have one bit for the disk number.
+@@ -420,6 +420,27 @@ get_sector_size(int filedes)
+ 	return sector_size;
+ }
+ 
++/************************************************************
++ * lcm
++ * Requires:
++ * - numbers of which to find the lowest common multiple
++ * Modifies: nothing
++ * Returns:
++ *  lowest common multiple of x and y
++ ************************************************************/
++unsigned int
++lcm(unsigned int x, unsigned int y)
++{
++	unsigned int m = x, n = y, o;
++
++	while ((o = m % n)) {
++		m = n;
++		n = o;
++	}
++
++	return (x / n) * y;
++}
++
+ /**
+  * disk_get_partition_info()
+  *  @fd - open file descriptor to disk
+@@ -442,26 +463,27 @@ disk_get_partition_info (int fd,
+ 			 uint8_t *mbr_type, uint8_t *signature_type)
+ {
+ 	legacy_mbr *mbr;
+-	void *mbr_unaligned;
++	void *mbr_sector;
++	size_t mbr_size;
+ 	off_t offset;
+ 	int this_bytes_read = 0;
+ 	int gpt_invalid=0, mbr_invalid=0;
+ 	int rc=0;
+ 	int sector_size = get_sector_size(fd);
+ 
+-	if (sizeof(*mbr) != sector_size)
+-		return 1;
+-	mbr_unaligned = malloc(sizeof(*mbr)+sector_size-1);
+-	mbr = (legacy_mbr *)
+-		(((unsigned long)mbr_unaligned + sector_size - 1) &
+-		 ~(unsigned long)(sector_size-1));
+-	memset(mbr, 0, sizeof(*mbr));
++
++	mbr_size = lcm(sizeof(*mbr), sector_size);
++	if ((rc = posix_memalign(&mbr_sector, sector_size, mbr_size)) != 0)
++		goto error;
++	memset(mbr_sector, '\0', mbr_size);
++
+ 	offset = lseek(fd, 0, SEEK_SET);
+-	this_bytes_read = read(fd, mbr, sizeof(*mbr));
++	this_bytes_read = read(fd, mbr_sector, mbr_size);
+ 	if (this_bytes_read < sizeof(*mbr)) {
+ 		rc=1;
+ 		goto error_free_mbr;
+ 	}
++	mbr = (legacy_mbr *)mbr_sector;
+ 	gpt_invalid = gpt_disk_get_partition_info(fd, num,
+ 						  start, size,
+ 						  signature,
+@@ -479,7 +501,8 @@ disk_get_partition_info (int fd,
+ 		}
+ 	}
+  error_free_mbr:
+-	free(mbr_unaligned);
++	free(mbr_sector);
++ error:
+ 	return rc;
+ }
+ 
+diff --git a/src/lib/gpt.c b/src/lib/gpt.c
+index d90ddaf..83e7a94 100644
+--- a/src/lib/gpt.c
++++ b/src/lib/gpt.c
+@@ -215,26 +215,24 @@ read_lastoddsector(int fd, uint64_t lba, void *buffer, size_t count)
+ static ssize_t
+ read_lba(int fd, uint64_t lba, void *buffer, size_t bytes)
+ {
+-	int sector_size = get_sector_size(fd);
+-	off_t offset = lba * sector_size;
++        int sector_size = get_sector_size(fd);
++        off_t offset = lba * sector_size;
+         ssize_t bytesread;
+-        void *aligned;
+-        void *unaligned;
+-
+-        if (bytes % sector_size)
+-                return EINVAL;
++        void *iobuf;
++        size_t iobuf_size;
++        int rc;
+ 
+-	unaligned = malloc(bytes+sector_size-1);
+-	aligned = (void *)
+-		(((unsigned long)unaligned + sector_size - 1) &
+-		 ~(unsigned long)(sector_size-1));
+-	memset(aligned, 0, bytes);
++        iobuf_size = lcm(bytes, sector_size);
++        rc = posix_memalign(&iobuf, sector_size, iobuf_size);
++        if (rc)
++                return rc;
++        memset(iobuf, 0, bytes);
+ 
+ 
+-	lseek(fd, offset, SEEK_SET);
+-	bytesread = read(fd, aligned, bytes);
+-        memcpy(buffer, aligned, bytesread);
+-        free(unaligned);
++        lseek(fd, offset, SEEK_SET);
++        bytesread = read(fd, iobuf, iobuf_size);
++        memcpy(buffer, iobuf, bytes);
++        free(iobuf);
+ 
+         /* Kludge.  This is necessary to read/write the last
+            block of an odd-sized disk, until Linux 2.5.x kernel fixes.
diff --git a/abs/extra/efibootmgr/efibootmgr_default_to_grub2.patch b/abs/extra/efibootmgr/efibootmgr_default_to_grub2.patch
new file mode 100755
index 0000000..3520729
--- /dev/null
+++ b/abs/extra/efibootmgr/efibootmgr_default_to_grub2.patch
@@ -0,0 +1,45 @@
+diff --git a/src/efibootmgr/efibootmgr.c b/src/efibootmgr/efibootmgr.c
+index 199af39..3826e03 100644
+--- a/src/efibootmgr/efibootmgr.c
++++ b/src/efibootmgr/efibootmgr.c
+@@ -18,7 +18,7 @@
+     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ 
+ 
+-  This must tie the EFI_DEVICE_PATH to /boot/efi/elilo.efi
++  This must tie the EFI_DEVICE_PATH to /boot/efi/EFI/arch_grub/grubx64.efi
+   The  EFI_DEVICE_PATH will look something like:
+     ACPI device path, length 12 bytes
+     Hardware Device Path, PCI, length 6 bytes
+@@ -26,7 +26,7 @@
+     Media Device Path, Hard Drive, partition XX, length 30 bytes
+     Media Device Path, File Path, length ??
+     End of Hardware Device Path, length 4
+-    Arguments passed to elilo, as UCS-2 characters, length ??
++    Arguments passed to grub2, as UCS-2 characters, length ??
+ 
+ */
+ 
+@@ -780,8 +780,8 @@ usage()
+ 	printf("\t-g | --gpt            force disk with invalid PMBR to be treated as GPT\n");
+ 	printf("\t-H | --acpi_hid XXXX  set the ACPI HID (used with -i)\n");
+ 	printf("\t-i | --iface name     create a netboot entry for the named interface\n");
+-	printf("\t-l | --loader name     (defaults to \\elilo.efi)\n");
+-	printf("\t-L | --label label     Boot manager display label (defaults to \"Linux\")\n");
++	printf("\t-l | --loader name     (defaults to \\EFI\\arch_grub\\grubx64.efi)\n");
++	printf("\t-L | --label label     Boot manager display label (defaults to \"Arch Linux (GRUB2)\")\n");
+ 	printf("\t-n | --bootnext XXXX   set BootNext to XXXX (hex)\n");
+ 	printf("\t-N | --delete-bootnext delete BootNext\n");
+ 	printf("\t-o | --bootorder XXXX,YYYY,ZZZZ,...     explicitly set BootOrder (hex)\n");
+@@ -808,8 +808,8 @@ set_default_opts()
+ 	opts.active          = -1;   /* Don't set it */
+ 	opts.timeout         = -1;   /* Don't set it */
+ 	opts.edd10_devicenum = 0x80;
+-	opts.loader          = "\\elilo.efi";
+-	opts.label           = "Linux";
++	opts.loader          = "\\EFI\\arch_grub\\grubx64.efi";
++	opts.label           = "Arch Linux (GRUB2)";
+ 	opts.disk            = "/dev/sda";
+ 	opts.iface           = NULL;
+ 	opts.part            = 1;
+
-- 
cgit v0.12

