qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH 1/1] s390/ipl: sync back loadparm


From: Christian Borntraeger
Subject: Re: [PATCH 1/1] s390/ipl: sync back loadparm
Date: Thu, 5 Mar 2020 15:25:14 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1


On 05.03.20 15:11, Halil Pasic wrote:
> On Thu, 5 Mar 2020 13:44:31 +0100
> Christian Borntraeger <address@hidden> wrote:
> 
>>
>>
>> On 25.02.20 15:35, Viktor Mihajlovski wrote:
>>>
>>>
>>> On 2/25/20 12:56 PM, Halil Pasic wrote:
>>>> On Tue, 25 Feb 2020 10:39:40 +0100
>>>> David Hildenbrand <address@hidden> wrote:
>>>>
>>>>> 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 <address@hidden>
>>>>>> Fixes: 7104bae9de "hw/s390x: provide loadparm property for the machine"
>>>>>> Reported-by: Marc Hartmayer <address@hidden>
>>>>>> Reviewed-by: Janosch Frank <address@hidden>
>>>>>> Reviewed-by: Viktor Mihajlovski <address@hidden>
>>>>>> Tested-by: Marc Hartmayer <address@hidden>
>>>>>> ---
>>>>>>   hw/s390x/ipl.c | 21 +++++++++++++++++++++
>>>>>>   1 file changed, 21 insertions(+)
>>>>>>
>>>>>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>>> [...]
>>>>>> +
>>>>>> +    /* 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.
>>>>
>>>> IMHO this is a typical assert() situation where one would like to have
>>>> a fast and obvious failure when testing, but not in production.
>>>>
>>>> AFAIU the guest can trigger this code at any time, and crashing the
>>>> whole (production) system seems a bit heavy handed to me. The setter
>>>> should only fail if something is buggy.
>>>>
>>>> But if the majority says &error_abort I can certainly do. Other opinions?
>>>>
>>> We might consider to return 0x0402 (invalid parameter) from the diag308 
>>> "set", which is less drastic and would allow the OS to do whatever it finds 
>>> appropriate to deal with the failure. Not that Linux would care about that 
>>> today :-).
>>
>> I think it is not an error. It is perfectly fine for a guest to not set 
>> DIAG308_FLAGS_LP_VALID if the guest does not want to set it. The LOADPARM is 
>> supposed to be ignored then.
>>
> 
> I believe David's concern was not the else branch, but the last
> parameter of object_property_set_str(), which tells us what to do if the
> validation/normalization done by the setter of the loadparm qemu
> property fails the set operation.

Ah I see. I still think that the guest could provoke the an error by putting
invalid characters in the loadparm field. So error_abort seems wrong.
And in fact for that case, the 0x0402 proposal from Viktor seems like the
right thing to do.




reply via email to

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