git: df57775d7a80 - stable/13 - hyperv: Fix vmbus after the i386 4/4 split
Mark Johnston
markj at FreeBSD.org
Tue Jun 22 01:09:45 UTC 2021
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=df57775d7a806ace688822dbc272e3672628163d
commit df57775d7a806ace688822dbc272e3672628163d
Author: Mark Johnston <markj at FreeBSD.org>
AuthorDate: 2021-06-08 13:40:30 +0000
Commit: Mark Johnston <markj at FreeBSD.org>
CommitDate: 2021-06-22 01:09:17 +0000
hyperv: Fix vmbus after the i386 4/4 split
The vmbus ISR needs to live in a trampoline. Dynamically allocating a
trampoline at driver initialization time poses some difficulties due to
the fact that the KENTER macro assumes that the offset relative to
tramp_idleptd is fixed at static link time. Another problem is that
native_lapic_ipi_alloc() uses setidt(), which assumes a fixed trampoline
offset.
Rather than fight this, move the Hyper-V ISR to i386/exception.s. Add a
new HYPERV kernel option to make this optional, and configure it by
default on i386. This is sufficient to make use of vmbus(4) after the
4/4 split. Note that vmbus cannot be loaded dynamically and both the
HYPERV option and device must be configured together. I think this is
not too onerous a requirement, since vmbus(4) was previously
non-functional.
Reported by: Harry Schmalzbauer <freebsd at omnilan.de>
Tested by: Harry Schmalzbauer <freebsd at omnilan.de>
Reviewed by: whu, kib
Sponsored by: The FreeBSD Foundation
(cherry picked from commit 97993d1ebf592ac6689a498d5d0d2afb46758680)
---
sys/conf/files.i386 | 1 -
sys/conf/options.i386 | 3 +++
sys/dev/hyperv/vmbus/i386/vmbus_vector.S | 6 +++++-
sys/i386/conf/GENERIC | 4 +++-
sys/i386/i386/exception.s | 9 +++++++++
sys/modules/hyperv/vmbus/Makefile | 5 ++++-
6 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index de759a9f7c83..4bbd584cb831 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -101,7 +101,6 @@ dev/glxiic/glxiic.c optional glxiic
dev/glxsb/glxsb.c optional glxsb
dev/glxsb/glxsb_hash.c optional glxsb
dev/hyperv/vmbus/i386/hyperv_machdep.c optional hyperv
-dev/hyperv/vmbus/i386/vmbus_vector.S optional hyperv
dev/le/if_le_isa.c optional le isa
dev/nctgpio/nctgpio.c optional nctgpio
dev/nfe/if_nfe.c optional nfe pci
diff --git a/sys/conf/options.i386 b/sys/conf/options.i386
index 73957449413f..fea6efdb991d 100644
--- a/sys/conf/options.i386
+++ b/sys/conf/options.i386
@@ -110,6 +110,9 @@ NPX_DEBUG opt_npx.h
# BPF just-in-time compiler
BPF_JITTER opt_bpf.h
+# Hyper-V support
+HYPERV opt_hyperv.h
+
XENHVM opt_global.h
# options for the Intel C600 SAS driver (isci)
diff --git a/sys/dev/hyperv/vmbus/i386/vmbus_vector.S b/sys/dev/hyperv/vmbus/i386/vmbus_vector.S
index f503e3d81203..4bb51be2623d 100644
--- a/sys/dev/hyperv/vmbus/i386/vmbus_vector.S
+++ b/sys/dev/hyperv/vmbus/i386/vmbus_vector.S
@@ -35,6 +35,9 @@
/*
* This is the Hyper-V vmbus channel direct callback interrupt.
* Only used when it is running on Hyper-V.
+ *
+ * Note that this file is not compiled directly, it is included into
+ * i386/exception.s.
*/
.text
SUPERALIGN_TEXT
@@ -46,7 +49,8 @@ IDTVEC(vmbus_isr)
KENTER
FAKE_MCOUNT(TF_EIP(%esp))
pushl %esp
- call vmbus_handle_intr
+ mov $vmbus_handle_intr, %eax
+ call *%eax
add $4, %esp
MEXITCOUNT
jmp doreti
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index 702f6d64223c..fd8290a56929 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -328,7 +328,9 @@ device virtio_scsi # VirtIO SCSI device
device virtio_balloon # VirtIO Memory Balloon device
# HyperV drivers and enhancement support
-device hyperv # HyperV drivers
+# NOTE: HYPERV depends on hyperv. They must be added or removed together.
+options HYPERV # Kernel support for HyperV drivers
+device hyperv # HyperV drivers
# Xen HVM Guest Optimizations
# NOTE: XENHVM depends on xenpci. They must be added or removed together.
diff --git a/sys/i386/i386/exception.s b/sys/i386/i386/exception.s
index b288543dafe1..4e806e8b3bd9 100644
--- a/sys/i386/i386/exception.s
+++ b/sys/i386/i386/exception.s
@@ -39,6 +39,7 @@
#include "opt_apic.h"
#include "opt_atpic.h"
#include "opt_hwpmc_hooks.h"
+#include "opt_hyperv.h"
#include "assym.inc"
@@ -428,6 +429,14 @@ MCOUNT_LABEL(bintr)
#ifdef DEV_APIC
#include <i386/i386/apic_vector.s>
+#endif
+
+#ifdef HYPERV
+ .data
+ .p2align 4
+ .text
+ SUPERALIGN_TEXT
+#include <dev/hyperv/vmbus/i386/vmbus_vector.S>
#endif
.data
diff --git a/sys/modules/hyperv/vmbus/Makefile b/sys/modules/hyperv/vmbus/Makefile
index 435106c7e9bd..47a83e76204a 100644
--- a/sys/modules/hyperv/vmbus/Makefile
+++ b/sys/modules/hyperv/vmbus/Makefile
@@ -13,8 +13,11 @@ SRCS= hyperv.c \
vmbus_et.c \
vmbus_if.c \
vmbus_res.c \
- vmbus_vector.S \
vmbus_xact.c
+
+.if ${MACHINE_CPUARCH} != "i386"
+SRCS+= vmbus_vector.S
+.endif
SRCS+= acpi_if.h bus_if.h device_if.h opt_acpi.h pci_if.h pcib_if.h vmbus_if.h
# XXX: for assym.inc
More information about the dev-commits-src-all
mailing list