On Mon, Jan 06, 2014 at 12:01:25PM +0100, Koen Kooi wrote: > Recently grub git gained support for ARM builds (using u-boot or EFI as first > stage loader) and with 2 extra patches we get support for 64-bit ARM as well. > > Buildtested for genericarmv7a, genericarmv8 and qemux86. The genericarmv8 > build fails in do_package/strip due to a binutils problem.
Current grub_2.00.bb recipe is always failing for qemux86-64, is it the same/similar issue as genericarmv8? NOTE: Running task 16693 of 27381 (ID: 10143, /home/jenkins/oe/shr-core-branches/shr-core/meta-openembedded/meta-xfce/recipes-panel-plugins/battery/xfce4-battery-plugin_1.0.5.bb, do_package) ERROR: debugedit failed with exit code 256 (cmd was '/home/jenkins/oe/shr-core-branches/shr-core/tmp-eglibc/sysroots/x86_64-linux/usr/lib/rpm/bin/debugedit' -b '/home/jenkins/oe/shr-core-branches/shr-core/tmp-eglibc/work/x86_64-oe-linux' -d '/usr/src/debug' -i -l '/home/jenkins/oe/shr-core-branches/shr-core/tmp-eglibc/work/x86_64-oe-linux/grub/2.00-r1/debugsources.list' '/home/jenkins/oe/shr-core-branches/shr-core/tmp-eglibc/work/x86_64-oe-linux/grub/2.00-r1/package/usr/lib/grub/i386-pc/gcry_twofish.module'): /home/jenkins/oe/shr-core-branches/shr-core/tmp-eglibc/sysroots/x86_64-linux/usr/lib/rpm/bin/debugedit: elf_update: invalid section alignment ERROR: Function failed: split_and_strip_files ERROR: Logfile of failure stored in: /home/jenkins/oe/shr-core-branches/shr-core/tmp-eglibc/work/x86_64-oe-linux/grub/2.00-r1/temp/log.do_package.24947 NOTE: recipe grub-2.00-r1: task do_package: Failed ERROR: Task 10967 (/home/jenkins/oe/shr-core-branches/shr-core/openembedded-core/meta/recipes-bsp/grub/grub_2.00.bb, do_package) failed with exit code '1' > > Signed-off-by: Koen Kooi <[email protected]> > --- > meta/recipes-bsp/grub/grub-2.00/40_custom | 9 - > ...t-add-grub_fdt_create_empty_tree-function.patch | 73 +++ > .../grub/0002-arm64-add-EFI-Linux-loader.patch | 653 > +++++++++++++++++++++ > meta/recipes-bsp/grub/grub/40_custom | 9 + > meta/recipes-bsp/grub/grub_git.bb | 61 ++ > 5 files changed, 796 insertions(+), 9 deletions(-) > delete mode 100755 meta/recipes-bsp/grub/grub-2.00/40_custom > create mode 100644 > meta/recipes-bsp/grub/grub/0001-fdt-add-grub_fdt_create_empty_tree-function.patch > create mode 100644 > meta/recipes-bsp/grub/grub/0002-arm64-add-EFI-Linux-loader.patch > create mode 100755 meta/recipes-bsp/grub/grub/40_custom > create mode 100644 meta/recipes-bsp/grub/grub_git.bb > > diff --git a/meta/recipes-bsp/grub/grub-2.00/40_custom > b/meta/recipes-bsp/grub/grub-2.00/40_custom > deleted file mode 100755 > index f891b02..0000000 > --- a/meta/recipes-bsp/grub/grub-2.00/40_custom > +++ /dev/null > @@ -1,9 +0,0 @@ > -#!/bin/sh > -exec tail -n +3 $0 > -# This file provides an easy way to add custom menu entries. Simply type the > -# menu entries you want to add after this comment. Be careful not to change > -# the 'exec tail' line above. > -menuentry "Linux" { > - set root=(hd0,1) > - linux /vmlinuz root=__ROOTFS__ rw __CONSOLE__ __VIDEO_MODE__ > __VGA_MODE__ quiet > -} > diff --git > a/meta/recipes-bsp/grub/grub/0001-fdt-add-grub_fdt_create_empty_tree-function.patch > > b/meta/recipes-bsp/grub/grub/0001-fdt-add-grub_fdt_create_empty_tree-function.patch > new file mode 100644 > index 0000000..3414574 > --- /dev/null > +++ > b/meta/recipes-bsp/grub/grub/0001-fdt-add-grub_fdt_create_empty_tree-function.patch > @@ -0,0 +1,73 @@ > +From b3417ec69ff7d52379a8f2cb291dbecccdab684f Mon Sep 17 00:00:00 2001 > +From: Leif Lindholm <[email protected]> > +Date: Wed, 4 Dec 2013 13:09:21 +0000 > +Subject: [PATCH 1/2] fdt: add grub_fdt_create_empty_tree() function > + > +Signed-off-by: Leif Lindholm <[email protected]> > +--- > + grub-core/lib/fdt.c | 39 +++++++++++++++++++++++++++++++++++++++ > + include/grub/fdt.h | 1 + > + 2 files changed, 40 insertions(+) > + > +diff --git a/grub-core/lib/fdt.c b/grub-core/lib/fdt.c > +index 9f34dc7..581a118 100644 > +--- a/grub-core/lib/fdt.c > ++++ b/grub-core/lib/fdt.c > +@@ -423,3 +423,42 @@ int grub_fdt_set_prop (void *fdt, unsigned int > nodeoffset, const char *name, > + grub_memcpy (prop + 3, val, len); > + return 0; > + } > ++ > ++struct empty_tree { > ++ grub_fdt_header_t header; > ++ grub_uint64_t empty_rsvmap[2]; > ++ struct { > ++ grub_uint32_t prop_start; > ++ grub_uint8_t name[1]; > ++ grub_uint32_t prop_end; > ++ grub_uint32_t node_end; > ++ } empty_node; > ++}; > ++ > ++int > ++grub_fdt_create_empty_tree (void *fdt, unsigned int size) > ++{ > ++ struct empty_tree *et; > ++ > ++ if (size < sizeof (struct empty_tree)) > ++ return -1; > ++ > ++ grub_memset (fdt, 0, size); > ++ et = fdt; > ++ > ++ et->empty_node.node_end = grub_cpu_to_be32 (FDT_END); > ++ et->empty_node.prop_end = grub_cpu_to_be32 (FDT_END_NODE); > ++ et->empty_node.prop_start = grub_cpu_to_be32 (FDT_BEGIN_NODE); > ++ ((struct empty_tree *) fdt)->header.off_mem_rsvmap = > ++ grub_cpu_to_be32 (ALIGN_UP (sizeof (grub_fdt_header_t), 8)); > ++ > ++ grub_fdt_set_off_dt_strings (fdt, sizeof (struct empty_tree)); > ++ grub_fdt_set_off_dt_struct (fdt, sizeof (grub_fdt_header_t) + 16); > ++ grub_fdt_set_version (fdt, FDT_SUPPORTED_VERSION); > ++ grub_fdt_set_last_comp_version (fdt, FDT_SUPPORTED_VERSION); > ++ grub_fdt_set_size_dt_struct (fdt, sizeof (et->empty_node)); > ++ grub_fdt_set_totalsize (fdt, size); > ++ grub_fdt_set_magic (fdt, FDT_MAGIC); > ++ > ++ return 0; > ++} > +diff --git a/include/grub/fdt.h b/include/grub/fdt.h > +index 2ad0536..06eec19 100644 > +--- a/include/grub/fdt.h > ++++ b/include/grub/fdt.h > +@@ -82,6 +82,7 @@ typedef struct { > + #define grub_fdt_set_size_dt_struct(fdt, value) \ > + grub_fdt_set_header(fdt, size_dt_struct, value) > + > ++int grub_fdt_create_empty_tree (void *fdt, unsigned int size); > + int grub_fdt_check_header (void *fdt, unsigned int size); > + int grub_fdt_find_subnode (const void *fdt, unsigned int parentoffset, > + const char *name); > +-- > +1.8.4.2 > + > diff --git a/meta/recipes-bsp/grub/grub/0002-arm64-add-EFI-Linux-loader.patch > b/meta/recipes-bsp/grub/grub/0002-arm64-add-EFI-Linux-loader.patch > new file mode 100644 > index 0000000..4e9df62 > --- /dev/null > +++ b/meta/recipes-bsp/grub/grub/0002-arm64-add-EFI-Linux-loader.patch > @@ -0,0 +1,653 @@ > +From 55cbddc471b6caf27355ce93d1534d894e6ed0bb Mon Sep 17 00:00:00 2001 > +From: Leif Lindholm <[email protected]> > +Date: Wed, 4 Dec 2013 15:21:16 +0000 > +Subject: [PATCH 2/2] arm64: add EFI Linux loader > + > +Signed-off-by: Leif Lindholm <[email protected]> > +--- > + grub-core/Makefile.core.def | 4 +- > + grub-core/loader/arm64/linux.c | 252 ++++++++++++++++++++++++++++++++++ > + grub-core/loader/arm64/linuxefi.c | 279 > ++++++++++++++++++++++++++++++++++++++ > + include/grub/arm64/linux.h | 54 ++++++++ > + include/grub/efi/api.h | 4 + > + 5 files changed, 592 insertions(+), 1 deletion(-) > + create mode 100644 grub-core/loader/arm64/linux.c > + create mode 100644 grub-core/loader/arm64/linuxefi.c > + create mode 100644 include/grub/arm64/linux.h > + > +diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def > +index 060de44..7cf91a6 100644 > +--- a/grub-core/Makefile.core.def > ++++ b/grub-core/Makefile.core.def > +@@ -1663,7 +1663,9 @@ module = { > + sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c; > + ia64_efi = loader/ia64/efi/linux.c; > + arm = loader/arm/linux.c; > +- arm = lib/fdt.c; > ++ arm64 = loader/arm64/linux.c; > ++ arm64 = loader/arm64/linuxefi.c; > ++ fdt = lib/fdt.c; > + common = loader/linux.c; > + common = lib/cmdline.c; > + enable = noemu; > +diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c > +new file mode 100644 > +index 0000000..38821c9 > +--- /dev/null > ++++ b/grub-core/loader/arm64/linux.c > +@@ -0,0 +1,252 @@ > ++/* Helper functions for the generic UEFI Linux loader */ > ++/* > ++ * GRUB -- GRand Unified Bootloader > ++ * Copyright (C) 2013 Free Software Foundation, Inc. > ++ * > ++ * GRUB 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, either version 3 of the License, or > ++ * (at your option) any later version. > ++ * > ++ * GRUB is distributed in the hope that it will be useful, > ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of > ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > ++ * GNU General Public License for more details. > ++ * > ++ * You should have received a copy of the GNU General Public License > ++ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > ++ */ > ++ > ++#include <grub/command.h> > ++#include <grub/err.h> > ++#include <grub/file.h> > ++#include <grub/fdt.h> > ++#include <grub/mm.h> > ++#include <grub/cpu/linux.h> > ++#include <grub/efi/efi.h> > ++ > ++static grub_efi_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID; > ++ > ++static int chosen; > ++ > ++static grub_addr_t initrd_start; > ++static grub_addr_t initrd_end; > ++ > ++static void * fw_fdt; > ++static void * fdt; > ++ > ++static char *linux_args; > ++ > ++static void > ++get_fdt (void) > ++{ > ++ grub_efi_configuration_table_t * tables; > ++ unsigned int i; > ++ int size; > ++ > ++ /* If already loaded, just return address. */ > ++ if (fdt) > ++ return; > ++ > ++ tables = grub_efi_system_table->configuration_table; > ++ > ++ if (!fw_fdt) > ++ /* Look for FDT in UEFI config tables. */ > ++ for (i=0; i < grub_efi_system_table->num_table_entries; i++) > ++ if (grub_memcmp (&tables[i].vendor_guid, &fdt_guid, sizeof (fdt_guid)) > ++ == 0) > ++ { > ++ fw_fdt = tables[i].vendor_table; > ++ grub_dprintf("linux", "found registered FDT @ 0x%p\n", fw_fdt); > ++ break; > ++ } > ++ > ++ size = fw_fdt ? grub_fdt_get_totalsize (fw_fdt) : 0; > ++ size += grub_strlen (linux_args) + 0x400; > ++ > ++ grub_dprintf("linux", "allocating %d bytes for fdt\n", size); > ++ fdt = grub_malloc (size); > ++ if (!fdt) > ++ return; > ++ > ++ if (fw_fdt) > ++ { > ++ grub_memmove (fdt, fw_fdt, size); > ++ grub_fdt_set_totalsize (fdt, size); > ++ } > ++ else > ++ { > ++ grub_fdt_create_empty_tree (fdt, size); > ++ } > ++} > ++ > ++static int > ++get_chosen (void) > ++{ > ++ chosen = grub_fdt_find_subnode (fdt, 0, "chosen"); > ++ grub_printf("chosen: 0x%08x\n", chosen); > ++ if (chosen < 0) > ++ { > ++ grub_dprintf ("linux", "No 'chosen' node in FDT - creating.\n"); > ++ chosen = grub_fdt_add_subnode (fdt, 0, "chosen"); > ++ if (chosen < 0) > ++ return 0; > ++ grub_printf("chosen=0x%08x\n", chosen); > ++ } > ++ > ++ return chosen; > ++} > ++ > ++ > ++grub_err_t > ++grub_linux_init_params (void) > ++{ > ++ return GRUB_ERR_NONE; > ++} > ++ > ++grub_err_t > ++grub_linux_check_kernel (struct linux_kernel_header *lh) > ++{ > ++ if (lh->magic != GRUB_LINUX_MAGIC) > ++ return GRUB_ERR_BAD_OS; > ++ > ++ if ((lh->code0 & 0xffff) == 0x5A4D) > ++ grub_dprintf ("linux", "UEFI stub kernel\n"); > ++ else > ++ grub_dprintf ("linux", "Plain Image kernel\n"); > ++ > ++ return GRUB_ERR_NONE; > ++} > ++ > ++grub_err_t > ++grub_linux_register_cmdline (void * addr) > ++{ > ++ linux_args = addr; > ++ > ++ return GRUB_ERR_NONE; > ++} > ++ > ++grub_err_t > ++grub_linux_register_initrd (void * addr, grub_size_t size) > ++{ > ++ initrd_start = (grub_addr_t) addr; > ++ initrd_end = initrd_start + size; > ++ > ++ return GRUB_ERR_NONE; > ++} > ++ > ++grub_err_t > ++grub_linux_finalize_params (void) > ++{ > ++ grub_efi_boot_services_t *b; > ++ grub_efi_status_t status; > ++ int node, retval; > ++ > ++ get_fdt(); > ++ if (!fdt) > ++ goto failure; > ++ > ++ node = get_chosen(); > ++ if (node < 1) > ++ goto failure; > ++ > ++ /* Generate and set command line */ > ++ retval = grub_fdt_set_prop (fdt, node, "bootargs", linux_args, > ++ grub_strlen (linux_args) + 1); > ++ if (retval) > ++ { > ++ grub_dprintf("linux", "failed to set command line\n"); > ++ goto failure; > ++ } > ++ > ++ grub_dprintf ("linux", "linux command line: '%s'\n", linux_args); > ++ > ++ b = grub_efi_system_table->boot_services; > ++ status = b->install_configuration_table (&fdt_guid, fdt); > ++ if (status != GRUB_EFI_SUCCESS) > ++ return GRUB_ERR_BAD_OS; > ++ > ++ grub_dprintf ("linux", "Installed/updated FDT configuration table!\n"); > ++ grub_dprintf ("linux", " @ %p\n", fdt); > ++ > ++ return GRUB_ERR_NONE; > ++ > ++ failure: > ++ return GRUB_ERR_BAD_OS; > ++} > ++ > ++static void * > ++load_dtb (const char * filename) > ++{ > ++ grub_file_t dtb; > ++ void * tmp_fdt; > ++ int size; > ++ > ++ tmp_fdt = NULL; > ++ dtb = grub_file_open (filename); > ++ if (!dtb) > ++ { > ++ grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("failed to open file")); > ++ return NULL; > ++ } > ++ > ++ size = grub_file_size (dtb); > ++ if (size == 0) > ++ goto out; > ++ > ++ tmp_fdt = grub_malloc (size); > ++ if (!tmp_fdt) > ++ goto out; > ++ > ++ if (grub_file_read (dtb, tmp_fdt, size) != size) > ++ { > ++ grub_free (tmp_fdt); > ++ return NULL; > ++ } > ++ > ++ if (grub_fdt_check_header (tmp_fdt, size) != 0) > ++ { > ++ grub_free (tmp_fdt); > ++ return NULL; > ++ } > ++ > ++ out: > ++ grub_file_close (dtb); > ++ return tmp_fdt; > ++} > ++ > ++static grub_err_t > ++grub_cmd_devicetree (grub_command_t cmd __attribute__ ((unused)), > ++ int argc, char *argv[]) > ++{ > ++ void *blob; > ++ > ++ if (argc != 1) > ++ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); > ++ > ++ grub_free(fdt); > ++ > ++ blob = load_dtb (argv[0]); > ++ if (!blob) > ++ return GRUB_ERR_FILE_NOT_FOUND; > ++ > ++ fw_fdt = blob; > ++ > ++ return GRUB_ERR_NONE; > ++} > ++ > ++static grub_command_t cmd_devicetree; > ++ > ++void > ++grub_efi_linux_arch_register_commands (void) > ++{ > ++ cmd_devicetree = > ++ grub_register_command ("devicetree", grub_cmd_devicetree, 0, > ++ N_("Load DTB file.")); > ++} > ++ > ++void > ++grub_efi_linux_arch_unregister_commands (void) > ++{ > ++ grub_unregister_command (cmd_devicetree); > ++} > +diff --git a/grub-core/loader/arm64/linuxefi.c > b/grub-core/loader/arm64/linuxefi.c > +new file mode 100644 > +index 0000000..71d11f4 > +--- /dev/null > ++++ b/grub-core/loader/arm64/linuxefi.c > +@@ -0,0 +1,279 @@ > ++/* > ++ * GRUB -- GRand Unified Bootloader > ++ * Copyright (C) 2013 Free Software Foundation, Inc. > ++ * > ++ * GRUB 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, either version 3 of the License, or > ++ * (at your option) any later version. > ++ * > ++ * GRUB is distributed in the hope that it will be useful, > ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of > ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > ++ * GNU General Public License for more details. > ++ * > ++ * You should have received a copy of the GNU General Public License > ++ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > ++ */ > ++ > ++#include <grub/loader.h> > ++#include <grub/file.h> > ++#include <grub/err.h> > ++#include <grub/types.h> > ++#include <grub/mm.h> > ++#include <grub/cpu/linux.h> > ++#include <grub/command.h> > ++#include <grub/i18n.h> > ++#include <grub/lib/cmdline.h> > ++#include <grub/efi/efi.h> > ++#include <grub/efi/pe32.h> > ++ > ++GRUB_MOD_LICENSE ("GPLv3+"); > ++ > ++static grub_dl_t my_mod; > ++static int loaded; > ++static void *kernel_mem; > ++static grub_uint64_t kernel_size; > ++static void *initrd_mem; > ++static grub_uint32_t initrd_size; > ++static char *linux_cmdline; > ++ > ++static grub_uint32_t cmdline_size; > ++ > ++#define GRUB_EFI_PAGE_SHIFT 12 > ++#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) > ++ > ++typedef void (* handover_func) (grub_efi_handle_t, grub_efi_system_table_t > *, void *); > ++ > ++static grub_err_t > ++grub_linuxefi_boot (void) > ++{ > ++ handover_func hf; > ++ struct linux_kernel_header *lh = kernel_mem; > ++ struct grub_pe32_optional_header *oh; > ++ grub_err_t retval; > ++ > ++ retval = grub_linux_finalize_params(); > ++ if (retval != GRUB_ERR_NONE) > ++ return retval; > ++ > ++ grub_printf ("PE/COFF header @ %08x\n", lh->hdr_offset); > ++ oh = (void *) ((grub_addr_t) kernel_mem + sizeof ("PE\0") + lh->hdr_offset > ++ + sizeof (struct grub_pe32_coff_header)); > ++ > ++ grub_printf ("Entry point: 0x%08x\n", oh->entry_addr); > ++ hf = (handover_func) ((char *) kernel_mem + oh->entry_addr); > ++ grub_printf ("hf: %p\n", (void *) hf); > ++ grub_printf("grub_efi_image_handle: %p\n", grub_efi_image_handle); > ++ grub_printf("grub_efi_system_table: %p\n", grub_efi_system_table); > ++ > ++ hf (grub_efi_image_handle, grub_efi_system_table, > grub_linux_get_params()); > ++ > ++ grub_printf("holy shit!\n"); > ++ > ++ /* Not reached */ > ++ return GRUB_ERR_NONE; > ++} > ++ > ++static grub_err_t > ++grub_linuxefi_unload (void) > ++{ > ++ grub_dl_unref (my_mod); > ++ loaded = 0; > ++ if (initrd_mem) > ++ grub_efi_free_pages((grub_efi_physical_address_t)initrd_mem, > ++ BYTES_TO_PAGES(initrd_size)); > ++ if (kernel_mem) > ++ grub_efi_free_pages((grub_efi_physical_address_t)kernel_mem, > ++ BYTES_TO_PAGES(kernel_size)); > ++ return GRUB_ERR_NONE; > ++} > ++ > ++static grub_err_t > ++grub_cmd_initrdefi (grub_command_t cmd __attribute__ ((unused)), > ++ int argc, char *argv[]) > ++{ > ++ grub_file_t *files = 0; > ++ int i, nfiles = 0; > ++ grub_size_t size = 0; > ++ grub_uint8_t *ptr; > ++ > ++ if (argc == 0) > ++ { > ++ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); > ++ goto fail; > ++ } > ++ > ++ if (!loaded) > ++ { > ++ grub_error (GRUB_ERR_BAD_ARGUMENT, > ++ N_("you need to load the kernel first")); > ++ goto fail; > ++ } > ++ > ++ files = grub_zalloc (argc * sizeof (files[0])); > ++ if (!files) > ++ goto fail; > ++ > ++ for (i = 0; i < argc; i++) > ++ { > ++ grub_file_filter_disable_compression (); > ++ files[i] = grub_file_open (argv[i]); > ++ if (! files[i]) > ++ goto fail; > ++ nfiles++; > ++ size += ALIGN_UP (grub_file_size (files[i]), 4); > ++ } > ++ > ++ initrd_mem = grub_efi_allocate_pages (0, BYTES_TO_PAGES(size)); > ++ > ++ if (!initrd_mem) > ++ { > ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate initrd")); > ++ goto fail; > ++ } > ++ > ++ grub_linux_register_initrd (initrd_mem, size); > ++ > ++ ptr = initrd_mem; > ++ > ++ for (i = 0; i < nfiles; i++) > ++ { > ++ grub_ssize_t cursize = grub_file_size (files[i]); > ++ if (grub_file_read (files[i], ptr, cursize) != cursize) > ++ { > ++ if (!grub_errno) > ++ grub_error (GRUB_ERR_FILE_READ_ERROR, > ++ N_("premature end of file %s"), argv[i]); > ++ goto fail; > ++ } > ++ ptr += cursize; > ++ grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4)); > ++ ptr += ALIGN_UP_OVERHEAD (cursize, 4); > ++ } > ++ > ++ fail: > ++ for (i = 0; i < nfiles; i++) > ++ grub_file_close (files[i]); > ++ grub_free (files); > ++ > ++ if (initrd_mem && grub_errno) > ++ grub_efi_free_pages((grub_efi_physical_address_t) initrd_mem, > ++ BYTES_TO_PAGES(size)); > ++ > ++ return grub_errno; > ++} > ++ > ++static grub_err_t > ++grub_cmd_linuxefi (grub_command_t cmd __attribute__ ((unused)), > ++ int argc, char *argv[]) > ++{ > ++ grub_file_t file = 0; > ++ struct linux_kernel_header *lh; > ++ grub_ssize_t filelen; > ++ > ++ grub_dl_ref (my_mod); > ++ > ++ if (argc == 0) > ++ { > ++ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); > ++ goto fail; > ++ } > ++ > ++ file = grub_file_open (argv[0]); > ++ if (! file) > ++ goto fail; > ++ > ++ filelen = grub_file_size (file); > ++ > ++ grub_printf ("kernel file size: %lld\n", (long long) filelen); > ++ kernel_mem = grub_efi_allocate_pages (0, BYTES_TO_PAGES(filelen)); > ++ grub_printf ("kernel numpages: %lld\n", (long long) > BYTES_TO_PAGES(filelen)); > ++ if (!kernel_mem) > ++ { > ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate kernel")); > ++ goto fail; > ++ } > ++ > ++ if (grub_file_read (file, kernel_mem, filelen) != filelen) > ++ { > ++ grub_error (GRUB_ERR_FILE_READ_ERROR, N_("Can't read kernel %s"), > ++ argv[0]); > ++ goto fail; > ++ } > ++ > ++ lh = (void *) kernel_mem; > ++ grub_dprintf ("linux", "kernel_mem @ %p\n", kernel_mem); > ++ grub_dprintf ("linux", "code0: 0x%08x\n", lh->code0); > ++ grub_dprintf ("linux", "code1: 0x%08x\n", lh->code1); > ++ grub_dprintf ("linux", "text_offset: 0x%016llx\n", > ++ (long long unsigned) lh->text_offset); > ++ grub_dprintf ("linux", "magic: 0x%08x\n", lh->magic); > ++ grub_dprintf ("linux", "hdr_offset: 0x%08llx\n", > ++ (long long unsigned) lh->hdr_offset); > ++ > ++ if (grub_linux_init_params() != GRUB_ERR_NONE) > ++ { > ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate kernel > parameters"); > ++ goto fail; > ++ } > ++ > ++ cmdline_size = grub_loader_cmdline_size (argc, argv); > ++ > ++ linux_cmdline = grub_malloc(cmdline_size + sizeof (LINUX_IMAGE)); > ++ if (!linux_cmdline) > ++ grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate command line"); > ++ grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE)); > ++ grub_create_loader_cmdline (argc, argv, > ++ linux_cmdline + sizeof (LINUX_IMAGE) - 1, > ++ cmdline_size); > ++ > ++ grub_linux_register_cmdline (linux_cmdline); > ++ > ++ if (grub_errno == GRUB_ERR_NONE) > ++ { > ++ grub_loader_set (grub_linuxefi_boot, grub_linuxefi_unload, 0); > ++ loaded = 1; > ++ } > ++ > ++ fail: > ++ > ++ if (file) > ++ grub_file_close (file); > ++ > ++ if (grub_errno != GRUB_ERR_NONE) > ++ { > ++ grub_dl_unref (my_mod); > ++ loaded = 0; > ++ } > ++ > ++ if (linux_cmdline && !loaded) > ++ grub_efi_free_pages ((grub_efi_physical_address_t) linux_cmdline, > ++ BYTES_TO_PAGES(cmdline_size)); > ++ > ++ if (kernel_mem && !loaded) > ++ grub_efi_free_pages ((grub_efi_physical_address_t) kernel_mem, > ++ BYTES_TO_PAGES(kernel_size)); > ++ > ++ return grub_errno; > ++} > ++ > ++static grub_command_t cmd_linuxefi, cmd_initrdefi; > ++ > ++GRUB_MOD_INIT(linuxefi) > ++{ > ++ cmd_linuxefi = > ++ grub_register_command ("linuxefi", grub_cmd_linuxefi, 0, N_("Load > Linux.")); > ++ cmd_initrdefi = > ++ grub_register_command ("initrdefi", grub_cmd_initrdefi, > ++ 0, N_("Load initrd.")); > ++ grub_efi_linux_arch_register_commands(); > ++ my_mod = mod; > ++} > ++ > ++GRUB_MOD_FINI(linuxefi) > ++{ > ++ grub_unregister_command (cmd_linuxefi); > ++ grub_unregister_command (cmd_initrdefi); > ++ grub_efi_linux_arch_unregister_commands(); > ++} > +diff --git a/include/grub/arm64/linux.h b/include/grub/arm64/linux.h > +new file mode 100644 > +index 0000000..9529bc3 > +--- /dev/null > ++++ b/include/grub/arm64/linux.h > +@@ -0,0 +1,54 @@ > ++/* > ++ * GRUB -- GRand Unified Bootloader > ++ * Copyright (C) 2013 Free Software Foundation, Inc. > ++ * > ++ * GRUB 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, either version 3 of the License, or > ++ * (at your option) any later version. > ++ * > ++ * GRUB is distributed in the hope that it will be useful, > ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of > ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > ++ * GNU General Public License for more details. > ++ * > ++ * You should have received a copy of the GNU General Public License > ++ * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > ++ */ > ++ > ++#ifndef GRUB_LINUX_CPU_HEADER > ++#define GRUB_LINUX_CPU_HEADER 1 > ++ > ++#include <grub/efi/efi.h> > ++ > ++#define GRUB_EFI_KERNEL_STUB_ENTRY_OFFSET 0 > ++#define GRUB_LINUX_MAX_LOAD_ADDR 0xffffffffffffULL > ++ > ++#define GRUB_LINUX_MAGIC 0x644d5241 /* 'ARM\x64' */ > ++ > ++/* From linux/Documentation/arm64/booting.txt */ > ++struct linux_kernel_header > ++{ > ++ grub_uint32_t code0; /* Executable code */ > ++ grub_uint32_t code1; /* Executable code */ > ++ grub_uint64_t text_offset; /* Image load offset */ > ++ grub_uint64_t res0; /* reserved */ > ++ grub_uint64_t res1; /* reserved */ > ++ grub_uint64_t res2; /* reserved */ > ++ grub_uint64_t res3; /* reserved */ > ++ grub_uint64_t res4; /* reserved */ > ++ grub_uint32_t magic; /* Magic number, little endian, > "ARM\x64" */ > ++ grub_uint32_t hdr_offset; /* Offset of PE/COFF header */ > ++}; > ++ > ++#define grub_linux_get_params() NULL > ++extern grub_err_t grub_linux_init_params (void); > ++extern grub_err_t grub_linux_finalize_params (void); > ++extern grub_err_t grub_linux_check_kernel (struct linux_kernel_header *lh); > ++extern grub_err_t grub_linux_register_cmdline (void * addr); > ++extern grub_err_t grub_linux_register_initrd (void * addr, grub_size_t > size); > ++ > ++extern void grub_efi_linux_arch_register_commands (void); > ++extern void grub_efi_linux_arch_unregister_commands (void); > ++ > ++#endif /* ! GRUB_LINUX_CPU_HEADER */ > +diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h > +index 3af0911..055b01d 100644 > +--- a/include/grub/efi/api.h > ++++ b/include/grub/efi/api.h > +@@ -276,6 +276,10 @@ > + { 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 } \ > + } > + > ++#define GRUB_EFI_DEVICE_TREE_GUID \ > ++ { 0xb1b621d5, 0xf19c, 0x41a5, \ > ++ { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } \ > ++ } > + struct grub_efi_sal_system_table > + { > + grub_uint32_t signature; > +-- > +1.8.4.2 > + > diff --git a/meta/recipes-bsp/grub/grub/40_custom > b/meta/recipes-bsp/grub/grub/40_custom > new file mode 100755 > index 0000000..f891b02 > --- /dev/null > +++ b/meta/recipes-bsp/grub/grub/40_custom > @@ -0,0 +1,9 @@ > +#!/bin/sh > +exec tail -n +3 $0 > +# This file provides an easy way to add custom menu entries. Simply type the > +# menu entries you want to add after this comment. Be careful not to change > +# the 'exec tail' line above. > +menuentry "Linux" { > + set root=(hd0,1) > + linux /vmlinuz root=__ROOTFS__ rw __CONSOLE__ __VIDEO_MODE__ > __VGA_MODE__ quiet > +} > diff --git a/meta/recipes-bsp/grub/grub_git.bb > b/meta/recipes-bsp/grub/grub_git.bb > new file mode 100644 > index 0000000..ca636f3 > --- /dev/null > +++ b/meta/recipes-bsp/grub/grub_git.bb > @@ -0,0 +1,61 @@ > +SUMMARY = "GRUB2 is the next-generation GRand Unified Bootloader" > + > +DESCRIPTION = "GRUB2 is the next generaion of a GPLed bootloader \ > +intended to unify bootloading across x86 operating systems. In \ > +addition to loading the Linux kernel, it implements the Multiboot \ > +standard, which allows for flexible loading of multiple boot images." > + > +HOMEPAGE = "http://www.gnu.org/software/grub/" > +SECTION = "bootloaders" > + > +LICENSE = "GPLv3" > +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" > + > +DEPENDS = "autogen-native flex-native bison-native xz freetype" > + > +DEFAULT_PREFERENCE = "-1" > +DEFAULT_PREFERENCE_arm = "1" > + > +PV = "2.00+${SRCPV}" > +SRCREV = "3bc1b2daabb9b07a9c08bca386005d96f07147fe" > +SRC_URI = "git://git.savannah.gnu.org/grub.git \ > + file://0001-fdt-add-grub_fdt_create_empty_tree-function.patch \ > + file://0002-arm64-add-EFI-Linux-loader.patch \ > + file://40_custom \ > + " > + > +S = "${WORKDIR}/git" > + > +COMPATIBLE_HOST = '(x86_64.*|i.86.*|arm.*|aarch64.*)-(linux.*|freebsd.*)' > + > +inherit autotools > +inherit gettext > + > +PACKAGECONFIG ??= "" > +PACKAGECONFIG[grub-mount] = "--enable-grub-mount,--disable-grub-mount,fuse" > + > +# configure.ac has code to set this automagically from the target tuple > +# but the OE freeform one (core2-foo-bar-linux) don't work with that. > + > +GRUBPLATFORM_arm = "uboot" > +GRUBPLATFORM_aarch64 = "efi" > +GRUBPLATFORM ??= "pc" > + > +EXTRA_OECONF = "--with-platform=${GRUBPLATFORM} --disable-grub-mkfont > --program-prefix="" \ > + --enable-liblzma=no --enable-device-mapper=no > --enable-libzfs=no" > + > +do_configure_prepend() { > + ( cd ${S} > + ${S}/autogen.sh ) > +} > + > +do_install_append () { > + install -d ${D}${sysconfdir}/grub.d > + install -m 0755 ${WORKDIR}/40_custom ${D}${sysconfdir}/grub.d/40_custom > +} > + > +RDEPENDS_${PN} = "diffutils freetype" > +FILES_${PN}-dbg += "${libdir}/${BPN}/*/.debug" > + > +INSANE_SKIP_${PN} = "arch" > +INSANE_SKIP_${PN}-dbg = "arch" > -- > 1.8.4.2 > > _______________________________________________ > Openembedded-core mailing list > [email protected] > http://lists.openembedded.org/mailman/listinfo/openembedded-core -- Martin 'JaMa' Jansa jabber: [email protected]
signature.asc
Description: Digital signature
_______________________________________________ Openembedded-core mailing list [email protected] http://lists.openembedded.org/mailman/listinfo/openembedded-core
