#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/clocksource.h>
#include <linux/clockchips.h>
#include <linux/gfp.h>
#include <linux/slab.h>
#include <linux/pvclock_gtod.h>
#include <linux/timekeeper_internal.h>
#include <asm/pvclock.h>
#include <asm/xen/hypervisor.h>
#include <asm/xen/hypercall.h>
#include <asm/xen/cpuid.h>
#include <xen/events.h>
#include <xen/features.h>
#include <xen/interface/xen.h>
#include <xen/interface/vcpu.h>
#include "xen-ops.h"
#define TIMER_SLOP …
static u64 xen_sched_clock_offset __read_mostly;
static unsigned long xen_tsc_khz(void)
{ … }
static u64 xen_clocksource_read(void)
{ … }
static u64 xen_clocksource_get_cycles(struct clocksource *cs)
{ … }
static noinstr u64 xen_sched_clock(void)
{ … }
static void xen_read_wallclock(struct timespec64 *ts)
{ … }
static void xen_get_wallclock(struct timespec64 *now)
{ … }
static int xen_set_wallclock(const struct timespec64 *now)
{ … }
static int xen_pvclock_gtod_notify(struct notifier_block *nb,
unsigned long was_set, void *priv)
{ … }
static struct notifier_block xen_pvclock_gtod_notifier = …;
static int xen_cs_enable(struct clocksource *cs)
{ … }
static struct clocksource xen_clocksource __read_mostly = …;
static s64 get_abs_timeout(unsigned long delta)
{ … }
static int xen_timerop_shutdown(struct clock_event_device *evt)
{ … }
static int xen_timerop_set_next_event(unsigned long delta,
struct clock_event_device *evt)
{ … }
static struct clock_event_device xen_timerop_clockevent __ro_after_init = …;
static int xen_vcpuop_shutdown(struct clock_event_device *evt)
{ … }
static int xen_vcpuop_set_oneshot(struct clock_event_device *evt)
{ … }
static int xen_vcpuop_set_next_event(unsigned long delta,
struct clock_event_device *evt)
{ … }
static struct clock_event_device xen_vcpuop_clockevent __ro_after_init = …;
static const struct clock_event_device *xen_clockevent = …;
struct xen_clock_event_device { … };
static DEFINE_PER_CPU(struct xen_clock_event_device, xen_clock_events) = …;
static irqreturn_t xen_timer_interrupt(int irq, void *dev_id)
{ … }
void xen_teardown_timer(int cpu)
{ … }
void xen_setup_timer(int cpu)
{ … }
void xen_setup_cpu_clockevents(void)
{ … }
void xen_timer_resume(void)
{ … }
static struct pvclock_vsyscall_time_info *xen_clock __read_mostly;
static u64 xen_clock_value_saved;
void xen_save_time_memory_area(void)
{ … }
void xen_restore_time_memory_area(void)
{ … }
static void xen_setup_vsyscall_time_info(void)
{ … }
static int __init xen_tsc_safe_clocksource(void)
{ … }
static void __init xen_time_init(void)
{ … }
static void __init xen_init_time_common(void)
{ … }
void __init xen_init_time_ops(void)
{ … }
#ifdef CONFIG_XEN_PVHVM
static void xen_hvm_setup_cpu_clockevents(void)
{ … }
void __init xen_hvm_init_time_ops(void)
{ … }
#endif
static int __init parse_xen_timer_slop(char *ptr)
{ … }
early_param(…);