mc146818rtc: add rtc-reset-reinjection QMP command
PATCH v2 1/1 mc146818rtc: add rtc-reset-reinjection QMP command
It is necessary to reset RTC interrupt reinjection backlog if guest time is synchronized via a different mechanism, such as QGA's guest-set-time command.
Failing to do so causes both corrections to be applied (summed), resulting in an incorrect guest time.
hw/timer/mc146818rtc.c +18 -0
@@ -26,6 +26,7 @@#include "sysemu/sysemu.h" #include "hw/timer/mc146818rtc.h" #include "qapi/visitor.h" +#include "qmp-commands.h" #ifdef TARGET_I386 #include "hw/i386/apic.h"
@@ -84,6 +85,7 @@ typedef struct RTCState {Notifier clock_reset_notifier;LostTickPolicy lost_tick_policy;Notifier suspend_notifier; +QLIST_ENTRY (RTCState) link; } RTCState;static void rtc_set_time (RTCState *s);
@@ -522,6 +524,20 @@ static void rtc_get_time(RTCState *s, struct tm *tm)rtc_from_bcd (s, s->cmos_data[RTC_CENTURY ]) *100 -1900 ; } +static QLIST_HEAD(, RTCState) rtc_devices = +QLIST_HEAD_INITIALIZER (rtc_devices); + +#ifdef TARGET_I386 +void qmp_rtc_reset_reinjection (Error **errp) +{ +RTCState *s; + + QLIST_FOREACH(s, &rtc_devices, link) { + s->irq_coalesced =0 ; + } +} +#endif +static void rtc_set_time (RTCState *s) {struct tm tm;
@@ -911,6 +927,8 @@ ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq) }else {isa_init_irq (isadev, &s->irq,RTC_ISA_IRQ ); } +QLIST_INSERT_HEAD (&rtc_devices, s, link); +return isadev; }
qapi-schema.json +12 -0
@@ -4722,3 +4722,15 @@ 'btn' : 'InputBtnEvent', 'rel' : 'InputMoveEvent', 'abs' : 'InputMoveEvent' } } + +## +# @rtc-reset-reinjection +# +# This command will reset the RTC interrupt reinjection backlog. +# Can be used if another mechanism to synchronize guest time +# is in effect, for example QEMU guest agent's guest-set-time +# command. +# +# Since: 2.1 +## +{ 'command': 'rtc-reset-reinjection' }
qmp-commands.hx +23 -0
@@ -3572,3 +3572,26 @@ Example: } } ] } EQMP + +#if defined (TARGET_I386) + { + .name = "rtc-reset-reinjection", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_rtc_reset_reinjection, + }, +#endif + +SQMP +rtc-reset-reinjection +--------------------- + +Reset the RTC interrupt reinjection backlog. + +Arguments: None. + +Example: + +-> { "execute": "rtc-reset-reinjection" } +<- { "return": {} } + +EQMP
Quoted 9 lines · Marcelo Tosatti
It is necessary to reset RTC interrupt reinjection backlog if guest time is synchronized via a different mechanism, such as QGA's guest-set-time command.
Failing to do so causes both corrections to be applied (summed), resulting in an incorrect guest time.
Signed-off-by Marcelo Tosatti <[email protected]>
Thanks, I'll apply this on my tree, though I don't want to redo the pull request so it'll be in the next one. Seems small enough to be ok after soft freeze.
Quoted 75 lines
hw/timer/mc146818rtc.c +18
-0@@ -26,6 +26,7 @@#include "sysemu/sysemu.h" #include "hw/timer/mc146818rtc.h" #include "qapi/visitor.h" +#include "qmp-commands.h" #ifdef TARGET_I386 #include "hw/i386/apic.h" @@ -84,6 +85,7 @@ typedef struct RTCState {Notifier clock_reset_notifier;LostTickPolicy lost_tick_policy;Notifier suspend_notifier; +QLIST_ENTRY (RTCState) link; } RTCState;static void rtc_set_time (RTCState *s);@@ -522,6 +524,20 @@ static void rtc_get_time(RTCState *s, struct tm *tm)rtc_from_bcd (s, s->cmos_data[RTC_CENTURY ]) *100 -1900 ; } +static QLIST_HEAD(, RTCState) rtc_devices = +QLIST_HEAD_INITIALIZER (rtc_devices); + +#ifdef TARGET_I386 +void qmp_rtc_reset_reinjection (Error **errp) +{ +RTCState *s; + + QLIST_FOREACH(s, &rtc_devices, link) { + s->irq_coalesced =0 ; + } +} +#endif +static void rtc_set_time (RTCState *s) {struct tm tm;@@ -911,6 +927,8 @@ ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq) }else {isa_init_irq (isadev, &s->irq,RTC_ISA_IRQ ); } +QLIST_INSERT_HEAD (&rtc_devices, s, link); +return isadev; }qapi-schema.json +12
-0@@ -4722,3 +4722,15 @@ 'btn' : 'InputBtnEvent', 'rel' : 'InputMoveEvent', 'abs' : 'InputMoveEvent' } } + +## +# @rtc-reset-reinjection +# +# This command will reset the RTC interrupt reinjection backlog. +# Can be used if another mechanism to synchronize guest time +# is in effect, for example QEMU guest agent's guest-set-time +# command. +# +# Since: 2.1 +## +{ 'command': 'rtc-reset-reinjection' }qmp-commands.hx +0
-0
qmp-commands.hx Example: · line 3576
Quoted 5 lines
qmp-commands.hx +2
-0@@ -3572,3 +3572,26 @@ Example: } } ] } EQMP + +#if defined (TARGET_I386)
Pls don't put space before (). I fixed it up.
Quoted 21 lines
qmp-commands.hx +21
-0+ { + .name = "rtc-reset-reinjection", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_rtc_reset_reinjection, + }, +#endif + +SQMP +rtc-reset-reinjection +--------------------- + +Reset the RTC interrupt reinjection backlog. + +Arguments: None. + +Example: + +-> { "execute": "rtc-reset-reinjection" } +<- { "return": {} } + +EQMP
Quoted 9 lines · Marcelo Tosatti
It is necessary to reset RTC interrupt reinjection backlog if guest time is synchronized via a different mechanism, such as QGA's guest-set-time command.
Failing to do so causes both corrections to be applied (summed), resulting in an incorrect guest time.
Signed-off-by Marcelo Tosatti <[email protected]>
Fails build for non x86 target:
LINK arm-softmmu/qemu-system-arm../qmp-marshal.o: In function `qmp_marshal_input_rtc_reset_reinjection':
/scm/qemu/qmp-marshal.c:5059: undefined reference to `qmp_rtc_reset_reinjection'
collect2: error: ld returned 1 exit status
make[1]: *** [qemu-system-arm] Error 1
make: *** [subdir-arm-softmmu] Error 2
Quoted 101 lines
hw/timer/mc146818rtc.c +18
-0@@ -26,6 +26,7 @@#include "sysemu/sysemu.h" #include "hw/timer/mc146818rtc.h" #include "qapi/visitor.h" +#include "qmp-commands.h" #ifdef TARGET_I386 #include "hw/i386/apic.h" @@ -84,6 +85,7 @@ typedef struct RTCState {Notifier clock_reset_notifier;LostTickPolicy lost_tick_policy;Notifier suspend_notifier; +QLIST_ENTRY (RTCState) link; } RTCState;static void rtc_set_time (RTCState *s);@@ -522,6 +524,20 @@ static void rtc_get_time(RTCState *s, struct tm *tm)rtc_from_bcd (s, s->cmos_data[RTC_CENTURY ]) *100 -1900 ; } +static QLIST_HEAD(, RTCState) rtc_devices = +QLIST_HEAD_INITIALIZER (rtc_devices); + +#ifdef TARGET_I386 +void qmp_rtc_reset_reinjection (Error **errp) +{ +RTCState *s; + + QLIST_FOREACH(s, &rtc_devices, link) { + s->irq_coalesced =0 ; + } +} +#endif +static void rtc_set_time (RTCState *s) {struct tm tm;@@ -911,6 +927,8 @@ ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq) }else {isa_init_irq (isadev, &s->irq,RTC_ISA_IRQ ); } +QLIST_INSERT_HEAD (&rtc_devices, s, link); +return isadev; }qapi-schema.json +12
-0@@ -4722,3 +4722,15 @@ 'btn' : 'InputBtnEvent', 'rel' : 'InputMoveEvent', 'abs' : 'InputMoveEvent' } } + +## +# @rtc-reset-reinjection +# +# This command will reset the RTC interrupt reinjection backlog. +# Can be used if another mechanism to synchronize guest time +# is in effect, for example QEMU guest agent's guest-set-time +# command. +# +# Since: 2.1 +## +{ 'command': 'rtc-reset-reinjection' }qmp-commands.hx +23
-0@@ -3572,3 +3572,26 @@ Example: } } ] } EQMP + +#if defined (TARGET_I386) + { + .name = "rtc-reset-reinjection", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_rtc_reset_reinjection, + }, +#endif + +SQMP +rtc-reset-reinjection +--------------------- + +Reset the RTC interrupt reinjection backlog. + +Arguments: None. + +Example: + +-> { "execute": "rtc-reset-reinjection" } +<- { "return": {} } + +EQMP
Quoted 13 lines · Michael S. Tsirkin
Quoted 9 lines · Marcelo Tosatti
It is necessary to reset RTC interrupt reinjection backlog if guest time is synchronized via a different mechanism, such as QGA's guest-set-time command.
Failing to do so causes both corrections to be applied (summed), resulting in an incorrect guest time.
Signed-off-by Marcelo Tosatti <[email protected]>Fails build for non x86 target:
Quoted 7 lines
LINK arm-softmmu/qemu-system-arm
../qmp-marshal.o: In function `qmp_marshal_input_rtc_reset_reinjection':
/scm/qemu/qmp-marshal.c:5059: undefined reference to `qmp_rtc_reset_reinjection'
collect2: error: ld returned 1 exit status
make[1]: *** [qemu-system-arm] Error 1
make: *** [subdir-arm-softmmu] Error 2
Ping.
Do you plan to fix and re-post the patch?
Quoted 102 lines
Quoted 102 lines
hw/timer/mc146818rtc.c +18
-0@@ -26,6 +26,7 @@#include "sysemu/sysemu.h" #include "hw/timer/mc146818rtc.h" #include "qapi/visitor.h" +#include "qmp-commands.h" #ifdef TARGET_I386 #include "hw/i386/apic.h" @@ -84,6 +85,7 @@ typedef struct RTCState {Notifier clock_reset_notifier;LostTickPolicy lost_tick_policy;Notifier suspend_notifier; +QLIST_ENTRY (RTCState) link; } RTCState;static void rtc_set_time (RTCState *s);@@ -522,6 +524,20 @@ static void rtc_get_time(RTCState *s, struct tm *tm)rtc_from_bcd (s, s->cmos_data[RTC_CENTURY ]) *100 -1900 ; } +static QLIST_HEAD(, RTCState) rtc_devices = +QLIST_HEAD_INITIALIZER (rtc_devices); + +#ifdef TARGET_I386 +void qmp_rtc_reset_reinjection (Error **errp) +{ +RTCState *s; + + QLIST_FOREACH(s, &rtc_devices, link) { + s->irq_coalesced =0 ; + } +} +#endif +static void rtc_set_time (RTCState *s) {struct tm tm;@@ -911,6 +927,8 @@ ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq) }else {isa_init_irq (isadev, &s->irq,RTC_ISA_IRQ ); } +QLIST_INSERT_HEAD (&rtc_devices, s, link); +return isadev; }qapi-schema.json +12
-0@@ -4722,3 +4722,15 @@ 'btn' : 'InputBtnEvent', 'rel' : 'InputMoveEvent', 'abs' : 'InputMoveEvent' } } + +## +# @rtc-reset-reinjection +# +# This command will reset the RTC interrupt reinjection backlog. +# Can be used if another mechanism to synchronize guest time +# is in effect, for example QEMU guest agent's guest-set-time +# command. +# +# Since: 2.1 +## +{ 'command': 'rtc-reset-reinjection' }qmp-commands.hx +23
-0@@ -3572,3 +3572,26 @@ Example: } } ] } EQMP + +#if defined (TARGET_I386) + { + .name = "rtc-reset-reinjection", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_rtc_reset_reinjection, + }, +#endif + +SQMP +rtc-reset-reinjection +--------------------- + +Reset the RTC interrupt reinjection backlog. + +Arguments: None. + +Example: + +-> { "execute": "rtc-reset-reinjection" } +<- { "return": {} } + +EQMP