aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2022-02-22 13:02:07 +0100
committerMarkus Armbruster <armbru@redhat.com>2022-02-28 11:39:35 +0100
commit2beb1e5f9acb443d90fe4d366463f89d32d83bc8 (patch)
tree3039414c1a58c8778309dd16014befeb882489a7
parent03397528d96ff5d631fd2fa40b753548e53b5149 (diff)
downloadqemu-2beb1e5f9acb443d90fe4d366463f89d32d83bc8.zip
qemu-2beb1e5f9acb443d90fe4d366463f89d32d83bc8.tar.gz
qemu-2beb1e5f9acb443d90fe4d366463f89d32d83bc8.tar.bz2
rtc: Have event RTC_CHANGE identify the RTC by QOM path
Event RTC_CHANGE is "emitted when the guest changes the RTC time" (and the RTC supports the event). What if there's more than one RTC? Which one changed? New @qom-path identifies it. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <87a6ejnm80.fsf@pond.sub.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
-rw-r--r--hw/ppc/spapr_rtc.c4
-rw-r--r--hw/rtc/mc146818rtc.c3
-rw-r--r--hw/rtc/pl031.c3
-rw-r--r--qapi/misc.json4
4 files changed, 10 insertions, 4 deletions
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index 79677cf..d55b4b0 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -97,6 +97,7 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr,
uint32_t nret, target_ulong rets)
{
SpaprRtcState *rtc = &spapr->rtc;
+ g_autofree const char *qom_path = NULL;
struct tm tm;
time_t new_s;
int64_t host_ns;
@@ -120,7 +121,8 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr,
}
/* Generate a monitor event for the change */
- qapi_event_send_rtc_change(qemu_timedate_diff(&tm));
+ qom_path = object_get_canonical_path(OBJECT(rtc));
+ qapi_event_send_rtc_change(qemu_timedate_diff(&tm), qom_path);
host_ns = qemu_clock_get_ns(rtc_clock);
diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
index 57c514e..ac9a60c 100644
--- a/hw/rtc/mc146818rtc.c
+++ b/hw/rtc/mc146818rtc.c
@@ -611,12 +611,13 @@ static void rtc_get_time(RTCState *s, struct tm *tm)
static void rtc_set_time(RTCState *s)
{
struct tm tm;
+ g_autofree const char *qom_path = object_get_canonical_path(OBJECT(s));
rtc_get_time(s, &tm);
s->base_rtc = mktimegm(&tm);
s->last_update = qemu_clock_get_ns(rtc_clock);
- qapi_event_send_rtc_change(qemu_timedate_diff(&tm));
+ qapi_event_send_rtc_change(qemu_timedate_diff(&tm), qom_path);
}
static void rtc_set_cmos(RTCState *s, const struct tm *tm)
diff --git a/hw/rtc/pl031.c b/hw/rtc/pl031.c
index 60167c7..b01d0e7 100644
--- a/hw/rtc/pl031.c
+++ b/hw/rtc/pl031.c
@@ -138,12 +138,13 @@ static void pl031_write(void * opaque, hwaddr offset,
switch (offset) {
case RTC_LR: {
+ g_autofree const char *qom_path = object_get_canonical_path(opaque);
struct tm tm;
s->tick_offset += value - pl031_get_count(s);
qemu_get_timedate(&tm, s->tick_offset);
- qapi_event_send_rtc_change(qemu_timedate_diff(&tm));
+ qapi_event_send_rtc_change(qemu_timedate_diff(&tm), qom_path);
pl031_set_alarm(s);
break;
diff --git a/qapi/misc.json b/qapi/misc.json
index 0ab235e..b83cc39 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -536,6 +536,8 @@
# @offset: offset in seconds between base RTC clock (as specified
# by -rtc base), and new RTC clock value
#
+# @qom-path: path to the RTC object in the QOM tree
+#
# Note: This event is rate-limited.
# It is not guaranteed that the RTC in the system implements
# this event, or even that the system has an RTC at all.
@@ -550,4 +552,4 @@
#
##
{ 'event': 'RTC_CHANGE',
- 'data': { 'offset': 'int' } }
+ 'data': { 'offset': 'int', 'qom-path': 'str' } }