On Fri, 3 Apr 2020 17:23:08 +0300 Jon Doron <ari...@gmail.com> wrote:
> Guest OS uses ACPI to discover vmbus presence. Add a corresponding > entry to DSDT in case vmbus has been enabled. > > Experimentally Windows guests were found to require this entry to > include two IRQ resources, so this patch adds two semi-arbitrarily > chosen ones (7 and 13). This results, in particular, in parallel port > conflicting with vmbus. > > TODO: discover and use spare IRQs to avoid conflicts. CCing Vitaly as he might know whom to ping wrt 'spec' that describes vmbus and confirm with ACPI tables that native hyperv generates. > Signed-off-by: Evgeny Yakovlev <eyakov...@virtuozzo.com> > Signed-off-by: Roman Kagan <rka...@virtuozzo.com> > Signed-off-by: Jon Doron <ari...@gmail.com> > --- > hw/i386/acpi-build.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index 2a7e55bae7..6d7fdbbe9b 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -43,6 +43,7 @@ > #include "hw/acpi/tpm.h" > #include "hw/acpi/vmgenid.h" > #include "hw/boards.h" > +#include "hw/vmbus/vmbus.h" > #include "sysemu/tpm_backend.h" > #include "hw/rtc/mc146818rtc_regs.h" > #include "migration/vmstate.h" > @@ -1270,6 +1271,43 @@ static Aml *build_com_device_aml(uint8_t uid) > return dev; > } > > +static Aml *build_vmbus_device_aml(void) > +{ > + Aml *dev; > + Aml *method; > + Aml *crs; > + > + dev = aml_device("VMBS"); > + aml_append(dev, aml_name_decl("STA", aml_int(0xF))); > + aml_append(dev, aml_name_decl("_HID", aml_string("VMBus"))); > + aml_append(dev, aml_name_decl("_UID", aml_int(0x0))); > + aml_append(dev, aml_name_decl("_DDN", aml_string("VMBUS"))); > + > + method = aml_method("_DIS", 0, AML_NOTSERIALIZED); > + aml_append(method, aml_store(aml_and(aml_name("STA"), aml_int(0xD), > NULL), > + aml_name("STA"))); > + aml_append(dev, method); > + > + method = aml_method("_PS0", 0, AML_NOTSERIALIZED); > + aml_append(method, aml_store(aml_or(aml_name("STA"), aml_int(0xF), NULL), > + aml_name("STA"))); > + aml_append(dev, method); > + > + method = aml_method("_STA", 0, AML_NOTSERIALIZED); > + aml_append(method, aml_store(aml_name("STA"), aml_local(0))); > + aml_append(method, aml_return(aml_local(0))); > + aml_append(dev, method); does it need all that complicated _STA handling? Would simple aml_append(dev, aml_name_decl("_STA", aml_int(0xF))); work for you? > + aml_append(dev, aml_name_decl("_PS3", aml_int(0x0))); > + > + crs = aml_resource_template(); > + aml_append(crs, aml_irq_no_flags(7)); > + aml_append(crs, aml_irq_no_flags(13)); > + aml_append(dev, aml_name_decl("_CRS", crs)); > + > + return dev; > +} > + > static void build_isa_devices_aml(Aml *table) > { > ISADevice *fdc = pc_find_fdc0(); > @@ -1296,6 +1334,10 @@ static void build_isa_devices_aml(Aml *table) > build_acpi_ipmi_devices(scope, BUS(obj), "\\_SB.PCI0.ISA"); > } > > + if (vmbus_exists()) { > + aml_append(scope, build_vmbus_device_aml()); > + } > + > aml_append(table, scope); > } >