[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCHv2 10/12] pseries: Move /hypervisor node constructi
From: |
Michael Roth |
Subject: |
Re: [Qemu-ppc] [PATCHv2 10/12] pseries: Move /hypervisor node construction to fdt_build_fdt() |
Date: |
Sun, 23 Oct 2016 18:26:29 -0500 |
User-agent: |
alot/0.3.6 |
Quoting David Gibson (2016-10-20 21:56:38)
> Currently the /hypervisor device tree node is constructed in
> spapr_create_fdt_skel(). As part of consolidating device tree construction
> to reset time, move it to a function called from spapr_build_fdt().
>
> Signed-off-by: David Gibson <address@hidden>
> Reviewed-by: Thomas Huth <address@hidden>
Reviewed-by: Michael Roth <address@hidden>
> ---
> hw/ppc/spapr.c | 49 ++++++++++++++++++++++++++++---------------------
> 1 file changed, 28 insertions(+), 21 deletions(-)
>
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index c7ad195..4bd547f 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -328,27 +328,6 @@ static void *spapr_create_fdt_skel(sPAPRMachineState
> *spapr)
>
> _FDT((fdt_end_node(fdt)));
>
> - /* /hypervisor node */
> - if (kvm_enabled()) {
> - uint8_t hypercall[16];
> -
> - /* indicate KVM hypercall interface */
> - _FDT((fdt_begin_node(fdt, "hypervisor")));
> - _FDT((fdt_property_string(fdt, "compatible", "linux,kvm")));
> - if (kvmppc_has_cap_fixup_hcalls()) {
> - /*
> - * Older KVM versions with older guest kernels were broken with
> the
> - * magic page, don't allow the guest to map it.
> - */
> - if (!kvmppc_get_hypercall(first_cpu->env_ptr, hypercall,
> - sizeof(hypercall))) {
> - _FDT((fdt_property(fdt, "hcall-instructions", hypercall,
> - sizeof(hypercall))));
> - }
> - }
> - _FDT((fdt_end_node(fdt)));
> - }
> -
> _FDT((fdt_end_node(fdt))); /* close root node */
> _FDT((fdt_finish(fdt)));
>
> @@ -916,6 +895,29 @@ static void spapr_dt_chosen(sPAPRMachineState *spapr,
> void *fdt)
> g_free(bootlist);
> }
>
> +static void spapr_dt_hypervisor(sPAPRMachineState *spapr, void *fdt)
> +{
> + /* The /hypervisor node isn't in PAPR - this is a hack to allow PR
> + * KVM to work under pHyp with some guest co-operation */
> + int hypervisor;
> + uint8_t hypercall[16];
> +
> + _FDT(hypervisor = fdt_add_subnode(fdt, 0, "hypervisor"));
> + /* indicate KVM hypercall interface */
> + _FDT(fdt_setprop_string(fdt, hypervisor, "compatible", "linux,kvm"));
> + if (kvmppc_has_cap_fixup_hcalls()) {
> + /*
> + * Older KVM versions with older guest kernels were broken
> + * with the magic page, don't allow the guest to map it.
> + */
> + if (!kvmppc_get_hypercall(first_cpu->env_ptr, hypercall,
> + sizeof(hypercall))) {
> + _FDT(fdt_setprop(fdt, hypervisor, "hcall-instructions",
> + hypercall, sizeof(hypercall)));
> + }
> + }
> +}
> +
> static void *spapr_build_fdt(sPAPRMachineState *spapr,
> hwaddr rtas_addr,
> hwaddr rtas_size)
> @@ -989,6 +991,11 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr,
> /* /chosen */
> spapr_dt_chosen(spapr, fdt);
>
> + /* /hypervisor */
> + if (kvm_enabled()) {
> + spapr_dt_hypervisor(spapr, fdt);
> + }
> +
> /* Build memory reserve map */
> if (spapr->kernel_size) {
> _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, spapr->kernel_size)));
> --
> 2.7.4
>