From patchwork Thu Oct 20 05:12:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 9385929 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CF67D607F0 for ; Thu, 20 Oct 2016 05:21:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C3B5B29A60 for ; Thu, 20 Oct 2016 05:21:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B883429A62; Thu, 20 Oct 2016 05:21:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9401229A60 for ; Thu, 20 Oct 2016 05:21:08 +0000 (UTC) Received: from localhost ([::1]:52479 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bx5mt-0004hG-Rk for patchwork-qemu-devel@patchwork.kernel.org; Thu, 20 Oct 2016 01:21:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39084) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bx5eX-0005e3-8s for qemu-devel@nongnu.org; Thu, 20 Oct 2016 01:12:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bx5eT-0007Vk-9Z for qemu-devel@nongnu.org; Thu, 20 Oct 2016 01:12:29 -0400 Received: from ozlabs.org ([103.22.144.67]:36975) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1bx5eS-0007T6-Ki; Thu, 20 Oct 2016 01:12:25 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3szxkn1kFwz9sR9; Thu, 20 Oct 2016 16:12:17 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1476940337; bh=57/aZNB9YT+fdB+lG/+qHSCRgUrBC8h01OZmcNV3HUg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ug1Q1opfVit9Ve051mzYFgbSBHe7bmnVyWdWDbpOjE4z7IxAayzrYiU6Tf2FmpAhA nIhXEY2ugzEnw+z2xZaW02LdR+haAstUhiiTLQV/7GM887/FPpimbOlgeAg5Cq7ugc /LhZM23P/STJeWKWA+yzZIWWDN5ALM7N74u/5qY4= From: David Gibson To: aik@ozlabs.ru, mdroth@linux.vnet.ibm.com, groug@kaod.org Date: Thu, 20 Oct 2016 16:12:01 +1100 Message-Id: <1476940330-27705-5-git-send-email-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1476940330-27705-1-git-send-email-david@gibson.dropbear.id.au> References: <1476940330-27705-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] [PATCH 04/13] pseries: Make spapr_create_fdt_skel() get information from machine state 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: lvivier@redhat.com, thuth@redhat.com, agraf@suse.de, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Currently spapr_create_fdt_skel() takes a bunch of individual parameters for various things it will put in the device tree. Some of these can already be taken directly from sPAPRMachineState. This patch alters it so that all of them can be taken from there, which will allow this code to be moved away from its current caller in future. Signed-off-by: David Gibson Reviewed-by: Alexey Kardashevskiy Reviewed-by: Thomas Huth --- hw/ppc/spapr.c | 81 ++++++++++++++++++++++---------------------------- include/hw/ppc/spapr.h | 4 +++ 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index c4baca9..25c16d3 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -271,16 +271,12 @@ static void add_str(GString *s, const gchar *s1) g_string_append_len(s, s1, strlen(s1) + 1); } -static void *spapr_create_fdt_skel(hwaddr initrd_base, - hwaddr initrd_size, - hwaddr kernel_size, - bool little_endian, - const char *kernel_cmdline, - uint32_t epow_irq) +static void *spapr_create_fdt_skel(sPAPRMachineState *spapr) { + MachineState *machine = MACHINE(spapr); void *fdt; - uint32_t start_prop = cpu_to_be32(initrd_base); - uint32_t end_prop = cpu_to_be32(initrd_base + initrd_size); + uint32_t start_prop = cpu_to_be32(spapr->initrd_base); + uint32_t end_prop = cpu_to_be32(spapr->initrd_base + spapr->initrd_size); GString *hypertas = g_string_sized_new(256); GString *qemu_hypertas = g_string_sized_new(256); uint32_t refpoints[] = {cpu_to_be32(0x4), cpu_to_be32(0x4)}; @@ -305,11 +301,13 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, fdt = g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create(fdt, FDT_MAX_SIZE))); - if (kernel_size) { - _FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, kernel_size))); + if (spapr->kernel_size) { + _FDT((fdt_add_reservemap_entry(fdt, KERNEL_LOAD_ADDR, + spapr->kernel_size))); } - if (initrd_size) { - _FDT((fdt_add_reservemap_entry(fdt, initrd_base, initrd_size))); + if (spapr->initrd_size) { + _FDT((fdt_add_reservemap_entry(fdt, spapr->initrd_base, + spapr->initrd_size))); } _FDT((fdt_finish_reservemap(fdt))); @@ -354,17 +352,17 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, /* Set Form1_affinity */ _FDT((fdt_property(fdt, "ibm,architecture-vec-5", vec5, sizeof(vec5)))); - _FDT((fdt_property_string(fdt, "bootargs", kernel_cmdline))); + _FDT((fdt_property_string(fdt, "bootargs", machine->kernel_cmdline))); _FDT((fdt_property(fdt, "linux,initrd-start", &start_prop, sizeof(start_prop)))); _FDT((fdt_property(fdt, "linux,initrd-end", &end_prop, sizeof(end_prop)))); - if (kernel_size) { + if (spapr->kernel_size) { uint64_t kprop[2] = { cpu_to_be64(KERNEL_LOAD_ADDR), - cpu_to_be64(kernel_size) }; + cpu_to_be64(spapr->kernel_size) }; _FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop)))); - if (little_endian) { + if (spapr->kernel_le) { _FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0))); } } @@ -441,7 +439,7 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base, _FDT((fdt_end_node(fdt))); /* event-sources */ - spapr_events_fdt_skel(fdt, epow_irq); + spapr_events_fdt_skel(fdt, spapr->check_exception_irq); /* /hypervisor node */ if (kvm_enabled()) { @@ -1685,7 +1683,6 @@ static void ppc_spapr_init(MachineState *machine) MachineClass *mc = MACHINE_GET_CLASS(machine); sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); const char *kernel_filename = machine->kernel_filename; - const char *kernel_cmdline = machine->kernel_cmdline; const char *initrd_filename = machine->initrd_filename; PCIHostState *phb; int i; @@ -1695,10 +1692,7 @@ static void ppc_spapr_init(MachineState *machine) void *rma = NULL; hwaddr rma_alloc_size; hwaddr node0_size = spapr_node0_size(); - uint32_t initrd_base = 0; - long kernel_size = 0, initrd_size = 0; long load_limit, fw_size; - bool kernel_le = false; char *filename; int smt = kvmppc_smt_threads(); int spapr_cores = smp_cpus / smp_threads; @@ -1971,19 +1965,19 @@ static void ppc_spapr_init(MachineState *machine) if (kernel_filename) { uint64_t lowaddr = 0; - kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL, - NULL, &lowaddr, NULL, 1, PPC_ELF_MACHINE, - 0, 0); - if (kernel_size == ELF_LOAD_WRONG_ENDIAN) { - kernel_size = load_elf(kernel_filename, - translate_kernel_address, NULL, - NULL, &lowaddr, NULL, 0, PPC_ELF_MACHINE, - 0, 0); - kernel_le = kernel_size > 0; - } - if (kernel_size < 0) { - error_report("error loading %s: %s", - kernel_filename, load_elf_strerror(kernel_size)); + spapr->kernel_size = load_elf(kernel_filename, translate_kernel_address, + NULL, NULL, &lowaddr, NULL, 1, + PPC_ELF_MACHINE, 0, 0); + if (spapr->kernel_size == ELF_LOAD_WRONG_ENDIAN) { + spapr->kernel_size = load_elf(kernel_filename, + translate_kernel_address, NULL, NULL, + &lowaddr, NULL, 0, PPC_ELF_MACHINE, + 0, 0); + spapr->kernel_le = spapr->kernel_size > 0; + } + if (spapr->kernel_size < 0) { + error_report("error loading %s: %s", kernel_filename, + load_elf_strerror(spapr->kernel_size)); exit(1); } @@ -1992,17 +1986,17 @@ static void ppc_spapr_init(MachineState *machine) /* Try to locate the initrd in the gap between the kernel * and the firmware. Add a bit of space just in case */ - initrd_base = (KERNEL_LOAD_ADDR + kernel_size + 0x1ffff) & ~0xffff; - initrd_size = load_image_targphys(initrd_filename, initrd_base, - load_limit - initrd_base); - if (initrd_size < 0) { + spapr->initrd_base = (KERNEL_LOAD_ADDR + spapr->kernel_size + + 0x1ffff) & ~0xffff; + spapr->initrd_size = load_image_targphys(initrd_filename, + spapr->initrd_base, + load_limit + - spapr->initrd_base); + if (spapr->initrd_size < 0) { error_report("could not load initial ram disk '%s'", initrd_filename); exit(1); } - } else { - initrd_base = 0; - initrd_size = 0; } } @@ -2029,10 +2023,7 @@ static void ppc_spapr_init(MachineState *machine) &savevm_htab_handlers, spapr); /* Prepare the device tree */ - spapr->fdt_skel = spapr_create_fdt_skel(initrd_base, initrd_size, - kernel_size, kernel_le, - kernel_cmdline, - spapr->check_exception_irq); + spapr->fdt_skel = spapr_create_fdt_skel(spapr); assert(spapr->fdt_skel != NULL); /* used by RTAS */ diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 1174741..a0b4bf8 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -65,6 +65,10 @@ struct sPAPRMachineState { int vrma_adjust; ssize_t rtas_size; void *rtas_blob; + long kernel_size; + bool kernel_le; + uint32_t initrd_base; + long initrd_size; void *fdt_skel; uint64_t rtc_offset; /* Now used only during incoming migration */ struct PPCTimebase tb;