diff mbox

[2/2] hw/ppc/spapr Add qemu_register_boot_set for SPAPR

Message ID 54C60A51.7030705@suse.de
State New
Headers show

Commit Message

Alexander Graf Jan. 26, 2015, 9:35 a.m. UTC
On 01/26/2015 11:49 AM, Dinar Valeev wrote:
> On 01/24/2015 12:04 AM, Alexander Graf wrote:
>>
>>
>> On 23.01.15 23:51, dvaleev@suse.de wrote:
>>> From: Dinar Valeev <dvaleev@suse.com>
>>>
>>> In order to have -boot once=d functioning, it is required to have
>>> qemu_register_boot_set
>>>
>>> qemu-system-ppc64 -enable-kvm -boot once=d
>>>
>>> Ready!
>>> 0 > dev /chosen   ok
>>> 0 > .properties
>>> ...
>>> qemu,boot-device                 d
>>> ...
>>> 0 > reset-all
>>>
>>> Ready!
>>> 0 > dev /chosen   ok
>>> 0 > .properties
>>> ...
>>> qemu,boot-device                 cdn
>>> ...
>>>
>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
>>> ---
>>>   hw/ppc/spapr.c | 12 ++++++++++++
>>>   1 file changed, 12 insertions(+)
>>>
>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>> index 3d2cfa3..38b03fc 100644
>>> --- a/hw/ppc/spapr.c
>>> +++ b/hw/ppc/spapr.c
>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar *s1)
>>>       g_string_append_len(s, s1, strlen(s1) + 1);
>>>   }
>>>
>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
>>> +                           Error **errp)
>>> +{
>>> +    int offset;
>>> +    offset = fdt_path_offset(opaque, "/chosen");
>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device", 
>>> boot_device);
>>> +
>>> +}
>>> +
>>> +
>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>                                      hwaddr initrd_size,
>>>                                      hwaddr kernel_size,
>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr 
>>> initrd_base,
>>>       if (boot_device) {
>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device", 
>>> boot_device)));
>>>       }
>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
>>
>> If you simply move the code above (the _FDT() one) from create_fdt_skel
>> to spapr_finalize_fdt() you should have the same net effect and much
>> cleaner code :).
> I've tried your proposal, on reset boot-device property stays "d"

Ugh, the machine field doesn't change on reset. I think it'd be a lot 
more intuitive if it did. Can you try with the patch below applied as well?


          error_setg(errp, "no function defined to set boot device list for"
@@ -63,6 +64,7 @@ void qemu_boot_set(const char *boot_order, Error **errp)
          return;
      }

+    machine->boot_order = boot_order;
      boot_set_handler(boot_set_opaque, boot_order, errp);
  }



Thanks,

Alex

Comments

Gonglei (Arei) Jan. 29, 2015, 12:40 a.m. UTC | #1
On 2015/1/26 17:35, Alexander Graf wrote:

> On 01/26/2015 11:49 AM, Dinar Valeev wrote:
>> On 01/24/2015 12:04 AM, Alexander Graf wrote:
>>>
>>>
>>> On 23.01.15 23:51, dvaleev@suse.de wrote:
>>>> From: Dinar Valeev <dvaleev@suse.com>
>>>>
>>>> In order to have -boot once=d functioning, it is required to have
>>>> qemu_register_boot_set
>>>>
>>>> qemu-system-ppc64 -enable-kvm -boot once=d
>>>>
>>>> Ready!
>>>> 0 > dev /chosen   ok
>>>> 0 > .properties
>>>> ...
>>>> qemu,boot-device                 d
>>>> ...
>>>> 0 > reset-all
>>>>
>>>> Ready!
>>>> 0 > dev /chosen   ok
>>>> 0 > .properties
>>>> ...
>>>> qemu,boot-device                 cdn
>>>> ...
>>>>
>>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
>>>> ---
>>>>   hw/ppc/spapr.c | 12 ++++++++++++
>>>>   1 file changed, 12 insertions(+)
>>>>
>>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>>> index 3d2cfa3..38b03fc 100644
>>>> --- a/hw/ppc/spapr.c
>>>> +++ b/hw/ppc/spapr.c
>>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar *s1)
>>>>       g_string_append_len(s, s1, strlen(s1) + 1);
>>>>   }
>>>>
>>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
>>>> +                           Error **errp)
>>>> +{
>>>> +    int offset;
>>>> +    offset = fdt_path_offset(opaque, "/chosen");
>>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device", boot_device);
>>>> +
>>>> +}
>>>> +
>>>> +
>>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>                                      hwaddr initrd_size,
>>>>                                      hwaddr kernel_size,
>>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>       if (boot_device) {
>>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
>>>>       }
>>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
>>>
>>> If you simply move the code above (the _FDT() one) from create_fdt_skel
>>> to spapr_finalize_fdt() you should have the same net effect and much
>>> cleaner code :).
>> I've tried your proposal, on reset boot-device property stays "d"
> 
> Ugh, the machine field doesn't change on reset. I think it'd be a lot more intuitive if it did. Can you try with the patch below applied as well?
> 

