From patchwork Sat Nov 26 16:59:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Safae Ouajih X-Patchwork-Id: 1709248 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=baylibre-com.20210112.gappssmtp.com header.i=@baylibre-com.20210112.gappssmtp.com header.a=rsa-sha256 header.s=20210112 header.b=2tPWr5mD; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NKJRg015zz23nB for ; Sun, 27 Nov 2022 04:21:18 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 2F753852C2; Sat, 26 Nov 2022 18:18:53 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=baylibre-com.20210112.gappssmtp.com header.i=@baylibre-com.20210112.gappssmtp.com header.b="2tPWr5mD"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 202B385023; Sat, 26 Nov 2022 18:00:00 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A695484494 for ; Sat, 26 Nov 2022 17:59:57 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=souajih@baylibre.com Received: by mail-wr1-x430.google.com with SMTP id cl5so10807598wrb.9 for ; Sat, 26 Nov 2022 08:59:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QuOBzvLBbKO4vJ/l1w5EPg7/o4GpG+kQQ2TVkXyx2Xg=; b=2tPWr5mD8Kx+J9rouKkCc89wIDXlUGP7itUGlhuhrQ3B7l8gXiyJEBFkrfii6d1B6n ws/SZc/fLl/Q1SJ+qEhM8GpWlp+FebS4/G6LAfgcyWJbE7vajIR5rc5RLpvqWRhg18CM T2iSGFF+4uPPe0olNmwHXZELb/MtFgocZIxn1+B6878jsNAqa9esw8teZpd5J8qOPJgv +WhYW4birqf6BE1nsv/DvW/ffVDeJUwUhnjGTNEO6bm/c7uM+M7pjvHLzSM/wsqiYXJH lSLTq8wsCEUsOHdcx0qlfW1d5jbPNYqy0NK5rpcPJ21VPkiIMeDmAgNDXzd/PrqHGnyv a7tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QuOBzvLBbKO4vJ/l1w5EPg7/o4GpG+kQQ2TVkXyx2Xg=; b=04huqFUrO30HNNn3JF0sLCTDKpkJrv7bLRg5P5fSCKy4JfBKq6+WgbN5BvTI8TaKHL QgVyNX+VMhmS6ZNUh8pg8MDOz6b9LEuPSL008FoQvcitGbEeWYMSelge4UXNNzLxOIMG mQDUlp7WdWgBepcX2aOcs6SAMjhEDtDWkM6834CaAW6Rg3vFilbz/Yp28jF8BuYa/dyr X8rDGHGNFYZGcn7WRLcGfCJC4fxfzBJ4JOQQLaQ2rq0tZCTAqw3I+CCrWmG7/EW+wV7x atPd04jJkbJDzWtOxzftP5a3SYmr3OkVV3vApdZk+Jp/4FGjgDkAveGY46ZqRdulEHw4 2uqw== X-Gm-Message-State: ANoB5pnyepEelS51YvnamACnb9uS1ywPxAajpY84inS5nHSvrR4GBBAd xIFHYt+eT+tgmC7FNL9DGYR9vA== X-Google-Smtp-Source: AA0mqf54iLXNUNB6oly0JgGiFbRlaM9kVMMyqrgBuMuXfs59SMlzj+8ZfOt0viAqaB3VD/VqoqKKVQ== X-Received: by 2002:a05:6000:1e16:b0:236:489b:8c81 with SMTP id bj22-20020a0560001e1600b00236489b8c81mr15133571wrb.649.1669481997174; Sat, 26 Nov 2022 08:59:57 -0800 (PST) Received: from safae.baylibre.local ([2a04:cec0:11b5:4031:7588:eb2c:a5c2:aa6d]) by smtp.gmail.com with ESMTPSA id c15-20020adfe70f000000b00241e8d00b79sm7462408wrm.54.2022.11.26.08.59.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 26 Nov 2022 08:59:56 -0800 (PST) From: Safae Ouajih To: sjg@chromium.org Cc: u-boot@lists.denx.de, sean.anderson@seco.com, r.stratiienko@gmail.com, mkorpershoek@baylibre.com, glaroque@baylibre.com, khilman@baylibre.com Subject: [PATCH 15/17] android: boot: support boot image header version 3 and 4 Date: Sat, 26 Nov 2022 17:59:29 +0100 Message-Id: <20221126165931.197607-16-souajih@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221126165931.197607-1-souajih@baylibre.com> References: <20221126165931.197607-1-souajih@baylibre.com> MIME-Version: 1.0 X-Mailman-Approved-At: Sat, 26 Nov 2022 18:18:14 +0100 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean This enables the support for boot image header version 3 and 4 using abootimg command. In order to use version 3 or 4: 1- Vendor boot image address should be given to abootimg cmd. abootimg addr $1 $vendor_boot_load_addr 2- "ramdisk_addr_r" env variable (ramdisk address) should be set to host the ramdisk : generic ramdisk + vendor ramdisk "struct andr_boot_img_hdr_v0_v1_v2*" is replaced by "void *" in some functions since v3 and v4 are now supported as well. Signed-off-by: Safae Ouajih --- boot/bootm.c | 29 ++++++++++++++++++++++++----- boot/image-android.c | 16 ++++++++++------ boot/image-board.c | 14 +++++++++++--- boot/image-fdt.c | 2 +- cmd/abootimg.c | 16 ++++++++++++++-- include/image.h | 14 ++++++++------ 6 files changed, 68 insertions(+), 23 deletions(-) diff --git a/boot/bootm.c b/boot/bootm.c index e44dc550077d..c0f9b2722d1f 100644 --- a/boot/bootm.c +++ b/boot/bootm.c @@ -113,6 +113,10 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { const void *os_hdr; +#ifdef CONFIG_ANDROID_BOOT_IMAGE + const void *vendor_boot_img; + const void *boot_img; +#endif bool ep_found = false; int ret; @@ -181,12 +185,17 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, int argc, #endif #ifdef CONFIG_ANDROID_BOOT_IMAGE case IMAGE_FORMAT_ANDROID: + boot_img = os_hdr; + vendor_boot_img = NULL; + if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) { + boot_img = (void *)get_abootimg_addr(); + vendor_boot_img = (void *)get_avendor_bootimg_addr(); + } images.os.type = IH_TYPE_KERNEL; - images.os.comp = android_image_get_kcomp(os_hdr, NULL); + images.os.comp = android_image_get_kcomp(boot_img, vendor_boot_img); images.os.os = IH_OS_LINUX; - - images.os.end = android_image_get_end(os_hdr, NULL); - images.os.load = android_image_get_kload(os_hdr, NULL); + images.os.end = android_image_get_end(boot_img, vendor_boot_img); + images.os.load = android_image_get_kload(boot_img, vendor_boot_img); images.ep = images.os.load; ep_found = true; break; @@ -892,6 +901,10 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc, int os_noffset; #endif +#ifdef CONFIG_ANDROID_BOOT_IMAGE + const void *boot_img; + const void *vendor_boot_img; +#endif img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0], &fit_uname_config, &fit_uname_kernel); @@ -967,8 +980,14 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, int flag, int argc, #endif #ifdef CONFIG_ANDROID_BOOT_IMAGE case IMAGE_FORMAT_ANDROID: + boot_img = buf; + vendor_boot_img = NULL; + if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) { + boot_img = (void *)get_abootimg_addr(); + vendor_boot_img = (void *)get_avendor_bootimg_addr(); + } printf("## Booting Android Image at 0x%08lx ...\n", img_addr); - if (android_image_get_kernel(buf, NULL, images->verify, + if (android_image_get_kernel(boot_img, vendor_boot_img, images->verify, os_data, os_len)) return NULL; break; diff --git a/boot/image-android.c b/boot/image-android.c index 291911ea1852..557047660bc3 100644 --- a/boot/image-android.c +++ b/boot/image-android.c @@ -199,7 +199,7 @@ static ulong android_image_get_kernel_addr(struct andr_image_data *img_data) * Return: Zero, os start address and length on success, * otherwise on failure. */ -int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, +int android_image_get_kernel(const void *hdr, const void *vendor_boot_img, int verify, ulong *os_data, ulong *os_len) { @@ -284,7 +284,7 @@ bool is_android_vendor_boot_image_header(const void *vendor_boot_img) return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, ANDR_VENDOR_BOOT_MAGIC_SIZE); } -bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr) +bool is_android_boot_image_header(const void *hdr) { return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE); } @@ -303,7 +303,7 @@ ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, return img_data.boot_img_total_size; } -ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, +ulong android_image_get_kload(const void *hdr, const void *vendor_boot_img) { struct andr_image_data img_data; @@ -314,7 +314,7 @@ ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, return android_image_get_kernel_addr(&img_data); } -ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, +ulong android_image_get_kcomp(const void *hdr, const void *vendor_boot_img) { struct andr_image_data img_data; @@ -362,14 +362,18 @@ int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img, return 0; } -int android_image_get_second(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, - ulong *second_data, ulong *second_len) +int android_image_get_second(const void *hdr, ulong *second_data, ulong *second_len) { struct andr_image_data img_data; if (!android_image_get_data(hdr, NULL, &img_data)) return -EINVAL; + if (img_data.header_version > 2) { + printf("Second stage bootloader is only supported for boot image version <= 2\n"); + return -1; + } + if (!img_data.second_size) { *second_data = *second_len = 0; return -1; diff --git a/boot/image-board.c b/boot/image-board.c index c8e41cc8706f..03ce2fb8093a 100644 --- a/boot/image-board.c +++ b/boot/image-board.c @@ -426,10 +426,18 @@ static int select_ramdisk(struct bootm_headers *images, const char *select, u8 a break; case IMAGE_FORMAT_ANDROID: if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) { - void *ptr = map_sysmem(images->os.start, 0); int ret; - ret = android_image_get_ramdisk(ptr, NULL, rd_datap, rd_lenp); - unmap_sysmem(ptr); + if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) { + ret = android_image_get_ramdisk((void *)get_abootimg_addr(), + (void *)get_avendor_bootimg_addr(), + rd_datap, rd_lenp); + } else { + void *ptr = map_sysmem(images->os.start, 0); + + ret = android_image_get_ramdisk(ptr, NULL, rd_datap, rd_lenp); + unmap_sysmem(ptr); + } + if (ret) return ret; done = true; diff --git a/boot/image-fdt.c b/boot/image-fdt.c index 6a08e8a07ed7..a1c122d9768a 100644 --- a/boot/image-fdt.c +++ b/boot/image-fdt.c @@ -529,7 +529,7 @@ int boot_get_fdt(int flag, int argc, char *const argv[], uint8_t arch, } #ifdef CONFIG_ANDROID_BOOT_IMAGE } else if (genimg_get_format(buf) == IMAGE_FORMAT_ANDROID) { - struct andr_boot_img_hdr_v0_v1_v2 *hdr = buf; + void *hdr = buf; ulong fdt_data, fdt_len; u32 fdt_size, dtb_idx; /* diff --git a/cmd/abootimg.c b/cmd/abootimg.c index e8c70a93cbf4..1e7d22b0da09 100644 --- a/cmd/abootimg.c +++ b/cmd/abootimg.c @@ -17,6 +17,16 @@ static ulong _abootimg_addr = -1; static ulong _avendor_bootimg_addr = -1; +ulong get_abootimg_addr(void) +{ + return (_abootimg_addr == -1 ? image_load_addr : _abootimg_addr); +} + +ulong get_avendor_bootimg_addr(void) +{ + return _avendor_bootimg_addr; +} + static int abootimg_get_ver(int argc, char *const argv[]) { const struct andr_boot_img_hdr_v0_v1_v2 *hdr; @@ -70,7 +80,8 @@ static int abootimg_get_dtb_load_addr(int argc, char *const argv[]) return CMD_RET_USAGE; struct andr_image_data img_data = {0}; - if (!android_image_get_data((void *)abootimg_addr(), NULL, &img_data)) + if (!android_image_get_data((void *)abootimg_addr(), + (void *)get_avendor_bootimg_addr(), &img_data)) return CMD_RET_FAILURE; if (img_data.header_version < 2) { @@ -114,7 +125,8 @@ static int abootimg_get_dtb_by_index(int argc, char *const argv[]) return CMD_RET_FAILURE; } - if (!android_image_get_dtb_by_index(abootimg_addr(), NULL, num, + if (!android_image_get_dtb_by_index(abootimg_addr(), + (void *)get_avendor_bootimg_addr(), num, &addr, &size)) { return CMD_RET_FAILURE; } diff --git a/include/image.h b/include/image.h index 461e30ae2ac8..f3ffbfffaf88 100644 --- a/include/image.h +++ b/include/image.h @@ -1728,29 +1728,31 @@ bool android_image_get_data(const void *boot_hdr, const void *vendor_boot_hdr, struct andr_image_data *data); struct andr_boot_img_hdr_v0_v1_v2; -int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, +int android_image_get_kernel(const void *hdr, const void *vendor_boot_img, int verify, ulong *os_data, ulong *os_len); int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img, ulong *rd_data, ulong *rd_len); -int android_image_get_second(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, - ulong *second_data, ulong *second_len); +int android_image_get_second(const void *hdr, ulong *second_data, ulong *second_len); bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size); bool android_image_get_dtb_by_index(ulong hdr_addr, const void *vendor_boot_img, u32 index, ulong *addr, u32 *size); ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, const void *vendor_boot_img); -ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, +ulong android_image_get_kload(const void *hdr, const void *vendor_boot_img); -ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, +ulong android_image_get_kcomp(const void *hdr, const void *vendor_boot_img); void android_print_contents(const struct andr_boot_img_hdr_v0_v1_v2 *hdr); #ifdef CONFIG_CMD_ABOOTIMG bool android_image_print_dtb_contents(ulong hdr_addr); #endif -bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr); +bool is_android_boot_image_header(const void *hdr); bool is_android_vendor_boot_image_header(const void *vendor_boot_img); +ulong get_abootimg_addr(void); +ulong get_avendor_bootimg_addr(void); + /** * board_fit_config_name_match() - Check for a matching board name *