Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/bouyer-xenpvh]: src/sys/arch/xen Rename xen/xen/clock.c to xen_clock.c, ...



details:   https://anonhg.NetBSD.org/src/rev/7bc32501df15
branches:  bouyer-xenpvh
changeset: 930905:7bc32501df15
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Thu Apr 16 19:23:50 2020 +0000

description:
Rename xen/xen/clock.c to xen_clock.c, so that it can be compiled
with x86/isa/clock.c
call events_default_setup() from hypervisor_match to that event
arrays are properly initialised.
Use xen_delay() and xen's timecounter for PVHVM.

diffstat:

 sys/arch/xen/conf/files.xen    |     4 +-
 sys/arch/xen/conf/files.xen.pv |     3 +-
 sys/arch/xen/xen/clock.c       |  1011 ---------------------------------------
 sys/arch/xen/xen/hypervisor.c  |    13 +-
 sys/arch/xen/xen/xen_clock.c   |  1013 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 1026 insertions(+), 1018 deletions(-)

diffs (truncated from 2115 to 300 lines):

diff -r 55f47de42cbf -r 7bc32501df15 sys/arch/xen/conf/files.xen
--- a/sys/arch/xen/conf/files.xen       Thu Apr 16 17:50:51 2020 +0000
+++ b/sys/arch/xen/conf/files.xen       Thu Apr 16 19:23:50 2020 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.xen,v 1.180.2.3 2020/04/16 08:46:35 bouyer Exp $
+#      $NetBSD: files.xen,v 1.180.2.4 2020/04/16 19:23:50 bouyer Exp $
 
 defflag        opt_xen.h                       XEN XENPVH XENPVHVM
 
@@ -9,7 +9,7 @@
 file   arch/xen/xen/xengnt.c                   xen
 file   arch/xen/x86/xen_ipi.c                  multiprocessor & xen
 file   arch/xen/x86/xen_mainbus.c              xen
-
+file   arch/xen/xen/xen_clock.c                xen
 
 define hypervisorbus {}
 define xendevbus {}
diff -r 55f47de42cbf -r 7bc32501df15 sys/arch/xen/conf/files.xen.pv
--- a/sys/arch/xen/conf/files.xen.pv    Thu Apr 16 17:50:51 2020 +0000
+++ b/sys/arch/xen/conf/files.xen.pv    Thu Apr 16 19:23:50 2020 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.xen.pv,v 1.1.2.1 2020/04/16 08:46:35 bouyer Exp $
+#      $NetBSD: files.xen.pv,v 1.1.2.2 2020/04/16 19:23:50 bouyer Exp $
 
 file   arch/xen/x86/autoconf.c         xenpv
 file   arch/xen/x86/x86_xpmap.c        xenpv
@@ -6,7 +6,6 @@
 file   arch/xen/x86/xenfunc.c          xenpv
 file   arch/xen/xen/xen_acpi_machdep.c acpi & xenpv
 
-file   arch/xen/xen/clock.c            xenpv
 file   arch/xen/x86/xen_bus_dma.c      machdep & xenpv
 file   arch/xen/x86/consinit.c         machdep & xenpv
 file   arch/xen/x86/pintr.c            machdep & dom0ops & xenpv