This approach is not good because boot_set_handler is NULL and return error directly.
Please using qemu_register_boot_set for this purpose.

Regards,
-Gonglei

> 
> diff --git a/bootdevice.c b/bootdevice.c
> index 5914417..3b750ff 100644
> --- a/bootdevice.c
> +++ b/bootdevice.c
> @@ -50,6 +50,7 @@ void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
>  void qemu_boot_set(const char *boot_order, Error **errp)
>  {
>      Error *local_err = NULL;
> +    MachineState *machine = MACHINE(qdev_get_machine());
> 
>      if (!boot_set_handler) {
>          error_setg(errp, "no function defined to set boot device list for"
> @@ -63,6 +64,7 @@ void qemu_boot_set(const char *boot_order, Error **errp)
>          return;
>      }
> 
> +    machine->boot_order = boot_order;
>      boot_set_handler(boot_set_opaque, boot_order, errp);
>  }
> 
> 
> 
> Thanks,
> 
> Alex
> 
>
Alexander Graf Jan. 29, 2015, 12:42 a.m. UTC | #2
On 29.01.15 01:40, Gonglei wrote:
> On 2015/1/26 17:35, Alexander Graf wrote:
> 
>> On 01/26/2015 11:49 AM, Dinar Valeev wrote:
>>> On 01/24/2015 12:04 AM, Alexander Graf wrote:
>>>>
>>>>
>>>> On 23.01.15 23:51, dvaleev@suse.de wrote:
>>>>> From: Dinar Valeev <dvaleev@suse.com>
>>>>>
>>>>> In order to have -boot once=d functioning, it is required to have
>>>>> qemu_register_boot_set
>>>>>
>>>>> qemu-system-ppc64 -enable-kvm -boot once=d
>>>>>
>>>>> Ready!
>>>>> 0 > dev /chosen   ok
>>>>> 0 > .properties
>>>>> ...
>>>>> qemu,boot-device                 d
>>>>> ...
>>>>> 0 > reset-all
>>>>>
>>>>> Ready!
>>>>> 0 > dev /chosen   ok
>>>>> 0 > .properties
>>>>> ...
>>>>> qemu,boot-device                 cdn
>>>>> ...
>>>>>
>>>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
>>>>> ---
>>>>>   hw/ppc/spapr.c | 12 ++++++++++++
>>>>>   1 file changed, 12 insertions(+)
>>>>>
>>>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>>>> index 3d2cfa3..38b03fc 100644
>>>>> --- a/hw/ppc/spapr.c
>>>>> +++ b/hw/ppc/spapr.c
>>>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar *s1)
>>>>>       g_string_append_len(s, s1, strlen(s1) + 1);
>>>>>   }
>>>>>
>>>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
>>>>> +                           Error **errp)
>>>>> +{
>>>>> +    int offset;
>>>>> +    offset = fdt_path_offset(opaque, "/chosen");
>>>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device", boot_device);
>>>>> +
>>>>> +}
>>>>> +
>>>>> +
>>>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>                                      hwaddr initrd_size,
>>>>>                                      hwaddr kernel_size,
>>>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>       if (boot_device) {
>>>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
>>>>>       }
>>>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
>>>>
>>>> If you simply move the code above (the _FDT() one) from create_fdt_skel
>>>> to spapr_finalize_fdt() you should have the same net effect and much
>>>> cleaner code :).
>>> I've tried your proposal, on reset boot-device property stays "d"
>>
>> Ugh, the machine field doesn't change on reset. I think it'd be a lot more intuitive if it did. Can you try with the patch below applied as well?
>>
> 
> This approach is not good because boot_set_handler is NULL and return error directly.
> Please using qemu_register_boot_set for this purpose.

