diff mbox

[4/5] pseries: Export /machine "rtc-time" property

Message ID 1418690628-20652-5-git-send-email-david@gibson.dropbear.id.au
State New
Headers show

Commit Message

David Gibson Dec. 16, 2014, 12:43 a.m. UTC
On x86, the guest's RTC can be read with QMP via the "rtc-time" property
on the /machine object.  This is due to an explicit QOM alias being set up
by the mc146818rtc driver, and doesn't work on other targets.

This extends the pseries RTAS RTC to populate that property, for improved
management compatibility with x86 guests.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_rtc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

Comments

Alexander Graf Dec. 16, 2014, 1:04 a.m. UTC | #1
On 16.12.14 01:43, David Gibson wrote:
> On x86, the guest's RTC can be read with QMP via the "rtc-time" property
> on the /machine object.  This is due to an explicit QOM alias being set up
> by the mc146818rtc driver, and doesn't work on other targets.
> 
> This extends the pseries RTAS RTC to populate that property, for improved
> management compatibility with x86 guests.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>

Yeah, this really should happen inside an rtc device.

> ---
>  hw/ppc/spapr_rtc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
> 
> diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
> index fac0017..13e74f1 100644
> --- a/hw/ppc/spapr_rtc.c
> +++ b/hw/ppc/spapr_rtc.c
> @@ -28,6 +28,7 @@
>  #include "cpu.h"
>  #include "hw/ppc/spapr.h"
>  #include "qapi-event.h"
> +#include "qapi/visitor.h"
>  
>  void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
>  {
> @@ -87,10 +88,58 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
>      rtas_st(rets, 0, RTAS_OUT_SUCCESS);
>  }
>  
> +static void spapr_qom_rtc_time(Object *obj, Visitor *v, void *opaque,
> +                               const char *name, Error **errp)

Also this function is mostly copy&paste from the mc14foo driver. Do you
think you can share this somehow?

I also think the alias should get created by the machine, not the device
itself.


Alex
David Gibson Dec. 16, 2014, 2:18 a.m. UTC | #2
On Tue, Dec 16, 2014 at 02:04:49AM +0100, Alexander Graf wrote:
> 
> 
> On 16.12.14 01:43, David Gibson wrote:
> > On x86, the guest's RTC can be read with QMP via the "rtc-time" property
> > on the /machine object.  This is due to an explicit QOM alias being set up
> > by the mc146818rtc driver, and doesn't work on other targets.
> > 
> > This extends the pseries RTAS RTC to populate that property, for improved
> > management compatibility with x86 guests.
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> 
> Yeah, this really should happen inside an rtc device.
> 
> > ---
> >  hw/ppc/spapr_rtc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 49 insertions(+)
> > 
> > diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
> > index fac0017..13e74f1 100644
> > --- a/hw/ppc/spapr_rtc.c
> > +++ b/hw/ppc/spapr_rtc.c
> > @@ -28,6 +28,7 @@
> >  #include "cpu.h"
> >  #include "hw/ppc/spapr.h"
> >  #include "qapi-event.h"
> > +#include "qapi/visitor.h"
> >  
> >  void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
> >  {
> > @@ -87,10 +88,58 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> >      rtas_st(rets, 0, RTAS_OUT_SUCCESS);
> >  }
> >  
> > +static void spapr_qom_rtc_time(Object *obj, Visitor *v, void *opaque,
> > +                               const char *name, Error **errp)
> 
> Also this function is mostly copy&paste from the mc14foo driver. Do you
> think you can share this somehow?

I guess I can make a helper function.

> I also think the alias should get created by the machine, not the device
> itself.

