qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH qemu] spapr: Add /choses to FDT only at reset time to preserv


From: David Gibson
Subject: Re: [PATCH qemu] spapr: Add /choses to FDT only at reset time to preserve kernel and initramdisk
Date: Mon, 28 Oct 2019 23:22:26 +0100
User-agent: Mutt/1.12.1 (2019-06-15)

On Thu, Oct 24, 2019 at 03:13:08PM +1100, Alexey Kardashevskiy wrote:
65;5603;1c> Since "spapr: Render full FDT on ibm,client-architecture-support" 
we build
> the entire flatten device tree (FDT) twice - at the reset time and
> when "ibm,client-architecture-support" (CAS) is called. The full FDT from
> CAS is then applied on top of the SLOF internal device tree.
> 
> This is mostly ok, however there is a case when the QEMU is started with
> -initrd and for some reason the guest decided to move/unpack the init RAM
> disk image - the guest correctly notifies SLOF about the change but
> at CAS it is overridden with the QEMU initial location addresses and
> the guest may fail to boot if the original initrd memory was changed.
> 
> This fixes the problem by only adding the /chosen node at the reset time
> to prevent the original QEMU's linux,initrd-start/linux,initrd-end to
> override the updated addresses.
> 
> This only treats /chosen differently as we know there is a special case
> already and it is unlikely anything else will need to change /chosen at CAS
> we are better off not touching /chosen after we handed it over to SLOF.
> 
> Signed-off-by: Alexey Kardashevskiy <address@hidden>

Applied to ppc-for-4.2 (with the typo in the subject line corrected
/choses -> /chosen).

> ---
>  hw/ppc/spapr.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index d4c07a9b1bab..0580789a1509 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -925,7 +925,7 @@ static bool spapr_hotplugged_dev_before_cas(void)
>      return false;
>  }
>  
> -static void *spapr_build_fdt(SpaprMachineState *spapr);
> +static void *spapr_build_fdt(SpaprMachineState *spapr, bool reset);
>  
>  int spapr_h_cas_compose_response(SpaprMachineState *spapr,
>                                   target_ulong addr, target_ulong size,
> @@ -947,7 +947,7 @@ int spapr_h_cas_compose_response(SpaprMachineState *spapr,
>  
>      size -= sizeof(hdr);
>  
> -    fdt = spapr_build_fdt(spapr);
> +    fdt = spapr_build_fdt(spapr, false);
>      _FDT((fdt_pack(fdt)));
>  
>      if (fdt_totalsize(fdt) + sizeof(hdr) > size) {
> @@ -1205,7 +1205,7 @@ static void spapr_dt_hypervisor(SpaprMachineState 
> *spapr, void *fdt)
>      }
>  }
>  
> -static void *spapr_build_fdt(SpaprMachineState *spapr)
> +static void *spapr_build_fdt(SpaprMachineState *spapr, bool reset)
>  {
>      MachineState *machine = MACHINE(spapr);
>      MachineClass *mc = MACHINE_GET_CLASS(machine);
> @@ -1305,7 +1305,9 @@ static void *spapr_build_fdt(SpaprMachineState *spapr)
>      spapr_dt_rtas(spapr, fdt);
>  
>      /* /chosen */
> -    spapr_dt_chosen(spapr, fdt);
> +    if (reset) {
> +        spapr_dt_chosen(spapr, fdt);
> +    }
>  
>      /* /hypervisor */
>      if (kvm_enabled()) {
> @@ -1313,11 +1315,14 @@ static void *spapr_build_fdt(SpaprMachineState *spapr)
>      }
>  
>      /* Build memory reserve map */
> -    if (spapr->kernel_size) {
> -        _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, spapr->kernel_size)));
> -    }
> -    if (spapr->initrd_size) {
> -        _FDT((fdt_add_mem_rsv(fdt, spapr->initrd_base, spapr->initrd_size)));
> +    if (reset) {
> +        if (spapr->kernel_size) {
> +            _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, 
> spapr->kernel_size)));
> +        }
> +        if (spapr->initrd_size) {
> +            _FDT((fdt_add_mem_rsv(fdt, spapr->initrd_base,
> +                                  spapr->initrd_size)));
> +        }
>      }
>  
>      /* ibm,client-architecture-support updates */
> @@ -1726,7 +1731,7 @@ static void spapr_machine_reset(MachineState *machine)
>       */
>      fdt_addr = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FDT_MAX_SIZE;
>  
> -    fdt = spapr_build_fdt(spapr);
> +    fdt = spapr_build_fdt(spapr, true);
>  
>      rc = fdt_pack(fdt);
>  

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]