Index: sys/arm64/conf/std.hyperv =================================================================== --- sys/arm64/conf/std.hyperv +++ sys/arm64/conf/std.hyperv @@ -2,5 +2,6 @@ # Hyper-V support (Hyper-v Gen 2) # +device acpi #hyper-v support -device hyperv +device hyperv Index: sys/conf/files.arm64 =================================================================== --- sys/conf/files.arm64 +++ sys/conf/files.arm64 @@ -214,6 +214,27 @@ dev/gpio/pl061_fdt.c optional pl061 gpio fdt dev/gpio/qoriq_gpio.c optional SOC_NXP_LS gpio fdt +dev/hyperv/vmbus/hyperv.c optional hyperv +dev/hyperv/vmbus/aarch64/hyperv_aarch64.c optional hyperv +dev/hyperv/vmbus/vmbus.c optional hyperv pci +dev/hyperv/vmbus/aarch64/vmbus_aarch64.c optional hyperv +dev/hyperv/vmbus/vmbus_if.m optional hyperv +dev/hyperv/vmbus/vmbus_res.c optional hyperv +dev/hyperv/vmbus/vmbus_xact.c optional hyperv +dev/hyperv/vmbus/aarch64/hyperv_machdep.c optional hyperv +dev/hyperv/vmbus/vmbus_chan.c optional hyperv +dev/hyperv/vmbus/hyperv_busdma.c optional hyperv +dev/hyperv/vmbus/vmbus_br.c optional hyperv +dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c optional hyperv +dev/hyperv/utilities/vmbus_timesync.c optional hyperv +dev/hyperv/utilities/vmbus_heartbeat.c optional hyperv +dev/hyperv/utilities/vmbus_ic.c optional hyperv +dev/hyperv/utilities/vmbus_shutdown.c optional hyperv +dev/hyperv/utilities/hv_kvp.c optional hyperv +dev/hyperv/netvsc/hn_nvs.c optional hyperv +dev/hyperv/netvsc/hn_rndis.c optional hyperv +dev/hyperv/netvsc/if_hn.c optional hyperv + dev/hwpmc/hwpmc_arm64.c optional hwpmc dev/hwpmc/hwpmc_arm64_md.c optional hwpmc dev/hwpmc/hwpmc_cmn600.c optional hwpmc acpi @@ -624,25 +645,3 @@ # Xilinx arm/xilinx/uart_dev_cdnc.c optional uart soc_xilinx_zynq fdt - -# Microsoft Hyper-V -dev/hyperv/vmbus/hyperv.c optional hyperv -dev/hyperv/vmbus/aarch64/hyperv_aarch64.c optional hyperv -dev/hyperv/vmbus/vmbus.c optional hyperv pci -dev/hyperv/vmbus/aarch64/vmbus_aarch64.c optional hyperv -dev/hyperv/vmbus/vmbus_if.m optional hyperv -dev/hyperv/vmbus/vmbus_res.c optional hyperv -dev/hyperv/vmbus/vmbus_xact.c optional hyperv -dev/hyperv/vmbus/aarch64/hyperv_machdep.c optional hyperv -dev/hyperv/vmbus/vmbus_chan.c optional hyperv -dev/hyperv/vmbus/hyperv_busdma.c optional hyperv -dev/hyperv/vmbus/vmbus_br.c optional hyperv -dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c optional hyperv -dev/hyperv/utilities/vmbus_timesync.c optional hyperv -dev/hyperv/utilities/vmbus_heartbeat.c optional hyperv -dev/hyperv/utilities/vmbus_ic.c optional hyperv -dev/hyperv/utilities/vmbus_shutdown.c optional hyperv -dev/hyperv/utilities/hv_kvp.c optional hyperv -dev/hyperv/netvsc/hn_nvs.c optional hyperv -dev/hyperv/netvsc/hn_rndis.c optional hyperv -dev/hyperv/netvsc/if_hn.c optional hyperv Index: sys/dev/hyperv/vmbus/aarch64/hyperv_aarch64.c =================================================================== --- sys/dev/hyperv/vmbus/aarch64/hyperv_aarch64.c +++ sys/dev/hyperv/vmbus/aarch64/hyperv_aarch64.c @@ -50,12 +50,15 @@ #include #include #include +#include void hyperv_init_tc(void); int hypercall_page_setup(vm_paddr_t); void hypercall_disable(void); bool hyperv_identify_features(void); +static int get_hypervid(void); + u_int hyperv_ver_major; u_int hyperv_features; u_int hyperv_recommends; @@ -80,11 +83,41 @@ return; } +static int +get_hypervid(void) +{ + ACPI_TABLE_FADT *fadt; + vm_paddr_t physaddr; + uint64_t hypervid; + int ret; + + physaddr = acpi_find_table(ACPI_SIG_FADT); + if (physaddr == 0) + return (0); + + fadt = acpi_map_table(physaddr, ACPI_SIG_FADT); + if (fadt == NULL) { + printf("hyperv: Unable to map the FADT\n"); + return (0); + } + + hypervid = fadt->HypervisorId; + acpi_unmap_table(fadt); + ret = strncmp((char *)&hypervid, "MsHyperV", 8); + return (ret); +} + bool hyperv_identify_features(void) { struct hv_get_vp_registers_output result; - vm_guest = VM_GUEST_HV; + + if (resource_disabled("acpi", 0)) + return (false); + if (get_hypervid()) + return (false); + else + vm_guest = VM_GUEST_HV; hv_get_vpreg_128(CPUID_LEAF_HV_FEATURES, &result); hyperv_features = result.as32.a; Index: sys/dev/hyperv/vmbus/aarch64/vmbus_aarch64.c =================================================================== --- sys/dev/hyperv/vmbus/aarch64/vmbus_aarch64.c +++ sys/dev/hyperv/vmbus/aarch64/vmbus_aarch64.c @@ -125,7 +125,7 @@ (uint64_t)rman_get_start(sc->ires), sc->vector, (uint64_t)rman_get_end(sc->ires)); } - err = bus_setup_intr(sc->vmbus_dev, sc->ires, INTR_TYPE_MISC, + err = bus_setup_intr(sc->vmbus_dev, sc->ires, INTR_TYPE_MISC | INTR_MPSAFE, vmbus_handle_intr_new, NULL, sc, &sc->icookie); if (err) { device_printf(sc->vmbus_dev, "failed to setup IRQ %d\n", err);