From patchwork Sat Jan 27 05:59:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Chen X-Patchwork-Id: 866712 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Qejhqlpg"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3zT4rT2nw7z9sPk for ; Sat, 27 Jan 2018 17:00:41 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 03629C21FAB; Sat, 27 Jan 2018 06:00:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 38BC8C21E41; Sat, 27 Jan 2018 06:00:32 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id D4ED4C21F91; Sat, 27 Jan 2018 05:59:47 +0000 (UTC) Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by lists.denx.de (Postfix) with ESMTPS id B8974C21E41 for ; Sat, 27 Jan 2018 05:59:44 +0000 (UTC) Received: by mail-pf0-f196.google.com with SMTP id b25so1551586pfd.9 for ; Fri, 26 Jan 2018 21:59:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=toOa7gVFweBgZgf5q7BKpYgZ0JQ6JDVhBsesJThG8Ko=; b=QejhqlpgBb1vxmoGe06JTeWRIxblAKYRnTzpxM2toPPqFzOKC2HR0tJdIljDYSPzkG /b7Xw9EHcSTRDUtFZiQyR6NR2qnnxKNpgiXAmFsYwSb7COyKsolYFDlyh/w71KPeucko wo2RZz9G28uAsPyJCYcrLogeYYTPIZ8N6IYm4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=toOa7gVFweBgZgf5q7BKpYgZ0JQ6JDVhBsesJThG8Ko=; b=lEWI6q3cMur9hOxYhlVkoV2A1m6xiIRvoiAdXEdy4TK6n8nIxwNtTPypfhC6R6bbP9 B6GL1pUy6RxyhyzOu486Q51bbLm7I+TBEjIheALDs12W0LTt3fEp/M6zKTSbQFPtfnKo 6z7f0MBnTzcRaGaJ8/fC2Ck2z7be9FUGbk+sswup8mThHYP7giNbBg0rwT4FNB4KsX3+ G/30VsEbARiv/2DjJsHBAkWmd5WhklCXhYaYO+K3r9cTeHQHetvpE5deLUmqD9sRfmIa ummYuT+37hYG+mPYbG1HGxPWL90HZ0M/CFZzRr3/GLC2uBgO31yCt5Goe4yvOswPPuGd 93Kw== X-Gm-Message-State: AKwxytc1HCVQRdEWWX7xPh1MR4JExRwaDRahjRBn0BLrgAMCpKTCa0fj pe/FozW0fFr8TGRRsaLjLxPGcuWDqE8= X-Google-Smtp-Source: AH8x227hDJUI+sGjK6O1yYYnlZqEGrs0qZLmK35OVjHe4+07XhA+vj1cru2h7tB1u7drk6rfLhvsfQ== X-Received: by 10.99.170.73 with SMTP id x9mr17260808pgo.393.1517032783279; Fri, 26 Jan 2018 21:59:43 -0800 (PST) Received: from localhost.localdomain (c27-253-115-177.carlnfd2.nsw.optusnet.com.au. [27.253.115.177]) by smtp.gmail.com with ESMTPSA id 184sm18395035pfg.87.2018.01.26.21.59.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 26 Jan 2018 21:59:42 -0800 (PST) From: Bin Chen To: u-boot@lists.denx.de, trini@konsulko.com Date: Sat, 27 Jan 2018 16:59:08 +1100 Message-Id: <20180127055909.12962-2-bin.chen@linaro.org> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20180127055909.12962-1-bin.chen@linaro.org> References: <20180127055909.12962-1-bin.chen@linaro.org> Cc: rob.herring@linaro.org Subject: [U-Boot] [PATCH 1/2] parse the second area of android image X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The second area of android image was intended to put a 2nd stage bootloader but in practice were rarely used (in my knowledge). An proposal was made to the AOSP to (re)use the second area as the dtb[1], This patch itself doesn't depend on that proposal being accepted but it won't be that helpful as well if that proposal won't be accepted. But don't do any harm as well. [1] https://android-review.googlesource.com/#/c/417447/ Signed-off-by: Bin Chen Reviewed-by: Tom Rini Reviewed-by: Kever Yang --- common/image-android.c | 19 +++++++++++++++++++ include/image.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/common/image-android.c b/common/image-android.c index e74d0aafca..5ad3a1fa38 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -146,6 +146,25 @@ int android_image_get_ramdisk(const struct andr_img_hdr *hdr, return 0; } +int android_image_get_second(const struct andr_img_hdr *hdr, + ulong *second_data, ulong *second_len) +{ + if (!hdr->second_size) { + *second_data = *second_len = 0; + return -1; + } + + *second_data = (unsigned long)hdr; + *second_data += hdr->page_size; + *second_data += ALIGN(hdr->kernel_size, hdr->page_size); + *second_data += ALIGN(hdr->ramdisk_size, hdr->page_size); + + printf("second address is 0x%lx\n",*second_data); + + *second_len = hdr->second_size; + return 0; +} + #if !defined(CONFIG_SPL_BUILD) /** * android_print_contents - prints out the contents of the Android format image diff --git a/include/image.h b/include/image.h index b2b23a96f1..c8ce4da901 100644 --- a/include/image.h +++ b/include/image.h @@ -1263,6 +1263,8 @@ int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, ulong *os_data, ulong *os_len); int android_image_get_ramdisk(const struct andr_img_hdr *hdr, ulong *rd_data, ulong *rd_len); +int android_image_get_second(const struct andr_img_hdr *hdr, + ulong *second_data, ulong *second_len); ulong android_image_get_end(const struct andr_img_hdr *hdr); ulong android_image_get_kload(const struct andr_img_hdr *hdr); void android_print_contents(const struct andr_img_hdr *hdr); From patchwork Sat Jan 27 05:59:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Chen X-Patchwork-Id: 866713 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="WXkMZwIB"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3zT4st16Krz9sPk for ; Sat, 27 Jan 2018 17:01:54 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id C2A3CC21FB7; Sat, 27 Jan 2018 06:00:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 2E792C21FF1; Sat, 27 Jan 2018 06:00:33 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id C8C62C21E68; Sat, 27 Jan 2018 05:59:53 +0000 (UTC) Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by lists.denx.de (Postfix) with ESMTPS id C75C5C21FC2 for ; Sat, 27 Jan 2018 05:59:47 +0000 (UTC) Received: by mail-pf0-f195.google.com with SMTP id k19so1556173pfj.5 for ; Fri, 26 Jan 2018 21:59:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=13+vyWv4kakzb5pw039IP+RSa0DahAiG9wpZHSOJIe8=; b=WXkMZwIBiGGNwOVKKy5HiccH/ov5KDvbGaRW7ruPweUcwN0ZwdxjpG+wXxJb1fMVMq Q336oJfY5W7aHxTY4PUEQJAbmv5IEkS7JpbwcW4Y2YnTStJ7sDv/PI6WcNdTe1ch9D6s o0KUGYAchthYIXhzop4dJ3tGv1VE+hqC9OTXA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=13+vyWv4kakzb5pw039IP+RSa0DahAiG9wpZHSOJIe8=; b=KcdIaUpUHMVfFttxAKJ5SBVYKnPjGcah3lZhzUzH7hzq+iKGKnJqyYYn0jKx7AJ4aq sdl2BmjryOoD5SdRjPUjWXfinJdf199RFVLxbNuKkDzftwPa/VKQsV/oHB53bv5KgCKa +yGUOnR5XYhYJ1+kz+yPwaofdRltmPIpraJAUgrlG4PWiYqBA7xzvx8Gby6phj2lOB6+ 2jtrftLrttXGGQ9hQ9Pia1XYW5EsexF3cBKoKQOl9LFwdv7nBm5SPdmlbgiZe5QoMetb q+xH6GRDrpfBO7RRoDqcJ8xJgtJHy9yOj6u08yLsdjgNYix3ZOcv3mADvZGTdm18lIYM z9LA== X-Gm-Message-State: AKwxytcd1kNht/u09rLO/rOR1OvqctjDO/OzYYl4gELoe81Ew2z9eR+9 +Cto69CcDxeM8jE8JleV18eTdlxhjFg= X-Google-Smtp-Source: AH8x227p3R/Ht4IQbOcEXdw95DYcK5QUX+U8xb188ksp2aVJ+oOFYGE6FLPtYkg2+uMB5N682esOYg== X-Received: by 10.98.215.30 with SMTP id b30mr21314450pfh.50.1517032786217; Fri, 26 Jan 2018 21:59:46 -0800 (PST) Received: from localhost.localdomain (c27-253-115-177.carlnfd2.nsw.optusnet.com.au. [27.253.115.177]) by smtp.gmail.com with ESMTPSA id 184sm18395035pfg.87.2018.01.26.21.59.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 26 Jan 2018 21:59:45 -0800 (PST) From: Bin Chen To: u-boot@lists.denx.de, trini@konsulko.com Date: Sat, 27 Jan 2018 16:59:09 +1100 Message-Id: <20180127055909.12962-3-bin.chen@linaro.org> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20180127055909.12962-1-bin.chen@linaro.org> References: <20180127055909.12962-1-bin.chen@linaro.org> Cc: rob.herring@linaro.org Subject: [U-Boot] [PATCH 2/2] move booti_setup to arch/arm/lig/image.c X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Follow bootz's pattern by moving the booti_setup to arch/arm/lib. This allows to use booti_setup in other paths, e.g booting an Android image containing Image format. Note that kernel relocation is move out of booti_setup and it is the caller's responsibility to do it and allows them do it differently. say, cmd/booti.c just do a manually, while in the bootm path, we can use bootm_load_os(with some changes). v2: - fix review comments for indentation - fix the comment for booti_setup - rebase to lastest u-boot - improve the commit comment Signed-off-by: Bin Chen Reviewed-by: Tom Rini --- arch/arm/lib/Makefile | 2 +- arch/arm/lib/image.c | 76 ++++++++++++++++++++++++++++++++++++++++++ cmd/booti.c | 92 ++++++++------------------------------------------- include/image.h | 9 +++++ 4 files changed, 99 insertions(+), 80 deletions(-) create mode 100644 arch/arm/lib/image.c diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 876024fc15..b5ffffd4e3 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -32,7 +32,7 @@ endif obj-$(CONFIG_CPU_V7M) += cmd_boot.o obj-$(CONFIG_OF_LIBFDT) += bootm-fdt.o -obj-$(CONFIG_CMD_BOOTI) += bootm.o +obj-$(CONFIG_CMD_BOOTI) += bootm.o image.o obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-$(CONFIG_CMD_BOOTZ) += bootm.o zimage.o obj-$(CONFIG_SYS_L2_PL310) += cache-pl310.o diff --git a/arch/arm/lib/image.c b/arch/arm/lib/image.c new file mode 100644 index 0000000000..460f8eb0e9 --- /dev/null +++ b/arch/arm/lib/image.c @@ -0,0 +1,76 @@ +/* + * (C) Copyright 2000-2009 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +#define LINUX_ARM64_IMAGE_MAGIC 0x644d5241 + +/* See Documentation/arm64/booting.txt in the Linux kernel */ +struct Image_header { + uint32_t code0; /* Executable code */ + uint32_t code1; /* Executable code */ + uint64_t text_offset; /* Image load offset, LE */ + uint64_t image_size; /* Effective Image size, LE */ + uint64_t flags; /* Kernel flags, LE */ + uint64_t res2; /* reserved */ + uint64_t res3; /* reserved */ + uint64_t res4; /* reserved */ + uint32_t magic; /* Magic number */ + uint32_t res5; +}; + +int booti_setup(ulong image, ulong *relocated_addr, ulong *size) +{ + struct Image_header *ih; + uint64_t dst; + uint64_t image_size, text_offset; + + *relocated_addr = image; + + ih = (struct Image_header *)map_sysmem(image, 0); + + if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) { + puts("Bad Linux ARM64 Image magic!\n"); + return 1; + } + + /* + * Prior to Linux commit a2c1d73b94ed, the text_offset field + * is of unknown endianness. In these cases, the image_size + * field is zero, and we can assume a fixed value of 0x80000. + */ + if (ih->image_size == 0) { + puts("Image lacks image_size field, assuming 16MiB\n"); + image_size = 16 << 20; + text_offset = 0x80000; + } else { + image_size = le64_to_cpu(ih->image_size); + text_offset = le64_to_cpu(ih->text_offset); + } + + *size = image_size; + + /* + * If bit 3 of the flags field is set, the 2MB aligned base of the + * kernel image can be anywhere in physical memory, so respect + * images->ep. Otherwise, relocate the image to the base of RAM + * since memory below it is not accessible via the linear mapping. + */ + if (le64_to_cpu(ih->flags) & BIT(3)) + dst = image - text_offset; + else + dst = gd->bd->bi_dram[0].start; + + *relocated_addr = ALIGN(dst, SZ_2M) + text_offset; + + unmap_sysmem(ih); + + return 0; +} diff --git a/cmd/booti.c b/cmd/booti.c index da6fb01c11..0be786cb6b 100644 --- a/cmd/booti.c +++ b/cmd/booti.c @@ -16,77 +16,6 @@ DECLARE_GLOBAL_DATA_PTR; -/* See Documentation/arm64/booting.txt in the Linux kernel */ -struct Image_header { - uint32_t code0; /* Executable code */ - uint32_t code1; /* Executable code */ - uint64_t text_offset; /* Image load offset, LE */ - uint64_t image_size; /* Effective Image size, LE */ - uint64_t flags; /* Kernel flags, LE */ - uint64_t res2; /* reserved */ - uint64_t res3; /* reserved */ - uint64_t res4; /* reserved */ - uint32_t magic; /* Magic number */ - uint32_t res5; -}; - -#define LINUX_ARM64_IMAGE_MAGIC 0x644d5241 - -static int booti_setup(bootm_headers_t *images) -{ - struct Image_header *ih; - uint64_t dst; - uint64_t image_size, text_offset; - - ih = (struct Image_header *)map_sysmem(images->ep, 0); - - if (ih->magic != le32_to_cpu(LINUX_ARM64_IMAGE_MAGIC)) { - puts("Bad Linux ARM64 Image magic!\n"); - return 1; - } - - /* - * Prior to Linux commit a2c1d73b94ed, the text_offset field - * is of unknown endianness. In these cases, the image_size - * field is zero, and we can assume a fixed value of 0x80000. - */ - if (ih->image_size == 0) { - puts("Image lacks image_size field, assuming 16MiB\n"); - image_size = 16 << 20; - text_offset = 0x80000; - } else { - image_size = le64_to_cpu(ih->image_size); - text_offset = le64_to_cpu(ih->text_offset); - } - - /* - * If bit 3 of the flags field is set, the 2MB aligned base of the - * kernel image can be anywhere in physical memory, so respect - * images->ep. Otherwise, relocate the image to the base of RAM - * since memory below it is not accessible via the linear mapping. - */ - if (le64_to_cpu(ih->flags) & BIT(3)) - dst = images->ep - text_offset; - else - dst = gd->bd->bi_dram[0].start; - - dst = ALIGN(dst, SZ_2M) + text_offset; - - unmap_sysmem(ih); - - if (images->ep != dst) { - void *src; - - debug("Moving Image from 0x%lx to 0x%llx\n", images->ep, dst); - - src = (void *)images->ep; - images->ep = dst; - memmove((void *)dst, src, image_size); - } - - return 0; -} - /* * Image booting support */ @@ -94,31 +23,36 @@ static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], bootm_headers_t *images) { int ret; - struct Image_header *ih; + ulong ld; + ulong relocated_addr; + ulong image_size; ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START, images, 1); /* Setup Linux kernel Image entry point */ if (!argc) { - images->ep = load_addr; + ld = load_addr; debug("* kernel: default image load address = 0x%08lx\n", load_addr); } else { - images->ep = simple_strtoul(argv[0], NULL, 16); + ld = simple_strtoul(argv[0], NULL, 16); debug("* kernel: cmdline image address = 0x%08lx\n", images->ep); } - ret = booti_setup(images); + ret = booti_setup(ld, &relocated_addr, &image_size); if (ret != 0) return 1; - ih = (struct Image_header *)map_sysmem(images->ep, 0); - - lmb_reserve(&images->lmb, images->ep, le32_to_cpu(ih->image_size)); + /* Handle BOOTM_STATE_LOADOS */ + if (relocated_addr != ld) { + debug("Moving Image from 0x%lx to 0x%lx\n", ld, relocated_addr); + memmove((void *)relocated_addr, (void *)ld, image_size); + } - unmap_sysmem(ih); + images->ep = relocated_addr; + lmb_reserve(&images->lmb, images->ep, le32_to_cpu(image_size)); /* * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not diff --git a/include/image.h b/include/image.h index c8ce4da901..325b014754 100644 --- a/include/image.h +++ b/include/image.h @@ -871,6 +871,15 @@ int image_setup_linux(bootm_headers_t *images); */ int bootz_setup(ulong image, ulong *start, ulong *end); +/** + * Return the correct start address and size of a Linux aarch64 Image. + * + * @image: Address of image + * @start: Returns start address of image + * @size : Returns size image + * @return 0 if OK, 1 if the image was not recognised + */ +int booti_setup(ulong image, ulong *relocated_addr, ulong *size); /*******************************************************************/ /* New uImage format specific code (prefixed with fit_) */