aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hyperv
diff options
context:
space:
mode:
authorSepherosa Ziehau <sephe@FreeBSD.org>2016-12-21 03:23:35 +0000
committerSepherosa Ziehau <sephe@FreeBSD.org>2016-12-21 03:23:35 +0000
commitbe53a2fa1b2aea95fd99a5f43c0117caa97f575b (patch)
treec4c4de6af014211223f72c5a3020bea43d77a666 /sys/dev/hyperv
parent39f0182303e1b9b66ded25a09c5fdc9d3fb65523 (diff)
downloadsrc-be53a2fa1b2aea95fd99a5f43c0117caa97f575b.tar.gz
src-be53a2fa1b2aea95fd99a5f43c0117caa97f575b.zip
hyperv: Unbreak EARLY_AP_STARUP Hyper-V bootstrap by using intrhook
Properly working pause and friends are required. MFC after: 3 days Sponsored by: Microsoft
Notes
Notes: svn path=/head/; revision=310348
Diffstat (limited to 'sys/dev/hyperv')
-rw-r--r--sys/dev/hyperv/vmbus/vmbus.c29
-rw-r--r--sys/dev/hyperv/vmbus/vmbus_var.h3
2 files changed, 30 insertions, 2 deletions
diff --git a/sys/dev/hyperv/vmbus/vmbus.c b/sys/dev/hyperv/vmbus/vmbus.c
index 193e4489183d..dae3789ee2c4 100644
--- a/sys/dev/hyperv/vmbus/vmbus.c
+++ b/sys/dev/hyperv/vmbus/vmbus.c
@@ -99,6 +99,9 @@ static uint32_t vmbus_get_vcpu_id_method(device_t bus,
device_t dev, int cpu);
static struct taskqueue *vmbus_get_eventtq_method(device_t, device_t,
int);
+#ifdef EARLY_AP_STARTUP
+static void vmbus_intrhook(void *);
+#endif
static int vmbus_init(struct vmbus_softc *);
static int vmbus_connect(struct vmbus_softc *, uint32_t);
@@ -1402,6 +1405,21 @@ vmbus_event_proc_dummy(struct vmbus_softc *sc __unused, int cpu __unused)
{
}
+#ifdef EARLY_AP_STARTUP
+
+static void
+vmbus_intrhook(void *xsc)
+{
+ struct vmbus_softc *sc = xsc;
+
+ if (bootverbose)
+ device_printf(sc->vmbus_dev, "intrhook\n");
+ vmbus_doattach(sc);
+ config_intrhook_disestablish(&sc->vmbus_intrhook);
+}
+
+#endif /* EARLY_AP_STARTUP */
+
static int
vmbus_attach(device_t dev)
{
@@ -1416,7 +1434,14 @@ vmbus_attach(device_t dev)
*/
vmbus_sc->vmbus_event_proc = vmbus_event_proc_dummy;
-#ifndef EARLY_AP_STARTUP
+#ifdef EARLY_AP_STARTUP
+ /*
+ * Defer the real attach until the pause(9) works as expected.
+ */
+ vmbus_sc->vmbus_intrhook.ich_func = vmbus_intrhook;
+ vmbus_sc->vmbus_intrhook.ich_arg = vmbus_sc;
+ config_intrhook_establish(&vmbus_sc->vmbus_intrhook);
+#else /* !EARLY_AP_STARTUP */
/*
* If the system has already booted and thread
* scheduling is possible indicated by the global
@@ -1424,8 +1449,8 @@ vmbus_attach(device_t dev)
* initialization directly.
*/
if (!cold)
-#endif
vmbus_doattach(vmbus_sc);
+#endif /* EARLY_AP_STARTUP */
return (0);
}
diff --git a/sys/dev/hyperv/vmbus/vmbus_var.h b/sys/dev/hyperv/vmbus/vmbus_var.h
index cd9fb33cd411..2f39c91cdb5c 100644
--- a/sys/dev/hyperv/vmbus/vmbus_var.h
+++ b/sys/dev/hyperv/vmbus/vmbus_var.h
@@ -30,6 +30,7 @@
#define _VMBUS_VAR_H_
#include <sys/param.h>
+#include <sys/kernel.h>
#include <sys/taskqueue.h>
#include <sys/rman.h>
@@ -128,6 +129,8 @@ struct vmbus_softc {
struct mtx vmbus_chan_lock;
TAILQ_HEAD(, vmbus_channel) vmbus_chans;
+ struct intr_config_hook vmbus_intrhook;
+
#ifdef NEW_PCIB
/* The list of usable MMIO ranges for PCIe pass-through */
struct pcib_host_resources vmbus_mmio_res;