From patchwork Tue Oct 21 16:55:18 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ahmad Draidi X-Patchwork-Id: 401603 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 433BC140077 for ; Wed, 22 Oct 2014 03:56:42 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AD6234B635; Tue, 21 Oct 2014 18:56:39 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id lHNVzBNIvzWl; Tue, 21 Oct 2014 18:56:39 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2A8CCA73E7; Tue, 21 Oct 2014 18:56:39 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 7BB174B635 for ; Tue, 21 Oct 2014 18:56:35 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id CXqLZczHcDvA for ; Tue, 21 Oct 2014 18:56:35 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by theia.denx.de (Postfix) with ESMTPS id 484BA4B634 for ; Tue, 21 Oct 2014 18:56:32 +0200 (CEST) Received: by mail-wi0-f182.google.com with SMTP id bs8so1606397wib.15 for ; Tue, 21 Oct 2014 09:56:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ngW1Lbt/eoKlxezcv3u5LhQJ8AhMFzNvroqYokhUcdQ=; b=X4EgKwibdNb47Ry7g8/Fd3+gfL2M5lgodkhH87qzPM0SPCU/KUZWoJ5D0pTzzhnz13 ddMvUGSsA7+DM6mBTOfzuzj26PwJpZ97aAbvFpe/d3dR3F7Otj3zi8dPjY3B5MYc0A+6 5VWmdgtLECcFlqaJZAGHWC4B42n6dqeNMYSx9mHXrBCvNyZl7X239G3dY+jOhLYFhpUj 1wHDti8BGnvdaNCvUWIhelmGWozbNHjAz5t9dN2k2K6t8TLdomwdNjwnAWUYN/ATLYNE 0Ty6zaUarwRNcftwCKUNIUel0bvl0beRHMd/TwtxUT8PIrW+TRnhoenFZZYurK4EnAyU idZw== X-Received: by 10.194.58.8 with SMTP id m8mr4120439wjq.43.1413910590336; Tue, 21 Oct 2014 09:56:30 -0700 (PDT) Received: from Sandy.lan ([92.253.108.19]) by mx.google.com with ESMTPSA id om1sm15935631wjc.42.2014.10.21.09.56.28 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 21 Oct 2014 09:56:29 -0700 (PDT) From: Ahmad Draidi To: u-boot@lists.denx.de Date: Tue, 21 Oct 2014 19:55:18 +0300 Message-Id: <1413910518-26288-1-git-send-email-ar2000jp@gmail.com> X-Mailer: git-send-email 2.1.1 In-Reply-To: <1413521529-1697-1-git-send-email-ar2000jp@gmail.com> References: <1413521529-1697-1-git-send-email-ar2000jp@gmail.com> Cc: Ahmad Draidi , Tom Rini Subject: [U-Boot] [PATCH v2] image: Fix Android boot image support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.13 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de This patch makes the following changes: - Set kernel entry point correctly - Append bootargs from image to global bootargs instead of replacing them - Return end address instead of size from android_image_get_end() - Give correct parameter to genimg_get_format() in boot_get_ramdisk() Signed-off-by: Ahmad Draidi Cc: Tom Rini Reviewed-by: Simon Glass --- Changes for v2: - Cleanup bootargs copying code - Coding Style cleanup --- common/bootm.c | 4 ++-- common/image-android.c | 45 ++++++++++++++++++++++++++++++++++----------- common/image.c | 3 ++- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/common/bootm.c b/common/bootm.c index ff81a27..c04a3b0 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -144,11 +144,11 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, images.os.type = IH_TYPE_KERNEL; images.os.comp = IH_COMP_NONE; images.os.os = IH_OS_LINUX; - images.ep = images.os.load; - ep_found = true; images.os.end = android_image_get_end(os_hdr); images.os.load = android_image_get_kload(os_hdr); + images.ep = images.os.load; + ep_found = true; break; #endif default: diff --git a/common/image-android.c b/common/image-android.c index 6ded7e2..673cbca 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -7,6 +7,7 @@ #include #include #include +#include static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1]; @@ -25,12 +26,33 @@ int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, printf("Kernel load addr 0x%08x size %u KiB\n", hdr->kernel_addr, DIV_ROUND_UP(hdr->kernel_size, 1024)); - strncpy(andr_tmp_str, hdr->cmdline, ANDR_BOOT_ARGS_SIZE); - andr_tmp_str[ANDR_BOOT_ARGS_SIZE] = '\0'; - if (strlen(andr_tmp_str)) { - printf("Kernel command line: %s\n", andr_tmp_str); - setenv("bootargs", andr_tmp_str); + + int len = 0; + if (*hdr->cmdline) { + printf("Kernel command line: %s\n", hdr->cmdline); + len += strlen(hdr->cmdline); + } + + char *bootargs = getenv("bootargs"); + if (bootargs) + len += strlen(bootargs); + + char *newbootargs = malloc(len + 2); + if (!newbootargs) { + puts("Error: malloc in android_image_get_kernel failed!\n"); + return -1; } + *newbootargs = '\0'; + + if (bootargs) { + strcpy(newbootargs, bootargs); + strcat(newbootargs, " "); + } + if (*hdr->cmdline) + strcat(newbootargs, hdr->cmdline); + + setenv("bootargs", newbootargs); + if (hdr->ramdisk_size) printf("RAM disk load addr 0x%08x size %u KiB\n", hdr->ramdisk_addr, @@ -52,17 +74,18 @@ int android_image_check_header(const struct andr_img_hdr *hdr) ulong android_image_get_end(const struct andr_img_hdr *hdr) { - u32 size = 0; + ulong end; /* * The header takes a full page, the remaining components are aligned * on page boundary */ - size += hdr->page_size; - size += ALIGN(hdr->kernel_size, hdr->page_size); - size += ALIGN(hdr->ramdisk_size, hdr->page_size); - size += ALIGN(hdr->second_size, hdr->page_size); + end = (ulong)hdr; + end += hdr->page_size; + end += ALIGN(hdr->kernel_size, hdr->page_size); + end += ALIGN(hdr->ramdisk_size, hdr->page_size); + end += ALIGN(hdr->second_size, hdr->page_size); - return size; + return end; } ulong android_image_get_kload(const struct andr_img_hdr *hdr) diff --git a/common/image.c b/common/image.c index 085771c..e21c848 100644 --- a/common/image.c +++ b/common/image.c @@ -1009,7 +1009,8 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len); } #ifdef CONFIG_ANDROID_BOOT_IMAGE - else if ((genimg_get_format(images) == IMAGE_FORMAT_ANDROID) && + else if ((genimg_get_format((void *)images->os.start) + == IMAGE_FORMAT_ANDROID) && (!android_image_get_ramdisk((void *)images->os.start, &rd_data, &rd_len))) { /* empty */