--- b/sys/dev/xen/timer/timer.c +++ b/sys/dev/xen/timer/timer.c @@ -86,6 +86,14 @@ static devclass_t xentimer_devclass; #define XENTIMER_QUALITY 950 +static int xen_disable_pv_et = 0; +static int xen_disable_pv_tc = 0; +static int xen_disable_pv_clk = 0; +TUNABLE_INT("hw.xen.disable_pv_et", &xen_disable_pv_et); +TUNABLE_INT("hw.xen.disable_pv_tc", &xen_disable_pv_tc); +TUNABLE_INT("hw.xen.disable_pv_clk", &xen_disable_pv_clk); + + struct xentimer_pcpu_data { uint64_t timer; uint64_t last_processed; @@ -412,7 +420,8 @@ xentimer_attach(device_t dev) sc->et.et_start = xentimer_et_start; sc->et.et_stop = xentimer_et_stop; sc->et.et_priv = sc; - et_register(&sc->et); + if (!xen_disable_pv_et) + et_register(&sc->et); /* Register the timecounter. */ sc->tc.tc_name = "XENTIMER"; @@ -427,10 +436,12 @@ xentimer_attach(device_t dev) sc->tc.tc_counter_mask = ~0u; sc->tc.tc_get_timecount = xentimer_get_timecount; sc->tc.tc_priv = sc; - tc_init(&sc->tc); + if (!xen_disable_pv_tc) + tc_init(&sc->tc); /* Register the Hypervisor wall clock */ - clock_register(dev, XENCLOCK_RESOLUTION); + if (!xen_disable_pv_clk) + clock_register(dev, XENCLOCK_RESOLUTION); return (0); } --- b/sys/x86/xen/xen_apic.c +++ b/sys/x86/xen/xen_apic.c @@ -55,6 +55,10 @@ __FBSDID("$FreeBSD$"); #include +/*------------------------------ Sysctl tunables -----------------------------*/ +static int xen_disable_pv_ipi = 0; +TUNABLE_INT("hw.xen.disable_pv_ipi", &xen_disable_pv_ipi); + /*--------------------------------- Macros -----------------------------------*/ #define XEN_APIC_UNSUPPORTED \ @@ -524,6 +528,9 @@ xen_setup_cpus(void) { int i; + if (xen_disable_pv_ipi) + return; + if (!xen_vector_callback_enabled) return;