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@omnilan.de> Tested by: Harry Schmalzbauer <freebsd@omnilan.de> Reviewed by: whu, kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D30577
This commit is contained in:
@@ -102,7 +102,6 @@ dev/glxiic/glxiic.c optional glxiic
|
|||||||
dev/glxsb/glxsb.c optional glxsb
|
dev/glxsb/glxsb.c optional glxsb
|
||||||
dev/glxsb/glxsb_hash.c optional glxsb
|
dev/glxsb/glxsb_hash.c optional glxsb
|
||||||
dev/hyperv/vmbus/i386/hyperv_machdep.c optional hyperv
|
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/le/if_le_isa.c optional le isa
|
||||||
dev/nctgpio/nctgpio.c optional nctgpio
|
dev/nctgpio/nctgpio.c optional nctgpio
|
||||||
dev/nfe/if_nfe.c optional nfe pci
|
dev/nfe/if_nfe.c optional nfe pci
|
||||||
|
|||||||
@@ -101,6 +101,9 @@ NPX_DEBUG opt_npx.h
|
|||||||
# BPF just-in-time compiler
|
# BPF just-in-time compiler
|
||||||
BPF_JITTER opt_bpf.h
|
BPF_JITTER opt_bpf.h
|
||||||
|
|
||||||
|
# Hyper-V support
|
||||||
|
HYPERV opt_hyperv.h
|
||||||
|
|
||||||
XENHVM opt_global.h
|
XENHVM opt_global.h
|
||||||
|
|
||||||
# options for the Intel C600 SAS driver (isci)
|
# options for the Intel C600 SAS driver (isci)
|
||||||
|
|||||||
@@ -35,6 +35,9 @@
|
|||||||
/*
|
/*
|
||||||
* This is the Hyper-V vmbus channel direct callback interrupt.
|
* This is the Hyper-V vmbus channel direct callback interrupt.
|
||||||
* Only used when it is running on Hyper-V.
|
* 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
|
.text
|
||||||
SUPERALIGN_TEXT
|
SUPERALIGN_TEXT
|
||||||
@@ -45,6 +48,7 @@ IDTVEC(vmbus_isr)
|
|||||||
cld
|
cld
|
||||||
KENTER
|
KENTER
|
||||||
pushl %esp
|
pushl %esp
|
||||||
call vmbus_handle_intr
|
mov $vmbus_handle_intr, %eax
|
||||||
|
call *%eax
|
||||||
add $4, %esp
|
add $4, %esp
|
||||||
jmp doreti
|
jmp doreti
|
||||||
|
|||||||
@@ -339,6 +339,8 @@ device virtio_scsi # VirtIO SCSI device
|
|||||||
device virtio_balloon # VirtIO Memory Balloon device
|
device virtio_balloon # VirtIO Memory Balloon device
|
||||||
|
|
||||||
# HyperV drivers and enhancement support
|
# HyperV drivers and enhancement support
|
||||||
|
# NOTE: HYPERV depends on hyperv. They must be added or removed together.
|
||||||
|
options HYPERV # Kernel support for HyperV drivers
|
||||||
device hyperv # HyperV drivers
|
device hyperv # HyperV drivers
|
||||||
|
|
||||||
# Xen HVM Guest Optimizations
|
# Xen HVM Guest Optimizations
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
#include "opt_apic.h"
|
#include "opt_apic.h"
|
||||||
#include "opt_atpic.h"
|
#include "opt_atpic.h"
|
||||||
#include "opt_hwpmc_hooks.h"
|
#include "opt_hwpmc_hooks.h"
|
||||||
|
#include "opt_hyperv.h"
|
||||||
|
|
||||||
#include "assym.inc"
|
#include "assym.inc"
|
||||||
|
|
||||||
@@ -404,6 +405,14 @@ ENTRY(fork_trampoline)
|
|||||||
|
|
||||||
#ifdef DEV_APIC
|
#ifdef DEV_APIC
|
||||||
#include <i386/i386/apic_vector.s>
|
#include <i386/i386/apic_vector.s>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HYPERV
|
||||||
|
.data
|
||||||
|
.p2align 4
|
||||||
|
.text
|
||||||
|
SUPERALIGN_TEXT
|
||||||
|
#include <dev/hyperv/vmbus/i386/vmbus_vector.S>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.data
|
.data
|
||||||
|
|||||||
@@ -13,8 +13,11 @@ SRCS= hyperv.c \
|
|||||||
vmbus_et.c \
|
vmbus_et.c \
|
||||||
vmbus_if.c \
|
vmbus_if.c \
|
||||||
vmbus_res.c \
|
vmbus_res.c \
|
||||||
vmbus_vector.S \
|
|
||||||
vmbus_xact.c
|
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
|
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
|
# XXX: for assym.inc
|
||||||
|
|||||||
Reference in New Issue
Block a user