From 0a6baf4799dd6e70d7959002ea6ddb998eddbc6d Mon Sep 17 00:00:00 2001 From: "shenghualong@huawei.com" Date: Mon, 18 Mar 2024 15:53:43 +0800 Subject: [PATCH] freeclock: add qmp command to get time offset of vm in seconds When setting the system time in VM, a RTC_CHANGE event will be reported. However, if libvirt is restarted while the event is be reporting, the event will be lost and we will get the old time (not the time we set in VM) after rebooting the VM. We save the delta time in QEMU and add a rtc-date-diff qmp to get the delta time so that libvirt can get the latest time in VM according to the qmp after libvirt is restarted. Signed-off-by: Peng Liang Signed-off-by: zhangxinhao Signed-off-by: Yuan Zhang --- hw/core/machine-qmp-cmds.c | 6 ++++++ include/sysemu/rtc.h | 4 +++- qapi/misc.json | 9 +++++++++ qapi/pragma.json | 3 ++- system/rtc.c | 11 +++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c index 3860a50c3b..f1389ef644 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c @@ -8,6 +8,7 @@ */ #include "qemu/osdep.h" +#include "sysemu/rtc.h" #include "hw/acpi/vmgenid.h" #include "hw/boards.h" #include "hw/intc/intc.h" @@ -373,6 +374,11 @@ HumanReadableText *qmp_x_query_irq(Error **errp) return human_readable_text_from_str(buf); } +int64_t qmp_query_rtc_date_diff(Error **errp) +{ + return get_rtc_date_diff(); +} + GuidInfo *qmp_query_vm_generation_id(Error **errp) { GuidInfo *info; diff --git a/include/sysemu/rtc.h b/include/sysemu/rtc.h index 0fc8ad6fdf..3edae762d4 100644 --- a/include/sysemu/rtc.h +++ b/include/sysemu/rtc.h @@ -54,5 +54,7 @@ void qemu_get_timedate(struct tm *tm, time_t offset); * then this function will return 3600. */ time_t qemu_timedate_diff(struct tm *tm); - +time_t get_rtc_date_diff(void); +void set_rtc_date_diff(time_t diff); +int64_t qmp_query_rtc_date_diff(Error **errp); #endif diff --git a/qapi/misc.json b/qapi/misc.json index cda2effa81..1832d5f460 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -550,6 +550,15 @@ 'returns': ['CommandLineOptionInfo'], 'allow-preconfig': true} +## +# @query-rtc-date-diff: +# +# get vm's time offset +# +# Since: 2.8 +## +{ 'command': 'query-rtc-date-diff', 'returns': 'int64' } + ## # @RTC_CHANGE: # diff --git a/qapi/pragma.json b/qapi/pragma.json index 0aa4eeddd3..7a07b44bb1 100644 --- a/qapi/pragma.json +++ b/qapi/pragma.json @@ -30,7 +30,8 @@ 'qom-get', 'query-tpm-models', 'query-tpm-types', - 'ringbuf-read' ], + 'ringbuf-read', + 'query-rtc-date-diff'], # Externally visible types whose member names may use uppercase 'member-name-exceptions': [ # visible in: 'ACPISlotType', # query-acpi-ospm-status diff --git a/system/rtc.c b/system/rtc.c index 4904581abe..e16b5fffc5 100644 --- a/system/rtc.c +++ b/system/rtc.c @@ -44,6 +44,7 @@ static time_t rtc_ref_start_datetime; static int rtc_realtime_clock_offset; /* used only with QEMU_CLOCK_REALTIME */ static int rtc_host_datetime_offset = -1; /* valid & used only with RTC_BASE_DATETIME */ +static time_t rtc_date_diff = 0; QEMUClockType rtc_clock; /***********************************************************/ /* RTC reference time/date access */ @@ -108,6 +109,16 @@ time_t qemu_timedate_diff(struct tm *tm) return seconds - qemu_ref_timedate(QEMU_CLOCK_HOST); } +time_t get_rtc_date_diff(void) +{ + return rtc_date_diff; +} + +void set_rtc_date_diff(time_t diff) +{ + rtc_date_diff = diff; +} + static void configure_rtc_base_datetime(const char *startdate) { time_t rtc_start_datetime; -- 2.27.0