On 24.02.20 16:02, Halil Pasic wrote:
> We expose loadparm as a r/w machine property, but if loadparm is set by
> the guest via DIAG 308, we don't update the property. Having a
> disconnect between the guest view and the QEMU property is not nice in
> itself, but things get even worse for SCSI, where under certain
> circumstances (see 789b5a401b "s390: Ensure IPL from SCSI works as
> expected" for details) we call s390_gen_initial_iplb() on resets
> effectively overwriting the guest/user supplied loadparm with the stale
> value.
> 
> Signed-off-by: Halil Pasic <pa...@linux.ibm.com>
> Fixes: 7104bae9de "hw/s390x: provide loadparm property for the machine"
> Reported-by: Marc Hartmayer <mhart...@linux.ibm.com>
> Reviewed-by: Janosch Frank <fran...@linux.ibm.com>
> Reviewed-by: Viktor Mihajlovski <mihaj...@linux.ibm.com>
> Tested-by: Marc Hartmayer <mhart...@linux.ibm.com>
> ---
>  hw/s390x/ipl.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 7773499d7f..97a279c1a5 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -538,6 +538,26 @@ static bool is_virtio_scsi_device(IplParameterBlock 
> *iplb)
>      return is_virtio_ccw_device_of_type(iplb, VIRTIO_ID_SCSI);
>  }
>  
> +static void update_machine_ipl_properties(IplParameterBlock *iplb)
> +{
> +    Object *mo = qdev_get_machine();

I'd just call this "machine".

> +
> +    /* Sync loadparm */
> +    if (iplb->flags & DIAG308_FLAGS_LP_VALID) {
> +        char ascii_loadparm[8];
> +        uint8_t *ebcdic_loadparm = iplb->loadparm;
> +        int i;
> +
> +        for (i = 0; i < 8 && ebcdic_loadparm[i]; i++) {
> +            ascii_loadparm[i] = ebcdic2ascii[(uint8_t) ebcdic_loadparm[i]];
> +        }
> +        ascii_loadparm[i] = 0;
> +        object_property_set_str(mo, ascii_loadparm, "loadparm", NULL);
> +    } else {
> +        object_property_set_str(mo, "", "loadparm", NULL);
> +    }

&error_abort instead of NULL, we certainly want to know if this would
ever surprisingly fail.

> +}
> +
>  void s390_ipl_update_diag308(IplParameterBlock *iplb)
>  {
>      S390IPLState *ipl = get_ipl_device();
> @@ -545,6 +565,7 @@ void s390_ipl_update_diag308(IplParameterBlock *iplb)
>      ipl->iplb = *iplb;
>      ipl->iplb_valid = true;
>      ipl->netboot = is_virtio_net_device(iplb);
> +    update_machine_ipl_properties(iplb);
>  }
>  

Somewhat I dislike this manual syncing (and converting back and forth),
but there seems to be no easy way around it.

-- 
Thanks,

David / dhildenb


Reply via email to