The branch main has been updated by markj:

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

commit 97993d1ebf592ac6689a498d5d0d2afb46758680
Author:     Mark Johnston <[email protected]>
AuthorDate: 2021-06-08 13:40:30 +0000
Commit:     Mark Johnston <[email protected]>
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 <[email protected]>
    Tested by:      Harry Schmalzbauer <[email protected]>
    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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to