changes since v2: * rename acpi prefixes in API to aml * reverse conversion order from bottom->top to top->bottom * introduce internal Aml garbage collector and 2 API functions to initialize and cleanup it up * replace acpi_argX() helpers with a single aml_arg(X) helper do the same for acpi_localX() helpers. * add 3 internal allocators, for allocating dummy Aml struct for helpers aml_alloc(), aml_opcode(OPCODE) for simple Aml elements and aml_bundle(opcode, kind) for complex elements that require post-processing after element has been composed * amend spec references to ACPI 1.0b and later if AML element was introduced later * various codestyle fixes * rebase on top of PCI tree
changes since RFC: * conflicts with vmgenid (broken) patches, so it's not based on PCI tree * rebased on top of today's master + [PATCH v5 0/5] pc: acpi: various fixes and cleanups + some patches from PCI tree that above series depends on * small cleanups * droped [42/47] acpi: make tables linker-loader available to other targets since Michael has a cleaner similar patch(es) in PCI tree, so reuse them (not included in here) * move SMC device from DSDT to SSDT and create it only when applesmc device is present. This series refactors SSDT runtime composing and gets rid of: * patching AML templates, with related pointer arithmetic magic * manual AML composition, i.e. creating AML terms practically byte by byte * using AML templates for SSDT creation, reducing dependency on IASL. as result of above, QEMU source tree doesn't have to carry 'binary' template blobs that used to be part of SSDT. * hand-crafted PCI0._CRSes for pc/q35 machines in DSDT with manual hole punching of reserved resources and adds following: * introduces ASL like API for creating AML objects using ASL like constructs/terms. API: * provides a necessary minimum set of terms/helpers to replace currently used SSDT templates. * simplifies AML composition and keeps track of AML object contexts, transparently managing their (de)allocation and merging into parent context, making composition of SSDT 'almost' like writing native ASL definition of the table. * hides pointer arithmetic from user when composing SSDT. * dynamically creates unified PCI0._CRS in SSDT for pc/q35 machines allowing to reserve resources at runtime vs current compile time * while adding new API, make it target independed CONFIG_ACPI and also make some other utilities for composing ACPI tables target independed (i.e. utils on which API depends) so that they could be reused for ARM target later without moving stuff around uncessarily. * trims SSDT by not creating objects that are not present (S[34] Package if disabled, pvpanic, applesmc) As result of replacing AML templates with ASL API, codebase reduces on ~1900LOC even with net addition of API 1050LOC counted in. Tested with XPsp3, WS2012R2, RHEL6/7 guests. Git tree for playing with: https://github.com/imammedo/qemu/commits/ASL_API_v3 Igor Mammedov (52): acpi: introduce AML composer aml_append() pc: acpi: use local var for accessing ACPI tables blob in acpi_build() pc: acpi: make top level ACPI tables blob Aml* acpi: factor out ACPI const int packing out of build_append_value() acpi: add aml_def_block() term pc: acpi-build: use aml_def_block() for declaring SSDT table acpi: add aml_scope() term pc: acpi-build: use aml_scope() for \_SB scope acpi: add aml_device() term acpi: add aml_method() term acpi: add aml_if() term acpi: add aml_name() & aml_name_decl() term acpi: extend build_append_{value|int}() to support 64-bit values acpi: add aml_int() term acpi: add aml_return() term acpi: add aml_arg() term acpi: add aml_store() term acpi: add aml_and() term acpi: add aml_notify() term acpi: add aml_call1(), aml_call2(), aml_call3(), aml_call4() helpers pc: acpi-build: drop template patching and create PCI bus tree dynamically acpi: add aml_package() term pc: acpi-build: drop unsupported PM1b_CNT.SLP_TYP pc: acpi-build: generate _S[345] packages dynamically acpi: add aml_buffer() term acpi: add aml_resource_template() helper acpi: add aml_io() helper acpi: include PkgLength size only when requested acpi: add aml_operation_region() term acpi: add aml_field() & aml_named_field() terms acpi: add aml_local() term acpi: add aml_string() term pc: acpi-build: generate pvpanic device description dynamically acpi: add aml_varpackage() term acpi: add aml_equal() term acpi: add aml_processor() term acpi: add aml_eisaid() term pc: acpi-build: drop template patching and CPU hotplug objects dynamically pc: acpi-build: create CPU hotplug IO region dynamically acpi: add aml_reserved_field() term pc: acpi-build: drop template patching and memory hotplug objects dynamically pc: acpi-build: create memory hotplug IO region dynamically acpi: add aml_word_bus_number(), aml_word_io(), aml_dword_memory(), aml_qword_memory() terms pc: pcihp: expose MMIO base and len as properties pc: acpi-build: reserve PCIHP MMIO resources pc: acpi-build: create PCI0._CRS dynamically pc: acpi-build: drop remaining ssdt_misc template and use acpi_def_block() acpi: add acpi_irq_no_flags() term pc: export applesmc IO port/len pc: acpi-build: drop template patching and create Device(SMC) dynamically pc: acpi-build: update [q35-]acpi-dsdt.hex.generated due to moved SMC acpi: make build_*() routines static to aml-build.c hw/acpi/aml-build.c | 744 ++++++++++++++++++++++++++++++-- hw/acpi/pcihp.c | 18 +- hw/acpi/piix4.c | 2 +- hw/i386/Makefile.objs | 4 +- hw/i386/acpi-build.c | 825 +++++++++++++++++++----------------- hw/i386/acpi-dsdt-cpu-hotplug.dsl | 17 +- hw/i386/acpi-dsdt-isa.dsl | 11 - hw/i386/acpi-dsdt-mem-hotplug.dsl | 36 +- hw/i386/acpi-dsdt-pci-crs.dsl | 92 ---- hw/i386/acpi-dsdt.dsl | 46 -- hw/i386/acpi-dsdt.hex.generated | 714 ++----------------------------- hw/i386/q35-acpi-dsdt.dsl | 19 - hw/i386/q35-acpi-dsdt.hex.generated | 662 ++--------------------------- hw/i386/ssdt-mem.dsl | 77 ---- hw/i386/ssdt-mem.hex.generated | 213 ---------- hw/i386/ssdt-misc.dsl | 122 ------ hw/i386/ssdt-misc.hex.generated | 399 ----------------- hw/i386/ssdt-pcihp.dsl | 100 ----- hw/i386/ssdt-pcihp.hex.generated | 251 ----------- hw/i386/ssdt-proc.dsl | 63 --- hw/i386/ssdt-proc.hex.generated | 134 ------ hw/misc/applesmc.c | 5 +- include/hw/acpi/aml-build.h | 210 ++++++++- include/hw/acpi/pc-hotplug.h | 1 + include/hw/acpi/pcihp.h | 7 +- include/hw/isa/isa.h | 11 +- 26 files changed, 1436 insertions(+), 3347 deletions(-) delete mode 100644 hw/i386/acpi-dsdt-pci-crs.dsl delete mode 100644 hw/i386/ssdt-mem.dsl delete mode 100644 hw/i386/ssdt-mem.hex.generated delete mode 100644 hw/i386/ssdt-misc.dsl delete mode 100644 hw/i386/ssdt-misc.hex.generated delete mode 100644 hw/i386/ssdt-pcihp.dsl delete mode 100644 hw/i386/ssdt-pcihp.hex.generated delete mode 100644 hw/i386/ssdt-proc.dsl delete mode 100644 hw/i386/ssdt-proc.hex.generated -- 1.8.3.1