From patchwork Wed Apr 20 02:33:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 612448 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 3qqQwr3xHqz9sDC for ; Wed, 20 Apr 2016 12:35:56 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.b=knV8shcV; dkim-atps=neutral Received: from localhost ([::1]:40361 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ashzd-00048e-V6 for incoming@patchwork.ozlabs.org; Tue, 19 Apr 2016 22:35:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34009) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ashw4-0002J4-1H for qemu-devel@nongnu.org; Tue, 19 Apr 2016 22:32:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ashvz-0007qj-75 for qemu-devel@nongnu.org; Tue, 19 Apr 2016 22:32:11 -0400 Received: from ozlabs.org ([103.22.144.67]:50851) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ashvy-0007qG-Sk; Tue, 19 Apr 2016 22:32:07 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3qqQrK73trz9t6m; Wed, 20 Apr 2016 12:32:01 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1461119522; bh=luQctayP8KjQUG7en3b6UqXMEZTdNQrpUy/TKPGutTk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=knV8shcVHlxjTiGxNW+JiKt82UmbinZusi6g8rjFPU4UViQxPLkverCg56e3PLFdy zGGTEcjz9Ostt3WmGkG1p6c8VU7jpd9Cdl+D2F7OER3junXLETnJKvzO0pCZvctu+K bSTCy0mXHaWydAlp+SBO0QlpYhwyr13F7Cq9vY5g= From: David Gibson To: agraf@suse.de, crosthwaite.peter@gmail.com Date: Wed, 20 Apr 2016 12:33:12 +1000 Message-Id: <1461119601-4936-3-git-send-email-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1461119601-4936-1-git-send-email-david@gibson.dropbear.id.au> References: <1461119601-4936-1-git-send-email-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [RFC for-2.7 02/11] pseries: Split device tree construction from device tree load X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: aik@ozlabs.ru, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" spapr_finalize_fdt() both finishes building the device tree for the guest and loads it into guest memory. For future cleanups, it's going to be more convenient to do these two things separately, so split them apart. The loading portion is pretty trivial, so we move it inline into the caller, ppc_spapr_reset(). We also rename spapr_finalize_fdt(), because the current name is going to become inaccurate. Signed-off-by: David Gibson Reviewed-by: Thomas Huth Reviewed-by: Alexey Kardashevskiy --- hw/ppc/spapr.c | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index feaab08..26b95ce 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -899,10 +899,9 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr, return 0; } -static void spapr_finalize_fdt(sPAPRMachineState *spapr, - hwaddr fdt_addr, - hwaddr rtas_addr, - hwaddr rtas_size) +static void *spapr_build_fdt(sPAPRMachineState *spapr, + hwaddr rtas_addr, + hwaddr rtas_size) { MachineState *machine = MACHINE(qdev_get_machine()); sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); @@ -988,19 +987,8 @@ static void spapr_finalize_fdt(sPAPRMachineState *spapr, _FDT(spapr_drc_populate_dt(fdt, 0, NULL, SPAPR_DR_CONNECTOR_TYPE_LMB)); } - _FDT((fdt_pack(fdt))); - - if (fdt_totalsize(fdt) > FDT_MAX_SIZE) { - error_report("FDT too big ! 0x%x bytes (max is 0x%x)", - fdt_totalsize(fdt), FDT_MAX_SIZE); - exit(1); - } - - qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt)); - cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt)); - g_free(bootlist); - g_free(fdt); + return fdt; } static uint64_t translate_kernel_address(void *opaque, uint64_t addr) @@ -1138,6 +1126,8 @@ static void ppc_spapr_reset(void) sPAPRMachineState *spapr = SPAPR_MACHINE(machine); PowerPCCPU *first_ppc_cpu; uint32_t rtas_limit; + void *fdt; + int rc; /* Check for unknown sysbus devices */ foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL); @@ -1164,14 +1154,27 @@ static void ppc_spapr_reset(void) spapr->rtas_addr = rtas_limit - RTAS_MAX_SIZE; spapr->fdt_addr = spapr->rtas_addr - FDT_MAX_SIZE; - /* Load the fdt */ - spapr_finalize_fdt(spapr, spapr->fdt_addr, spapr->rtas_addr, - spapr->rtas_size); + fdt = spapr_build_fdt(spapr, spapr->rtas_addr, spapr->rtas_size); /* Copy RTAS over */ cpu_physical_memory_write(spapr->rtas_addr, spapr->rtas_blob, spapr->rtas_size); + rc = fdt_pack(fdt); + + /* Should only fail if we've built a corrupted tree */ + assert(rc == 0); + + if (fdt_totalsize(fdt) > FDT_MAX_SIZE) { + error_report("FDT too big ! 0x%x bytes (max is 0x%x)", + fdt_totalsize(fdt), FDT_MAX_SIZE); + exit(1); + } + + /* Load the fdt */ + qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt)); + cpu_physical_memory_write(spapr->fdt_addr, fdt, fdt_totalsize(fdt)); + /* Set up the entry state */ first_ppc_cpu = POWERPC_CPU(first_cpu); first_ppc_cpu->env.gpr[3] = spapr->fdt_addr;