qemu-devel
[Top][All Lists]
Advanced

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

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


From: David Gibson
Subject: [Qemu-devel] [PATCH 4/5] pseries: Export /machine "rtc-time" property
Date: Tue, 16 Dec 2014 11:43:47 +1100

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 <address@hidden>
---
 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)
+{
+    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);
 }
-- 
2.1.0




reply via email to

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