Again, I'm copying what mc146818rtc does.
Alexander Graf Dec. 16, 2014, 9:42 a.m. UTC | #3
> Am 16.12.2014 um 03:18 schrieb David Gibson <david@gibson.dropbear.id.au>:
> 
>> On Tue, Dec 16, 2014 at 02:04:49AM +0100, Alexander Graf wrote:
>> 
>> 
>>> On 16.12.14 01:43, David Gibson wrote:
>>> On x86, the guest's RTC can be read with QMP via the "rtc-time" property
>>> on the /machine object.  This is due to an explicit QOM alias being set up
>>> by the mc146818rtc driver, and doesn't work on other targets.
>>> 
>>> This extends the pseries RTAS RTC to populate that property, for improved
>>> management compatibility with x86 guests.
>>> 
>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
>> 
>> Yeah, this really should happen inside an rtc device.
>> 
>>> ---
>>> hw/ppc/spapr_rtc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 49 insertions(+)
>>> 
>>> diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
>>> index fac0017..13e74f1 100644
>>> --- a/hw/ppc/spapr_rtc.c
>>> +++ b/hw/ppc/spapr_rtc.c
>>> @@ -28,6 +28,7 @@
>>> #include "cpu.h"
>>> #include "hw/ppc/spapr.h"
>>> #include "qapi-event.h"
>>> +#include "qapi/visitor.h"
>>> 
>>> void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
>>> {
>>> @@ -87,10 +88,58 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
>>>     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
>>> }
>>> 
>>> +static void spapr_qom_rtc_time(Object *obj, Visitor *v, void *opaque,
>>> +                               const char *name, Error **errp)
>> 
>> Also this function is mostly copy&paste from the mc14foo driver. Do you
>> think you can share this somehow?
> 
> I guess I can make a helper function.
> 
>> I also think the alias should get created by the machine, not the device
>> itself.
> 
> Again, I'm copying what mc146818rtc does.

Yup, but unfortunately layering violations that made it upstream are still violating our layering ;)

Alex

> 
> -- 
> 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
diff mbox

Patch

diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index fac0017..13e74f1 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -28,6 +28,7 @@ 
 #include "cpu.h"
 #include "hw/ppc/spapr.h"
 #include "qapi-event.h"
+#include "qapi/visitor.h"
 
 void spapr_rtc_read(sPAPREnvironment *spapr, struct tm *tm, uint32_t *ns)
 {
@@ -87,10 +88,58 @@  static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPREnvironment *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
+static void spapr_qom_rtc_time(Object *obj, Visitor *v, void *opaque,
+                               const char *name, Error **errp)
+{
+    Error *err = NULL;
+    sPAPREnvironment *spapr = opaque;
+    struct tm current_tm;
+
+    spapr_rtc_read(spapr, &current_tm, NULL);
+
+    visit_start_struct(v, NULL, "struct tm", name, 0, &err);
+    if (err) {
+        goto out;
+    }
+    visit_type_int32(v, &current_tm.tm_year, "tm_year", &err);
+    if (err) {
+        goto out_end;
+    }
+    visit_type_int32(v, &current_tm.tm_mon, "tm_mon", &err);
+    if (err) {
+        goto out_end;
+    }
+    visit_type_int32(v, &current_tm.tm_mday, "tm_mday", &err);
+    if (err) {
+        goto out_end;
+    }
+    visit_type_int32(v, &current_tm.tm_hour, "tm_hour", &err);
+    if (err) {
+        goto out_end;
+    }
+    visit_type_int32(v, &current_tm.tm_min, "tm_min", &err);
+    if (err) {
+        goto out_end;
+    }
+    visit_type_int32(v, &current_tm.tm_sec, "tm_sec", &err);
+    if (err) {
+        goto out_end;
+    }
+out_end:
+    error_propagate(errp, err);
+    err = NULL;
+    visit_end_struct(v, errp);
+out:
+    error_propagate(errp, err);
+}
+
 void spapr_rtc_init(void)
 {
     spapr_rtas_register(RTAS_GET_TIME_OF_DAY, "get-time-of-day",
                         rtas_get_time_of_day);
     spapr_rtas_register(RTAS_SET_TIME_OF_DAY, "set-time-of-day",
                         rtas_set_time_of_day);
+
+    object_property_add(qdev_get_machine(), "rtc-time", "struct tm",
+                        spapr_qom_rtc_time, NULL, NULL, spapr, NULL);
 }