From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52641) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0gFI-00014N-3w for qemu-devel@nongnu.org; Mon, 15 Dec 2014 19:44:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y0gF2-0006Lm-3q for qemu-devel@nongnu.org; Mon, 15 Dec 2014 19:44:12 -0500 Received: from ozlabs.org ([2401:3900:2:1::2]:50469) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0gF1-0006LH-OW for qemu-devel@nongnu.org; Mon, 15 Dec 2014 19:43:56 -0500 From: David Gibson Date: Tue, 16 Dec 2014 11:43:47 +1100 Message-Id: <1418690628-20652-5-git-send-email-david@gibson.dropbear.id.au> In-Reply-To: <1418690628-20652-1-git-send-email-david@gibson.dropbear.id.au> References: <1418690628-20652-1-git-send-email-david@gibson.dropbear.id.au> Subject: [Qemu-devel] [PATCH 4/5] pseries: Export /machine "rtc-time" property List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: agraf@suse.de, aik@ozlabs.ru, mdroth@us.ibm.com Cc: paulus@samba.org, qemu-devel@nongnu.org, David Gibson 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 --- 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, ¤t_tm, NULL); + + visit_start_struct(v, NULL, "struct tm", name, 0, &err); + if (err) { + goto out; + } + visit_type_int32(v, ¤t_tm.tm_year, "tm_year", &err); + if (err) { + goto out_end; + } + visit_type_int32(v, ¤t_tm.tm_mon, "tm_mon", &err); + if (err) { + goto out_end; + } + visit_type_int32(v, ¤t_tm.tm_mday, "tm_mday", &err); + if (err) { + goto out_end; + } + visit_type_int32(v, ¤t_tm.tm_hour, "tm_hour", &err); + if (err) { + goto out_end; + } + visit_type_int32(v, ¤t_tm.tm_min, "tm_min", &err); + if (err) { + goto out_end; + } + visit_type_int32(v, ¤t_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