Hi, Michael > From: Michael S. Tsirkin [mailto:m...@redhat.com] > Subject: Re: [PATCH v5 2/2] ACPI: Add -acpitable fadt= to allow FADT > revision changes > > On Mon, Aug 15, 2016 at 02:18:55AM +0000, Zheng, Lv wrote: > > Hi, > > > > > From: Michael S. Tsirkin [mailto:m...@redhat.com] > > > Subject: Re: [PATCH v5 2/2] ACPI: Add -acpitable fadt= to allow FADT > > > revision changes > > > > > > On Mon, Aug 15, 2016 at 01:33:41AM +0000, Zheng, Lv wrote: > > > > Hi, > > > > > > > > > From: Michael S. Tsirkin [mailto:m...@redhat.com] > > > > > Subject: Re: [PATCH v5 2/2] ACPI: Add -acpitable fadt= to allow > FADT > > > > > revision changes > > > > > > > > > > On Fri, Aug 12, 2016 at 12:47:04AM +0000, Zheng, Lv wrote: > > > > > > Hi, Igor > > > > > > > > > > > > Thanks for the review. > > > > > > > > > > > > > From: Igor Mammedov [mailto:imamm...@redhat.com] > > > > > > > Subject: Re: [PATCH v5 2/2] ACPI: Add -acpitable fadt= to allow > > > FADT > > > > > > > revision changes > > > > > > > > > > > > > > On Thu, 11 Aug 2016 17:36:45 +0800 > > > > > > > Lv Zheng <lv.zh...@intel.com> wrote: > > > > > > > > > > > > > > > This patch allows FADT to be built with different revisions. > When > > > the > > > > > > > revision > > > > > > > > is greater than 1.0, 64-bit address fields may also be filled. > > > > > > > > > > > > > > > > Note that FADT revision 2 has never been defined by the ACPI > > > > > > > specification. So > > > > > > > > this patch only adds an option -acpitable fadt= to allow > revision > > > 1,3,5 > > > > > to > > > > > > > be > > > > > > > > configured by the users. > > > > > > > > > > > > > > > > 1. Tested by booting a linux image, the 64-bit addresses are > > > correctly > > > > > > > filled > > > > > > > > in the dumped FADT. > > > > > > > > 2. Tested by booting a Windows image, no boot failure can be > > > seen. > > > > > > > > > > > > > > series still doesn't say why do you need 64-bit addresses in > FADT, > > > > > > > current Seabios/OVMF allocates tables below 4Gb and gpe/pm > > > > > > > register blocks are below 4gb as well so there is no point in > > > > > > > accepting theses patches and adding extra CLI options as these > > > > > > > patches do. > > > > > > [Lv Zheng] > > > > > > This patch is used by us to probe Windows FADT behavior. > > > > > > Current known behavior includes: > > > > > > 1. On x86, Windows requires BIOS to have 2 FADTs, 1 is in RSDT, > and > > > > > probably is a v1 table, the other is in XSDT, and probably is a v3+ > table. > > > > > > > > > > What does "requires" mean here? It seems to work fine without. > > > > > > > > Let me reword: > > > > Windows requires BIOS to provide 2 FADTs when both RSDT and > XSDT > > > are provided. > > > > > > That's good to know, thanks. > > > Do you see a reason to have both at the moment? > > > > If qemu always uses RSDT, then all Windows clones should support such > an old BIOS because all Windows clones are backward compatible. > > > > But, ACPI 2.0+/5.0+ introduced new features, (for example, reduced > hardware model). > > My investigation result shows if an FADT is provided via RSDT, windows > will ignore some of its fields. > > So if qemu starts to support new features, then qemu may need to > provide both RSDT and XSDT. > > As a result, qemu may need to provide 2 FADTs. > > > > However, there is no real ACPI 2.0+ support in qemu/x86 code. > > So this feature (having a version parameter for FADT setup) is just a > good-to-have feature. > > With which, developers may start to introduce some ACPI 2.0+ features. > > > > Thanks > > Lv > > Right. Let's include this when we actually need some of the > features that require an XSDT.
OK. I should: 1. remove -acpitable fadt option since it is only for the purpose of probing Windows behavior; 2. do not increase FADT version since currently there is no XSDT in qemu/x86. > > Pls note that OVMF currently won't do the right thing > if you have both an RSDT and an XSDT: it will try to > install two copies of all tables. > If you are interested in this, please take a look at > the OVMF code and fix it up. Good to know this. I'll try when I have bandwidth. Thanks and best regards Lv > > > > > > > > > > > > > > > 2. v2 FADT never exists in the spec, it is used in very early years, > by > > > IA64 > > > > > prototype machines. > > > > > > 3. If the FADT in RSDT takes effective, then Windows actually > ignores > > > 64- > > > > > bit GAS fields, but uses 32-bit register fields. > > > > > > But there are still many uncertainties: > > > > > > 1. What if the FADT in XSDT takes effective? > > > > > > 2. What's the behavior on IA64/ARM platforms? > > > > > > If we could have an option here, we could continue the probing > work, > > > > > trying every combination. > > > > > > > > > > > > Thus the original purpose of this commit is - probing de-facto > > > standard > > > > > behavior. > > > > > > > > > > Nice, but why do we need PATCH 2 upstream? Is it hard for you to > > > > > maintain > > > > > out of tree? > > > > > > > > Not hard. > > > > I just may encounter problems if I want to put a document in Linux > > > kernel related to FADT support and Windows behavior proofs. > > > > I'll remove this option. > > > > > > > > > > > > > > > > > > > > > > > If we'd ever need to bump FADT revision, I'd first try to increase > it > > > > > > > unconditionally and test/see if it would not upset legacy guests > > > > > > > Windows starting from XP, RHEL4/5/6 > > > > > > > If it works then these patches are not necessary, > > > > > > > (this approach worked just fine for bumping up DSDT revision > to 2 > > > > > > > it would be possible to use 64-bit math in ASL/AML). > > > > > > > > > > > > > > if it doesn't, I still won't do it this way but rather: > > > > > > > - make new revision used by default > > > > > > > - add compat property to piix4_pm/ich9-lpc to force legacy > > > revision > > > > > > > - turn on legacy revision for old machine types using added > above > > > > > > > property > > > > > > > > > > > > > > That way we won't regress existing setups as old machines will > stay > > > > > > > the same and only new machine types will be affected. And > users > > > that > > > > > > > actually want to play with legacy revision on new machine > types > > > could > > > > > > > force it by using above property. > > > > > > > > > > > > > [Lv Zheng] > > > > > > But it seems the code in this commit contains useful stuffs for > qemu. > > > > > > > > > > > > As I said previously, it seems Windows requires 2 FADTs. > > > > > > So having a revision parameter for build_fadt() seems to be > > > necessary. > > > > > > Because if qemu wants to increase FADT revision, qemu may do > this > > > in > > > > > this way: > > > > > > 1. Invoke build_fadt() with revision 1, and put it into RSDT; > > > > > > 2. Invoke build_fadt() with latest revision, and put it into XSDT. > > > > > > Also we know latest revision FADT is useful, it contains reduced > > > > > hardware support. > > > > > > And some of new ACPI features rely this model. > > > > > > > > > > > > So I'm sure that this commit contains useful stuffs for qemu to > do > > > future > > > > > extension. > > > > > > > > > > > > But I don't know if you want to keep the new -acpitable fadt= > option. > > > > > > Let me ask: > > > > > > 1. Are there any issues in PATCH 01? Maybe my understanding of > > > qemu > > > > > option code is not correct. > > > > > > > > > > Didn't review yet, I'll let Igor review first. > > > > > > > > > > > 2. IMO, this option should be useful for a long period because we > > > need it > > > > > to help probing Windows behavior, so can we have it upstreamed? > > > > > > > > > > ATM PATCH 2 does not seem generally useful. > > > > > > > > OK. I see. > > > > > > > > Thanks > > > > Lv > > > > > > > > > > > > > > > > > > > > > Best regards > > > > > > Lv > > > > > > > > > > > > > > > > > > > > > > Signed-off-by: Lv Zheng <lv.zh...@intel.com> > > > > > > > > --- > > > > > > > > hw/acpi/core.c | 20 ++++++++++++- > > > > > > > > hw/i386/acpi-build.c | 76 > > > > > > > ++++++++++++++++++++++++++++++++++++++++++------ > > > > > > > > include/hw/acpi/acpi.h | 1 + > > > > > > > > qemu-options.hx | 8 ++++- > > > > > > > > 4 files changed, 94 insertions(+), 11 deletions(-) > > > > > > > > > > > > > > > > diff --git a/hw/acpi/core.c b/hw/acpi/core.c > > > > > > > > index 85e0e94..832c86b 100644 > > > > > > > > --- a/hw/acpi/core.c > > > > > > > > +++ b/hw/acpi/core.c > > > > > > > > @@ -19,6 +19,7 @@ > > > > > > > > * GNU GPL, version 2 or (at your option) any later version. > > > > > > > > */ > > > > > > > > #include "qemu/osdep.h" > > > > > > > > +#include "qemu/cutils.h" > > > > > > > > #include "sysemu/sysemu.h" > > > > > > > > #include "hw/hw.h" > > > > > > > > #include "hw/i386/pc.h" > > > > > > > > @@ -54,6 +55,7 @@ static const char unsigned > > > > > > > dfl_hdr[ACPI_TABLE_HDR_SIZE - ACPI_TABLE_PFX_SIZE] = > > > > > > > > > > > > > > > > char unsigned *acpi_tables; > > > > > > > > size_t acpi_tables_len; > > > > > > > > +uint8_t acpi_fadt_rev = 1; > > > > > > > > > > > > > > > > static QemuOptsList qemu_acpi_opts = { > > > > > > > > .name = "acpi", > > > > > > > > @@ -312,7 +314,23 @@ void acpi_table_add(const > QemuOpts > > > > > *opts, > > > > > > > Error **errp) > > > > > > > > return; > > > > > > > > } > > > > > > > > > > > > > > > > - error_setg(errp, "'-acpitable' requires one of 'data' or > 'file'"); > > > > > > > > + val = qemu_opt_get((QemuOpts *)opts, "fadt"); > > > > > > > > + if (val) { > > > > > > > > + unsigned long rev; > > > > > > > > + int err; > > > > > > > > + > > > > > > > > + err = qemu_strtoul(val, NULL, 10, &rev); > > > > > > > > + if (err || > > > > > > > > + (rev != 1 && rev != 3 && rev != 5)) { > > > > > > > > + error_setg(errp, "Unsupported FADT revision %s, " > > > > > > > > + "please specify 1,3,5", val); > > > > > > > > + return; > > > > > > > > + } > > > > > > > > + acpi_fadt_rev = rev; > > > > > > > > + return; > > > > > > > > + } > > > > > > > > + > > > > > > > > + error_setg(errp, "'-acpitable' requires one of > > > > > > > > 'data','file' or > > > 'fadt'"); > > > > > > > > } > > > > > > > > > > > > > > > > static bool acpi_table_builtin = false; > > > > > > > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > > > > > > > > index ce7cbc5..8be6578 100644 > > > > > > > > --- a/hw/i386/acpi-build.c > > > > > > > > +++ b/hw/i386/acpi-build.c > > > > > > > > @@ -276,8 +276,22 @@ build_facs(GArray *table_data, > > > BIOSLinker > > > > > > > *linker) > > > > > > > > facs->length = cpu_to_le32(sizeof(*facs)); > > > > > > > > } > > > > > > > > > > > > > > > > +/* GAS */ > > > > > > > > +static void > > > > > > > > +build_gas(struct AcpiGenericAddress *gas, uint8_t space_id, > > > > > > > > + uint8_t bit_width, uint8_t bit_offset, > > > > > > > > + uint8_t access_width, uint64_t address) > > > > > > > > +{ > > > > > > > > + gas->space_id = space_id; > > > > > > > > + gas->bit_width = bit_width; > > > > > > > > + gas->bit_offset = bit_offset; > > > > > > > > + gas->access_width = access_width; > > > > > > > > + gas->address = address; > > > > > > > > +} > > > > > > > > + > > > > > > > > /* Load chipset information in FADT */ > > > > > > > > -static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, > > > AcpiPmInfo > > > > > *pm) > > > > > > > > +static void fadt_setup(AcpiFadtDescriptorRev5_1 *fadt, > > > AcpiPmInfo > > > > > > > *pm, > > > > > > > > + uint8_t revision) > > > > > > > > { > > > > > > > > fadt->model = 1; > > > > > > > > fadt->reserved1 = 0; > > > > > > > > @@ -309,6 +323,25 @@ static void > > > > > fadt_setup(AcpiFadtDescriptorRev1 > > > > > > > *fadt, AcpiPmInfo *pm) > > > > > > > > fadt->flags |= cpu_to_le32(1 << > > > > > > > ACPI_FADT_F_FORCE_APIC_CLUSTER_MODEL); > > > > > > > > } > > > > > > > > fadt->century = RTC_CENTURY; > > > > > > > > + > > > > > > > > + /* Build ACPI 2.0 (FADT version 3+) GAS fields */ > > > > > > > > + if (revision >= 3) { > > > > > > > > + /* EVT, CNT, TMR register matches hw/acpi/core.c */ > > > > > > > > + build_gas(&fadt->xpm1a_event_block, > AML_SYSTEM_IO, > > > > > > > > + 32, 0, 0, cpu_to_le64(pm->io_base)); > > > > > > > > + build_gas(&fadt->xpm1a_control_block, > AML_SYSTEM_IO, > > > > > > > > + 16, 0, 0, cpu_to_le64(pm->io_base + 0x04)); > > > > > > > > + build_gas(&fadt->xpm_timer_block, AML_SYSTEM_IO, > > > > > > > > + 32, 0, 0, cpu_to_le64(pm->io_base + 0x08)); > > > > > > > > + build_gas(&fadt->xgpe0_block, AML_SYSTEM_IO, > > > > > > > > + pm->gpe0_blk_len << 3, 0, 0, cpu_to_le64(pm- > > > > > >gpe0_blk)); > > > > > > > > + } > > > > > > > > + > > > > > > > > + /* Build dummy ACPI 5.0 fields */ > > > > > > > > + if (revision >= 5) { > > > > > > > > + build_gas(&fadt->sleep_control, > AML_SYSTEM_MEMORY, > > > 0, 0, > > > > > 0, > > > > > > > 0); > > > > > > > > + build_gas(&fadt->sleep_status, > AML_SYSTEM_MEMORY, 0, > > > 0, > > > > > 0, 0); > > > > > > > > + } > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > @@ -316,11 +349,21 @@ static void > > > > > > > fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm) > > > > > > > > static void > > > > > > > > build_fadt(GArray *table_data, BIOSLinker *linker, > AcpiPmInfo > > > *pm, > > > > > > > > unsigned facs_tbl_offset, unsigned dsdt_tbl_offset, > > > > > > > > - const char *oem_id, const char *oem_table_id) > > > > > > > > + const char *oem_id, const char *oem_table_id, > uint8_t > > > > > revision) > > > > > > > > { > > > > > > > > - AcpiFadtDescriptorRev1 *fadt = > acpi_data_push(table_data, > > > > > > > sizeof(*fadt)); > > > > > > > > - unsigned fw_ctrl_offset = (char *)&fadt->firmware_ctrl - > > > > > table_data- > > > > > > > >data; > > > > > > > > - unsigned dsdt_entry_offset = (char *)&fadt->dsdt - > > > table_data- > > > > > >data; > > > > > > > > + AcpiFadtDescriptorRev5_1 *fadt; > > > > > > > > + unsigned fw_ctrl_offset; > > > > > > > > + unsigned dsdt_entry_offset; > > > > > > > > + unsigned fadt_len; > > > > > > > > + > > > > > > > > + if (revision == 1) { > > > > > > > > + fadt_len = sizeof(AcpiFadtDescriptorRev1); > > > > > > > > + } else { > > > > > > > > + fadt_len = sizeof(AcpiFadtDescriptorRev5_1); > > > > > > > > + } > > > > > > > > + fadt = acpi_data_push(table_data, fadt_len); > > > > > > > > + fw_ctrl_offset = (char *)&fadt->firmware_ctrl - > table_data- > > > >data; > > > > > > > > + dsdt_entry_offset = (char *)&fadt->dsdt - table_data- > >data; > > > > > > > > > > > > > > > > /* FACS address to be filled by Guest linker */ > > > > > > > > bios_linker_loader_add_pointer(linker, > > > > > > > > @@ -328,13 +371,28 @@ build_fadt(GArray *table_data, > > > > > BIOSLinker > > > > > > > *linker, AcpiPmInfo *pm, > > > > > > > > ACPI_BUILD_TABLE_FILE, facs_tbl_offset); > > > > > > > > > > > > > > > > /* DSDT address to be filled by Guest linker */ > > > > > > > > - fadt_setup(fadt, pm); > > > > > > > > bios_linker_loader_add_pointer(linker, > > > > > > > > ACPI_BUILD_TABLE_FILE, dsdt_entry_offset, sizeof(fadt- > > > >dsdt), > > > > > > > > ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset); > > > > > > > > > > > > > > > > - build_header(linker, table_data, > > > > > > > > - (void *)fadt, "FACP", sizeof(*fadt), 1, > > > > > > > > oem_id, > > > > > oem_table_id); > > > > > > > > + if (revision > 2) { > > > > > > > > + fw_ctrl_offset = (char *)&fadt->Xfacs - table_data- > >data; > > > > > > > > + dsdt_entry_offset = (char *)&fadt->Xdsdt - table_data- > > > >data; > > > > > > > > + > > > > > > > > + /* FACS address to be filled by Guest linker */ > > > > > > > > + bios_linker_loader_add_pointer(linker, > > > > > > > > + ACPI_BUILD_TABLE_FILE, fw_ctrl_offset, sizeof(fadt- > > > >Xfacs), > > > > > > > > + ACPI_BUILD_TABLE_FILE, facs_tbl_offset); > > > > > > > > + > > > > > > > > + /* DSDT address to be filled by Guest linker */ > > > > > > > > + bios_linker_loader_add_pointer(linker, > > > > > > > > + ACPI_BUILD_TABLE_FILE, dsdt_entry_offset, > sizeof(fadt- > > > > > >Xdsdt), > > > > > > > > + ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset); > > > > > > > > + } > > > > > > > > + > > > > > > > > + fadt_setup(fadt, pm, revision); > > > > > > > > + build_header(linker, table_data, (void *)fadt, "FACP", > fadt_len, > > > > > > > > + revision, oem_id, oem_table_id); > > > > > > > > } > > > > > > > > > > > > > > > > void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid, > > > > > > > > @@ -2681,7 +2739,7 @@ void acpi_build(AcpiBuildTables > > > *tables, > > > > > > > MachineState *machine) > > > > > > > > fadt = tables_blob->len; > > > > > > > > acpi_add_table(table_offsets, tables_blob); > > > > > > > > build_fadt(tables_blob, tables->linker, &pm, facs, dsdt, > > > > > > > > - slic_oem.id, slic_oem.table_id); > > > > > > > > + slic_oem.id, slic_oem.table_id, acpi_fadt_rev); > > > > > > > > aml_len += tables_blob->len - fadt; > > > > > > > > > > > > > > > > acpi_add_table(table_offsets, tables_blob); > > > > > > > > diff --git a/include/hw/acpi/acpi.h b/include/hw/acpi/acpi.h > > > > > > > > index 7b3d93c..63df38d 100644 > > > > > > > > --- a/include/hw/acpi/acpi.h > > > > > > > > +++ b/include/hw/acpi/acpi.h > > > > > > > > @@ -173,6 +173,7 @@ void acpi_update_sci(ACPIREGS > > > *acpi_regs, > > > > > > > qemu_irq irq); > > > > > > > > > > > > > > > > /* acpi.c */ > > > > > > > > extern int acpi_enabled; > > > > > > > > +extern uint8_t acpi_fadt_rev; > > > > > > > > extern char unsigned *acpi_tables; > > > > > > > > extern size_t acpi_tables_len; > > > > > > > > > > > > > > > > diff --git a/qemu-options.hx b/qemu-options.hx > > > > > > > > index 5fe7f87..d61dd92 100644 > > > > > > > > --- a/qemu-options.hx > > > > > > > > +++ b/qemu-options.hx > > > > > > > > @@ -1497,7 +1497,10 @@ DEF("acpitable", HAS_ARG, > > > > > > > QEMU_OPTION_acpitable, > > > > > > > > " [,sig=str][,rev=n]\n" > > > > > > > > " > > > > > > > > [,oem_id=str][,oem_table_id=str][,oem_rev=n]\n" > > > > > > > > " > > > > > > > > [,asl_compiler_id=str][,asl_compiler_rev=n]\n" > > > > > > > > - " ACPI table description\n", QEMU_ARCH_I386) > > > > > > > > + " ACPI table description\n" > > > > > > > > + "-acpitable fadt=n\n" > > > > > > > > + " Configure FADT revision\n", > > > > > > > > + QEMU_ARCH_I386) > > > > > > > > STEXI > > > > > > > > @item -acpitable > > > > > > > > > > > > > > > > data=@var{file1}[:@var{file2}]...[,sig=@var{str}][,rev=@var{n}][,oem_id=@ > > > > > > > var{str}][,oem_table_id=@var{str}][,oem_rev=@var{n}] > > > > > > > [,asl_compiler_id=@var{str}][,asl_compiler_rev=@var{n}] > > > > > > > > @findex -acpitable > > > > > > > > @@ -1511,6 +1514,9 @@ If a SLIC table is supplied to QEMU, > > > then > > > > > the > > > > > > > SLIC's oem_id and oem_table_id > > > > > > > > fields will override the same in the RSDT and the FADT (a.k.a. > > > FACP), > > > > > in > > > > > > > order > > > > > > > > to ensure the field matches required by the Microsoft SLIC > spec > > > and > > > > > the > > > > > > > ACPI > > > > > > > > spec. > > > > > > > > + > > > > > > > > +@item -acpitable fadt=@var{n} > > > > > > > > +Configure FADT revision to 1, 3, 5, default 1. > > > > > > > > ETEXI > > > > > > > > > > > > > > > > DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,