[arch-commits] Commit in (6 files)
Tobias Powalowski
tpowa at archlinux.org
Wed Sep 26 09:59:21 UTC 2012
Date: Wednesday, September 26, 2012 @ 05:59:20
Author: tpowa
Revision: 167147
newpkg: add efilinux loader to repos
Added:
efilinux-efi/
efilinux-efi/repos/
efilinux-efi/trunk/
efilinux-efi/trunk/PKGBUILD
efilinux-efi/trunk/efilinux-1.0-to-aa925098a5887.patch
efilinux-efi/trunk/efilinux-efi.install
-------------------------------------+
PKGBUILD | 48 ++
efilinux-1.0-to-aa925098a5887.patch | 604 ++++++++++++++++++++++++++++++++++
efilinux-efi.install | 23 +
3 files changed, 675 insertions(+)
Added: efilinux-efi/trunk/PKGBUILD
===================================================================
--- efilinux-efi/trunk/PKGBUILD (rev 0)
+++ efilinux-efi/trunk/PKGBUILD 2012-09-26 09:59:20 UTC (rev 167147)
@@ -0,0 +1,48 @@
+# Contributor : Keshav P R <(the.ridikulus.rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)>
+
+pkgname="efilinux-efi"
+pkgver="1.0"
+pkgrel="1"
+pkgdesc="Reference Implementation of a Linux Bootloader for UEFI Firmwares"
+url="https://github.com/mfleming/efilinux"
+arch=('any')
+license=('GPL')
+makedepends=('gnu-efi-libs')
+depends=('dosfstools' 'efibootmgr')
+conflicts=('efilinux-efi-x86_64' 'efilinux-efi-i386')
+provides=('efilinux-efi-x86_64' 'efilinux-efi-i386')
+replaces=('efilinux-efi-x86_64' 'efilinux-efi-i386')
+options=('!strip')
+install="${pkgname}.install"
+source=("http://www.kernel.org/pub/linux/utils/boot/efilinux/efilinux-${pkgver}.tar.xz"
+ 'efilinux-1.0-to-aa925098a5887.patch')
+md5sums=('090e45f839cd23b97d05d82daa54508a'
+ '89e86f90e4f284651f5509ef1a1011cf')
+
+build() {
+ if [[ "${CARCH}" != "x86_64" ]]; then
+ msg "efilinux-efi can be built only in an x86_64 system. Exiting."
+ exit 1
+ fi
+
+ cd "${srcdir}/efilinux-${pkgver}/"
+ patch -Np1 -i "${srcdir}/efilinux-1.0-to-aa925098a5887.patch"
+
+ sed 's|ARCH :=|ARCH ?=|g' -i "${srcdir}/efilinux-${pkgver}/Makefile"
+ sed 's|ARCH=|ARCH?=|g' -i "${srcdir}/efilinux-${pkgver}/Makefile"
+ sed 's|LIBDIR=|LIBDIR?=|g' -i "${srcdir}/efilinux-${pkgver}/Makefile"
+
+ cp -r "${srcdir}/efilinux-${pkgver}" "${srcdir}/efilinux-${pkgver}-x86_64"
+ cd "${srcdir}/efilinux-${pkgver}-x86_64/"
+ CFLAGS="-m64" ARCH="x86_64" LIBDIR="/usr/lib" CRT0="/usr/lib/crt0-efi-x86_64.o" LDSCRIPT="/usr/lib/elf_x86_64_efi.lds" make
+
+ cp -r "${srcdir}/efilinux-${pkgver}" "${srcdir}/efilinux-${pkgver}-i386"
+ cd "${srcdir}/efilinux-${pkgver}-i386/"
+ CFLAGS="-m32" ARCH="ia32" LIBDIR="/usr/lib32" CRT0="/usr/lib32/crt0-efi-ia32.o" LDSCRIPT="/usr/lib32/elf_ia32_efi.lds" make
+}
+
+package() {
+ install -d "${pkgdir}/usr/lib/efilinux/"
+ install -D -m0644 "${srcdir}/efilinux-${pkgver}-x86_64/efilinux.efi" "${pkgdir}/usr/lib/efilinux/efilinuxx64.efi"
+ install -D -m0644 "${srcdir}/efilinux-${pkgver}-i386/efilinux.efi" "${pkgdir}/usr/lib/efilinux/efilinuxia32.efi"
+}
Property changes on: efilinux-efi/trunk/PKGBUILD
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Added: efilinux-efi/trunk/efilinux-1.0-to-aa925098a5887.patch
===================================================================
--- efilinux-efi/trunk/efilinux-1.0-to-aa925098a5887.patch (rev 0)
+++ efilinux-efi/trunk/efilinux-1.0-to-aa925098a5887.patch 2012-09-26 09:59:20 UTC (rev 167147)
@@ -0,0 +1,604 @@
+diff --git a/Makefile b/Makefile
+index 4c7e990..a955e34 100644
+--- a/Makefile
++++ b/Makefile
+@@ -12,9 +12,6 @@
+ # copyright notice, this list of conditions and the following
+ # disclaimer in the documentation and/or other materials provided
+ # with the distribution.
+-# * Neither the name of Intel Corporation nor the names of its
+-# contributors may be used to endorse or promote products derived
+-# from this software without specific prior written permission.
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -32,7 +29,7 @@
+
+ %.efi: %.so
+ $(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
+- -j .rela -j .reloc --target=$(FORMAT) $*.so $@
++ -j .rela -j .reloc -S --target=$(FORMAT) $*.so $@
+
+ OBJCOPY=objcopy
+
+@@ -63,6 +60,9 @@ ifeq ($(ARCH),ia32)
+ CFLAGS += -m32
+ endif
+ endif
++ifeq ($(ARCH),x86_64)
++ CFLAGS += -mno-red-zone
++endif
+
+ LDFLAGS=-T $(LDSCRIPT) -Bsymbolic -shared -nostdlib -znocombreloc \
+ -L$(LIBDIR) $(CRT0)
+diff --git a/README b/README
+index b94a49f..9eae5db 100644
+--- a/README
++++ b/README
+@@ -12,7 +12,12 @@ The latest development version of efilinux can be found at,
+
+ Stable versions can be found at,
+
+- http://www.kernel.org/pub/linux/boot/efilinux/
++ http://www.kernel.org/pub/linux/utils/boot/efilinux/
+
++CONFIGURATION FILE SYNTAX
+
+-Matt Fleming <matt.fleming at linux.intel.com>
++There is no config syntax as such. A config file is a one-line file
++that contains command line parameters. See example.cfg.
++
++
++Matt Fleming <matt.fleming at intel.com>
+diff --git a/efilinux.h b/efilinux.h
+index 9ca320f..dcbcb29 100644
+--- a/efilinux.h
++++ b/efilinux.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+diff --git a/entry.c b/entry.c
+index 5e165b1..0aa6cdd 100644
+--- a/entry.c
++++ b/entry.c
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -323,7 +319,7 @@ read_config_file(EFI_LOADED_IMAGE *image, CHAR16 **options,
+ if (err != TRUE)
+ return FALSE;
+
+- err = file_open(path, &file);
++ err = file_open(image, path, &file);
+ if (err != EFI_SUCCESS)
+ return FALSE;
+
+diff --git a/example.cfg b/example.cfg
+new file mode 100644
+index 0000000..bc3f786
+--- /dev/null
++++ b/example.cfg
+@@ -0,0 +1 @@
++-f 0:\bzImage console=ttyS0 initrd=0:\initrd
+diff --git a/fs/fs.c b/fs/fs.c
+index 8a45442..36a75f8 100644
+--- a/fs/fs.c
++++ b/fs/fs.c
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -73,7 +69,7 @@ handle_to_dev(EFI_HANDLE *handle)
+ * @file: used to return a pointer to the allocated file on success
+ */
+ EFI_STATUS
+-file_open(CHAR16 *name, struct file **file)
++file_open(EFI_LOADED_IMAGE *image, CHAR16 *name, struct file **file)
+ {
+ EFI_FILE_HANDLE fh;
+ struct file *f;
+@@ -91,10 +87,19 @@ file_open(CHAR16 *name, struct file **file)
+ break;
+ }
+
+- if (!name[dev_len] || !dev_len)
+- goto notfound;
++ if (!name[dev_len] || !dev_len) {
++ dev_len = 0;
++ if (!image)
++ goto notfound;
++
++ i = handle_to_dev(image->DeviceHandle);
++ if (i < 0 || i >= nr_fs_devices)
++ goto notfound;
+
+- name[dev_len] = 0;
++ f->handle = fs_devices[i].fh;
++ goto found;
++ } else
++ name[dev_len++] = 0;
+
+ if (name[0] >= '0' && name[0] <= '9') {
+ i = Atoi(name);
+@@ -126,7 +131,7 @@ file_open(CHAR16 *name, struct file **file)
+
+ found:
+ /* Strip the device name */
+- filename = name + dev_len + 1;
++ filename = name + dev_len;
+
+ /* skip any path separators */
+ while (*filename == ':' || *filename == '\\')
+diff --git a/fs/fs.h b/fs/fs.h
+index 0f76d0c..9223b79 100644
+--- a/fs/fs.h
++++ b/fs/fs.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -98,7 +94,7 @@ file_size(struct file *f, UINT64 *size)
+ return EFI_SUCCESS;
+ }
+
+-extern EFI_STATUS file_open(CHAR16 *name, struct file **file);
++extern EFI_STATUS file_open(EFI_LOADED_IMAGE *image, CHAR16 *name, struct file **file);
+ extern EFI_STATUS file_close(struct file *f);
+
+ extern void list_boot_devices(void);
+diff --git a/loaders/bzimage/bzimage.c b/loaders/bzimage/bzimage.c
+index af73e77..efdb884 100644
+--- a/loaders/bzimage/bzimage.c
++++ b/loaders/bzimage/bzimage.c
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -54,7 +50,7 @@ struct initrd {
+ struct file *file;
+ };
+
+-static void parse_initrd(struct boot_params *buf, char *cmdline)
++static void parse_initrd(EFI_LOADED_IMAGE *image, struct boot_params *buf, char *cmdline)
+ {
+ EFI_PHYSICAL_ADDRESS addr;
+ struct initrd *initrds;
+@@ -116,7 +112,7 @@ static void parse_initrd(struct boot_params *buf, char *cmdline)
+
+ *n = '\0';
+
+- err = file_open(filename, &rdfile);
++ err = file_open(image, filename, &rdfile);
+ if (err != EFI_SUCCESS)
+ goto close_handles;
+
+@@ -167,13 +163,16 @@ close_handles:
+ * load_kernel - Load a kernel image into memory from the boot device
+ */
+ EFI_STATUS
+-load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
++load_kernel(EFI_HANDLE image, CHAR16 *name, char *_cmdline)
+ {
+ UINTN map_size, _map_size, map_key;
+ EFI_PHYSICAL_ADDRESS kernel_start, addr;
++ EFI_PHYSICAL_ADDRESS pref_address;
+ struct boot_params *boot_params;
+ EFI_MEMORY_DESCRIPTOR *map_buf;
++ EFI_LOADED_IMAGE *info = NULL;
+ struct e820_entry *e820_map;
++ UINT64 setup_sz, init_size;
+ struct boot_params *buf;
+ struct efi_info *efi;
+ UINT32 desc_version;
+@@ -181,10 +180,16 @@ load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
+ struct file *file;
+ UINTN desc_size;
+ EFI_STATUS err;
+- UINTN size = 0;
++ char *cmdline;
++ UINT64 size;
+ int i, j = 0;
+
+- err = file_open(name, &file);
++ err = handle_protocol(image, &LoadedImageProtocol, (void **)&info);
++ if (err != EFI_SUCCESS)
++ info = NULL;
++
++ err = file_open(info, name, &file);
++
+ if (err != EFI_SUCCESS)
+ goto out;
+
+@@ -193,14 +198,14 @@ load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
+ goto out;
+
+ size = 1;
+- err = file_read(file, &size, &nr_setup_secs);
++ err = file_read(file, (UINTN *)&size, &nr_setup_secs);
+ if (err != EFI_SUCCESS)
+ goto out;
+
+ nr_setup_secs++; /* Add the boot sector */
+- size = nr_setup_secs * 512;
++ setup_sz = nr_setup_secs * 512;
+
+- buf = malloc(size);
++ buf = malloc(setup_sz);
+ if (!buf)
+ goto out;
+
+@@ -208,10 +213,16 @@ load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
+ if (err != EFI_SUCCESS)
+ goto out;
+
+- err = file_read(file, &size, buf);
++ err = file_read(file, (UINTN *)&setup_sz, buf);
++ if (err != EFI_SUCCESS)
++ goto out;
++
++ err = file_size(file, &size);
+ if (err != EFI_SUCCESS)
+ goto out;
+
++ size -= setup_sz;
++
+ /* Check boot sector signature */
+ if (buf->hdr.signature != 0xAA55) {
+ Print(L"bzImage kernel corrupt");
+@@ -237,33 +248,70 @@ load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
+ goto out;
+ }
+
++ if (buf->hdr.version >= 0x20a) {
++ pref_address = buf->hdr.pref_address;
++ init_size = buf->hdr.init_size;
++ } else {
++ pref_address = 0x100000;
++
++ /*
++ * We need to account for the fact that the kernel
++ * needs room for decompression, otherwise we could
++ * end up trashing other chunks of allocated memory.
++ */
++ init_size = size * 3;
++ }
++
+ /* Don't need an allocated ID, we're a prototype */
+ buf->hdr.loader_id = 0x1;
+
+- parse_initrd(buf, cmdline);
++ /*
++ * The kernel expects cmdline to be allocated pretty low,
++ * Documentation/x86/boot.txt says,
++ *
++ * "The kernel command line can be located anywhere
++ * between the end of the setup heap and 0xA0000"
++ */
++ addr = 0xA0000;
++ err = allocate_pages(AllocateMaxAddress, EfiLoaderData,
++ EFI_SIZE_TO_PAGES(strlen(_cmdline) + 1),
++ &addr);
++ if (err != EFI_SUCCESS)
++ goto out;
++ cmdline = (char *)(UINTN)addr;
++ memcpy(cmdline, _cmdline, strlen(_cmdline) + 1);
++
++ parse_initrd(info, buf, cmdline);
+
+ buf->hdr.cmd_line_ptr = (UINT32)(UINTN)cmdline;
+
+ memset((char *)&buf->screen_info, 0x0, sizeof(buf->screen_info));
+
+- err = setup_graphics(buf);
+- if (err != EFI_SUCCESS)
+- goto out;
++ addr = pref_address;
++ err = allocate_pages(AllocateAddress, EfiLoaderData,
++ EFI_SIZE_TO_PAGES(init_size), &addr);
++ if (err != EFI_SUCCESS) {
++ /*
++ * We failed to allocate the preferred address, so
++ * just allocate some memory and hope for the best.
++ */
++ err = emalloc(init_size, buf->hdr.kernel_alignment, &addr);
++ if (err != EFI_SUCCESS)
++ goto out;
++ }
++
++ kernel_start = addr;
+
+ /*
+- * Time to allocate our memory.
+- *
+- * Because the kernel needs to decompress itself we first
+- * allocate boot_params, gdt and space for the memory map
+- * under the assumption that they'll be allocated at lower
+- * addresses than the kernel. If we dont't allocate these data
+- * structures first there is the potential for them to be
+- * trashed when the kernel is decompressed! Allocating them
+- * underneath the kernel should be safe.
+- *
+- * Max kernel size is 8MB
++ * Read the rest of the kernel image.
+ */
+- err = emalloc(16384, 1, &addr);
++ err = file_read(file, (UINTN *)&size, (void *)(UINTN)kernel_start);
++ if (err != EFI_SUCCESS)
++ goto out;
++
++ addr = 0x3fffffff;
++ err = allocate_pages(AllocateMaxAddress, EfiLoaderData,
++ EFI_SIZE_TO_PAGES(16384), &addr);
+ if (err != EFI_SUCCESS)
+ goto out;
+
+@@ -273,6 +321,20 @@ load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
+
+ /* Copy first two sectors to boot_params */
+ memcpy((char *)boot_params, (char *)buf, 2 * 512);
++ boot_params->hdr.code32_start = (UINT32)((UINT64)kernel_start);
++
++ /*
++ * Use the kernel's EFI boot stub by invoking the handover
++ * protocol.
++ */
++ if (buf->hdr.version >= 0x20b) {
++ handover_jump(image, boot_params, kernel_start);
++ goto out;
++ }
++
++ err = setup_graphics(buf);
++ if (err != EFI_SUCCESS)
++ goto out;
+
+ err = emalloc(gdt.limit, 8, (EFI_PHYSICAL_ADDRESS *)&gdt.base);
+ if (err != EFI_SUCCESS)
+@@ -312,38 +374,6 @@ again:
+ goto out;
+
+ map_buf = (EFI_MEMORY_DESCRIPTOR *)(UINTN)addr;
+- size = 0x800000;
+- err = emalloc(size, buf->hdr.kernel_alignment, &kernel_start);
+- if (err != EFI_SUCCESS)
+- goto out;
+-
+- /*
+- * If the firmware doesn't sort the memory map by increasing
+- * address it's possible that kernel_start may have been
+- * allocated below boot_params or gdt.base.
+- *
+- * Print a warning and hope for the best.
+- */
+- if (kernel_start < (UINTN)boot_params ||
+- kernel_start < (UINTN)map_buf ||
+- kernel_start < (UINTN)gdt.base)
+- Print(L"Warning: kernel_start is too low.\n");
+-
+- /*
+- * Read the rest of the kernel image.
+- */
+- err = file_read(file, &size, (void *)(UINTN)kernel_start);
+- if (err != EFI_SUCCESS)
+- goto out;
+-
+- boot_params->hdr.code32_start = (UINT32)((UINT64)kernel_start);
+-
+- /*
+- * Remember! We've already allocated map_buf with emalloc (and
+- * 'map_size' contains its size) which means that it should be
+- * positioned below our allocation for the kernel. Use that
+- * space for the memory map.
+- */
+ err = get_memory_map(&map_size, map_buf, &map_key,
+ &desc_size, &desc_version);
+ if (err != EFI_SUCCESS) {
+@@ -355,9 +385,7 @@ again:
+ * larger. 'map_size' has been updated by the
+ * call to memory_map().
+ */
+- efree(kernel_start, 0x800000);
+ efree((UINTN)map_buf, _map_size);
+- file_set_position(file, (UINT64)nr_setup_secs * 512);
+ goto again;
+ }
+ goto out;
+diff --git a/loaders/bzimage/bzimage.h b/loaders/bzimage/bzimage.h
+index 370d126..cd11fd3 100644
+--- a/loaders/bzimage/bzimage.h
++++ b/loaders/bzimage/bzimage.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -80,6 +76,9 @@ struct setup_header {
+ UINT32 payload_offset;
+ UINT32 payload_length;
+ UINT64 setup_data;
++ UINT64 pref_address;
++ UINT32 init_size;
++ UINT32 handover_offset;
+ } __attribute__((packed));
+
+ struct efi_info {
+diff --git a/loaders/bzimage/graphics.c b/loaders/bzimage/graphics.c
+index 22a4d81..b14cae1 100644
+--- a/loaders/bzimage/graphics.c
++++ b/loaders/bzimage/graphics.c
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+diff --git a/loaders/bzimage/i386.h b/loaders/bzimage/i386.h
+index 3199a02..593e2af 100644
+--- a/loaders/bzimage/i386.h
++++ b/loaders/bzimage/i386.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -46,4 +42,19 @@ static inline void kernel_jump(EFI_PHYSICAL_ADDRESS kernel_start,
+ :: "m" (boot_params), "m" (kernel_start));
+ }
+
++static inline void handover_jump(EFI_HANDLE image, struct boot_params *bp,
++ EFI_PHYSICAL_ADDRESS kernel_start)
++{
++ kernel_start += bp->hdr.handover_offset;
++
++ asm volatile ("cli \n"
++ "pushl %0 \n"
++ "pushl %1 \n"
++ "pushl %2 \n"
++ "movl %3, %%ecx \n"
++ "jmp *%%ecx \n"
++ :: "m" (bp), "m" (ST),
++ "m" (image), "m" (kernel_start));
++}
++
+ #endif /* __I386_H__ */
+diff --git a/loaders/bzimage/x86_64.h b/loaders/bzimage/x86_64.h
+index e3e7a33..b63710e 100644
+--- a/loaders/bzimage/x86_64.h
++++ b/loaders/bzimage/x86_64.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@@ -37,6 +33,7 @@
+ #define EFI_LOADER_SIGNATURE "EL64"
+
+ typedef void(*kernel_func)(void *, struct boot_params *);
++typedef void(*handover_func)(void *, EFI_SYSTEM_TABLE *, struct boot_params *);
+
+ static inline void kernel_jump(EFI_PHYSICAL_ADDRESS kernel_start,
+ struct boot_params *boot_params)
+@@ -55,4 +52,19 @@ static inline void kernel_jump(EFI_PHYSICAL_ADDRESS kernel_start,
+ kf(NULL, boot_params);
+ }
+
++static inline void handover_jump(EFI_HANDLE image, struct boot_params *bp,
++ EFI_PHYSICAL_ADDRESS kernel_start)
++{
++ UINT32 offset = bp->hdr.handover_offset;
++ handover_func hf;
++
++ asm volatile ("cli");
++
++ /* The 64-bit kernel entry is 512 bytes after the start. */
++ kernel_start += 512;
++
++ hf = (handover_func)(kernel_start + offset);
++ hf(image, ST, bp);
++}
++
+ #endif /* __X86_64_H__ */
+diff --git a/loaders/loader.h b/loaders/loader.h
+index 2a3d271..7e26eff 100644
+--- a/loaders/loader.h
++++ b/loaders/loader.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+diff --git a/malloc.c b/malloc.c
+index 8f2b18c..d10b314 100644
+--- a/malloc.c
++++ b/malloc.c
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+diff --git a/protocol.h b/protocol.h
+index 6881d70..2972d5d 100644
+--- a/protocol.h
++++ b/protocol.h
+@@ -12,10 +12,6 @@
+ * notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+- * * Neither the name of Intel Corporation nor the names of its
+- * contributors may be used to endorse or promote products
+- * derived from this software without specific prior written
+- * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Added: efilinux-efi/trunk/efilinux-efi.install
===================================================================
--- efilinux-efi/trunk/efilinux-efi.install (rev 0)
+++ efilinux-efi/trunk/efilinux-efi.install 2012-09-26 09:59:20 UTC (rev 167147)
@@ -0,0 +1,23 @@
+post_install() {
+
+ cat << EOF
+
+efilinux has been installed at /usr/lib/efilinux/*.efi
+
+Copy the efi application for your UEFI ARCH to a sub-directory of
+<EFISYS>/EFI/ and add an entry to firmware boot menu using efibootmgr
+or mactel-boot (for Macs)
+
+Usage instructions at http://thread.gmane.org/gmane.linux.kernel/1172645
+and http://article.gmane.org/gmane.linux.kernel/1175060
+
+EOF
+
+}
+
+post_upgrade() {
+
+ post_install
+
+}
+
More information about the arch-commits
mailing list