From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57461) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1byT1l-0007m1-HK for qemu-devel@nongnu.org; Sun, 23 Oct 2016 20:22:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1byT1i-0005D7-7S for qemu-devel@nongnu.org; Sun, 23 Oct 2016 20:22:09 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:33913) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1byT1h-0005Ba-UX for qemu-devel@nongnu.org; Sun, 23 Oct 2016 20:22:06 -0400 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id u9O0IphV119398 for ; Sun, 23 Oct 2016 20:22:04 -0400 Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.149]) by mx0a-001b2d01.pphosted.com with ESMTP id 268yyu61au-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Sun, 23 Oct 2016 20:22:04 -0400 Received: from localhost by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 23 Oct 2016 18:22:03 -0600 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Roth In-Reply-To: <1477018600-6881-4-git-send-email-david@gibson.dropbear.id.au> References: <1477018600-6881-1-git-send-email-david@gibson.dropbear.id.au> <1477018600-6881-4-git-send-email-david@gibson.dropbear.id.au> Date: Sun, 23 Oct 2016 18:25:27 -0500 Message-Id: <20161023232527.17113.30683@loki> Subject: Re: [Qemu-devel] [PATCHv2 03/12] pseries: Make spapr_create_fdt_skel() get information from machine state List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson , aik@ozlabs.ru, groug@kaod.org Cc: agraf@suse.de, lvivier@redhat.com, thuth@redhat.com, qemu-ppc@nongnu.org, qemu-devel@nongnu.org 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 > Reviewed-by: Alexey Kardashevskiy > Reviewed-by: Thomas Huth Reviewed-by: Michael Roth > --- > 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 =3D MACHINE(spapr); > void *fdt; > - uint32_t start_prop =3D cpu_to_be32(initrd_base); > - uint32_t end_prop =3D cpu_to_be32(initrd_base + initrd_size); > + uint32_t start_prop =3D cpu_to_be32(spapr->initrd_base); > + uint32_t end_prop =3D cpu_to_be32(spapr->initrd_base + spapr->initrd= _size); > GString *hypertas =3D g_string_sized_new(256); > GString *qemu_hypertas =3D g_string_sized_new(256); > uint32_t refpoints[] =3D {cpu_to_be32(0x4), cpu_to_be32(0x4)}; > @@ -305,11 +301,13 @@ static void *spapr_create_fdt_skel(hwaddr initrd_ba= se, > fdt =3D 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_siz= e))); > + 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_ba= se, > /* 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] =3D { 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 =3D MACHINE_GET_CLASS(machine); > sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); > const char *kernel_filename =3D machine->kernel_filename; > - const char *kernel_cmdline =3D machine->kernel_cmdline; > const char *initrd_filename =3D machine->initrd_filename; > PCIHostState *phb; > int i; > @@ -1696,10 +1693,7 @@ static void ppc_spapr_init(MachineState *machine) > void *rma =3D NULL; > hwaddr rma_alloc_size; > hwaddr node0_size =3D spapr_node0_size(); > - uint32_t initrd_base =3D 0; > - long kernel_size =3D 0, initrd_size =3D 0; > long load_limit, fw_size; > - bool kernel_le =3D false; > char *filename; > int smt =3D kvmppc_smt_threads(); > int spapr_cores =3D smp_cpus / smp_threads; > @@ -1972,19 +1966,19 @@ static void ppc_spapr_init(MachineState *machine) > if (kernel_filename) { > uint64_t lowaddr =3D 0; > = > - kernel_size =3D load_elf(kernel_filename, translate_kernel_addre= ss, NULL, > - NULL, &lowaddr, NULL, 1, PPC_ELF_MACHINE, > - 0, 0); > - if (kernel_size =3D=3D ELF_LOAD_WRONG_ENDIAN) { > - kernel_size =3D load_elf(kernel_filename, > - translate_kernel_address, NULL, > - NULL, &lowaddr, NULL, 0, PPC_ELF_MACH= INE, > - 0, 0); > - kernel_le =3D kernel_size > 0; > - } > - if (kernel_size < 0) { > - error_report("error loading %s: %s", > - kernel_filename, load_elf_strerror(kernel_size)= ); > + spapr->kernel_size =3D load_elf(kernel_filename, translate_kerne= l_address, > + NULL, NULL, &lowaddr, NULL, 1, > + PPC_ELF_MACHINE, 0, 0); > + if (spapr->kernel_size =3D=3D ELF_LOAD_WRONG_ENDIAN) { > + spapr->kernel_size =3D load_elf(kernel_filename, > + translate_kernel_address, NULL= , NULL, > + &lowaddr, NULL, 0, PPC_ELF_MAC= HINE, > + 0, 0); > + spapr->kernel_le =3D 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 =3D (KERNEL_LOAD_ADDR + kernel_size + 0x1ffff) &= ~0xffff; > - initrd_size =3D load_image_targphys(initrd_filename, initrd_= base, > - load_limit - initrd_base); > - if (initrd_size < 0) { > + spapr->initrd_base =3D (KERNEL_LOAD_ADDR + spapr->kernel_size > + + 0x1ffff) & ~0xffff; > + spapr->initrd_size =3D load_image_targphys(initrd_filename, > + spapr->initrd_base, > + load_limit > + - spapr->initrd_bas= e); > + if (spapr->initrd_size < 0) { > error_report("could not load initial ram disk '%s'", > initrd_filename); > exit(1); > } > - } else { > - initrd_base =3D 0; > - initrd_size =3D 0; > } > } > = > @@ -2030,10 +2024,7 @@ static void ppc_spapr_init(MachineState *machine) > &savevm_htab_handlers, spapr); > = > /* Prepare the device tree */ > - spapr->fdt_skel =3D spapr_create_fdt_skel(initrd_base, initrd_size, > - kernel_size, kernel_le, > - kernel_cmdline, > - spapr->check_exception_irq); > + spapr->fdt_skel =3D spapr_create_fdt_skel(spapr); > assert(spapr->fdt_skel !=3D 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 >=20