From 6bdab42c6f586f3ff18992cfa563877b9cfa45ef Mon Sep 17 00:00:00 2001 From: James Meyer 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 +# Contributor : Murtuza Akhtari +# Contributor: Keshav P R + +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