From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>,
aik@ozlabs.ru, groug@kaod.org
Cc: agraf@suse.de, lvivier@redhat.com, thuth@redhat.com,
qemu-ppc@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCHv2 03/12] pseries: Make spapr_create_fdt_skel() get information from machine state
Date: Sun, 23 Oct 2016 18:25:27 -0500 [thread overview]
Message-ID: <20161023232527.17113.30683@loki> (raw)
In-Reply-To: <1477018600-6881-4-git-send-email-david@gibson.dropbear.id.au>
Quoting David Gibson (2016-10-20 21:56:31)
> 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 <david@gibson.dropbear.id.au>
> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
> 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 2c1c7ff..b4c4353 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()) {
> @@ -1686,7 +1684,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;
> @@ -1696,10 +1693,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;
> @@ -1972,19 +1966,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);
> }
>
> @@ -1993,17 +1987,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;
> }
> }
>
> @@ -2030,10 +2024,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;
> --
> 2.7.4
>
next prev parent reply other threads:[~2016-10-24 0:22 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-21 2:56 [Qemu-devel] [PATCHv2 00/12] pseries: Consolidate guest device tree construction David Gibson
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 01/12] pseries: Split device tree construction from device tree load David Gibson
2016-10-24 5:17 ` Alexey Kardashevskiy
2016-10-25 0:51 ` David Gibson
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 02/12] pseries: Remove rtas_addr and fdt_addr fields from machinestate David Gibson
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 03/12] pseries: Make spapr_create_fdt_skel() get information from machine state David Gibson
2016-10-23 23:25 ` Michael Roth [this message]
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 04/12] pseries: Move adding of fdt reserve map entries David Gibson
2016-10-23 23:25 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 05/12] pseries: Consolidate RTAS loading David Gibson
2016-10-23 23:25 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 06/12] pseries: Move construction of /interrupt-controller fdt node David Gibson
2016-10-24 0:23 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 07/12] pseries: Consolidate construction of /chosen device tree node David Gibson
2016-10-24 0:33 ` Michael Roth
2016-10-24 1:07 ` David Gibson
2016-10-24 2:20 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 08/12] pseries: Consolidate construction of /rtas " David Gibson
2016-10-23 23:26 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 09/12] pseries: Move /event-sources construction to spapr_build_fdt() David Gibson
2016-10-24 0:16 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 10/12] pseries: Move /hypervisor node construction to fdt_build_fdt() David Gibson
2016-10-23 23:26 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 11/12] pseries: Consolidate construction of /vdevice device tree node David Gibson
2016-10-23 23:27 ` Michael Roth
2016-10-21 2:56 ` [Qemu-devel] [PATCHv2 12/12] pseries: Remove spapr_create_fdt_skel() David Gibson
2016-10-24 0:21 ` Michael Roth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161023232527.17113.30683@loki \
--to=mdroth@linux.vnet.ibm.com \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=david@gibson.dropbear.id.au \
--cc=groug@kaod.org \
--cc=lvivier@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).