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