diff -r 55f47de42cbf -r 7bc32501df15 sys/arch/xen/xen/clock.c
--- a/sys/arch/xen/xen/clock.c  Thu Apr 16 17:50:51 2020 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,1011 +0,0 @@
-/*     $NetBSD: clock.c,v 1.80.6.2 2020/04/12 17:25:53 bouyer Exp $    */
-
-/*-
- * Copyright (c) 2017, 2018 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Taylor R. Campbell.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "opt_xen.h"
-
-#ifndef XEN_CLOCK_DEBUG
-#define        XEN_CLOCK_DEBUG 0
-#endif
-
-#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.80.6.2 2020/04/12 17:25:53 bouyer Exp $");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/atomic.h>
-#include <sys/callout.h>
-#include <sys/cpu.h>
-#include <sys/device.h>
-#include <sys/evcnt.h>
-#include <sys/intr.h>
-#include <sys/kernel.h>
-#include <sys/lwp.h>
-#include <sys/proc.h>
-#include <sys/sysctl.h>
-#include <sys/systm.h>
-#include <sys/time.h>
-#include <sys/timetc.h>
-
-#include <dev/clock_subr.h>
-
-#include <machine/cpu.h>
-#include <machine/cpu_counter.h>
-#include <machine/lock.h>
-
-#include <xen/evtchn.h>
-#include <xen/hypervisor.h>
-#include <xen/include/public/vcpu.h>
-#include <xen/xen.h>
-
-#include <x86/rtc.h>
-
-#define NS_PER_TICK ((uint64_t)1000000000ULL/hz)
-
-static uint64_t        xen_vcputime_systime_ns(void);
-static uint64_t        xen_vcputime_raw_systime_ns(void);
-static void    xen_wallclock_time(struct timespec *);
-static uint64_t        xen_global_systime_ns(void);
-static unsigned        xen_get_timecount(struct timecounter *);
-static int     xen_rtc_get(struct todr_chip_handle *, struct timeval *);
-static int     xen_rtc_set(struct todr_chip_handle *, struct timeval *);
-static int     xen_timer_handler(void *, struct clockframe *);
-
-/*
- * xen timecounter:
- *
- *     Xen vCPU system time, plus an adjustment with rdtsc.
- */
-static struct timecounter xen_timecounter = {
-       .tc_get_timecount = xen_get_timecount,
-       .tc_poll_pps = NULL,
-       .tc_counter_mask = ~0U,
-       .tc_frequency = 1000000000ULL,  /* 1 GHz, i.e. units of nanoseconds */
-       .tc_name = "xen_system_time",
-       .tc_quality = 10000,
-};
-
-/*
- * xen_global_systime_ns_stamp
- *
- *     The latest Xen vCPU system time that has been observed on any
- *     CPU, for a global monotonic view of the Xen system time clock.
- */
-static volatile uint64_t xen_global_systime_ns_stamp __cacheline_aligned;
-
-/*
- * 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,
-};
-
-#ifdef DOM0OPS
-/*
- * xen timepush state:
- *
- *     Callout to periodically, after a sysctl-configurable number of
- *     NetBSD ticks, set the Xen hypervisor's wall clock time.
- */
-static struct {
-       struct callout  ch;
-       int             ticks;
-} xen_timepush;
-
-static void    xen_timepush_init(void);
-static void    xen_timepush_intr(void *);
-static int     sysctl_xen_timepush(SYSCTLFN_ARGS);
-#endif
-
-/*
- * 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)
-{
-}
-
-/*
- * idle_block()
- *
- *     Called from the idle loop when we have nothing to do but wait
- *     for an interrupt.
- */
-void
-idle_block(void)
-{
-
-       HYPERVISOR_block();
-}
-
-/*
- * xen_rdtsc()
- *
- *     Read the local pCPU's tsc.
- */
-static inline uint64_t
-xen_rdtsc(void)
-{
-       uint32_t lo, hi;
-
-       asm volatile("rdtsc" : "=a"(lo), "=d"(hi));
-
-       return ((uint64_t)hi << 32) | lo;
-}
-
-/*
- * struct xen_vcputime_ticket
- *
- *     State for a vCPU read section, during which a caller may read
- *     from fields of a struct vcpu_time_info and call xen_rdtsc.
- *     Caller must enter with xen_vcputime_enter, exit with
- *     xen_vcputime_exit, and be prepared to retry if
- *     xen_vcputime_exit fails.
- */
-struct xen_vcputime_ticket {
-       uint64_t        version;
-};
-
-/*
- * xen_vcputime_enter(tp)
- *
- *     Enter a vCPU time read section and store a ticket in *tp, which
- *     the caller must use with xen_vcputime_exit.  Return a pointer
- *     to the current CPU's vcpu_time_info structure.  Caller must
- *     already be bound to the CPU.
- */
-static inline volatile struct vcpu_time_info *
-xen_vcputime_enter(struct xen_vcputime_ticket *tp)
-{
-       volatile struct vcpu_time_info *vt = &curcpu()->ci_vcpu->time;
-
-       while (__predict_false(1 & (tp->version = vt->version)))
-               SPINLOCK_BACKOFF_HOOK;
-
-       /*
-        * Must read the version before reading the tsc on the local
-        * pCPU.  We are racing only with interruption by the
-        * hypervisor, so no need for a stronger memory barrier.
-        */
-       __insn_barrier();
-
-       return vt;
-}
-
-/*
- * xen_vcputime_exit(vt, tp)
- *
- *     Exit a vCPU time read section with the ticket in *tp from
- *     xen_vcputime_enter.  Return true on success, false if caller
- *     must retry.
- */
-static inline bool
-xen_vcputime_exit(volatile struct vcpu_time_info *vt,
-    struct xen_vcputime_ticket *tp)
-{
-
-       KASSERT(vt == &curcpu()->ci_vcpu->time);
-
-       /*
-        * Must read the tsc before re-reading the version on the local
-        * pCPU.  We are racing only with interruption by the
-        * hypervisor, so no need for a stronger memory barrier.
-        */
-       __insn_barrier();
-
-       return tp->version == vt->version;
-}
-
-/*
- * xen_tsc_to_ns_delta(delta_tsc, mul_frac, shift)
- *
- *     Convert a difference in tsc units to a difference in
- *     nanoseconds given a multiplier and shift for the unit
- *     conversion.
- */
-static inline uint64_t
-xen_tsc_to_ns_delta(uint64_t delta_tsc, uint32_t tsc_to_system_mul,
-    int8_t tsc_shift)
-{
-       uint32_t delta_tsc_hi, delta_tsc_lo;
-
-       if (tsc_shift < 0)
-               delta_tsc >>= -tsc_shift;
-       else



Home | Main Index | Thread Index | Old Index