From patchwork Fri Jun 14 16:36:22 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soren Brinkmann X-Patchwork-Id: 251459 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 483FD2C0085 for ; Sat, 15 Jun 2013 02:37:33 +1000 (EST) Received: from localhost ([::1]:32887 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnX0F-0003yn-Dj for incoming@patchwork.ozlabs.org; Fri, 14 Jun 2013 12:37:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33602) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnWzg-0003kW-RG for qemu-devel@nongnu.org; Fri, 14 Jun 2013 12:37:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UnWzb-0000aG-0D for qemu-devel@nongnu.org; Fri, 14 Jun 2013 12:36:56 -0400 Received: from mail-pa0-x22c.google.com ([2607:f8b0:400e:c03::22c]:56939) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnWza-0000YI-NZ for qemu-devel@nongnu.org; Fri, 14 Jun 2013 12:36:50 -0400 Received: by mail-pa0-f44.google.com with SMTP id lj1so821031pab.3 for ; Fri, 14 Jun 2013 09:36:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=Xlh0cK2eMqGRZ9DoG6LuenmTfpnr+ESiiMHXp4um5Bc=; b=alCl7p0UnwDUrRhuMLeLo4tAYqMBpTd1P5PWgnQpBfCYOf9hTHgdsyOqi5dsbNLJCy DKvce/hE33mu0G5WJXSx7GJyEawkjYWvXYYA5BPPHE04sWI0wdbRM3iDTIrxdbpFr1fM OLUgCMUUfGaahDv08XBI78+tDUCyq0aY78WzufTs3uaMvBoKtKyeohlqrgNu0UqdtIoZ w8n8luHxSYxTKj3fH/JAnUqtHmIAMijQ1ihumWN3YDd99EcLbL8K9Vs8bhd0y2+EpGhu BbaQZmdYCQy7PJIEng+rHzz4qGPeHqmFdb3lByCQNd0UctJ15za255oAbD2eNIF/nLJD yXFg== X-Received: by 10.66.245.49 with SMTP id xl17mr3363239pac.101.1371227809959; Fri, 14 Jun 2013 09:36:49 -0700 (PDT) Received: from localhost ([149.199.62.254]) by mx.google.com with ESMTPSA id fl2sm3006669pab.23.2013.06.14.09.36.48 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 14 Jun 2013 09:36:49 -0700 (PDT) From: Soren Brinkmann To: Paul Brook , Peter Maydell , Paolo Bonzini Date: Fri, 14 Jun 2013 09:36:22 -0700 Message-Id: <1371227783-23086-2-git-send-email-soren.brinkmann@xilinx.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1371227783-23086-1-git-send-email-soren.brinkmann@xilinx.com> References: <1371227783-23086-1-git-send-email-soren.brinkmann@xilinx.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400e:c03::22c Cc: Peter Crosthwaite , Edgar Iglesias , Soren Brinkmann , qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH 1/2] hw/loader: Support ramdisk with u-boot header X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Introduce 'load_ramdisk()' which can load "normal" ramdisks and ramdisks with a u-boot header. To enable this and leverage synergies 'load_uimage()' is refactored to accomodate this additional use case. Signed-off-by: Soren Brinkmann --- hw/core/loader.c | 86 +++++++++++++++++++++++++++++++++++++---------------- include/hw/loader.h | 1 + 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/hw/core/loader.c b/hw/core/loader.c index 7507914..e72d682 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -434,15 +434,17 @@ static ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, } /* Load a U-Boot image. */ -int load_uimage(const char *filename, hwaddr *ep, - hwaddr *loadaddr, int *is_linux) +static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr, + int *is_linux) { int fd; int size; + hwaddr address; uboot_image_header_t h; uboot_image_header_t *hdr = &h; uint8_t *data = NULL; int ret = -1; + int do_uncompress = 0; fd = open(filename, O_RDONLY | O_BINARY); if (fd < 0) @@ -458,31 +460,48 @@ int load_uimage(const char *filename, hwaddr *ep, goto out; /* TODO: Implement other image types. */ - if (hdr->ih_type != IH_TYPE_KERNEL) { - fprintf(stderr, "Can only load u-boot image type \"kernel\"\n"); - goto out; - } + switch (hdr->ih_type) { + case IH_TYPE_KERNEL: + address = hdr->ih_load; + if (loadaddr) { + *loadaddr = hdr->ih_load; + } + + switch (hdr->ih_comp) { + case IH_COMP_NONE: + break; + case IH_COMP_GZIP: + do_uncompress = 1; + break; + default: + fprintf(stderr, + "Unable to load u-boot images with compression type %d\n", + hdr->ih_comp); + goto out; + } + + if (ep) { + *ep = hdr->ih_ep; + } - switch (hdr->ih_comp) { - case IH_COMP_NONE: - case IH_COMP_GZIP: + /* TODO: Check CPU type. */ + if (is_linux) { + if (hdr->ih_os == IH_OS_LINUX) { + *is_linux = 1; + } else { + *is_linux = 0; + } + } + + break; + case IH_TYPE_RAMDISK: + address = *loadaddr; break; default: - fprintf(stderr, - "Unable to load u-boot images with compression type %d\n", - hdr->ih_comp); + fprintf(stderr, "Unsupported u-boot image type\n"); goto out; } - /* TODO: Check CPU type. */ - if (is_linux) { - if (hdr->ih_os == IH_OS_LINUX) - *is_linux = 1; - else - *is_linux = 0; - } - - *ep = hdr->ih_ep; data = g_malloc(hdr->ih_size); if (read(fd, data, hdr->ih_size) != hdr->ih_size) { @@ -490,7 +509,7 @@ int load_uimage(const char *filename, hwaddr *ep, goto out; } - if (hdr->ih_comp == IH_COMP_GZIP) { + if (do_uncompress) { uint8_t *compressed_data; size_t max_bytes; ssize_t bytes; @@ -508,10 +527,7 @@ int load_uimage(const char *filename, hwaddr *ep, hdr->ih_size = bytes; } - rom_add_blob_fixed(filename, data, hdr->ih_size, hdr->ih_load); - - if (loadaddr) - *loadaddr = hdr->ih_load; + rom_add_blob_fixed(filename, data, hdr->ih_size, address); ret = hdr->ih_size; @@ -522,6 +538,24 @@ out: return ret; } +int load_uimage(const char *filename, hwaddr *ep, hwaddr *loadaddr, + int *is_linux) +{ + return load_uboot_image(filename, ep, loadaddr, is_linux); +} + +/* Load a ramdisk. */ +int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz) +{ + int size = load_uboot_image(filename, NULL, &addr, NULL); + + if (size < 0) { + size = load_image_targphys(filename, addr, max_sz); + } + + return size; +} + /* * Functions for reboot-persistent memory regions. * - used for vga bios and option roms. diff --git a/include/hw/loader.h b/include/hw/loader.h index 0958f06..8ef403e 100644 --- a/include/hw/loader.h +++ b/include/hw/loader.h @@ -15,6 +15,7 @@ int load_aout(const char *filename, hwaddr addr, int max_sz, int bswap_needed, hwaddr target_page_size); int load_uimage(const char *filename, hwaddr *ep, hwaddr *loadaddr, int *is_linux); +int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz); ssize_t read_targphys(const char *name, int fd, hwaddr dst_addr, size_t nbytes);