diff options
Diffstat (limited to 'website/static/security/patches/EN-22:03/hyperv.patch')
-rw-r--r-- | website/static/security/patches/EN-22:03/hyperv.patch | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/website/static/security/patches/EN-22:03/hyperv.patch b/website/static/security/patches/EN-22:03/hyperv.patch new file mode 100644 index 0000000000..38985feb77 --- /dev/null +++ b/website/static/security/patches/EN-22:03/hyperv.patch @@ -0,0 +1,59 @@ +--- sys/dev/hyperv/pcib/vmbus_pcib.c.orig ++++ sys/dev/hyperv/pcib/vmbus_pcib.c +@@ -1356,6 +1356,47 @@ + } + } + ++/* ++ * The vPCI in some Hyper-V releases do not initialize the last 4 ++ * bit of BAR registers. This could result weird problems causing PCI ++ * code fail to configure BAR correctly. ++ * ++ * Just write all 1's to those BARs whose probed values are not zero. ++ * This seems to make the Hyper-V vPCI and pci_write_bar() to cooperate ++ * correctly. ++ */ ++ ++static void ++vmbus_pcib_prepopulate_bars(struct hv_pcibus *hbus) ++{ ++ struct hv_pci_dev *hpdev; ++ int i; ++ ++ mtx_lock(&hbus->device_list_lock); ++ TAILQ_FOREACH(hpdev, &hbus->children, link) { ++ for (i = 0; i < 6; i++) { ++ /* Ignore empty bar */ ++ if (hpdev->probed_bar[i] == 0) ++ continue; ++ ++ uint32_t bar_val = 0; ++ ++ _hv_pcifront_read_config(hpdev, PCIR_BAR(i), ++ 4, &bar_val); ++ ++ if (hpdev->probed_bar[i] != bar_val) { ++ if (bootverbose) ++ printf("vmbus_pcib: initialize bar %d " ++ "by writing all 1s\n", i); ++ ++ _hv_pcifront_write_config(hpdev, PCIR_BAR(i), ++ 4, 0xffffffff); ++ } ++ } ++ } ++ mtx_unlock(&hbus->device_list_lock); ++} ++ + static void + vmbus_pcib_set_detaching(void *arg, int pending __unused) + { +@@ -1479,6 +1520,8 @@ + if (ret) + goto vmbus_close; + ++ vmbus_pcib_prepopulate_bars(hbus); ++ + hbus->pci_bus = device_add_child(dev, "pci", -1); + if (!hbus->pci_bus) { + device_printf(dev, "failed to create pci bus\n"); |