git: 97993d1ebf59 - main - hyperv: Fix vmbus after the i386 4/4 split

Mark Johnston markj at FreeBSD.org
Tue Jun 8 13:50:29 UTC 2021


The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=97993d1ebf592ac6689a498d5d0d2afb46758680

commit 97993d1ebf592ac6689a498d5d0d2afb46758680
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-08 13:40:30 +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
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D30577
---
 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 331ad5fec79a..10e286dae271 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -102,7 +102,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 4249fa1dfd0a..5e7ea446089b 100644
--- a/sys/conf/options.i386
+++ b/sys/conf/options.i386
@@ -101,6 +101,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 0570c6b49e1c..d119cfdc5b12 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
@@ -45,6 +48,7 @@ IDTVEC(vmbus_isr)
 	cld
 	KENTER
 	pushl	%esp
-	call	vmbus_handle_intr
+	mov	$vmbus_handle_intr, %eax
+	call	*%eax
 	add	$4, %esp
 	jmp	doreti
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index 1b4d853fe1d4..288968d84af1 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -339,7 +339,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 6989d3e2828a..f47ab92f1987 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"
 
@@ -404,6 +405,14 @@ ENTRY(fork_trampoline)
 
 #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