From patchwork Mon Sep 17 09:02:54 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Peter A. G. Crosthwaite" X-Patchwork-Id: 184335 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7263A2C0086 for ; Mon, 17 Sep 2012 19:12:20 +1000 (EST) Received: from localhost ([::1]:60952 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDXFe-0003cQ-KM for incoming@patchwork.ozlabs.org; Mon, 17 Sep 2012 05:04:22 -0400 Received: from eggs.gnu.org ([208.118.235.92]:35618) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDXF7-0002HI-PB for qemu-devel@nongnu.org; Mon, 17 Sep 2012 05:04:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TDXF1-0001ZL-Hw for qemu-devel@nongnu.org; Mon, 17 Sep 2012 05:03:49 -0400 Received: from mail-ie0-f173.google.com ([209.85.223.173]:39068) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDXF1-0001XC-DI for qemu-devel@nongnu.org; Mon, 17 Sep 2012 05:03:43 -0400 Received: by mail-ie0-f173.google.com with SMTP id c10so8784577ieb.4 for ; Mon, 17 Sep 2012 02:03:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references:x-gm-message-state; bh=ML6S29ObSxSTpCHarBgSV/yvMgsL2m8Rf5k4EQHCeyM=; b=Jm4q/GzXQTZ2sIUidh+3Q/Jj87HqhLhgwfoy3YpVfzp/fLZQsaJ+bMPLOIPI6Lq9TV 4khAMuGijLLsZjsKnByKkznkq9AXSB0LkiqW0XxFl+t4Q2+TRvWZb/dYvdoI6GKp1BFg 0P3tX7tySFZm12r0+rg9JligL7vsn9IM8/DrPFZp7llHitptckN5hvkYKFawg7ikAYRU TNwcydyO8jedUbHc5FkKrLEB/RY5L1SptnJ3/HyoAxV/DGJpadEjq63iLBw9bdWk3kEy QleohhCHQKtKLAF9wylxV3GSwA6PA74J+aB47ZW1bf6mudbXJUKQhovx5r5n8CXV+sTj gG/A== Received: by 10.50.181.168 with SMTP id dx8mr5936734igc.8.1347872623137; Mon, 17 Sep 2012 02:03:43 -0700 (PDT) Received: from localhost ([124.148.20.9]) by mx.google.com with ESMTPS id xm2sm16591334igb.3.2012.09.17.02.03.40 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 17 Sep 2012 02:03:42 -0700 (PDT) From: "Peter A. G. Crosthwaite" To: qemu-devel@nongnu.org, edgar.iglesias@gmail.com Date: Mon, 17 Sep 2012 19:02:54 +1000 Message-Id: X-Mailer: git-send-email 1.7.0.4 In-Reply-To: References: In-Reply-To: References: X-Gm-Message-State: ALoCoQnnCBMVYapSqkaquBVbeHR8/Du6XYjrnIfdTbbX+DkWS/8879zjxU9xeh2T9pFnEkvhyy5Z X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.223.173 Cc: peter.crosthwaite@petalogix.com, crwulff@gmail.com Subject: [Qemu-devel] [RFC v0 02/10] device_tree: return Error* from prop getters 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 Rather than exit(1) on fail return an Error*. Clients can then handle errors as they wish. Signed-off-by: Peter A. G. Crosthwaite --- device_tree.c | 25 ++++++++++++++++++------- device_tree.h | 9 +++++++-- hw/arm_boot.c | 8 ++++++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/device_tree.c b/device_tree.c index 92a383e..3792085 100644 --- a/device_tree.c +++ b/device_tree.c @@ -179,7 +179,8 @@ int qemu_devtree_setprop_string(void *fdt, const char *node_path, } const void *qemu_devtree_getprop(void *fdt, const char *node_path, - const char *property, int *lenp) + const char *property, int *lenp, + Error **errp) { int len; const void *r; @@ -190,20 +191,30 @@ const void *qemu_devtree_getprop(void *fdt, const char *node_path, if (!r) { fprintf(stderr, "%s: Couldn't get %s/%s: %s\n", __func__, node_path, property, fdt_strerror(*lenp)); - exit(1); + /* FIXME: Be smarter */ + error_set(errp, QERR_UNDEFINED_ERROR); + return NULL; } return r; } uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path, - const char *property, int offset) + const char *property, int offset, + Error **errp) { int len; - const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len); + const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len, + errp); + if (errp && *errp) { + return 0; + } if (len < (offset+1)*4) { - fprintf(stderr, "%s: %s/%s not long enough to hold %d properties\n", - __func__, node_path, property, offset+1); - exit(1); + fprintf(stderr, "%s: %s/%s not long enough to hold %d properties " + "(length = %d)\n", __func__, node_path, property, + offset+1, len); + /* FIXME: Be smarter */ + error_set(errp, QERR_UNDEFINED_ERROR); + return 0; } return be32_to_cpu(p[offset]); } diff --git a/device_tree.h b/device_tree.h index 759e142..b707085 100644 --- a/device_tree.h +++ b/device_tree.h @@ -14,6 +14,9 @@ #ifndef __DEVICE_TREE_H__ #define __DEVICE_TREE_H__ +#include "qemu-common.h" +#include "qerror.h" + void *create_device_tree(int *sizep); void *load_device_tree(const char *filename_path, int *sizep); @@ -29,9 +32,11 @@ int qemu_devtree_setprop_phandle(void *fdt, const char *node_path, const char *property, const char *target_node_path); const void *qemu_devtree_getprop(void *fdt, const char *node_path, - const char *property, int *lenp); + const char *property, int *lenp, + Error **errp); uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path, - const char *property, int offset); + const char *property, int offset, + Error **errp); uint32_t qemu_devtree_get_phandle(void *fdt, const char *path); uint32_t qemu_devtree_alloc_phandle(void *fdt); int qemu_devtree_nop_node(void *fdt, const char *node_path); diff --git a/hw/arm_boot.c b/hw/arm_boot.c index 051aee6..45a7455 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -221,6 +221,8 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) void *fdt = NULL; char *filename; int size, rc; + Error *errp = NULL; + uint32_t acells, scells, hival; filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, binfo->dtb_filename); @@ -237,8 +239,10 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) } g_free(filename); - acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells", 0); - scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells", 0); + acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells", 0, &errp); + scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells", 0, &errp); + assert_no_error(errp); + if (acells == 0 || scells == 0) { fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); return -1;