I'd personally prefer if we get rid of qemu_register_boot_set
completely. It duplicates the reset logic as well as information holder
locality (machine struct vs parameter).


Alex
Gonglei (Arei) Jan. 29, 2015, 3:46 a.m. UTC | #3
On 2015/1/29 8:42, Alexander Graf wrote:

> 
> 
> On 29.01.15 01:40, Gonglei wrote:
>> On 2015/1/26 17:35, Alexander Graf wrote:
>>
>>> On 01/26/2015 11:49 AM, Dinar Valeev wrote:
>>>> On 01/24/2015 12:04 AM, Alexander Graf wrote:
>>>>>
>>>>>
>>>>> On 23.01.15 23:51, dvaleev@suse.de wrote:
>>>>>> From: Dinar Valeev <dvaleev@suse.com>
>>>>>>
>>>>>> In order to have -boot once=d functioning, it is required to have
>>>>>> qemu_register_boot_set
>>>>>>
>>>>>> qemu-system-ppc64 -enable-kvm -boot once=d
>>>>>>
>>>>>> Ready!
>>>>>> 0 > dev /chosen   ok
>>>>>> 0 > .properties
>>>>>> ...
>>>>>> qemu,boot-device                 d
>>>>>> ...
>>>>>> 0 > reset-all
>>>>>>
>>>>>> Ready!
>>>>>> 0 > dev /chosen   ok
>>>>>> 0 > .properties
>>>>>> ...
>>>>>> qemu,boot-device                 cdn
>>>>>> ...
>>>>>>
>>>>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
>>>>>> ---
>>>>>>   hw/ppc/spapr.c | 12 ++++++++++++
>>>>>>   1 file changed, 12 insertions(+)
>>>>>>
>>>>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>>>>> index 3d2cfa3..38b03fc 100644
>>>>>> --- a/hw/ppc/spapr.c
>>>>>> +++ b/hw/ppc/spapr.c
>>>>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar *s1)
>>>>>>       g_string_append_len(s, s1, strlen(s1) + 1);
>>>>>>   }
>>>>>>
>>>>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
>>>>>> +                           Error **errp)
>>>>>> +{
>>>>>> +    int offset;
>>>>>> +    offset = fdt_path_offset(opaque, "/chosen");
>>>>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device", boot_device);
>>>>>> +
>>>>>> +}
>>>>>> +
>>>>>> +
>>>>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>>                                      hwaddr initrd_size,
>>>>>>                                      hwaddr kernel_size,
>>>>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>>       if (boot_device) {
>>>>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
>>>>>>       }
>>>>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
>>>>>
>>>>> If you simply move the code above (the _FDT() one) from create_fdt_skel
>>>>> to spapr_finalize_fdt() you should have the same net effect and much
>>>>> cleaner code :).
>>>> I've tried your proposal, on reset boot-device property stays "d"
>>>
>>> Ugh, the machine field doesn't change on reset. I think it'd be a lot more intuitive if it did. Can you try with the patch below applied as well?
>>>
>>
>> This approach is not good because boot_set_handler is NULL and return error directly.
>> Please using qemu_register_boot_set for this purpose.
> 
> I'd personally prefer if we get rid of qemu_register_boot_set
> completely. It duplicates the reset logic as well as information holder
> locality (machine struct vs parameter).
> 

Maybe yes. But lots of other machines do not  register
reset callback. So those machines using qemu_register_boot_set()
register a handler callback achieve this purpose.

