From patchwork Mon Jan 13 12:54:28 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koen Kooi X-Patchwork-Id: 23161 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-qe0-f70.google.com (mail-qe0-f70.google.com [209.85.128.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 984CF2054B for ; Mon, 13 Jan 2014 12:54:36 +0000 (UTC) Received: by mail-qe0-f70.google.com with SMTP id nd7sf4641141qeb.1 for ; Mon, 13 Jan 2014 04:54:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:delivered-to:from:to:date :message-id:cc:subject:precedence:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:mime-version:sender :errors-to:x-original-sender:x-original-authentication-results :mailing-list:content-type:content-transfer-encoding; bh=3hHKRDVfUpK2qihGexEZXWZB/AasFsqOmgmXt5up6go=; b=P/bJlianH0POROBIZ/k2oSnP667uMf8KZsxN3K+3DWRl4qU0DnxlZIoPC/8e7dZMfW 3Kd2yp80p6/anNx6ips6w60WSeuc3OnMCMKaQD8MabQwkICabeMz0nwUq8Wf7FcXJ9aX yt0040iAXql095urnv1SUD12UP3JwTruEUqseqCxfuwpyARAzXTRdT1qkHKE8Nca0uEC i3BWfLGhSUiImNaEmbsJ9IJaoaeEQ+gMnzhT88wKrDSzd9QdaEEpk//JfRVcgYKSh+w2 8bKJNXW/d7ZKwGxNUSrUq5pfEvt+VpcGAfX/YXzR3qC2Rw7/Q0ro9DxhPSYcwvvYb1mI phbw== X-Gm-Message-State: ALoCoQlB9iFBMNx/ZlO+BQZ66rTotpLhNxc9hBOMCfvcZjzHW3kSGf/RjZ5svqEmvpDrC7cnX5Z1 X-Received: by 10.58.156.42 with SMTP id wb10mr9472472veb.26.1389617675845; Mon, 13 Jan 2014 04:54:35 -0800 (PST) X-BeenThere: patchwork-forward@linaro.org Received: by 10.49.133.36 with SMTP id oz4ls1891338qeb.7.gmail; Mon, 13 Jan 2014 04:54:35 -0800 (PST) X-Received: by 10.52.26.77 with SMTP id j13mr3603311vdg.33.1389617675773; Mon, 13 Jan 2014 04:54:35 -0800 (PST) Received: from mail-vb0-f47.google.com (mail-vb0-f47.google.com [209.85.212.47]) by mx.google.com with ESMTPS id et2si444828vcb.40.2014.01.13.04.54.35 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 13 Jan 2014 04:54:35 -0800 (PST) Received-SPF: neutral (google.com: 209.85.212.47 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.212.47; Received: by mail-vb0-f47.google.com with SMTP id w8so2644453vbj.34 for ; Mon, 13 Jan 2014 04:54:35 -0800 (PST) X-Received: by 10.58.143.73 with SMTP id sc9mr391900veb.60.1389617675598; Mon, 13 Jan 2014 04:54:35 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.59.13.131 with SMTP id ey3csp125790ved; Mon, 13 Jan 2014 04:54:34 -0800 (PST) X-Received: by 10.66.240.4 with SMTP id vw4mr29492570pac.26.1389617674315; Mon, 13 Jan 2014 04:54:34 -0800 (PST) Received: from mail.openembedded.org (mail.openembedded.org. [140.211.169.62]) by mx.google.com with ESMTP id o7si15603175pbb.280.2014.01.13.04.54.33 for ; Mon, 13 Jan 2014 04:54:34 -0800 (PST) Received-SPF: pass (google.com: domain of openembedded-core-bounces@lists.openembedded.org designates 140.211.169.62 as permitted sender) client-ip=140.211.169.62; Received: from mail.openembedded.org (localhost [127.0.0.1]) by mail.openembedded.org (Postfix) with ESMTP id 9F8476BCE6; Mon, 13 Jan 2014 12:54:31 +0000 (UTC) X-Original-To: openembedded-core@lists.openembedded.org Delivered-To: openembedded-core@lists.openembedded.org Received: from mail-wg0-f45.google.com (mail-wg0-f45.google.com [74.125.82.45]) by mail.openembedded.org (Postfix) with ESMTP id 862AD6B446 for ; Mon, 13 Jan 2014 12:54:30 +0000 (UTC) Received: by mail-wg0-f45.google.com with SMTP id n12so2951263wgh.12 for ; Mon, 13 Jan 2014 04:54:30 -0800 (PST) X-Received: by 10.180.76.103 with SMTP id j7mr15201618wiw.58.1389617670820; Mon, 13 Jan 2014 04:54:30 -0800 (PST) Received: from localhost ([2001:610:612:0:5e51:4fff:fec8:7c15]) by mx.google.com with ESMTPSA id jw4sm11405914wjc.20.2014.01.13.04.54.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Jan 2014 04:54:30 -0800 (PST) From: Koen Kooi To: openembedded-core@lists.openembedded.org Date: Mon, 13 Jan 2014 13:54:28 +0100 Message-Id: <1389617668-1468-1-git-send-email-koen.kooi@linaro.org> X-Mailer: git-send-email 1.8.4.2 Cc: Koen Kooi Subject: [OE-core] [PATCH] grub git: update to latest git X-BeenThere: openembedded-core@lists.openembedded.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: openembedded-core-bounces@lists.openembedded.org Errors-To: openembedded-core-bounces@lists.openembedded.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: koen.kooi@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.212.47 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 Drop the 2 patches since the functionality is upstream now. Also sync PACKAGECONFIG with grub 2.00 recipe. The debugedit problem for 64 bit machines in do_package is still present, though: ERROR: debugedit failed with exit code 256 (cmd was '/build/linaro/build/build/tmp-eglibc/sysroots/x86_64-linux/usr/lib/rpm/bin/debugedit' -b '/build/linaro/build/build/tmp-eglibc/work/aarch64-oe-linux' -d '/usr/src/debug' -i -l '/build/linaro/build/build/tmp-eglibc/work/aarch64-oe-linux/grub/2.00+AUTOINC+0776112c53-r0/debugsources.list' '/build/linaro/build/build/tmp-eglibc/work/aarch64-oe-linux/grub/2.00+AUTOINC+0776112c53-r0/package/usr/lib/grub/arm64-efi/cpio_be.module'): /build/linaro/build/build/tmp-eglibc/sysroots/x86_64-linux/usr/lib/rpm/bin/debugedit: /build/linaro/build/build/tmp-eglibc/work/aarch64-oe-linux/grub/2.00+AUTOINC+0776112c53-r0/package/usr/lib/grub/arm64-efi/cpio_be.module: Unhandled relocation 258 in .debug_info section ERROR: Function failed: split_and_strip_files ERROR: Logfile of failure stored in: /build/linaro/build/build/tmp-eglibc/work/aarch64-oe-linux/grub/2.00+AUTOINC+0776112c53-r0/temp/log.do_package.29234 ERROR: Task 10 (/build/linaro/build/openembedded-core/meta/recipes-bsp/grub/grub_git.bb, do_package) failed with exit code '1' Signed-off-by: Koen Kooi --- ...t-add-grub_fdt_create_empty_tree-function.patch | 73 --- .../grub/0002-arm64-add-EFI-Linux-loader.patch | 653 --------------------- meta/recipes-bsp/grub/grub_git.bb | 5 +- 3 files changed, 2 insertions(+), 729 deletions(-) delete mode 100644 meta/recipes-bsp/grub/grub/0001-fdt-add-grub_fdt_create_empty_tree-function.patch delete mode 100644 meta/recipes-bsp/grub/grub/0002-arm64-add-EFI-Linux-loader.patch 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 deleted file mode 100644 index 3414574..0000000 --- a/meta/recipes-bsp/grub/grub/0001-fdt-add-grub_fdt_create_empty_tree-function.patch +++ /dev/null @@ -1,73 +0,0 @@ -From b3417ec69ff7d52379a8f2cb291dbecccdab684f Mon Sep 17 00:00:00 2001 -From: Leif Lindholm -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 ---- - 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 deleted file mode 100644 index 4e9df62..0000000 --- a/meta/recipes-bsp/grub/grub/0002-arm64-add-EFI-Linux-loader.patch +++ /dev/null @@ -1,653 +0,0 @@ -From 55cbddc471b6caf27355ce93d1534d894e6ed0bb Mon Sep 17 00:00:00 2001 -From: Leif Lindholm -Date: Wed, 4 Dec 2013 15:21:16 +0000 -Subject: [PATCH 2/2] arm64: add EFI Linux loader - -Signed-off-by: Leif Lindholm ---- - 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 . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+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 . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+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 . -+ */ -+ -+#ifndef GRUB_LINUX_CPU_HEADER -+#define GRUB_LINUX_CPU_HEADER 1 -+ -+#include -+ -+#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_git.bb b/meta/recipes-bsp/grub/grub_git.bb index ca636f3..1796e7f 100644 --- a/meta/recipes-bsp/grub/grub_git.bb +++ b/meta/recipes-bsp/grub/grub_git.bb @@ -17,10 +17,8 @@ DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_arm = "1" PV = "2.00+${SRCPV}" -SRCREV = "3bc1b2daabb9b07a9c08bca386005d96f07147fe" +SRCREV = "0776112c5311196889a15058a3b1be4c81ba5e05" 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 \ " @@ -33,6 +31,7 @@ inherit gettext PACKAGECONFIG ??= "" PACKAGECONFIG[grub-mount] = "--enable-grub-mount,--disable-grub-mount,fuse" +PACKAGECONFIG[device-mapper] = "--enable-device-mapper,--disable-device-mapper,lvm2" # 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.