git: 97993d1ebf59 - main - hyperv: Fix vmbus after the i386 4/4 split
Mateusz Guzik
mjguzik at gmail.com
Wed Jun 9 10:36:51 UTC 2021
This breaks i386 LINT kernels:
ld: error: undefined symbol: Xvmbus_isr
>>> referenced by vmbus.c
>>> vmbus.o:(vmbus_intrhook)
ld: error: undefined symbol: Xvmbus_isr_pti
>>> referenced by vmbus.c
>>> vmbus.o:(vmbus_intrhook)
On 6/8/21, Mark Johnston <markj at freebsd.org> wrote:
> 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
>
--
Mateusz Guzik <mjguzik gmail.com>
More information about the dev-commits-src-all
mailing list