Regards,
-Gonglei
Alexander Graf Jan. 29, 2015, 12:55 p.m. UTC | #4
On 29.01.15 04:46, Gonglei wrote:
> On 2015/1/29 8:42, Alexander Graf wrote:
> 
>>
>>
>> On 29.01.15 01:40, Gonglei wrote:
>>> On 2015/1/26 17:35, Alexander Graf wrote:
>>>
>>>> On 01/26/2015 11:49 AM, Dinar Valeev wrote:
>>>>> On 01/24/2015 12:04 AM, Alexander Graf wrote:
>>>>>>
>>>>>>
>>>>>> On 23.01.15 23:51, dvaleev@suse.de wrote:
>>>>>>> From: Dinar Valeev <dvaleev@suse.com>
>>>>>>>
>>>>>>> In order to have -boot once=d functioning, it is required to have
>>>>>>> qemu_register_boot_set
>>>>>>>
>>>>>>> qemu-system-ppc64 -enable-kvm -boot once=d
>>>>>>>
>>>>>>> Ready!
>>>>>>> 0 > dev /chosen   ok
>>>>>>> 0 > .properties
>>>>>>> ...
>>>>>>> qemu,boot-device                 d
>>>>>>> ...
>>>>>>> 0 > reset-all
>>>>>>>
>>>>>>> Ready!
>>>>>>> 0 > dev /chosen   ok
>>>>>>> 0 > .properties
>>>>>>> ...
>>>>>>> qemu,boot-device                 cdn
>>>>>>> ...
>>>>>>>
>>>>>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
>>>>>>> ---
>>>>>>>   hw/ppc/spapr.c | 12 ++++++++++++
>>>>>>>   1 file changed, 12 insertions(+)
>>>>>>>
>>>>>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>>>>>> index 3d2cfa3..38b03fc 100644
>>>>>>> --- a/hw/ppc/spapr.c
>>>>>>> +++ b/hw/ppc/spapr.c
>>>>>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar *s1)
>>>>>>>       g_string_append_len(s, s1, strlen(s1) + 1);
>>>>>>>   }
>>>>>>>
>>>>>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
>>>>>>> +                           Error **errp)
>>>>>>> +{
>>>>>>> +    int offset;
>>>>>>> +    offset = fdt_path_offset(opaque, "/chosen");
>>>>>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device", boot_device);
>>>>>>> +
>>>>>>> +}
>>>>>>> +
>>>>>>> +
>>>>>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>>>                                      hwaddr initrd_size,
>>>>>>>                                      hwaddr kernel_size,
>>>>>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>>>       if (boot_device) {
>>>>>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
>>>>>>>       }
>>>>>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
>>>>>>
>>>>>> If you simply move the code above (the _FDT() one) from create_fdt_skel
>>>>>> to spapr_finalize_fdt() you should have the same net effect and much
>>>>>> cleaner code :).
>>>>> I've tried your proposal, on reset boot-device property stays "d"
>>>>
>>>> Ugh, the machine field doesn't change on reset. I think it'd be a lot more intuitive if it did. Can you try with the patch below applied as well?
>>>>
>>>
>>> This approach is not good because boot_set_handler is NULL and return error directly.
>>> Please using qemu_register_boot_set for this purpose.
>>
>> I'd personally prefer if we get rid of qemu_register_boot_set
>> completely. It duplicates the reset logic as well as information holder
>> locality (machine struct vs parameter).
>>
> 
> Maybe yes. But lots of other machines do not  register
> reset callback. So those machines using qemu_register_boot_set()
> register a handler callback achieve this purpose.

I think we're better off just registering reset handlers then.


Alex
Gonglei (Arei) Jan. 29, 2015, 1 p.m. UTC | #5
On 2015/1/29 20:55, Alexander Graf wrote:

