Page MenuHomeFreeBSD

D37219.id112433.diff
No OneTemporary

D37219.id112433.diff

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 <dev/hyperv/vmbus/aarch64/hyperv_reg.h>
#include <dev/hyperv/vmbus/hyperv_var.h>
#include <dev/hyperv/vmbus/hyperv_common_reg.h>
+#include <contrib/dev/acpica/include/acpi.h>
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,46 @@
return;
}
+/*
+ * This function verifies if the platform is Hyper-V or not.
+ * To do that we are using ACPI FADT and for that, acpi
+ * fadt is mapped first.
+ */
+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 (1);
+
+ fadt = acpi_map_table(physaddr, ACPI_SIG_FADT);
+ if (fadt == NULL) {
+ printf("hyperv: Unable to map the FADT\n");
+ return (1);
+ }
+
+ 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);

File Metadata

Mime Type
text/plain
Expires
Wed, Mar 4, 5:03 AM (6 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29226872
Default Alt Text
D37219.id112433.diff (5 KB)

Event Timeline