From patchwork Thu Jan 2 05:35:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: liguang X-Patchwork-Id: 306057 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)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 972CC2C0092 for ; Thu, 2 Jan 2014 16:38:23 +1100 (EST) Received: from localhost ([::1]:43447 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vyaz6-00057w-RT for incoming@patchwork.ozlabs.org; Thu, 02 Jan 2014 00:38:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43145) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vyayi-00057X-K7 for qemu-devel@nongnu.org; Thu, 02 Jan 2014 00:38:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vyaye-0004l0-Ng for qemu-devel@nongnu.org; Thu, 02 Jan 2014 00:37:56 -0500 Received: from [222.73.24.84] (port=23191 helo=song.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vyaye-0004jt-8m for qemu-devel@nongnu.org; Thu, 02 Jan 2014 00:37:52 -0500 X-IronPort-AV: E=Sophos;i="4.95,588,1384272000"; d="scan'208";a="9362643" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 02 Jan 2014 13:34:07 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s025bdOY013851; Thu, 2 Jan 2014 13:37:42 +0800 Received: from liguang.fnst.cn.fujitsu.com ([10.167.226.116]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2014010213364724-786278 ; Thu, 2 Jan 2014 13:36:47 +0800 From: Li Guang To: qemu-devel@nongnu.org Date: Thu, 2 Jan 2014 13:35:40 +0800 Message-Id: <1388640940-12782-1-git-send-email-lig.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.7.2.5 X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/01/02 13:36:47, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/01/02 13:36:50, Serialize complete at 2014/01/02 13:36:50 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 222.73.24.84 Cc: peter.maydell@linaro.org, Peter Crosthwaite , Li Guang Subject: [Qemu-devel] [PATCH] hw/misc/blob-loader: add a generic blob loader 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 this blob loader will be used to load a specified blob into a specified RAM address. Signed-off-by: Li Guang --- it can be used now for allwinner-a10, like: "-device blob-loader,addr=0x43000000,file=/path/script.bin" reference: http://linux-sunxi.org/Sunxi-tools script file address: http://dl.dbank.com/c00aonvlmw Thanks to Peter Crosthwaite for the idea! --- default-configs/arm-softmmu.mak | 2 + hw/misc/Makefile.objs | 2 + hw/misc/blob-loader.c | 75 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 0 deletions(-) create mode 100644 hw/misc/blob-loader.c diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak index ce1d620..50c71a6 100644 --- a/default-configs/arm-softmmu.mak +++ b/default-configs/arm-softmmu.mak @@ -87,3 +87,5 @@ CONFIG_INTEGRATOR_DEBUG=y CONFIG_ALLWINNER_A10_PIT=y CONFIG_ALLWINNER_A10_PIC=y CONFIG_ALLWINNER_A10=y + +CONFIG_BLOB_LOADER=y diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs index f674365..df28288 100644 --- a/hw/misc/Makefile.objs +++ b/hw/misc/Makefile.objs @@ -42,3 +42,5 @@ obj-$(CONFIG_SLAVIO) += slavio_misc.o obj-$(CONFIG_ZYNQ) += zynq_slcr.o obj-$(CONFIG_PVPANIC) += pvpanic.o + +obj-$(CONFIG_BLOB_LOADER) += blob-loader.o diff --git a/hw/misc/blob-loader.c b/hw/misc/blob-loader.c new file mode 100644 index 0000000..d7f1408 --- /dev/null +++ b/hw/misc/blob-loader.c @@ -0,0 +1,75 @@ +#include "hw/sysbus.h" +#include "hw/devices.h" +#include "hw/loader.h" +#include "qemu/error-report.h" + +typedef struct BlobLoaderState { + DeviceState qdev; + uint32_t addr; + char *file; +} BlobLoaderState; + +#define TYPE_BLOB_LOADER "blob-loader" +#define BLOB_LOADER(obj) OBJECT_CHECK(BlobLoaderState, (obj), TYPE_BLOB_LOADER) + +static Property blob_loader_props[] = { + DEFINE_PROP_UINT32("addr", BlobLoaderState, addr, 0), + DEFINE_PROP_STRING("file", BlobLoaderState, file), + DEFINE_PROP_END_OF_LIST(), +}; + +static void do_blob_load(BlobLoaderState *s) +{ + char *file_name; + int file_size; + + if (s->file == NULL) { + error_report("please spicify a file for blob loader\n"); + return; + } + file_name = qemu_find_file(QEMU_FILE_TYPE_BIOS, s->file); + if (file_name == NULL) { + error_report("can't find %s\n", s->file); + return; + } + file_size = get_image_size(file_name); + if (file_size < 0) { + error_report("can't get file size of %s\n", file_name); + return; + } + if (load_image_targphys(file_name, s->addr, file_size) < 0) { + error_report("can't load %s\n", file_name); + return; + } +} + +static int blob_loader_init(DeviceState *dev) +{ + BlobLoaderState *s = BLOB_LOADER(dev); + + do_blob_load(s); + return 0; +} + +static void blob_loader_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->props = blob_loader_props; + dc->desc = "blob loader"; + dc->init = blob_loader_init; +} + +static TypeInfo blob_loader_info = { + .name = TYPE_BLOB_LOADER, + .parent = TYPE_DEVICE, + .instance_size = sizeof(BlobLoaderState), + .class_init = blob_loader_class_init, +}; + +static void blob_loader_register_type(void) +{ + type_register_static(&blob_loader_info); +} + +type_init(blob_loader_register_type)