> 
> 
> On 29.01.15 04:46, Gonglei wrote:
>> On 2015/1/29 8:42, Alexander Graf wrote:
>>
>>>
>>>
>>> On 29.01.15 01:40, Gonglei wrote:
>>>> On 2015/1/26 17:35, Alexander Graf wrote:
>>>>
>>>>> On 01/26/2015 11:49 AM, Dinar Valeev wrote:
>>>>>> On 01/24/2015 12:04 AM, Alexander Graf wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 23.01.15 23:51, dvaleev@suse.de wrote:
>>>>>>>> From: Dinar Valeev <dvaleev@suse.com>
>>>>>>>>
>>>>>>>> In order to have -boot once=d functioning, it is required to have
>>>>>>>> qemu_register_boot_set
>>>>>>>>
>>>>>>>> qemu-system-ppc64 -enable-kvm -boot once=d
>>>>>>>>
>>>>>>>> Ready!
>>>>>>>> 0 > dev /chosen   ok
>>>>>>>> 0 > .properties
>>>>>>>> ...
>>>>>>>> qemu,boot-device                 d
>>>>>>>> ...
>>>>>>>> 0 > reset-all
>>>>>>>>
>>>>>>>> Ready!
>>>>>>>> 0 > dev /chosen   ok
>>>>>>>> 0 > .properties
>>>>>>>> ...
>>>>>>>> qemu,boot-device                 cdn
>>>>>>>> ...
>>>>>>>>
>>>>>>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
>>>>>>>> ---
>>>>>>>>   hw/ppc/spapr.c | 12 ++++++++++++
>>>>>>>>   1 file changed, 12 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>>>>>>> index 3d2cfa3..38b03fc 100644
>>>>>>>> --- a/hw/ppc/spapr.c
>>>>>>>> +++ b/hw/ppc/spapr.c
>>>>>>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar *s1)
>>>>>>>>       g_string_append_len(s, s1, strlen(s1) + 1);
>>>>>>>>   }
>>>>>>>>
>>>>>>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
>>>>>>>> +                           Error **errp)
>>>>>>>> +{
>>>>>>>> +    int offset;
>>>>>>>> +    offset = fdt_path_offset(opaque, "/chosen");
>>>>>>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device", boot_device);
>>>>>>>> +
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +
>>>>>>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>>>>                                      hwaddr initrd_size,
>>>>>>>>                                      hwaddr kernel_size,
>>>>>>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
>>>>>>>>       if (boot_device) {
>>>>>>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
>>>>>>>>       }
>>>>>>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
>>>>>>>
>>>>>>> If you simply move the code above (the _FDT() one) from create_fdt_skel
>>>>>>> to spapr_finalize_fdt() you should have the same net effect and much
>>>>>>> cleaner code :).
>>>>>> I've tried your proposal, on reset boot-device property stays "d"
>>>>>
>>>>> Ugh, the machine field doesn't change on reset. I think it'd be a lot more intuitive if it did. Can you try with the patch below applied as well?
>>>>>
>>>>
>>>> This approach is not good because boot_set_handler is NULL and return error directly.
>>>> Please using qemu_register_boot_set for this purpose.
>>>
>>> I'd personally prefer if we get rid of qemu_register_boot_set
>>> completely. It duplicates the reset logic as well as information holder
>>> locality (machine struct vs parameter).
>>>
>>
>> Maybe yes. But lots of other machines do not  register
>> reset callback. So those machines using qemu_register_boot_set()
>> register a handler callback achieve this purpose.
> 
> I think we're better off just registering reset handlers then.
> 

Just like what we said in other thread, remove the check about handler,
I will post a patch soon.

Regards,
-Gonglei
Alexey Kardashevskiy April 2, 2015, 7:41 a.m. UTC | #6
On Fri, Jan 30, 2015 at 12:00 AM, Gonglei <arei.gonglei@huawei.com> wrote:

