Module Name: src Committed By: bouyer Date: Thu Apr 16 20:21:45 UTC 2020
Modified Files: src/sys/arch/xen/xen [bouyer-xenpvh]: xen_clock.c Log Message: MOve the #ifdef XENPV block to the end, so that XEN3_DOM0 builds again. To generate a diff of this commit: cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/arch/xen/xen/xen_clock.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/xen/xen/xen_clock.c diff -u src/sys/arch/xen/xen/xen_clock.c:1.1.2.1 src/sys/arch/xen/xen/xen_clock.c:1.1.2.2 --- src/sys/arch/xen/xen/xen_clock.c:1.1.2.1 Thu Apr 16 19:23:50 2020 +++ src/sys/arch/xen/xen/xen_clock.c Thu Apr 16 20:21:44 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xen_clock.c,v 1.1.2.1 2020/04/16 19:23:50 bouyer Exp $ */ +/* $NetBSD: xen_clock.c,v 1.1.2.2 2020/04/16 20:21:44 bouyer Exp $ */ /*- * Copyright (c) 2017, 2018 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xen_clock.c,v 1.1.2.1 2020/04/16 19:23:50 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xen_clock.c,v 1.1.2.2 2020/04/16 20:21:44 bouyer Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -114,128 +114,6 @@ static void xen_timepush_intr(void *); static int sysctl_xen_timepush(SYSCTLFN_ARGS); #endif -#ifdef XENPV -static int xen_rtc_get(struct todr_chip_handle *, struct timeval *); -static int xen_rtc_set(struct todr_chip_handle *, struct timeval *); -static void xen_wallclock_time(struct timespec *); -/* - * xen time of day register: - * - * Xen wall clock time, plus a Xen vCPU system time adjustment. - */ -static struct todr_chip_handle xen_todr_chip = { - .todr_gettime = xen_rtc_get, - .todr_settime = xen_rtc_set, -}; - -/* - * startrtclock() - * - * Initialize the real-time clock from x86 machdep autoconf. - */ -void -startrtclock(void) -{ - - todr_attach(&xen_todr_chip); -} - -/* - * setstatclockrate(rate) - * - * Set the statclock to run at rate, in units of ticks per second. - * - * Currently Xen does not have a separate statclock, so this is a - * noop; instad the statclock runs in hardclock. - */ -void -setstatclockrate(int rate) -{ -} - -/* - * xen_rtc_get(todr, tv) - * - * Get the current real-time clock from the Xen wall clock time - * and vCPU system time adjustment. - */ -static int -xen_rtc_get(struct todr_chip_handle *todr, struct timeval *tvp) -{ - struct timespec ts; - - xen_wallclock_time(&ts); - TIMESPEC_TO_TIMEVAL(tvp, &ts); - - return 0; -} - -/* - * xen_rtc_set(todr, tv) - * - * Set the Xen wall clock time, if we can. - */ -static int -xen_rtc_set(struct todr_chip_handle *todr, struct timeval *tvp) -{ -#ifdef DOM0OPS - struct clock_ymdhms dt; - xen_platform_op_t op; - uint64_t systime_ns; - - if (xendomain_is_privileged()) { - /* Convert to ymdhms and set the x86 ISA RTC. */ - clock_secs_to_ymdhms(tvp->tv_sec, &dt); - rtc_set_ymdhms(NULL, &dt); - - /* Get the global system time so we can preserve it. */ - systime_ns = xen_global_systime_ns(); - - /* Set the hypervisor wall clock time. */ - op.cmd = XENPF_settime; - op.u.settime.secs = tvp->tv_sec; - op.u.settime.nsecs = tvp->tv_usec * 1000; - op.u.settime.system_time = systime_ns; - return HYPERVISOR_platform_op(&op); - } -#endif - - /* XXX Should this fail if not on privileged dom0? */ - return 0; -} - -/* - * xen_wallclock_time(tsp) - * - * Return a snapshot of the current low-resolution wall clock - * time, as reported by the hypervisor, in tsp. - */ -static void -xen_wallclock_time(struct timespec *tsp) -{ - struct xen_wallclock_ticket ticket; - uint64_t systime_ns; - - int s = splsched(); /* make sure we won't be interrupted */ - /* Read the last wall clock sample from the hypervisor. */ - do { - xen_wallclock_enter(&ticket); - tsp->tv_sec = HYPERVISOR_shared_info->wc_sec; - tsp->tv_nsec = HYPERVISOR_shared_info->wc_nsec; - } while (!xen_wallclock_exit(&ticket)); - - /* Get the global system time. */ - systime_ns = xen_global_systime_ns(); - splx(s); - - /* Add the system time to the wall clock time. */ - systime_ns += tsp->tv_nsec; - tsp->tv_sec += systime_ns / 1000000000ull; - tsp->tv_nsec = systime_ns % 1000000000ull; -} - -#endif /* XENPV */ - /* * idle_block() * @@ -1011,3 +889,125 @@ sysctl_xen_timepush(SYSCTLFN_ARGS) } #endif /* DOM0OPS */ + +#ifdef XENPV +static int xen_rtc_get(struct todr_chip_handle *, struct timeval *); +static int xen_rtc_set(struct todr_chip_handle *, struct timeval *); +static void xen_wallclock_time(struct timespec *); +/* + * xen time of day register: + * + * Xen wall clock time, plus a Xen vCPU system time adjustment. + */ +static struct todr_chip_handle xen_todr_chip = { + .todr_gettime = xen_rtc_get, + .todr_settime = xen_rtc_set, +}; + +/* + * startrtclock() + * + * Initialize the real-time clock from x86 machdep autoconf. + */ +void +startrtclock(void) +{ + + todr_attach(&xen_todr_chip); +} + +/* + * setstatclockrate(rate) + * + * Set the statclock to run at rate, in units of ticks per second. + * + * Currently Xen does not have a separate statclock, so this is a + * noop; instad the statclock runs in hardclock. + */ +void +setstatclockrate(int rate) +{ +} + +/* + * xen_rtc_get(todr, tv) + * + * Get the current real-time clock from the Xen wall clock time + * and vCPU system time adjustment. + */ +static int +xen_rtc_get(struct todr_chip_handle *todr, struct timeval *tvp) +{ + struct timespec ts; + + xen_wallclock_time(&ts); + TIMESPEC_TO_TIMEVAL(tvp, &ts); + + return 0; +} + +/* + * xen_rtc_set(todr, tv) + * + * Set the Xen wall clock time, if we can. + */ +static int +xen_rtc_set(struct todr_chip_handle *todr, struct timeval *tvp) +{ +#ifdef DOM0OPS + struct clock_ymdhms dt; + xen_platform_op_t op; + uint64_t systime_ns; + + if (xendomain_is_privileged()) { + /* Convert to ymdhms and set the x86 ISA RTC. */ + clock_secs_to_ymdhms(tvp->tv_sec, &dt); + rtc_set_ymdhms(NULL, &dt); + + /* Get the global system time so we can preserve it. */ + systime_ns = xen_global_systime_ns(); + + /* Set the hypervisor wall clock time. */ + op.cmd = XENPF_settime; + op.u.settime.secs = tvp->tv_sec; + op.u.settime.nsecs = tvp->tv_usec * 1000; + op.u.settime.system_time = systime_ns; + return HYPERVISOR_platform_op(&op); + } +#endif + + /* XXX Should this fail if not on privileged dom0? */ + return 0; +} + +/* + * xen_wallclock_time(tsp) + * + * Return a snapshot of the current low-resolution wall clock + * time, as reported by the hypervisor, in tsp. + */ +static void +xen_wallclock_time(struct timespec *tsp) +{ + struct xen_wallclock_ticket ticket; + uint64_t systime_ns; + + int s = splsched(); /* make sure we won't be interrupted */ + /* Read the last wall clock sample from the hypervisor. */ + do { + xen_wallclock_enter(&ticket); + tsp->tv_sec = HYPERVISOR_shared_info->wc_sec; + tsp->tv_nsec = HYPERVISOR_shared_info->wc_nsec; + } while (!xen_wallclock_exit(&ticket)); + + /* Get the global system time. */ + systime_ns = xen_global_systime_ns(); + splx(s); + + /* Add the system time to the wall clock time. */ + systime_ns += tsp->tv_nsec; + tsp->tv_sec += systime_ns / 1000000000ull; + tsp->tv_nsec = systime_ns % 1000000000ull; +} + +#endif /* XENPV */