Module Name: src
Committed By: isaki
Date: Tue Mar 5 11:19:30 UTC 2024
Modified Files:
src/sys/arch/virt68k/dev: gfrtc_mainbus.c
src/sys/dev/goldfish: gfrtc.c
Log Message:
Fix two problems that the time runs late on virt68k.
- The time between the time the alarm occurred and the time read by
TIME_* register in the next interrupt handler was not accumulated.
- With the one-shot timer method, once the host time prolongs, the
guest time will never be able to catch up with the host time again.
New one does:
- The driver maintains its (guest's) time (as sc_alarm_time) and always
set the next alarm sc_interval_ns after the previous alarm.
- gfrtc_set_alarm() takes an absolute time instead of a relative time
as the argument.
PR kern/57980. Confirmed on QEMU.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/virt68k/dev/gfrtc_mainbus.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/goldfish/gfrtc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/virt68k/dev/gfrtc_mainbus.c
diff -u src/sys/arch/virt68k/dev/gfrtc_mainbus.c:1.2 src/sys/arch/virt68k/dev/gfrtc_mainbus.c:1.3
--- src/sys/arch/virt68k/dev/gfrtc_mainbus.c:1.2 Fri Jan 12 06:23:20 2024
+++ src/sys/arch/virt68k/dev/gfrtc_mainbus.c Tue Mar 5 11:19:30 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: gfrtc_mainbus.c,v 1.2 2024/01/12 06:23:20 mlelstv Exp $ */
+/* $NetBSD: gfrtc_mainbus.c,v 1.3 2024/03/05 11:19:30 isaki Exp $ */
/*-
* Copyright (c) 2023, 2024 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gfrtc_mainbus.c,v 1.2 2024/01/12 06:23:20 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gfrtc_mainbus.c,v 1.3 2024/03/05 11:19:30 isaki Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -58,6 +58,7 @@ struct gfrtc_mainbus_softc {
struct gfrtc_softc sc_gfrtc;
struct clock_attach_args sc_clock_args;
uint64_t sc_interval_ns;
+ uint64_t sc_alarm_time;
void (*sc_handler)(struct clockframe *);
struct evcnt * sc_evcnt;
void * sc_ih;
@@ -68,8 +69,9 @@ do { \
/* Clear the interrupt condition. */ \
gfrtc_clear_interrupt(&sc->sc_gfrtc); \
\
- /* Get the next alarm set ASAP. */ \
- gfrtc_set_alarm(&sc->sc_gfrtc, sc->sc_interval_ns); \
+ /* Get the next alarm set. */ \
+ sc->sc_alarm_time += sc->sc_interval_ns; \
+ gfrtc_set_alarm(&sc->sc_gfrtc, sc->sc_alarm_time); \
\
/* Increment the counter and call the handler. */ \
sc->sc_evcnt->ev_count++; \
@@ -103,7 +105,8 @@ gfrtc_mainbus_initclock(void *arg, unsig
gfrtc_enable_interrupt(&sc->sc_gfrtc);
/* Start the first alarm! */
- gfrtc_set_alarm(&sc->sc_gfrtc, sc->sc_interval_ns);
+ sc->sc_alarm_time = gfrtc_get_time(&sc->sc_gfrtc) + sc->sc_interval_ns;
+ gfrtc_set_alarm(&sc->sc_gfrtc, sc->sc_alarm_time);
}
static int
Index: src/sys/dev/goldfish/gfrtc.c
diff -u src/sys/dev/goldfish/gfrtc.c:1.4 src/sys/dev/goldfish/gfrtc.c:1.5
--- src/sys/dev/goldfish/gfrtc.c:1.4 Thu Jan 4 12:02:11 2024
+++ src/sys/dev/goldfish/gfrtc.c Tue Mar 5 11:19:30 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: gfrtc.c,v 1.4 2024/01/04 12:02:11 simonb Exp $ */
+/* $NetBSD: gfrtc.c,v 1.5 2024/03/05 11:19:30 isaki Exp $ */
/*-
* Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gfrtc.c,v 1.4 2024/01/04 12:02:11 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gfrtc.c,v 1.5 2024/03/05 11:19:30 isaki Exp $");
#include <sys/param.h>
@@ -141,10 +141,8 @@ gfrtc_get_time(struct gfrtc_softc * cons
void
-gfrtc_set_alarm(struct gfrtc_softc * const sc, const uint64_t nsec)
+gfrtc_set_alarm(struct gfrtc_softc * const sc, const uint64_t next)
{
- uint64_t next = gfrtc_get_time(sc) + nsec;
-
GOLDFISH_RTC_WRITE(sc, GOLDFISH_RTC_ALARM_HIGH, (uint32_t)(next >> 32));
GOLDFISH_RTC_WRITE(sc, GOLDFISH_RTC_ALARM_LOW, (uint32_t)next);
}