> On 2015/1/29 20:55, Alexander Graf wrote:
>
> >
> >
> > On 29.01.15 04:46, Gonglei wrote:
> >> On 2015/1/29 8:42, Alexander Graf wrote:
> >>
> >>>
> >>>
> >>> On 29.01.15 01:40, Gonglei wrote:
> >>>> On 2015/1/26 17:35, Alexander Graf wrote:
> >>>>
> >>>>> On 01/26/2015 11:49 AM, Dinar Valeev wrote:
> >>>>>> On 01/24/2015 12:04 AM, Alexander Graf wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>> On 23.01.15 23:51, dvaleev@suse.de wrote:
> >>>>>>>> From: Dinar Valeev <dvaleev@suse.com>
> >>>>>>>>
> >>>>>>>> In order to have -boot once=d functioning, it is required to have
> >>>>>>>> qemu_register_boot_set
> >>>>>>>>
> >>>>>>>> qemu-system-ppc64 -enable-kvm -boot once=d
> >>>>>>>>
> >>>>>>>> Ready!
> >>>>>>>> 0 > dev /chosen   ok
> >>>>>>>> 0 > .properties
> >>>>>>>> ...
> >>>>>>>> qemu,boot-device                 d
> >>>>>>>> ...
> >>>>>>>> 0 > reset-all
> >>>>>>>>
> >>>>>>>> Ready!
> >>>>>>>> 0 > dev /chosen   ok
> >>>>>>>> 0 > .properties
> >>>>>>>> ...
> >>>>>>>> qemu,boot-device                 cdn
> >>>>>>>> ...
> >>>>>>>>
> >>>>>>>> Signed-off-by: Dinar Valeev <dvaleev@suse.com>
> >>>>>>>> ---
> >>>>>>>>   hw/ppc/spapr.c | 12 ++++++++++++
> >>>>>>>>   1 file changed, 12 insertions(+)
> >>>>>>>>
> >>>>>>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> >>>>>>>> index 3d2cfa3..38b03fc 100644
> >>>>>>>> --- a/hw/ppc/spapr.c
> >>>>>>>> +++ b/hw/ppc/spapr.c
> >>>>>>>> @@ -314,6 +314,16 @@ static void add_str(GString *s, const gchar
> *s1)
> >>>>>>>>       g_string_append_len(s, s1, strlen(s1) + 1);
> >>>>>>>>   }
> >>>>>>>>
> >>>>>>>> +static void spapr_boot_set(void *opaque, const char *boot_device,
> >>>>>>>> +                           Error **errp)
> >>>>>>>> +{
> >>>>>>>> +    int offset;
> >>>>>>>> +    offset = fdt_path_offset(opaque, "/chosen");
> >>>>>>>> +    fdt_setprop_string(opaque, offset, "qemu,boot-device",
> boot_device);
> >>>>>>>> +
> >>>>>>>> +}
> >>>>>>>> +
> >>>>>>>> +
> >>>>>>>>   static void *spapr_create_fdt_skel(hwaddr initrd_base,
> >>>>>>>>                                      hwaddr initrd_size,
> >>>>>>>>                                      hwaddr kernel_size,
> >>>>>>>> @@ -414,6 +424,8 @@ static void *spapr_create_fdt_skel(hwaddr
> initrd_base,
> >>>>>>>>       if (boot_device) {
> >>>>>>>>           _FDT((fdt_property_string(fdt, "qemu,boot-device",
> boot_device)));
> >>>>>>>>       }
> >>>>>>>> +    qemu_register_boot_set(spapr_boot_set, fdt);
> >>>>>>>
> >>>>>>> If you simply move the code above (the _FDT() one) from
> create_fdt_skel
> >>>>>>> to spapr_finalize_fdt() you should have the same net effect and
> much
> >>>>>>> cleaner code :).
> >>>>>> I've tried your proposal, on reset boot-device property stays "d"
> >>>>>
> >>>>> Ugh, the machine field doesn't change on reset. I think it'd be a
> lot more intuitive if it did. Can you try with the patch below applied as
> well?
> >>>>>
> >>>>
> >>>> This approach is not good because boot_set_handler is NULL and return
> error directly.
> >>>> Please using qemu_register_boot_set for this purpose.
> >>>
> >>> I'd personally prefer if we get rid of qemu_register_boot_set
> >>> completely. It duplicates the reset logic as well as information holder
> >>> locality (machine struct vs parameter).
> >>>
> >>
> >> Maybe yes. But lots of other machines do not  register
> >> reset callback. So those machines using qemu_register_boot_set()
> >> register a handler callback achieve this purpose.
> >
> > I think we're better off just registering reset handlers then.
> >
>
> Just like what we said in other thread, remove the check about handler,
> I will post a patch soon.
>


Have you posted the patch? Cannot find it in the lists so I assume you have
not :-) Thanks!



>
> Regards,
> -Gonglei
>
>
>
Gonglei (Arei) April 2, 2015, 11:23 a.m. UTC | #7
On 2015/4/2 15:41, Alexey Kardashevskiy wrote:
>>
>> Just like what we said in other thread, remove the check about handler,
>> I will post a patch soon.
>>
> 
> 
> Have you posted the patch? Cannot find it in the lists so I assume you have
> not :-) Thanks!
> 
I had posted the patch which caused a regression about HMP command
hmp_boot_set(). By discussion again and again, we decide to remain the
original style. If you guys want to use this feature, please register the handler.
BTW I saw somebody had submitted patches with handler in the maillist. :)

Regards,
-Gonglei
diff mbox

Patch

diff --git a/bootdevice.c b/bootdevice.c
index 5914417..3b750ff 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -50,6 +50,7 @@  void qemu_register_boot_set(QEMUBootSetHandler *func, 
void *opaque)
  void qemu_boot_set(const char *boot_order, Error **errp)
  {
      Error *local_err = NULL;
+    MachineState *machine = MACHINE(qdev_get_machine());

      if (!boot_set_handler) {