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>
This commit is contained in:
Markus Armbruster 2022-02-22 13:02:07 +01:00
parent 03397528d9
commit 2beb1e5f9a
4 changed files with 10 additions and 4 deletions

View File

@ -97,6 +97,7 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr,
uint32_t nret, target_ulong rets) uint32_t nret, target_ulong rets)
{ {
SpaprRtcState *rtc = &spapr->rtc; SpaprRtcState *rtc = &spapr->rtc;
g_autofree const char *qom_path = NULL;
struct tm tm; struct tm tm;
time_t new_s; time_t new_s;
int64_t host_ns; 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 */ /* 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); host_ns = qemu_clock_get_ns(rtc_clock);

View File

@ -611,12 +611,13 @@ static void rtc_get_time(RTCState *s, struct tm *tm)
static void rtc_set_time(RTCState *s) static void rtc_set_time(RTCState *s)
{ {
struct tm tm; struct tm tm;
g_autofree const char *qom_path = object_get_canonical_path(OBJECT(s));
rtc_get_time(s, &tm); rtc_get_time(s, &tm);
s->base_rtc = mktimegm(&tm); s->base_rtc = mktimegm(&tm);
s->last_update = qemu_clock_get_ns(rtc_clock); 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) static void rtc_set_cmos(RTCState *s, const struct tm *tm)

View File

@ -138,12 +138,13 @@ static void pl031_write(void * opaque, hwaddr offset,
switch (offset) { switch (offset) {
case RTC_LR: { case RTC_LR: {
g_autofree const char *qom_path = object_get_canonical_path(opaque);
struct tm tm; struct tm tm;
s->tick_offset += value - pl031_get_count(s); s->tick_offset += value - pl031_get_count(s);
qemu_get_timedate(&tm, s->tick_offset); 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); pl031_set_alarm(s);
break; break;

View File

@ -536,6 +536,8 @@
# @offset: offset in seconds between base RTC clock (as specified # @offset: offset in seconds between base RTC clock (as specified
# by -rtc base), and new RTC clock value # 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. # Note: This event is rate-limited.
# It is not guaranteed that the RTC in the system implements # It is not guaranteed that the RTC in the system implements
# this event, or even that the system has an RTC at all. # this event, or even that the system has an RTC at all.
@ -550,4 +552,4 @@
# #
## ##
{ 'event': 'RTC_CHANGE', { 'event': 'RTC_CHANGE',
'data': { 'offset': 'int' } } 'data': { 'offset': 'int', 'qom-path': 'str' } }