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:
parent
03397528d9
commit
2beb1e5f9a
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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' } }
|
||||||
|
Loading…
Reference in New Issue
Block a user