All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest
@ 2013-10-07  9:34 Michael S. Tsirkin
  2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 01/27] cleanup object.h: include error.h directly Michael S. Tsirkin
                   ` (29 more replies)
  0 siblings, 30 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:34 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

This code can also be found here:
git://git.kernel.org/pub/scm/virt/kvm/mst/qemu.git acpi

While this patch still uses info not available in QOM, I think it's reasonable
to merge it and then refactor as QOM properties cover more ground.

In particular, merging this patchset blocks other projects so
I think its preferable to merge now and not wait
for all required QOM properties to materialize.

I added QOM properties in ich/piix where I knew how to
do this.

If you already reviewed v8 then the only patch that
changed significantly is
  i386: define pc guest info
it now supplies numa info about all CPUs and not just
the ones present at init.
I also made a couple of trivial tweaks to
  i386: ACPI table generation code from seabios

If you already reviewed v5 then the only patches that
changed are:
  i386: define pc guest info
  i386: ACPI table generation code from seabios

Gerd, Laszlo, I kept your Reviewed-by and Tested-by tags
on these patches to ensure your contribution is recongnized,
if you don't like this pls let me know.
Or better yet re-ack this version :)

Patches 1-3 are QOM patches really.
Included here for completeness.

Igor suggested dropping patches 1-2 and including error.h directly.
I included his patch and dropped mine.
I hope that's ok.

If everything's in order, I intend to merge this through my tree.

Please review, and comment.

Changes from v8:
- remove an unused function
- fix typo in error message, reported by Igor
- don't assert when adding a 4 byte value
  (we don't use this now but it's useful for follow-up
  bridge hotplug patches)
- fix numa node reporting for hotplugged cpus, reported by Igor

Changes from v7 reposted:
- whitespace fixes - issues reported by Igor
- typo fix in commit log reported by Eric

Changes from v7:
- removed all complex table patching and migration code
  we now only migrate a single byte "patched/non patched"
  all tables are simply regenerated on access, rewriting
  old data
  in particular this fixed a bug that Igor noticed:
  cpu online status is now updated correctly
- removed bitmask of found cpus - use QOM to calculate it
- dropped changes to typedefs.h - use Igor's patch instead

Changes from v6:
- fix 64 bit window bug reported by Igor
- tweak comments in error.h

Changes from v5:
- update generated files to fix build on systems without iasl
- fix mcfg failure reported by Gerd
Changes from v4:
- address comments by Paolo:
    rename loader interface
    reuse macro for hpet name
    better struct names
    move internal headers to hw/i386/
- fix typos resulting in bugs reported by Gerd

Changes from v3:
- reworked code to use QOM properties
  some info isn't yet available in QOM,
  use old-style APIs and lookups by type
- address comments by Gerd: tables are now updated
  on guest access after pci configuration

Changes from v2 repost:
- address comment by Anthony - convert to use APIs implemented
  using QOM
- address comment by Anthony - avoid tricky pointer path,
  use GArray from glib instead
- Address lots of comments by Hu Tao and Laszlo Ersek

Changes from v2:
- added missing patches to make it actually build
Changes from v1 RFC:
- added code to address cross version compatibility
- rebased to latest bits
- updated seabios code to latest bits (added pvpanic device)

This patchset moves all generation of ACPI tables
from guest BIOS to the hypervisor.

Although ACPI tables come from a system BIOS on real hw,
it makes sense that the ACPI tables are coupled with the
virtual machine, since they have to abstract the x86 machine to
the OS's.

This is widely desired as a way to avoid the churn
and proliferation of QEMU-specific interfaces
associated with ACPI tables in bios code.

There's a bit of code duplication where we
already declare similar acpi structures in qemu.

I think it's best to do it in this order: port
code directly, and apply cleanups and reduce duplication
that results, on top.
This way it's much easier to see that we don't introduce
regressions.

In particular, I booted a guest on qemu with and without the
change, and verified that ACPI tables are
unchanged except for trivial pointer address changes,
and the SSDT P_BLK change in the last patch.

Such binary compatibility makes it easier to be
confident that this change won't break things.

Igor Mammedov (1):
  cleanup object.h: include error.h directly

Michael S. Tsirkin (26):
  qom: cleanup struct Error references
  qom: add pointer to int property helpers
  pci: fix up w64 size calculation helper
  fw_cfg: interface to trigger callback on read
  loader: support for unmapped ROM blobs
  pcie_host: expose UNMAPPED macro
  pcie_host: expose address format
  q35: use macro for MCFG property name
  q35: expose mmcfg size as a property
  i386: add ACPI table files from seabios
  acpi: add rules to compile ASL source
  acpi: pre-compiled ASL files
  acpi: ssdt pcihp: updat generated file
  loader: use file path size from fw_cfg.h
  i386: add bios linker/loader
  loader: allow adding ROMs in done callbacks
  i386: define pc guest info
  acpi/piix: add macros for acpi property names
  piix: APIs for pc guest info
  ich9: APIs for pc guest info
  pvpanic: add API to access io port
  hpet: add API to find it
  i386: ACPI table generation code from seabios
  ssdt: fix PBLK length
  ssdt-proc: update generated file
  don't post me: update bios

 configure                           |    9 +-
 hw/i386/acpi-build.h                |    9 +
 hw/i386/acpi-defs.h                 |  331 ++
 hw/i386/bios-linker-loader.h        |   27 +
 hw/lm32/lm32_hwsetup.h              |    2 +-
 include/hw/acpi/ich9.h              |    2 +
 include/hw/acpi/piix4.h             |    8 +
 include/hw/i386/ich9.h              |    2 +
 include/hw/i386/pc.h                |   22 +
 include/hw/loader.h                 |    8 +-
 include/hw/nvram/fw_cfg.h           |    8 +-
 include/hw/pci-host/q35.h           |    2 +
 include/hw/pci/pcie_host.h          |   27 +
 include/hw/timer/hpet.h             |    2 +
 include/qom/object.h                |   73 +-
 hw/acpi/ich9.c                      |   24 +
 hw/acpi/piix4.c                     |   50 +-
 hw/core/loader.c                    |   31 +-
 hw/i386/acpi-build.c                | 1205 ++++++
 hw/i386/bios-linker-loader.c        |  158 +
 hw/i386/pc.c                        |   23 +
 hw/i386/pc_piix.c                   |    5 +
 hw/i386/pc_q35.c                    |    3 +
 hw/isa/lpc_ich9.c                   |   40 +
 hw/misc/pvpanic.c                   |   13 +-
 hw/nvram/fw_cfg.c                   |   33 +-
 hw/pci-host/piix.c                  |    8 +
 hw/pci-host/q35.c                   |   26 +-
 hw/pci/pci.c                        |   20 +-
 hw/pci/pcie_host.c                  |   24 -
 hw/timer/hpet.c                     |    5 +
 qom/object.c                        |   60 +
 vl.c                                |    3 +
 hw/i386/Makefile.objs               |   27 +
 hw/i386/acpi-dsdt-cpu-hotplug.dsl   |   93 +
 hw/i386/acpi-dsdt-dbug.dsl          |   41 +
 hw/i386/acpi-dsdt-hpet.dsl          |   51 +
 hw/i386/acpi-dsdt-isa.dsl           |  117 +
 hw/i386/acpi-dsdt-pci-crs.dsl       |  105 +
 hw/i386/acpi-dsdt.dsl               |  343 ++
 hw/i386/acpi-dsdt.hex.generated     | 4409 +++++++++++++++++++++
 hw/i386/q35-acpi-dsdt.dsl           |  452 +++
 hw/i386/q35-acpi-dsdt.hex.generated | 7346 +++++++++++++++++++++++++++++++++++
 hw/i386/ssdt-misc.dsl               |  119 +
 hw/i386/ssdt-misc.hex.generated     |  386 ++
 hw/i386/ssdt-pcihp.dsl              |   51 +
 hw/i386/ssdt-pcihp.hex.generated    |  108 +
 hw/i386/ssdt-proc.dsl               |   63 +
 hw/i386/ssdt-proc.hex.generated     |  134 +
 pc-bios/acpi-dsdt.aml               |  Bin 4407 -> 4407 bytes
 pc-bios/bios.bin                    |  Bin 131072 -> 262144 bytes
 pc-bios/q35-acpi-dsdt.aml           |  Bin 7344 -> 7344 bytes
 scripts/acpi_extract.py             |  362 ++
 scripts/acpi_extract_preprocess.py  |   51 +
 scripts/update-acpi.sh              |    4 +
 55 files changed, 16442 insertions(+), 83 deletions(-)
 create mode 100644 hw/i386/acpi-build.h
 create mode 100644 hw/i386/acpi-defs.h
 create mode 100644 hw/i386/bios-linker-loader.h
 create mode 100644 include/hw/acpi/piix4.h
 create mode 100644 hw/i386/acpi-build.c
 create mode 100644 hw/i386/bios-linker-loader.c
 create mode 100644 hw/i386/acpi-dsdt-cpu-hotplug.dsl
 create mode 100644 hw/i386/acpi-dsdt-dbug.dsl
 create mode 100644 hw/i386/acpi-dsdt-hpet.dsl
 create mode 100644 hw/i386/acpi-dsdt-isa.dsl
 create mode 100644 hw/i386/acpi-dsdt-pci-crs.dsl
 create mode 100644 hw/i386/acpi-dsdt.dsl
 create mode 100644 hw/i386/acpi-dsdt.hex.generated
 create mode 100644 hw/i386/q35-acpi-dsdt.dsl
 create mode 100644 hw/i386/q35-acpi-dsdt.hex.generated
 create mode 100644 hw/i386/ssdt-misc.dsl
 create mode 100644 hw/i386/ssdt-misc.hex.generated
 create mode 100644 hw/i386/ssdt-pcihp.dsl
 create mode 100644 hw/i386/ssdt-pcihp.hex.generated
 create mode 100644 hw/i386/ssdt-proc.dsl
 create mode 100644 hw/i386/ssdt-proc.hex.generated
 create mode 100755 scripts/acpi_extract.py
 create mode 100755 scripts/acpi_extract_preprocess.py
 create mode 100644 scripts/update-acpi.sh

-- 
MST

^ permalink raw reply	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 01/27] cleanup object.h: include error.h directly
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
@ 2013-10-07  9:34 ` Michael S. Tsirkin
  2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 02/27] qom: cleanup struct Error references Michael S. Tsirkin
                   ` (28 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:34 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

From: Igor Mammedov <imammedo@redhat.com>

qapi/error.h is simple enough to be included in qom/object.h
direcly and prepares qom/object.h to use Error typedef.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/qom/object.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 1a7b71a..d9a0063 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -18,9 +18,9 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include "qemu/queue.h"
+#include "qapi/error.h"
 
 struct Visitor;
-struct Error;
 
 struct TypeImpl;
 typedef struct TypeImpl *Type;
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 02/27] qom: cleanup struct Error references
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
  2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 01/27] cleanup object.h: include error.h directly Michael S. Tsirkin
@ 2013-10-07  9:34 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 03/27] qom: add pointer to int property helpers Michael S. Tsirkin
                   ` (27 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:34 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

now that a typedef for struct Error is available,
use it in qom/object.h to match coding style rules.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/qom/object.h | 50 +++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index d9a0063..6c1e7d3 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -301,7 +301,7 @@ typedef void (ObjectPropertyAccessor)(Object *obj,
                                       struct Visitor *v,
                                       void *opaque,
                                       const char *name,
-                                      struct Error **errp);
+                                      Error **errp);
 
 /**
  * ObjectPropertyRelease:
@@ -790,9 +790,9 @@ void object_property_add(Object *obj, const char *name, const char *type,
                          ObjectPropertyAccessor *get,
                          ObjectPropertyAccessor *set,
                          ObjectPropertyRelease *release,
-                         void *opaque, struct Error **errp);
+                         void *opaque, Error **errp);
 
-void object_property_del(Object *obj, const char *name, struct Error **errp);
+void object_property_del(Object *obj, const char *name, Error **errp);
 
 /**
  * object_property_find:
@@ -803,7 +803,7 @@ void object_property_del(Object *obj, const char *name, struct Error **errp);
  * Look up a property for an object and return its #ObjectProperty if found.
  */
 ObjectProperty *object_property_find(Object *obj, const char *name,
-                                     struct Error **errp);
+                                     Error **errp);
 
 void object_unparent(Object *obj);
 
@@ -818,7 +818,7 @@ void object_unparent(Object *obj);
  * Reads a property from a object.
  */
 void object_property_get(Object *obj, struct Visitor *v, const char *name,
-                         struct Error **errp);
+                         Error **errp);
 
 /**
  * object_property_set_str:
@@ -829,7 +829,7 @@ void object_property_get(Object *obj, struct Visitor *v, const char *name,
  * Writes a string value to a property.
  */
 void object_property_set_str(Object *obj, const char *value,
-                             const char *name, struct Error **errp);
+                             const char *name, Error **errp);
 
 /**
  * object_property_get_str:
@@ -842,7 +842,7 @@ void object_property_set_str(Object *obj, const char *value,
  * The caller should free the string.
  */
 char *object_property_get_str(Object *obj, const char *name,
-                              struct Error **errp);
+                              Error **errp);
 
 /**
  * object_property_set_link:
@@ -853,7 +853,7 @@ char *object_property_get_str(Object *obj, const char *name,
  * Writes an object's canonical path to a property.
  */
 void object_property_set_link(Object *obj, Object *value,
-                              const char *name, struct Error **errp);
+                              const char *name, Error **errp);
 
 /**
  * object_property_get_link:
@@ -866,7 +866,7 @@ void object_property_set_link(Object *obj, Object *value,
  * string or not a valid object path).
  */
 Object *object_property_get_link(Object *obj, const char *name,
-                                 struct Error **errp);
+                                 Error **errp);
 
 /**
  * object_property_set_bool:
@@ -877,7 +877,7 @@ Object *object_property_get_link(Object *obj, const char *name,
  * Writes a bool value to a property.
  */
 void object_property_set_bool(Object *obj, bool value,
-                              const char *name, struct Error **errp);
+                              const char *name, Error **errp);
 
 /**
  * object_property_get_bool:
@@ -889,7 +889,7 @@ void object_property_set_bool(Object *obj, bool value,
  * an error occurs (including when the property value is not a bool).
  */
 bool object_property_get_bool(Object *obj, const char *name,
-                              struct Error **errp);
+                              Error **errp);
 
 /**
  * object_property_set_int:
@@ -900,7 +900,7 @@ bool object_property_get_bool(Object *obj, const char *name,
  * Writes an integer value to a property.
  */
 void object_property_set_int(Object *obj, int64_t value,
-                             const char *name, struct Error **errp);
+                             const char *name, Error **errp);
 
 /**
  * object_property_get_int:
@@ -912,7 +912,7 @@ void object_property_set_int(Object *obj, int64_t value,
  * an error occurs (including when the property value is not an integer).
  */
 int64_t object_property_get_int(Object *obj, const char *name,
-                                struct Error **errp);
+                                Error **errp);
 
 /**
  * object_property_set:
@@ -926,7 +926,7 @@ int64_t object_property_get_int(Object *obj, const char *name,
  * Writes a property to a object.
  */
 void object_property_set(Object *obj, struct Visitor *v, const char *name,
-                         struct Error **errp);
+                         Error **errp);
 
 /**
  * object_property_parse:
@@ -938,7 +938,7 @@ void object_property_set(Object *obj, struct Visitor *v, const char *name,
  * Parses a string and writes the result into a property of an object.
  */
 void object_property_parse(Object *obj, const char *string,
-                           const char *name, struct Error **errp);
+                           const char *name, Error **errp);
 
 /**
  * object_property_print:
@@ -950,7 +950,7 @@ void object_property_parse(Object *obj, const char *string,
  * caller shall free the string.
  */
 char *object_property_print(Object *obj, const char *name,
-                            struct Error **errp);
+                            Error **errp);
 
 /**
  * object_property_get_type:
@@ -961,7 +961,7 @@ char *object_property_print(Object *obj, const char *name,
  * Returns:  The type name of the property.
  */
 const char *object_property_get_type(Object *obj, const char *name,
-                                     struct Error **errp);
+                                     Error **errp);
 
 /**
  * object_get_root:
@@ -1054,7 +1054,7 @@ Object *object_resolve_path_component(Object *parent, const gchar *part);
  * The child object itself can be retrieved using object_property_get_link().
  */
 void object_property_add_child(Object *obj, const char *name,
-                               Object *child, struct Error **errp);
+                               Object *child, Error **errp);
 
 /**
  * object_property_add_link:
@@ -1077,7 +1077,7 @@ void object_property_add_child(Object *obj, const char *name,
  */
 void object_property_add_link(Object *obj, const char *name,
                               const char *type, Object **child,
-                              struct Error **errp);
+                              Error **errp);
 
 /**
  * object_property_add_str:
@@ -1092,9 +1092,9 @@ void object_property_add_link(Object *obj, const char *name,
  * property of type 'string'.
  */
 void object_property_add_str(Object *obj, const char *name,
-                             char *(*get)(Object *, struct Error **),
-                             void (*set)(Object *, const char *, struct Error **),
-                             struct Error **errp);
+                             char *(*get)(Object *, Error **),
+                             void (*set)(Object *, const char *, Error **),
+                             Error **errp);
 
 /**
  * object_property_add_bool:
@@ -1108,9 +1108,9 @@ void object_property_add_str(Object *obj, const char *name,
  * property of type 'bool'.
  */
 void object_property_add_bool(Object *obj, const char *name,
-                              bool (*get)(Object *, struct Error **),
-                              void (*set)(Object *, bool, struct Error **),
-                              struct Error **errp);
+                              bool (*get)(Object *, Error **),
+                              void (*set)(Object *, bool, Error **),
+                              Error **errp);
 
 /**
  * object_child_foreach:
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 03/27] qom: add pointer to int property helpers
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
  2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 01/27] cleanup object.h: include error.h directly Michael S. Tsirkin
  2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 02/27] qom: cleanup struct Error references Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 04/27] pci: fix up w64 size calculation helper Michael S. Tsirkin
                   ` (26 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Make it easy to add read-only helpers for simple
integer properties in memory.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/qom/object.h | 21 ++++++++++++++++++
 qom/object.c         | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index 6c1e7d3..d02172a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -795,6 +795,27 @@ void object_property_add(Object *obj, const char *name, const char *type,
 void object_property_del(Object *obj, const char *name, Error **errp);
 
 /**
+ * object_property_add_uint8_ptr:
+ * object_property_add_uint16_ptr:
+ * object_property_add_uint32_ptr:
+ * object_property_add_uint64_ptr:
+ * @obj: the object to add a property to
+ * @name: the name of the property
+ * @v: pointer to value
+ *
+ * Add an integer property in memory.  This function will add a
+ * property of the appropriate type.
+ */
+void object_property_add_uint8_ptr(Object *obj, const char *name,
+                                   const uint8_t *v, Error **errp);
+void object_property_add_uint16_ptr(Object *obj, const char *name,
+                                    const uint16_t *v, Error **errp);
+void object_property_add_uint32_ptr(Object *obj, const char *name,
+                                    const uint32_t *v, Error **errp);
+void object_property_add_uint64_ptr(Object *obj, const char *name,
+                                    const uint64_t *v, Error **Errp);
+
+/**
  * object_property_find:
  * @obj: the object
  * @name: the name of the property
diff --git a/qom/object.c b/qom/object.c
index e90e382..b617f26 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1344,6 +1344,66 @@ static char *qdev_get_type(Object *obj, Error **errp)
     return g_strdup(object_get_typename(obj));
 }
 
+static void property_get_uint8_ptr(Object *obj, Visitor *v,
+                                   void *opaque, const char *name,
+                                   Error **errp)
+{
+    uint8_t value = *(uint8_t *)opaque;
+    visit_type_uint8(v, &value, name, errp);
+}
+
+static void property_get_uint16_ptr(Object *obj, Visitor *v,
+                                   void *opaque, const char *name,
+                                   Error **errp)
+{
+    uint16_t value = *(uint16_t *)opaque;
+    visit_type_uint16(v, &value, name, errp);
+}
+
+static void property_get_uint32_ptr(Object *obj, Visitor *v,
+                                   void *opaque, const char *name,
+                                   Error **errp)
+{
+    uint32_t value = *(uint32_t *)opaque;
+    visit_type_uint32(v, &value, name, errp);
+}
+
+static void property_get_uint64_ptr(Object *obj, Visitor *v,
+                                   void *opaque, const char *name,
+                                   Error **errp)
+{
+    uint64_t value = *(uint64_t *)opaque;
+    visit_type_uint64(v, &value, name, errp);
+}
+
+void object_property_add_uint8_ptr(Object *obj, const char *name,
+                                   const uint8_t *v, Error **errp)
+{
+    object_property_add(obj, name, "uint8", property_get_uint8_ptr,
+                        NULL, NULL, (void *)v, errp);
+}
+
+void object_property_add_uint16_ptr(Object *obj, const char *name,
+                                    const uint16_t *v, Error **errp)
+{
+    object_property_add(obj, name, "uint16", property_get_uint16_ptr,
+                        NULL, NULL, (void *)v, errp);
+}
+
+void object_property_add_uint32_ptr(Object *obj, const char *name,
+                                    const uint32_t *v, Error **errp)
+{
+    object_property_add(obj, name, "uint32", property_get_uint32_ptr,
+                        NULL, NULL, (void *)v, errp);
+}
+
+void object_property_add_uint64_ptr(Object *obj, const char *name,
+                                    const uint64_t *v, Error **errp)
+{
+    object_property_add(obj, name, "uint64", property_get_uint64_ptr,
+                        NULL, NULL, (void *)v, errp);
+}
+
 static void object_instance_init(Object *obj)
 {
     object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 04/27] pci: fix up w64 size calculation helper
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (2 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 03/27] qom: add pointer to int property helpers Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 05/27] fw_cfg: interface to trigger callback on read Michael S. Tsirkin
                   ` (25 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

BAR base was calculated incorrectly.
Use existing pci_bar_address to get it right.

Tested-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/pci/pci.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 00554a0..c3fdff4 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2264,7 +2264,7 @@ static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
     Range *range = opaque;
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
-    int r;
+    int i;
 
     if (!(cmd & PCI_COMMAND_MEMORY)) {
         return;
@@ -2283,17 +2283,21 @@ static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
             range_extend(range, &pref_range);
         }
     }
-    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
-        PCIIORegion *region = &dev->io_regions[r];
+    for (i = 0; i < PCI_NUM_REGIONS; ++i) {
+        PCIIORegion *r = &dev->io_regions[i];
         Range region_range;
 
-        if (!region->size ||
-            (region->type & PCI_BASE_ADDRESS_SPACE_IO) ||
-            !(region->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
+        if (!r->size ||
+            (r->type & PCI_BASE_ADDRESS_SPACE_IO) ||
+            !(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
+            continue;
+        }
+        region_range.begin = pci_bar_address(dev, i, r->type, r->size);
+        region_range.end = region_range.begin + r->size;
+
+        if (region_range.begin == PCI_BAR_UNMAPPED) {
             continue;
         }
-        region_range.begin = pci_get_quad(dev->config + pci_bar(dev, r));
-        region_range.end = region_range.begin + region->size;
 
         region_range.begin = MAX(region_range.begin, 0x1ULL << 32);
 
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 05/27] fw_cfg: interface to trigger callback on read
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (3 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 04/27] pci: fix up w64 size calculation helper Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 06/27] loader: support for unmapped ROM blobs Michael S. Tsirkin
                   ` (24 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/nvram/fw_cfg.h |  4 ++++
 hw/nvram/fw_cfg.c         | 33 ++++++++++++++++++++++++++++-----
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/include/hw/nvram/fw_cfg.h b/include/hw/nvram/fw_cfg.h
index f60dd67..2ab0fc2 100644
--- a/include/hw/nvram/fw_cfg.h
+++ b/include/hw/nvram/fw_cfg.h
@@ -60,6 +60,7 @@ typedef struct FWCfgFiles {
 } FWCfgFiles;
 
 typedef void (*FWCfgCallback)(void *opaque, uint8_t *data);
+typedef void (*FWCfgReadCallback)(void *opaque, uint32_t offset);
 
 void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len);
 void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value);
@@ -70,6 +71,9 @@ void fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
                          void *callback_opaque, void *data, size_t len);
 void fw_cfg_add_file(FWCfgState *s, const char *filename, void *data,
                      size_t len);
+void fw_cfg_add_file_callback(FWCfgState *s, const char *filename,
+                              FWCfgReadCallback callback, void *callback_opaque,
+                              void *data, size_t len);
 FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
                         hwaddr crl_addr, hwaddr data_addr);
 
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index d0820e5..f5dc3ea 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -42,6 +42,7 @@ typedef struct FWCfgEntry {
     uint8_t *data;
     void *callback_opaque;
     FWCfgCallback callback;
+    FWCfgReadCallback read_callback;
 } FWCfgEntry;
 
 struct FWCfgState {
@@ -249,8 +250,12 @@ static uint8_t fw_cfg_read(FWCfgState *s)
 
     if (s->cur_entry == FW_CFG_INVALID || !e->data || s->cur_offset >= e->len)
         ret = 0;
-    else
+    else {
+        if (e->read_callback) {
+            e->read_callback(e->callback_opaque, s->cur_offset);
+        }
         ret = e->data[s->cur_offset++];
+    }
 
     trace_fw_cfg_read(s, ret);
     return ret;
@@ -381,7 +386,10 @@ static const VMStateDescription vmstate_fw_cfg = {
     }
 };
 
-void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
+static void fw_cfg_add_bytes_read_callback(FWCfgState *s, uint16_t key,
+                                           FWCfgReadCallback callback,
+                                           void *callback_opaque,
+                                           void *data, size_t len)
 {
     int arch = !!(key & FW_CFG_ARCH_LOCAL);
 
@@ -391,6 +399,13 @@ void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
 
     s->entries[arch][key].data = data;
     s->entries[arch][key].len = (uint32_t)len;
+    s->entries[arch][key].read_callback = callback;
+    s->entries[arch][key].callback_opaque = callback_opaque;
+}
+
+void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
+{
+    fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len);
 }
 
 void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value)
@@ -444,8 +459,9 @@ void fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
     s->entries[arch][key].callback = callback;
 }
 
-void fw_cfg_add_file(FWCfgState *s,  const char *filename,
-                     void *data, size_t len)
+void fw_cfg_add_file_callback(FWCfgState *s,  const char *filename,
+                              FWCfgReadCallback callback, void *callback_opaque,
+                              void *data, size_t len)
 {
     int i, index;
     size_t dsize;
@@ -459,7 +475,8 @@ void fw_cfg_add_file(FWCfgState *s,  const char *filename,
     index = be32_to_cpu(s->files->count);
     assert(index < FW_CFG_FILE_SLOTS);
 
-    fw_cfg_add_bytes(s, FW_CFG_FILE_FIRST + index, data, len);
+    fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index,
+                                   callback, callback_opaque, data, len);
 
     pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name),
             filename);
@@ -477,6 +494,12 @@ void fw_cfg_add_file(FWCfgState *s,  const char *filename,
     s->files->count = cpu_to_be32(index+1);
 }
 
+void fw_cfg_add_file(FWCfgState *s,  const char *filename,
+                     void *data, size_t len)
+{
+    fw_cfg_add_file_callback(s, filename, NULL, NULL, data, len);
+}
+
 static void fw_cfg_machine_ready(struct Notifier *n, void *data)
 {
     size_t len;
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 06/27] loader: support for unmapped ROM blobs
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (4 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 05/27] fw_cfg: interface to trigger callback on read Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 07/27] pcie_host: expose UNMAPPED macro Michael S. Tsirkin
                   ` (23 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori
  Cc: Michael Walle, kraxel, imammedo, pbonzini, Laszlo Ersek, afaerber

Support ROM blobs not mapped into guest memory:
same as ROM files really but use caller's buffer.

Support invoking callback on access and
return memory pointer making it easier
for caller to update memory if necessary.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/lm32/lm32_hwsetup.h |  2 +-
 include/hw/loader.h    |  7 ++++---
 hw/core/loader.c       | 23 ++++++++++++++++++++---
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/hw/lm32/lm32_hwsetup.h b/hw/lm32/lm32_hwsetup.h
index 3449bd8..9fd5e69 100644
--- a/hw/lm32/lm32_hwsetup.h
+++ b/hw/lm32/lm32_hwsetup.h
@@ -73,7 +73,7 @@ static inline void hwsetup_free(HWSetup *hw)
 static inline void hwsetup_create_rom(HWSetup *hw,
         hwaddr base)
 {
-    rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE, base);
+    rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE, base, NULL, NULL, NULL);
 }
 
 static inline void hwsetup_add_u8(HWSetup *hw, uint8_t u)
diff --git a/include/hw/loader.h b/include/hw/loader.h
index 6145736..e0c576b 100644
--- a/include/hw/loader.h
+++ b/include/hw/loader.h
@@ -40,8 +40,9 @@ extern bool rom_file_in_ram;
 
 int rom_add_file(const char *file, const char *fw_dir,
                  hwaddr addr, int32_t bootindex);
-int rom_add_blob(const char *name, const void *blob, size_t len,
-                 hwaddr addr);
+void *rom_add_blob(const char *name, const void *blob, size_t len,
+                   hwaddr addr, const char *fw_file_name,
+                   FWCfgReadCallback fw_callback, void *callback_opaque);
 int rom_add_elf_program(const char *name, void *data, size_t datasize,
                         size_t romsize, hwaddr addr);
 int rom_load_all(void);
@@ -53,7 +54,7 @@ void do_info_roms(Monitor *mon, const QDict *qdict);
 #define rom_add_file_fixed(_f, _a, _i)          \
     rom_add_file(_f, NULL, _a, _i)
 #define rom_add_blob_fixed(_f, _b, _l, _a)      \
-    rom_add_blob(_f, _b, _l, _a)
+    (rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL) ? 0 : -1)
 
 #define PC_ROM_MIN_VGA     0xc0000
 #define PC_ROM_MIN_OPTION  0xc8000
diff --git a/hw/core/loader.c b/hw/core/loader.c
index 7b3d3ee..449bd4c 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -700,10 +700,12 @@ err:
     return -1;
 }
 
-int rom_add_blob(const char *name, const void *blob, size_t len,
-                 hwaddr addr)
+void *rom_add_blob(const char *name, const void *blob, size_t len,
+                   hwaddr addr, const char *fw_file_name,
+                   FWCfgReadCallback fw_callback, void *callback_opaque)
 {
     Rom *rom;
+    void *data = NULL;
 
     rom           = g_malloc0(sizeof(*rom));
     rom->name     = g_strdup(name);
@@ -713,7 +715,22 @@ int rom_add_blob(const char *name, const void *blob, size_t len,
     rom->data     = g_malloc0(rom->datasize);
     memcpy(rom->data, blob, len);
     rom_insert(rom);
-    return 0;
+    if (fw_file_name && fw_cfg) {
+        char devpath[100];
+
+        snprintf(devpath, sizeof(devpath), "/rom@%s", fw_file_name);
+
+        if (rom_file_in_ram) {
+            data = rom_set_mr(rom, OBJECT(fw_cfg), devpath);
+        } else {
+            data = rom->data;
+        }
+
+        fw_cfg_add_file_callback(fw_cfg, fw_file_name,
+                                 fw_callback, callback_opaque,
+                                 data, rom->romsize);
+    }
+    return data;
 }
 
 /* This function is specific for elf program because we don't need to allocate
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 07/27] pcie_host: expose UNMAPPED macro
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (5 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 06/27] loader: support for unmapped ROM blobs Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 08/27] pcie_host: expose address format Michael S. Tsirkin
                   ` (22 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Make it possible to test unmapped status through QMP.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/pci/pcie_host.h | 3 +++
 hw/pci/pcie_host.c         | 3 ---
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/hw/pci/pcie_host.h b/include/hw/pci/pcie_host.h
index 1228e36..bac3c67 100644
--- a/include/hw/pci/pcie_host.h
+++ b/include/hw/pci/pcie_host.h
@@ -28,6 +28,9 @@
 #define PCIE_HOST_BRIDGE(obj) \
     OBJECT_CHECK(PCIExpressHost, (obj), TYPE_PCIE_HOST_BRIDGE)
 
+/* pcie_host::base_addr == PCIE_BASE_ADDR_UNMAPPED when it isn't mapped. */
+#define PCIE_BASE_ADDR_UNMAPPED  ((hwaddr)-1ULL)
+
 struct PCIExpressHost {
     PCIHostState pci;
 
diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c
index b70e5ad..410ac08 100644
--- a/hw/pci/pcie_host.c
+++ b/hw/pci/pcie_host.c
@@ -104,9 +104,6 @@ static const MemoryRegionOps pcie_mmcfg_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-/* pcie_host::base_addr == PCIE_BASE_ADDR_UNMAPPED when it isn't mapped. */
-#define PCIE_BASE_ADDR_UNMAPPED  ((hwaddr)-1ULL)
-
 int pcie_host_init(PCIExpressHost *e)
 {
     e->base_addr = PCIE_BASE_ADDR_UNMAPPED;
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 08/27] pcie_host: expose address format
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (6 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 07/27] pcie_host: expose UNMAPPED macro Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 09/27] q35: use macro for MCFG property name Michael S. Tsirkin
                   ` (21 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Callers pass in the address so it's helpful for
them to be able to decode it.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/pci/pcie_host.h | 21 +++++++++++++++++++++
 hw/pci/pcie_host.c         | 21 ---------------------
 2 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/include/hw/pci/pcie_host.h b/include/hw/pci/pcie_host.h
index bac3c67..da0f275 100644
--- a/include/hw/pci/pcie_host.h
+++ b/include/hw/pci/pcie_host.h
@@ -54,4 +54,25 @@ void pcie_host_mmcfg_update(PCIExpressHost *e,
                             hwaddr addr,
                             uint32_t size);
 
+/*
+ * PCI express ECAM (Enhanced Configuration Address Mapping) format.
+ * AKA mmcfg address
+ * bit 20 - 28: bus number
+ * bit 15 - 19: device number
+ * bit 12 - 14: function number
+ * bit  0 - 11: offset in configuration space of a given device
+ */
+#define PCIE_MMCFG_SIZE_MAX             (1ULL << 28)
+#define PCIE_MMCFG_SIZE_MIN             (1ULL << 20)
+#define PCIE_MMCFG_BUS_BIT              20
+#define PCIE_MMCFG_BUS_MASK             0x1ff
+#define PCIE_MMCFG_DEVFN_BIT            12
+#define PCIE_MMCFG_DEVFN_MASK           0xff
+#define PCIE_MMCFG_CONFOFFSET_MASK      0xfff
+#define PCIE_MMCFG_BUS(addr)            (((addr) >> PCIE_MMCFG_BUS_BIT) & \
+                                         PCIE_MMCFG_BUS_MASK)
+#define PCIE_MMCFG_DEVFN(addr)          (((addr) >> PCIE_MMCFG_DEVFN_BIT) & \
+                                         PCIE_MMCFG_DEVFN_MASK)
+#define PCIE_MMCFG_CONFOFFSET(addr)     ((addr) & PCIE_MMCFG_CONFOFFSET_MASK)
+
 #endif /* PCIE_HOST_H */
diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c
index 410ac08..c6e1b57 100644
--- a/hw/pci/pcie_host.c
+++ b/hw/pci/pcie_host.c
@@ -24,27 +24,6 @@
 #include "hw/pci/pcie_host.h"
 #include "exec/address-spaces.h"
 
-/*
- * PCI express mmcfig address
- * bit 20 - 28: bus number
- * bit 15 - 19: device number
- * bit 12 - 14: function number
- * bit  0 - 11: offset in configuration space of a given device
- */
-#define PCIE_MMCFG_SIZE_MAX             (1ULL << 28)
-#define PCIE_MMCFG_SIZE_MIN             (1ULL << 20)
-#define PCIE_MMCFG_BUS_BIT              20
-#define PCIE_MMCFG_BUS_MASK             0x1ff
-#define PCIE_MMCFG_DEVFN_BIT            12
-#define PCIE_MMCFG_DEVFN_MASK           0xff
-#define PCIE_MMCFG_CONFOFFSET_MASK      0xfff
-#define PCIE_MMCFG_BUS(addr)            (((addr) >> PCIE_MMCFG_BUS_BIT) & \
-                                         PCIE_MMCFG_BUS_MASK)
-#define PCIE_MMCFG_DEVFN(addr)          (((addr) >> PCIE_MMCFG_DEVFN_BIT) & \
-                                         PCIE_MMCFG_DEVFN_MASK)
-#define PCIE_MMCFG_CONFOFFSET(addr)     ((addr) & PCIE_MMCFG_CONFOFFSET_MASK)
-
-
 /* a helper function to get a PCIDevice for a given mmconfig address */
 static inline PCIDevice *pcie_dev_find_by_mmcfg_addr(PCIBus *s,
                                                      uint32_t mmcfg_addr)
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 09/27] q35: use macro for MCFG property name
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (7 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 08/27] pcie_host: expose address format Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 10/27] q35: expose mmcfg size as a property Michael S. Tsirkin
                   ` (20 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Useful to make it accessible through QOM.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/pci/pcie_host.h | 2 ++
 hw/pci-host/q35.c          | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/hw/pci/pcie_host.h b/include/hw/pci/pcie_host.h
index da0f275..33d75bd 100644
--- a/include/hw/pci/pcie_host.h
+++ b/include/hw/pci/pcie_host.h
@@ -28,6 +28,8 @@
 #define PCIE_HOST_BRIDGE(obj) \
     OBJECT_CHECK(PCIExpressHost, (obj), TYPE_PCIE_HOST_BRIDGE)
 
+#define PCIE_HOST_MCFG_BASE "MCFG"
+
 /* pcie_host::base_addr == PCIE_BASE_ADDR_UNMAPPED when it isn't mapped. */
 #define PCIE_BASE_ADDR_UNMAPPED  ((hwaddr)-1ULL)
 
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 23dbeea..e46f286 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -110,7 +110,7 @@ static void q35_host_get_pci_hole64_end(Object *obj, Visitor *v,
 }
 
 static Property mch_props[] = {
-    DEFINE_PROP_UINT64("MCFG", Q35PCIHost, parent_obj.base_addr,
+    DEFINE_PROP_UINT64(PCIE_HOST_MCFG_BASE, Q35PCIHost, parent_obj.base_addr,
                         MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT),
     DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, Q35PCIHost,
                      mch.pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 10/27] q35: expose mmcfg size as a property
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (8 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 09/27] q35: use macro for MCFG property name Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 11/27] i386: add ACPI table files from seabios Michael S. Tsirkin
                   ` (19 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Address is already exposed, expose size for symmetry.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/pci/pcie_host.h |  1 +
 hw/pci-host/q35.c          | 14 ++++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/include/hw/pci/pcie_host.h b/include/hw/pci/pcie_host.h
index 33d75bd..acca45e 100644
--- a/include/hw/pci/pcie_host.h
+++ b/include/hw/pci/pcie_host.h
@@ -29,6 +29,7 @@
     OBJECT_CHECK(PCIExpressHost, (obj), TYPE_PCIE_HOST_BRIDGE)
 
 #define PCIE_HOST_MCFG_BASE "MCFG"
+#define PCIE_HOST_MCFG_SIZE "mcfg_size"
 
 /* pcie_host::base_addr == PCIE_BASE_ADDR_UNMAPPED when it isn't mapped. */
 #define PCIE_BASE_ADDR_UNMAPPED  ((hwaddr)-1ULL)
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index e46f286..a051b58 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -109,6 +109,16 @@ static void q35_host_get_pci_hole64_end(Object *obj, Visitor *v,
     visit_type_uint64(v, &w64.end, name, errp);
 }
 
+static void q35_host_get_mmcfg_size(Object *obj, Visitor *v,
+                                    void *opaque, const char *name,
+                                    Error **errp)
+{
+    PCIExpressHost *e = PCIE_HOST_BRIDGE(obj);
+    uint32_t value = e->size;
+
+    visit_type_uint32(v, &value, name, errp);
+}
+
 static Property mch_props[] = {
     DEFINE_PROP_UINT64(PCIE_HOST_MCFG_BASE, Q35PCIHost, parent_obj.base_addr,
                         MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT),
@@ -160,6 +170,10 @@ static void q35_host_initfn(Object *obj)
                         q35_host_get_pci_hole64_end,
                         NULL, NULL, NULL, NULL);
 
+    object_property_add(obj, PCIE_HOST_MCFG_SIZE, "int",
+                        q35_host_get_mmcfg_size,
+                        NULL, NULL, NULL, NULL);
+
     /* Leave enough space for the biggest MCFG BAR */
     /* TODO: this matches current bios behaviour, but
      * it's not a power of two, which means an MTRR
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 11/27] i386: add ACPI table files from seabios
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (9 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 10/27] q35: expose mmcfg size as a property Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 12/27] acpi: add rules to compile ASL source Michael S. Tsirkin
                   ` (18 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori
  Cc: Hu Tao, kraxel, imammedo, pbonzini, Laszlo Ersek, afaerber

This adds ASL code as well as scripts for processing it,
imported from seabios git tree
commit 51684b7ced75fb76776e8ee84833fcfb6ecf12dd

Will be used for runtime acpi table generation.

Note:
This patch reuses some code from SeaBIOS, which was originally under
LGPLv2 and then relicensed to GPLv3 or LGPLv3, in QEMU under GPLv2+. This
relicensing has been acked by all contributors that had contributed to the
code since the v2->v3 relicense. ACKs approving the v2+ relicensing are
listed below. The list might include ACKs from people not holding
copyright on any parts of the reused code, but it's better to err on the
side of caution and include them.

Affected SeaBIOS files (GPLv2+ license headers added)
<http://thread.gmane.org/gmane.comp.bios.coreboot.seabios/5949>:

 src/acpi-dsdt-cpu-hotplug.dsl
 src/acpi-dsdt-dbug.dsl
 src/acpi-dsdt-hpet.dsl
 src/acpi-dsdt-isa.dsl
 src/acpi-dsdt-pci-crs.dsl
 src/acpi.c
 src/acpi.h
 src/ssdt-misc.dsl
 src/ssdt-pcihp.dsl
 src/ssdt-proc.dsl
 tools/acpi_extract.py
 tools/acpi_extract_preprocess.py

Each one of the listed people agreed to the following:

> If you allow the use of your contribution in QEMU under the
> terms of GPLv2 or later as proposed by this patch,
> please respond to this mail including the line:
>
> Acked-by: Name <email address>

  Acked-by: Gerd Hoffmann <kraxel@redhat.com>
  Acked-by: Jan Kiszka <jan.kiszka@siemens.com>
  Acked-by: Jason Baron <jbaron@akamai.com>
  Acked-by: David Woodhouse <David.Woodhouse@intel.com>
  Acked-by: Gleb Natapov <gleb@redhat.com>
  Acked-by: Marcelo Tosatti <mtosatti@redhat.com>
  Acked-by: Dave Frodin <dave.frodin@se-eng.com>
  Acked-by: Paolo Bonzini <pbonzini@redhat.com>
  Acked-by: Kevin O'Connor <kevin@koconnor.net>
  Acked-by: Laszlo Ersek <lersek@redhat.com>
  Acked-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
  Acked-by: Isaku Yamahata <yamahata@valinux.co.jp>
  Acked-by: Magnus Christensson <magnus.christensson@intel.com>
  Acked-by: Hu Tao <hutao@cn.fujitsu.com>
  Acked-by: Eduardo Habkost <ehabkost@redhat.com>

Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Hu Tao <hutao@cn.fujitsu.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/acpi-dsdt-cpu-hotplug.dsl  |  93 ++++++++
 hw/i386/acpi-dsdt-dbug.dsl         |  41 ++++
 hw/i386/acpi-dsdt-hpet.dsl         |  51 +++++
 hw/i386/acpi-dsdt-isa.dsl          | 117 ++++++++++
 hw/i386/acpi-dsdt-pci-crs.dsl      | 105 +++++++++
 hw/i386/acpi-dsdt.dsl              | 343 ++++++++++++++++++++++++++++
 hw/i386/q35-acpi-dsdt.dsl          | 452 +++++++++++++++++++++++++++++++++++++
 hw/i386/ssdt-misc.dsl              | 119 ++++++++++
 hw/i386/ssdt-pcihp.dsl             |  51 +++++
 hw/i386/ssdt-proc.dsl              |  63 ++++++
 scripts/acpi_extract.py            | 362 +++++++++++++++++++++++++++++
 scripts/acpi_extract_preprocess.py |  51 +++++
 12 files changed, 1848 insertions(+)
 create mode 100644 hw/i386/acpi-dsdt-cpu-hotplug.dsl
 create mode 100644 hw/i386/acpi-dsdt-dbug.dsl
 create mode 100644 hw/i386/acpi-dsdt-hpet.dsl
 create mode 100644 hw/i386/acpi-dsdt-isa.dsl
 create mode 100644 hw/i386/acpi-dsdt-pci-crs.dsl
 create mode 100644 hw/i386/acpi-dsdt.dsl
 create mode 100644 hw/i386/q35-acpi-dsdt.dsl
 create mode 100644 hw/i386/ssdt-misc.dsl
 create mode 100644 hw/i386/ssdt-pcihp.dsl
 create mode 100644 hw/i386/ssdt-proc.dsl
 create mode 100755 scripts/acpi_extract.py
 create mode 100755 scripts/acpi_extract_preprocess.py

diff --git a/hw/i386/acpi-dsdt-cpu-hotplug.dsl b/hw/i386/acpi-dsdt-cpu-hotplug.dsl
new file mode 100644
index 0000000..c96ac42
--- /dev/null
+++ b/hw/i386/acpi-dsdt-cpu-hotplug.dsl
@@ -0,0 +1,93 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/****************************************************************
+ * CPU hotplug
+ ****************************************************************/
+
+Scope(\_SB) {
+    /* Objects filled in by run-time generated SSDT */
+    External(NTFY, MethodObj)
+    External(CPON, PkgObj)
+
+    /* Methods called by run-time generated SSDT Processor objects */
+    Method(CPMA, 1, NotSerialized) {
+        // _MAT method - create an madt apic buffer
+        // Arg0 = Processor ID = Local APIC ID
+        // Local0 = CPON flag for this cpu
+        Store(DerefOf(Index(CPON, Arg0)), Local0)
+        // Local1 = Buffer (in madt apic form) to return
+        Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1)
+        // Update the processor id, lapic id, and enable/disable status
+        Store(Arg0, Index(Local1, 2))
+        Store(Arg0, Index(Local1, 3))
+        Store(Local0, Index(Local1, 4))
+        Return (Local1)
+    }
+    Method(CPST, 1, NotSerialized) {
+        // _STA method - return ON status of cpu
+        // Arg0 = Processor ID = Local APIC ID
+        // Local0 = CPON flag for this cpu
+        Store(DerefOf(Index(CPON, Arg0)), Local0)
+        If (Local0) {
+            Return (0xF)
+        } Else {
+            Return (0x0)
+        }
+    }
+    Method(CPEJ, 2, NotSerialized) {
+        // _EJ0 method - eject callback
+        Sleep(200)
+    }
+
+    /* CPU hotplug notify method */
+    OperationRegion(PRST, SystemIO, 0xaf00, 32)
+    Field(PRST, ByteAcc, NoLock, Preserve) {
+        PRS, 256
+    }
+    Method(PRSC, 0) {
+        // Local5 = active cpu bitmap
+        Store(PRS, Local5)
+        // Local2 = last read byte from bitmap
+        Store(Zero, Local2)
+        // Local0 = Processor ID / APIC ID iterator
+        Store(Zero, Local0)
+        While (LLess(Local0, SizeOf(CPON))) {
+            // Local1 = CPON flag for this cpu
+            Store(DerefOf(Index(CPON, Local0)), Local1)
+            If (And(Local0, 0x07)) {
+                // Shift down previously read bitmap byte
+                ShiftRight(Local2, 1, Local2)
+            } Else {
+                // Read next byte from cpu bitmap
+                Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), Local2)
+            }
+            // Local3 = active state for this cpu
+            Store(And(Local2, 1), Local3)
+
+            If (LNotEqual(Local1, Local3)) {
+                // State change - update CPON with new state
+                Store(Local3, Index(CPON, Local0))
+                // Do CPU notify
+                If (LEqual(Local3, 1)) {
+                    NTFY(Local0, 1)
+                } Else {
+                    NTFY(Local0, 3)
+                }
+            }
+            Increment(Local0)
+        }
+    }
+}
diff --git a/hw/i386/acpi-dsdt-dbug.dsl b/hw/i386/acpi-dsdt-dbug.dsl
new file mode 100644
index 0000000..86230f7
--- /dev/null
+++ b/hw/i386/acpi-dsdt-dbug.dsl
@@ -0,0 +1,41 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/****************************************************************
+ * Debugging
+ ****************************************************************/
+
+Scope(\) {
+    /* Debug Output */
+    OperationRegion(DBG, SystemIO, 0x0402, 0x01)
+    Field(DBG, ByteAcc, NoLock, Preserve) {
+        DBGB,   8,
+    }
+
+    /* Debug method - use this method to send output to the QEMU
+     * BIOS debug port.  This method handles strings, integers,
+     * and buffers.  For example: DBUG("abc") DBUG(0x123) */
+    Method(DBUG, 1) {
+        ToHexString(Arg0, Local0)
+        ToBuffer(Local0, Local0)
+        Subtract(SizeOf(Local0), 1, Local1)
+        Store(Zero, Local2)
+        While (LLess(Local2, Local1)) {
+            Store(DerefOf(Index(Local0, Local2)), DBGB)
+            Increment(Local2)
+        }
+        Store(0x0A, DBGB)
+    }
+}
diff --git a/hw/i386/acpi-dsdt-hpet.dsl b/hw/i386/acpi-dsdt-hpet.dsl
new file mode 100644
index 0000000..dfde174
--- /dev/null
+++ b/hw/i386/acpi-dsdt-hpet.dsl
@@ -0,0 +1,51 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/****************************************************************
+ * HPET
+ ****************************************************************/
+
+Scope(\_SB) {
+    Device(HPET) {
+        Name(_HID, EISAID("PNP0103"))
+        Name(_UID, 0)
+        OperationRegion(HPTM, SystemMemory, 0xFED00000, 0x400)
+        Field(HPTM, DWordAcc, Lock, Preserve) {
+            VEND, 32,
+            PRD, 32,
+        }
+        Method(_STA, 0, NotSerialized) {
+            Store(VEND, Local0)
+            Store(PRD, Local1)
+            ShiftRight(Local0, 16, Local0)
+            If (LOr(LEqual(Local0, 0), LEqual(Local0, 0xffff))) {
+                Return (0x0)
+            }
+            If (LOr(LEqual(Local1, 0), LGreater(Local1, 100000000))) {
+                Return (0x0)
+            }
+            Return (0x0F)
+        }
+        Name(_CRS, ResourceTemplate() {
+#if 0       /* This makes WinXP BSOD for not yet figured reasons. */
+            IRQNoFlags() {2, 8}
+#endif
+            Memory32Fixed(ReadOnly,
+                0xFED00000,         // Address Base
+                0x00000400,         // Address Length
+                )
+        })
+    }
+}
diff --git a/hw/i386/acpi-dsdt-isa.dsl b/hw/i386/acpi-dsdt-isa.dsl
new file mode 100644
index 0000000..89caa16
--- /dev/null
+++ b/hw/i386/acpi-dsdt-isa.dsl
@@ -0,0 +1,117 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Common legacy ISA style devices. */
+Scope(\_SB.PCI0.ISA) {
+
+    Device(RTC) {
+        Name(_HID, EisaId("PNP0B00"))
+        Name(_CRS, ResourceTemplate() {
+            IO(Decode16, 0x0070, 0x0070, 0x10, 0x02)
+            IRQNoFlags() { 8 }
+            IO(Decode16, 0x0072, 0x0072, 0x02, 0x06)
+        })
+    }
+
+    Device(KBD) {
+        Name(_HID, EisaId("PNP0303"))
+        Method(_STA, 0, NotSerialized) {
+            Return (0x0f)
+        }
+        Name(_CRS, ResourceTemplate() {
+            IO(Decode16, 0x0060, 0x0060, 0x01, 0x01)
+            IO(Decode16, 0x0064, 0x0064, 0x01, 0x01)
+            IRQNoFlags() { 1 }
+        })
+    }
+
+    Device(MOU) {
+        Name(_HID, EisaId("PNP0F13"))
+        Method(_STA, 0, NotSerialized) {
+            Return (0x0f)
+        }
+        Name(_CRS, ResourceTemplate() {
+            IRQNoFlags() { 12 }
+        })
+    }
+
+    Device(FDC0) {
+        Name(_HID, EisaId("PNP0700"))
+        Method(_STA, 0, NotSerialized) {
+            Store(FDEN, Local0)
+            If (LEqual(Local0, 0)) {
+                Return (0x00)
+            } Else {
+                Return (0x0F)
+            }
+        }
+        Name(_CRS, ResourceTemplate() {
+            IO(Decode16, 0x03F2, 0x03F2, 0x00, 0x04)
+            IO(Decode16, 0x03F7, 0x03F7, 0x00, 0x01)
+            IRQNoFlags() { 6 }
+            DMA(Compatibility, NotBusMaster, Transfer8) { 2 }
+        })
+    }
+
+    Device(LPT) {
+        Name(_HID, EisaId("PNP0400"))
+        Method(_STA, 0, NotSerialized) {
+            Store(LPEN, Local0)
+            If (LEqual(Local0, 0)) {
+                Return (0x00)
+            } Else {
+                Return (0x0F)
+            }
+        }
+        Name(_CRS, ResourceTemplate() {
+            IO(Decode16, 0x0378, 0x0378, 0x08, 0x08)
+            IRQNoFlags() { 7 }
+        })
+    }
+
+    Device(COM1) {
+        Name(_HID, EisaId("PNP0501"))
+        Name(_UID, 0x01)
+        Method(_STA, 0, NotSerialized) {
+            Store(CAEN, Local0)
+            If (LEqual(Local0, 0)) {
+                Return (0x00)
+            } Else {
+                Return (0x0F)
+            }
+        }
+        Name(_CRS, ResourceTemplate() {
+            IO(Decode16, 0x03F8, 0x03F8, 0x00, 0x08)
+            IRQNoFlags() { 4 }
+        })
+    }
+
+    Device(COM2) {
+        Name(_HID, EisaId("PNP0501"))
+        Name(_UID, 0x02)
+        Method(_STA, 0, NotSerialized) {
+            Store(CBEN, Local0)
+            If (LEqual(Local0, 0)) {
+                Return (0x00)
+            } Else {
+                Return (0x0F)
+            }
+        }
+        Name(_CRS, ResourceTemplate() {
+            IO(Decode16, 0x02F8, 0x02F8, 0x00, 0x08)
+            IRQNoFlags() { 3 }
+        })
+    }
+}
diff --git a/hw/i386/acpi-dsdt-pci-crs.dsl b/hw/i386/acpi-dsdt-pci-crs.dsl
new file mode 100644
index 0000000..b375a19
--- /dev/null
+++ b/hw/i386/acpi-dsdt-pci-crs.dsl
@@ -0,0 +1,105 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* PCI CRS (current resources) definition. */
+Scope(\_SB.PCI0) {
+
+    Name(CRES, ResourceTemplate() {
+        WordBusNumber(ResourceProducer, MinFixed, MaxFixed, PosDecode,
+            0x0000,             // Address Space Granularity
+            0x0000,             // Address Range Minimum
+            0x00FF,             // Address Range Maximum
+            0x0000,             // Address Translation Offset
+            0x0100,             // Address Length
+            ,, )
+        IO(Decode16,
+            0x0CF8,             // Address Range Minimum
+            0x0CF8,             // Address Range Maximum
+            0x01,               // Address Alignment
+            0x08,               // Address Length
+            )
+        WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+            0x0000,             // Address Space Granularity
+            0x0000,             // Address Range Minimum
+            0x0CF7,             // Address Range Maximum
+            0x0000,             // Address Translation Offset
+            0x0CF8,             // Address Length
+            ,, , TypeStatic)
+        WordIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+            0x0000,             // Address Space Granularity
+            0x0D00,             // Address Range Minimum
+            0xFFFF,             // Address Range Maximum
+            0x0000,             // Address Translation Offset
+            0xF300,             // Address Length
+            ,, , TypeStatic)
+        DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+            0x00000000,         // Address Space Granularity
+            0x000A0000,         // Address Range Minimum
+            0x000BFFFF,         // Address Range Maximum
+            0x00000000,         // Address Translation Offset
+            0x00020000,         // Address Length
+            ,, , AddressRangeMemory, TypeStatic)
+        DWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
+            0x00000000,         // Address Space Granularity
+            0xE0000000,         // Address Range Minimum
+            0xFEBFFFFF,         // Address Range Maximum
+            0x00000000,         // Address Translation Offset
+            0x1EC00000,         // Address Length
+            ,, PW32, AddressRangeMemory, TypeStatic)
+    })
+
+    Name(CR64, ResourceTemplate() {
+        QWordMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+            0x00000000,          // Address Space Granularity
+            0x8000000000,        // Address Range Minimum
+            0xFFFFFFFFFF,        // Address Range Maximum
+            0x00000000,          // Address Translation Offset
+            0x8000000000,        // Address Length
+            ,, PW64, AddressRangeMemory, TypeStatic)
+    })
+
+    Method(_CRS, 0) {
+        /* Fields provided by dynamically created ssdt */
+        External(P0S, IntObj)
+        External(P0E, IntObj)
+        External(P1V, IntObj)
+        External(P1S, BuffObj)
+        External(P1E, BuffObj)
+        External(P1L, BuffObj)
+
+        /* fixup 32bit pci io window */
+        CreateDWordField(CRES, \_SB.PCI0.PW32._MIN, PS32)
+        CreateDWordField(CRES, \_SB.PCI0.PW32._MAX, PE32)
+        CreateDWordField(CRES, \_SB.PCI0.PW32._LEN, PL32)
+        Store(P0S, PS32)
+        Store(P0E, PE32)
+        Store(Add(Subtract(P0E, P0S), 1), PL32)
+
+        If (LEqual(P1V, Zero)) {
+            Return (CRES)
+        }
+
+        /* fixup 64bit pci io window */
+        CreateQWordField(CR64, \_SB.PCI0.PW64._MIN, PS64)
+        CreateQWordField(CR64, \_SB.PCI0.PW64._MAX, PE64)
+        CreateQWordField(CR64, \_SB.PCI0.PW64._LEN, PL64)
+        Store(P1S, PS64)
+        Store(P1E, PE64)
+        Store(P1L, PL64)
+        /* add window and return result */
+        ConcatenateResTemplate(CRES, CR64, Local0)
+        Return (Local0)
+    }
+}
diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
new file mode 100644
index 0000000..90efce0
--- /dev/null
+++ b/hw/i386/acpi-dsdt.dsl
@@ -0,0 +1,343 @@
+/*
+ * Bochs/QEMU ACPI DSDT ASL definition
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+ACPI_EXTRACT_ALL_CODE AcpiDsdtAmlCode
+
+DefinitionBlock (
+    "acpi-dsdt.aml",    // Output Filename
+    "DSDT",             // Signature
+    0x01,               // DSDT Compliance Revision
+    "BXPC",             // OEMID
+    "BXDSDT",           // TABLE ID
+    0x1                 // OEM Revision
+    )
+{
+
+#include "acpi-dsdt-dbug.dsl"
+
+
+/****************************************************************
+ * PCI Bus definition
+ ****************************************************************/
+
+    Scope(\_SB) {
+        Device(PCI0) {
+            Name(_HID, EisaId("PNP0A03"))
+            Name(_ADR, 0x00)
+            Name(_UID, 1)
+        }
+    }
+
+#include "acpi-dsdt-pci-crs.dsl"
+#include "acpi-dsdt-hpet.dsl"
+
+
+/****************************************************************
+ * VGA
+ ****************************************************************/
+
+    Scope(\_SB.PCI0) {
+        Device(VGA) {
+            Name(_ADR, 0x00020000)
+            OperationRegion(PCIC, PCI_Config, Zero, 0x4)
+            Field(PCIC, DWordAcc, NoLock, Preserve) {
+                VEND, 32
+            }
+            Method(_S1D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S2D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S3D, 0, NotSerialized) {
+                If (LEqual(VEND, 0x1001b36)) {
+                    Return (0x03)           // QXL
+                } Else {
+                    Return (0x00)
+                }
+            }
+        }
+    }
+
+
+/****************************************************************
+ * PIIX4 PM
+ ****************************************************************/
+
+    Scope(\_SB.PCI0) {
+        Device(PX13) {
+            Name(_ADR, 0x00010003)
+            OperationRegion(P13C, PCI_Config, 0x00, 0xff)
+        }
+    }
+
+
+/****************************************************************
+ * PIIX3 ISA bridge
+ ****************************************************************/
+
+    Scope(\_SB.PCI0) {
+        Device(ISA) {
+            Name(_ADR, 0x00010000)
+
+            /* PIIX PCI to ISA irq remapping */
+            OperationRegion(P40C, PCI_Config, 0x60, 0x04)
+
+            /* enable bits */
+            Field(\_SB.PCI0.PX13.P13C, AnyAcc, NoLock, Preserve) {
+                Offset(0x5f),
+                , 7,
+                LPEN, 1,         // LPT
+                Offset(0x67),
+                , 3,
+                CAEN, 1,         // COM1
+                , 3,
+                CBEN, 1,         // COM2
+            }
+            Name(FDEN, 1)
+        }
+    }
+
+#include "acpi-dsdt-isa.dsl"
+
+
+/****************************************************************
+ * PCI hotplug
+ ****************************************************************/
+
+    Scope(\_SB.PCI0) {
+        OperationRegion(PCST, SystemIO, 0xae00, 0x08)
+        Field(PCST, DWordAcc, NoLock, WriteAsZeros) {
+            PCIU, 32,
+            PCID, 32,
+        }
+
+        OperationRegion(SEJ, SystemIO, 0xae08, 0x04)
+        Field(SEJ, DWordAcc, NoLock, WriteAsZeros) {
+            B0EJ, 32,
+        }
+
+        /* Methods called by bulk generated PCI devices below */
+
+        /* Methods called by hotplug devices */
+        Method(PCEJ, 1, NotSerialized) {
+            // _EJ0 method - eject callback
+            Store(ShiftLeft(1, Arg0), B0EJ)
+            Return (0x0)
+        }
+
+        /* Hotplug notification method supplied by SSDT */
+        External(\_SB.PCI0.PCNT, MethodObj)
+
+        /* PCI hotplug notify method */
+        Method(PCNF, 0) {
+            // Local0 = iterator
+            Store(Zero, Local0)
+            While (LLess(Local0, 31)) {
+                Increment(Local0)
+                If (And(PCIU, ShiftLeft(1, Local0))) {
+                    PCNT(Local0, 1)
+                }
+                If (And(PCID, ShiftLeft(1, Local0))) {
+                    PCNT(Local0, 3)
+                }
+            }
+        }
+    }
+
+
+/****************************************************************
+ * PCI IRQs
+ ****************************************************************/
+
+    Scope(\_SB) {
+        Scope(PCI0) {
+            Name(_PRT, Package() {
+                /* PCI IRQ routing table, example from ACPI 2.0a specification,
+                   section 6.2.8.1 */
+                /* Note: we provide the same info as the PCI routing
+                   table of the Bochs BIOS */
+
+#define prt_slot(nr, lnk0, lnk1, lnk2, lnk3) \
+    Package() { nr##ffff, 0, lnk0, 0 }, \
+    Package() { nr##ffff, 1, lnk1, 0 }, \
+    Package() { nr##ffff, 2, lnk2, 0 }, \
+    Package() { nr##ffff, 3, lnk3, 0 }
+
+#define prt_slot0(nr) prt_slot(nr, LNKD, LNKA, LNKB, LNKC)
+#define prt_slot1(nr) prt_slot(nr, LNKA, LNKB, LNKC, LNKD)
+#define prt_slot2(nr) prt_slot(nr, LNKB, LNKC, LNKD, LNKA)
+#define prt_slot3(nr) prt_slot(nr, LNKC, LNKD, LNKA, LNKB)
+
+                prt_slot0(0x0000),
+                /* Device 1 is power mgmt device, and can only use irq 9 */
+                prt_slot(0x0001, LNKS, LNKB, LNKC, LNKD),
+                prt_slot2(0x0002),
+                prt_slot3(0x0003),
+                prt_slot0(0x0004),
+                prt_slot1(0x0005),
+                prt_slot2(0x0006),
+                prt_slot3(0x0007),
+                prt_slot0(0x0008),
+                prt_slot1(0x0009),
+                prt_slot2(0x000a),
+                prt_slot3(0x000b),
+                prt_slot0(0x000c),
+                prt_slot1(0x000d),
+                prt_slot2(0x000e),
+                prt_slot3(0x000f),
+                prt_slot0(0x0010),
+                prt_slot1(0x0011),
+                prt_slot2(0x0012),
+                prt_slot3(0x0013),
+                prt_slot0(0x0014),
+                prt_slot1(0x0015),
+                prt_slot2(0x0016),
+                prt_slot3(0x0017),
+                prt_slot0(0x0018),
+                prt_slot1(0x0019),
+                prt_slot2(0x001a),
+                prt_slot3(0x001b),
+                prt_slot0(0x001c),
+                prt_slot1(0x001d),
+                prt_slot2(0x001e),
+                prt_slot3(0x001f),
+            })
+        }
+
+        Field(PCI0.ISA.P40C, ByteAcc, NoLock, Preserve) {
+            PRQ0,   8,
+            PRQ1,   8,
+            PRQ2,   8,
+            PRQ3,   8
+        }
+
+        Method(IQST, 1, NotSerialized) {
+            // _STA method - get status
+            If (And(0x80, Arg0)) {
+                Return (0x09)
+            }
+            Return (0x0B)
+        }
+        Method(IQCR, 1, NotSerialized) {
+            // _CRS method - get current settings
+            Name(PRR0, ResourceTemplate() {
+                Interrupt(, Level, ActiveHigh, Shared) { 0 }
+            })
+            CreateDWordField(PRR0, 0x05, PRRI)
+            If (LLess(Arg0, 0x80)) {
+                Store(Arg0, PRRI)
+            }
+            Return (PRR0)
+        }
+
+#define define_link(link, uid, reg)                             \
+        Device(link) {                                          \
+            Name(_HID, EISAID("PNP0C0F"))                       \
+            Name(_UID, uid)                                     \
+            Name(_PRS, ResourceTemplate() {                     \
+                Interrupt(, Level, ActiveHigh, Shared) {        \
+                    5, 10, 11                                   \
+                }                                               \
+            })                                                  \
+            Method(_STA, 0, NotSerialized) {                    \
+                Return (IQST(reg))                              \
+            }                                                   \
+            Method(_DIS, 0, NotSerialized) {                    \
+                Or(reg, 0x80, reg)                              \
+            }                                                   \
+            Method(_CRS, 0, NotSerialized) {                    \
+                Return (IQCR(reg))                              \
+            }                                                   \
+            Method(_SRS, 1, NotSerialized) {                    \
+                CreateDWordField(Arg0, 0x05, PRRI)              \
+                Store(PRRI, reg)                                \
+            }                                                   \
+        }
+
+        define_link(LNKA, 0, PRQ0)
+        define_link(LNKB, 1, PRQ1)
+        define_link(LNKC, 2, PRQ2)
+        define_link(LNKD, 3, PRQ3)
+
+        Device(LNKS) {
+            Name(_HID, EISAID("PNP0C0F"))
+            Name(_UID, 4)
+            Name(_PRS, ResourceTemplate() {
+                Interrupt(, Level, ActiveHigh, Shared) { 9 }
+            })
+
+            // The SCI cannot be disabled and is always attached to GSI 9,
+            // so these are no-ops.  We only need this link to override the
+            // polarity to active high and match the content of the MADT.
+            Method(_STA, 0, NotSerialized) { Return (0x0b) }
+            Method(_DIS, 0, NotSerialized) { }
+            Method(_CRS, 0, NotSerialized) { Return (_PRS) }
+            Method(_SRS, 1, NotSerialized) { }
+        }
+    }
+
+#include "acpi-dsdt-cpu-hotplug.dsl"
+
+
+/****************************************************************
+ * General purpose events
+ ****************************************************************/
+
+    Scope(\_GPE) {
+        Name(_HID, "ACPI0006")
+
+        Method(_L00) {
+        }
+        Method(_E01) {
+            // PCI hotplug event
+            \_SB.PCI0.PCNF()
+        }
+        Method(_E02) {
+            // CPU hotplug event
+            \_SB.PRSC()
+        }
+        Method(_L03) {
+        }
+        Method(_L04) {
+        }
+        Method(_L05) {
+        }
+        Method(_L06) {
+        }
+        Method(_L07) {
+        }
+        Method(_L08) {
+        }
+        Method(_L09) {
+        }
+        Method(_L0A) {
+        }
+        Method(_L0B) {
+        }
+        Method(_L0C) {
+        }
+        Method(_L0D) {
+        }
+        Method(_L0E) {
+        }
+        Method(_L0F) {
+        }
+    }
+}
diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl
new file mode 100644
index 0000000..21c89b0
--- /dev/null
+++ b/hw/i386/q35-acpi-dsdt.dsl
@@ -0,0 +1,452 @@
+/*
+ * Bochs/QEMU ACPI DSDT ASL definition
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+/*
+ * Copyright (c) 2010 Isaku Yamahata
+ *                    yamahata at valinux co jp
+ * Based on acpi-dsdt.dsl, but heavily modified for q35 chipset.
+ */
+
+ACPI_EXTRACT_ALL_CODE Q35AcpiDsdtAmlCode
+
+DefinitionBlock (
+    "q35-acpi-dsdt.aml",// Output Filename
+    "DSDT",             // Signature
+    0x01,               // DSDT Compliance Revision
+    "BXPC",             // OEMID
+    "BXDSDT",           // TABLE ID
+    0x2                 // OEM Revision
+    )
+{
+
+#include "acpi-dsdt-dbug.dsl"
+
+    Scope(\_SB) {
+        OperationRegion(PCST, SystemIO, 0xae00, 0x0c)
+        OperationRegion(PCSB, SystemIO, 0xae0c, 0x01)
+        Field(PCSB, AnyAcc, NoLock, WriteAsZeros) {
+            PCIB, 8,
+        }
+    }
+
+
+/****************************************************************
+ * PCI Bus definition
+ ****************************************************************/
+
+    Scope(\_SB) {
+        Device(PCI0) {
+            Name(_HID, EisaId("PNP0A08"))
+            Name(_CID, EisaId("PNP0A03"))
+            Name(_ADR, 0x00)
+            Name(_UID, 1)
+
+            // _OSC: based on sample of ACPI3.0b spec
+            Name(SUPP, 0) // PCI _OSC Support Field value
+            Name(CTRL, 0) // PCI _OSC Control Field value
+            Method(_OSC, 4) {
+                // Create DWORD-addressable fields from the Capabilities Buffer
+                CreateDWordField(Arg3, 0, CDW1)
+
+                // Check for proper UUID
+                If (LEqual(Arg0, ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {
+                    // Create DWORD-addressable fields from the Capabilities Buffer
+                    CreateDWordField(Arg3, 4, CDW2)
+                    CreateDWordField(Arg3, 8, CDW3)
+
+                    // Save Capabilities DWORD2 & 3
+                    Store(CDW2, SUPP)
+                    Store(CDW3, CTRL)
+
+                    // Always allow native PME, AER (no dependencies)
+                    // Never allow SHPC (no SHPC controller in this system)
+                    And(CTRL, 0x1D, CTRL)
+
+#if 0 // For now, nothing to do
+                    If (Not(And(CDW1, 1))) { // Query flag clear?
+                        // Disable GPEs for features granted native control.
+                        If (And(CTRL, 0x01)) { // Hot plug control granted?
+                            Store(0, HPCE) // clear the hot plug SCI enable bit
+                            Store(1, HPCS) // clear the hot plug SCI status bit
+                        }
+                        If (And(CTRL, 0x04)) { // PME control granted?
+                            Store(0, PMCE) // clear the PME SCI enable bit
+                            Store(1, PMCS) // clear the PME SCI status bit
+                        }
+                        If (And(CTRL, 0x10)) { // OS restoring PCI Express cap structure?
+                            // Set status to not restore PCI Express cap structure
+                            // upon resume from S3
+                            Store(1, S3CR)
+                        }
+                    }
+#endif
+                    If (LNotEqual(Arg1, One)) {
+                        // Unknown revision
+                        Or(CDW1, 0x08, CDW1)
+                    }
+                    If (LNotEqual(CDW3, CTRL)) {
+                        // Capabilities bits were masked
+                        Or(CDW1, 0x10, CDW1)
+                    }
+                    // Update DWORD3 in the buffer
+                    Store(CTRL, CDW3)
+                } Else {
+                    Or(CDW1, 4, CDW1) // Unrecognized UUID
+                }
+                Return (Arg3)
+            }
+        }
+    }
+
+#include "acpi-dsdt-pci-crs.dsl"
+#include "acpi-dsdt-hpet.dsl"
+
+
+/****************************************************************
+ * VGA
+ ****************************************************************/
+
+    Scope(\_SB.PCI0) {
+        Device(VGA) {
+            Name(_ADR, 0x00010000)
+            Method(_S1D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S2D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S3D, 0, NotSerialized) {
+                Return (0x00)
+            }
+        }
+    }
+
+
+/****************************************************************
+ * LPC ISA bridge
+ ****************************************************************/
+
+    Scope(\_SB.PCI0) {
+        /* PCI D31:f0 LPC ISA bridge */
+        Device(ISA) {
+            /* PCI D31:f0 */
+            Name(_ADR, 0x001f0000)
+
+            /* ICH9 PCI to ISA irq remapping */
+            OperationRegion(PIRQ, PCI_Config, 0x60, 0x0C)
+
+            OperationRegion(LPCD, PCI_Config, 0x80, 0x2)
+            Field(LPCD, AnyAcc, NoLock, Preserve) {
+                COMA,   3,
+                    ,   1,
+                COMB,   3,
+
+                Offset(0x01),
+                LPTD,   2,
+                    ,   2,
+                FDCD,   2
+            }
+            OperationRegion(LPCE, PCI_Config, 0x82, 0x2)
+            Field(LPCE, AnyAcc, NoLock, Preserve) {
+                CAEN,   1,
+                CBEN,   1,
+                LPEN,   1,
+                FDEN,   1
+            }
+        }
+    }
+
+#include "acpi-dsdt-isa.dsl"
+
+
+/****************************************************************
+ * PCI IRQs
+ ****************************************************************/
+
+    /* Zero => PIC mode, One => APIC Mode */
+    Name(\PICF, Zero)
+    Method(\_PIC, 1, NotSerialized) {
+        Store(Arg0, \PICF)
+    }
+
+    Scope(\_SB) {
+        Scope(PCI0) {
+#define prt_slot_lnk(nr, lnk0, lnk1, lnk2, lnk3)  \
+    Package() { nr##ffff, 0, lnk0, 0 },           \
+    Package() { nr##ffff, 1, lnk1, 0 },           \
+    Package() { nr##ffff, 2, lnk2, 0 },           \
+    Package() { nr##ffff, 3, lnk3, 0 }
+
+#define prt_slot_lnkA(nr) prt_slot_lnk(nr, LNKA, LNKB, LNKC, LNKD)
+#define prt_slot_lnkB(nr) prt_slot_lnk(nr, LNKB, LNKC, LNKD, LNKA)
+#define prt_slot_lnkC(nr) prt_slot_lnk(nr, LNKC, LNKD, LNKA, LNKB)
+#define prt_slot_lnkD(nr) prt_slot_lnk(nr, LNKD, LNKA, LNKB, LNKC)
+
+#define prt_slot_lnkE(nr) prt_slot_lnk(nr, LNKE, LNKF, LNKG, LNKH)
+#define prt_slot_lnkF(nr) prt_slot_lnk(nr, LNKF, LNKG, LNKH, LNKE)
+#define prt_slot_lnkG(nr) prt_slot_lnk(nr, LNKG, LNKH, LNKE, LNKF)
+#define prt_slot_lnkH(nr) prt_slot_lnk(nr, LNKH, LNKE, LNKF, LNKG)
+
+            Name(PRTP, package() {
+                prt_slot_lnkE(0x0000),
+                prt_slot_lnkF(0x0001),
+                prt_slot_lnkG(0x0002),
+                prt_slot_lnkH(0x0003),
+                prt_slot_lnkE(0x0004),
+                prt_slot_lnkF(0x0005),
+                prt_slot_lnkG(0x0006),
+                prt_slot_lnkH(0x0007),
+                prt_slot_lnkE(0x0008),
+                prt_slot_lnkF(0x0009),
+                prt_slot_lnkG(0x000a),
+                prt_slot_lnkH(0x000b),
+                prt_slot_lnkE(0x000c),
+                prt_slot_lnkF(0x000d),
+                prt_slot_lnkG(0x000e),
+                prt_slot_lnkH(0x000f),
+                prt_slot_lnkE(0x0010),
+                prt_slot_lnkF(0x0011),
+                prt_slot_lnkG(0x0012),
+                prt_slot_lnkH(0x0013),
+                prt_slot_lnkE(0x0014),
+                prt_slot_lnkF(0x0015),
+                prt_slot_lnkG(0x0016),
+                prt_slot_lnkH(0x0017),
+                prt_slot_lnkE(0x0018),
+
+                /* INTA -> PIRQA for slot 25 - 31
+                   see the default value of D<N>IR */
+                prt_slot_lnkA(0x0019),
+                prt_slot_lnkA(0x001a),
+                prt_slot_lnkA(0x001b),
+                prt_slot_lnkA(0x001c),
+                prt_slot_lnkA(0x001d),
+
+                /* PCIe->PCI bridge. use PIRQ[E-H] */
+                prt_slot_lnkE(0x001e),
+
+                prt_slot_lnkA(0x001f)
+            })
+
+#define prt_slot_gsi(nr, gsi0, gsi1, gsi2, gsi3)  \
+    Package() { nr##ffff, 0, gsi0, 0 },           \
+    Package() { nr##ffff, 1, gsi1, 0 },           \
+    Package() { nr##ffff, 2, gsi2, 0 },           \
+    Package() { nr##ffff, 3, gsi3, 0 }
+
+#define prt_slot_gsiA(nr) prt_slot_gsi(nr, GSIA, GSIB, GSIC, GSID)
+#define prt_slot_gsiB(nr) prt_slot_gsi(nr, GSIB, GSIC, GSID, GSIA)
+#define prt_slot_gsiC(nr) prt_slot_gsi(nr, GSIC, GSID, GSIA, GSIB)
+#define prt_slot_gsiD(nr) prt_slot_gsi(nr, GSID, GSIA, GSIB, GSIC)
+
+#define prt_slot_gsiE(nr) prt_slot_gsi(nr, GSIE, GSIF, GSIG, GSIH)
+#define prt_slot_gsiF(nr) prt_slot_gsi(nr, GSIF, GSIG, GSIH, GSIE)
+#define prt_slot_gsiG(nr) prt_slot_gsi(nr, GSIG, GSIH, GSIE, GSIF)
+#define prt_slot_gsiH(nr) prt_slot_gsi(nr, GSIH, GSIE, GSIF, GSIG)
+
+            Name(PRTA, package() {
+                prt_slot_gsiE(0x0000),
+                prt_slot_gsiF(0x0001),
+                prt_slot_gsiG(0x0002),
+                prt_slot_gsiH(0x0003),
+                prt_slot_gsiE(0x0004),
+                prt_slot_gsiF(0x0005),
+                prt_slot_gsiG(0x0006),
+                prt_slot_gsiH(0x0007),
+                prt_slot_gsiE(0x0008),
+                prt_slot_gsiF(0x0009),
+                prt_slot_gsiG(0x000a),
+                prt_slot_gsiH(0x000b),
+                prt_slot_gsiE(0x000c),
+                prt_slot_gsiF(0x000d),
+                prt_slot_gsiG(0x000e),
+                prt_slot_gsiH(0x000f),
+                prt_slot_gsiE(0x0010),
+                prt_slot_gsiF(0x0011),
+                prt_slot_gsiG(0x0012),
+                prt_slot_gsiH(0x0013),
+                prt_slot_gsiE(0x0014),
+                prt_slot_gsiF(0x0015),
+                prt_slot_gsiG(0x0016),
+                prt_slot_gsiH(0x0017),
+                prt_slot_gsiE(0x0018),
+
+                /* INTA -> PIRQA for slot 25 - 31, but 30
+                   see the default value of D<N>IR */
+                prt_slot_gsiA(0x0019),
+                prt_slot_gsiA(0x001a),
+                prt_slot_gsiA(0x001b),
+                prt_slot_gsiA(0x001c),
+                prt_slot_gsiA(0x001d),
+
+                /* PCIe->PCI bridge. use PIRQ[E-H] */
+                prt_slot_gsiE(0x001e),
+
+                prt_slot_gsiA(0x001f)
+            })
+
+            Method(_PRT, 0, NotSerialized) {
+                /* PCI IRQ routing table, example from ACPI 2.0a specification,
+                   section 6.2.8.1 */
+                /* Note: we provide the same info as the PCI routing
+                   table of the Bochs BIOS */
+                If (LEqual(\PICF, Zero)) {
+                    Return (PRTP)
+                } Else {
+                    Return (PRTA)
+                }
+            }
+        }
+
+        Field(PCI0.ISA.PIRQ, ByteAcc, NoLock, Preserve) {
+            PRQA,   8,
+            PRQB,   8,
+            PRQC,   8,
+            PRQD,   8,
+
+            Offset(0x08),
+            PRQE,   8,
+            PRQF,   8,
+            PRQG,   8,
+            PRQH,   8
+        }
+
+        Method(IQST, 1, NotSerialized) {
+            // _STA method - get status
+            If (And(0x80, Arg0)) {
+                Return (0x09)
+            }
+            Return (0x0B)
+        }
+        Method(IQCR, 1, NotSerialized) {
+            // _CRS method - get current settings
+            Name(PRR0, ResourceTemplate() {
+                Interrupt(, Level, ActiveHigh, Shared) { 0 }
+            })
+            CreateDWordField(PRR0, 0x05, PRRI)
+            Store(And(Arg0, 0x0F), PRRI)
+            Return (PRR0)
+        }
+
+#define define_link(link, uid, reg)                             \
+        Device(link) {                                          \
+            Name(_HID, EISAID("PNP0C0F"))                       \
+            Name(_UID, uid)                                     \
+            Name(_PRS, ResourceTemplate() {                     \
+                Interrupt(, Level, ActiveHigh, Shared) {        \
+                    5, 10, 11                                   \
+                }                                               \
+            })                                                  \
+            Method(_STA, 0, NotSerialized) {                    \
+                Return (IQST(reg))                              \
+            }                                                   \
+            Method(_DIS, 0, NotSerialized) {                    \
+                Or(reg, 0x80, reg)                              \
+            }                                                   \
+            Method(_CRS, 0, NotSerialized) {                    \
+                Return (IQCR(reg))                              \
+            }                                                   \
+            Method(_SRS, 1, NotSerialized) {                    \
+                CreateDWordField(Arg0, 0x05, PRRI)              \
+                Store(PRRI, reg)                                \
+            }                                                   \
+        }
+
+        define_link(LNKA, 0, PRQA)
+        define_link(LNKB, 1, PRQB)
+        define_link(LNKC, 2, PRQC)
+        define_link(LNKD, 3, PRQD)
+        define_link(LNKE, 4, PRQE)
+        define_link(LNKF, 5, PRQF)
+        define_link(LNKG, 6, PRQG)
+        define_link(LNKH, 7, PRQH)
+
+#define define_gsi_link(link, uid, gsi)                         \
+        Device(link) {                                          \
+            Name(_HID, EISAID("PNP0C0F"))                       \
+            Name(_UID, uid)                                     \
+            Name(_PRS, ResourceTemplate() {                     \
+                Interrupt(, Level, ActiveHigh, Shared) {        \
+                    gsi                                         \
+                }                                               \
+            })                                                  \
+            Name(_CRS, ResourceTemplate() {                     \
+                Interrupt(, Level, ActiveHigh, Shared) {        \
+                    gsi                                         \
+                }                                               \
+            })                                                  \
+            Method(_SRS, 1, NotSerialized) {                    \
+            }                                                   \
+        }
+
+        define_gsi_link(GSIA, 0, 0x10)
+        define_gsi_link(GSIB, 0, 0x11)
+        define_gsi_link(GSIC, 0, 0x12)
+        define_gsi_link(GSID, 0, 0x13)
+        define_gsi_link(GSIE, 0, 0x14)
+        define_gsi_link(GSIF, 0, 0x15)
+        define_gsi_link(GSIG, 0, 0x16)
+        define_gsi_link(GSIH, 0, 0x17)
+    }
+
+#include "acpi-dsdt-cpu-hotplug.dsl"
+
+
+/****************************************************************
+ * General purpose events
+ ****************************************************************/
+
+    Scope(\_GPE) {
+        Name(_HID, "ACPI0006")
+
+        Method(_L00) {
+        }
+        Method(_L01) {
+            // CPU hotplug event
+            \_SB.PRSC()
+        }
+        Method(_L02) {
+        }
+        Method(_L03) {
+        }
+        Method(_L04) {
+        }
+        Method(_L05) {
+        }
+        Method(_L06) {
+        }
+        Method(_L07) {
+        }
+        Method(_L08) {
+        }
+        Method(_L09) {
+        }
+        Method(_L0A) {
+        }
+        Method(_L0B) {
+        }
+        Method(_L0C) {
+        }
+        Method(_L0D) {
+        }
+        Method(_L0E) {
+        }
+        Method(_L0F) {
+        }
+    }
+}
diff --git a/hw/i386/ssdt-misc.dsl b/hw/i386/ssdt-misc.dsl
new file mode 100644
index 0000000..a4484b8
--- /dev/null
+++ b/hw/i386/ssdt-misc.dsl
@@ -0,0 +1,119 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+ACPI_EXTRACT_ALL_CODE ssdp_misc_aml
+
+DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1)
+{
+
+/****************************************************************
+ * PCI memory ranges
+ ****************************************************************/
+
+    Scope(\) {
+       ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_start
+       Name(P0S, 0x12345678)
+       ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_end
+       Name(P0E, 0x12345678)
+       ACPI_EXTRACT_NAME_BYTE_CONST acpi_pci64_valid
+       Name(P1V, 0x12)
+       ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_start
+       Name(P1S, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
+       ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_end
+       Name(P1E, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
+       ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_length
+       Name(P1L, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
+    }
+
+
+/****************************************************************
+ * Suspend
+ ****************************************************************/
+
+    Scope(\) {
+    /*
+     * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off) type codes:
+     * must match piix4 emulation.
+     */
+
+        ACPI_EXTRACT_NAME_STRING acpi_s3_name
+        Name(_S3, Package(0x04) {
+            One,  /* PM1a_CNT.SLP_TYP */
+            One,  /* PM1b_CNT.SLP_TYP */
+            Zero,  /* reserved */
+            Zero   /* reserved */
+        })
+        ACPI_EXTRACT_NAME_STRING acpi_s4_name
+        ACPI_EXTRACT_PKG_START acpi_s4_pkg
+        Name(_S4, Package(0x04) {
+            0x2,  /* PM1a_CNT.SLP_TYP */
+            0x2,  /* PM1b_CNT.SLP_TYP */
+            Zero,  /* reserved */
+            Zero   /* reserved */
+        })
+        Name(_S5, Package(0x04) {
+            Zero,  /* PM1a_CNT.SLP_TYP */
+            Zero,  /* PM1b_CNT.SLP_TYP */
+            Zero,  /* reserved */
+            Zero   /* reserved */
+        })
+    }
+
+    External(\_SB.PCI0, DeviceObj)
+    External(\_SB.PCI0.ISA, DeviceObj)
+
+    Scope(\_SB.PCI0.ISA) {
+        Device(PEVT) {
+            Name(_HID, "QEMU0001")
+            /* PEST will be patched to be Zero if no such device */
+            ACPI_EXTRACT_NAME_WORD_CONST ssdt_isa_pest
+            Name(PEST, 0xFFFF)
+            OperationRegion(PEOR, SystemIO, PEST, 0x01)
+            Field(PEOR, ByteAcc, NoLock, Preserve) {
+                PEPT,   8,
+            }
+
+            Method(_STA, 0, NotSerialized) {
+                Store(PEST, Local0)
+                If (LEqual(Local0, Zero)) {
+                    Return (0x00)
+                } Else {
+                    Return (0x0F)
+                }
+            }
+
+            Method(RDPT, 0, NotSerialized) {
+                Store(PEPT, Local0)
+                Return (Local0)
+            }
+
+            Method(WRPT, 1, NotSerialized) {
+                Store(Arg0, PEPT)
+            }
+
+            Name(_CRS, ResourceTemplate() {
+                IO(Decode16, 0x00, 0x00, 0x01, 0x01, IO)
+            })
+
+            CreateWordField(_CRS, IO._MIN, IOMN)
+            CreateWordField(_CRS, IO._MAX, IOMX)
+
+            Method(_INI, 0, NotSerialized) {
+                Store(PEST, IOMN)
+                Store(PEST, IOMX)
+            }
+        }
+    }
+}
diff --git a/hw/i386/ssdt-pcihp.dsl b/hw/i386/ssdt-pcihp.dsl
new file mode 100644
index 0000000..d29a5b9
--- /dev/null
+++ b/hw/i386/ssdt-pcihp.dsl
@@ -0,0 +1,51 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+ACPI_EXTRACT_ALL_CODE ssdp_pcihp_aml
+
+DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
+{
+
+/****************************************************************
+ * PCI hotplug
+ ****************************************************************/
+
+    /* Objects supplied by DSDT */
+    External(\_SB.PCI0, DeviceObj)
+    External(\_SB.PCI0.PCEJ, MethodObj)
+
+    Scope(\_SB.PCI0) {
+
+        /* Bulk generated PCI hotplug devices */
+        ACPI_EXTRACT_DEVICE_START ssdt_pcihp_start
+        ACPI_EXTRACT_DEVICE_END ssdt_pcihp_end
+        ACPI_EXTRACT_DEVICE_STRING ssdt_pcihp_name
+
+        // Method _EJ0 can be patched by BIOS to EJ0_
+        // at runtime, if the slot is detected to not support hotplug.
+        // Extract the offset of the address dword and the
+        // _EJ0 name to allow this patching.
+        Device(SAA) {
+            ACPI_EXTRACT_NAME_BYTE_CONST ssdt_pcihp_id
+            Name(_SUN, 0xAA)
+            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcihp_adr
+            Name(_ADR, 0xAA0000)
+            ACPI_EXTRACT_METHOD_STRING ssdt_pcihp_ej0
+            Method(_EJ0, 1) {
+                Return (PCEJ(_SUN))
+            }
+        }
+    }
+}
diff --git a/hw/i386/ssdt-proc.dsl b/hw/i386/ssdt-proc.dsl
new file mode 100644
index 0000000..58333c7
--- /dev/null
+++ b/hw/i386/ssdt-proc.dsl
@@ -0,0 +1,63 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* This file is the basis for the ssdt table generated in src/acpi.c.
+ * It defines the contents of the per-cpu Processor() object.  At
+ * runtime, a dynamically generated SSDT will contain one copy of this
+ * AML snippet for every possible cpu in the system.  The objects will
+ * be placed in the \_SB_ namespace.
+ *
+ * In addition to the aml code generated from this file, the
+ * src/acpi.c file creates a NTFY method with an entry for each cpu:
+ *     Method(NTFY, 2) {
+ *         If (LEqual(Arg0, 0x00)) { Notify(CP00, Arg1) }
+ *         If (LEqual(Arg0, 0x01)) { Notify(CP01, Arg1) }
+ *         ...
+ *     }
+ * and a CPON array with the list of active and inactive cpus:
+ *     Name(CPON, Package() { One, One, ..., Zero, Zero, ... })
+ */
+
+ACPI_EXTRACT_ALL_CODE ssdp_proc_aml
+
+DefinitionBlock ("ssdt-proc.aml", "SSDT", 0x01, "BXPC", "BXSSDT", 0x1)
+{
+    ACPI_EXTRACT_PROCESSOR_START ssdt_proc_start
+    ACPI_EXTRACT_PROCESSOR_END ssdt_proc_end
+    ACPI_EXTRACT_PROCESSOR_STRING ssdt_proc_name
+    Processor(CPAA, 0xAA, 0x0000b010, 0x06) {
+        ACPI_EXTRACT_NAME_BYTE_CONST ssdt_proc_id
+        Name(ID, 0xAA)
+/*
+ * The src/acpi.c code requires the above ACP_EXTRACT tags so that it can update
+ * CPAA and 0xAA with the appropriate CPU id (see
+ * SD_OFFSET_CPUHEX/CPUID1/CPUID2).  Don't change the above without
+ * also updating the C code.
+ */
+        Name(_HID, "ACPI0007")
+        External(CPMA, MethodObj)
+        External(CPST, MethodObj)
+        External(CPEJ, MethodObj)
+        Method(_MAT, 0) {
+            Return (CPMA(ID))
+        }
+        Method(_STA, 0) {
+            Return (CPST(ID))
+        }
+        Method(_EJ0, 1, NotSerialized) {
+            CPEJ(ID, Arg0)
+        }
+    }
+}
diff --git a/scripts/acpi_extract.py b/scripts/acpi_extract.py
new file mode 100755
index 0000000..22ea468
--- /dev/null
+++ b/scripts/acpi_extract.py
@@ -0,0 +1,362 @@
+#!/usr/bin/python
+# Copyright (C) 2011 Red Hat, Inc., Michael S. Tsirkin <mst@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+# Process mixed ASL/AML listing (.lst file) produced by iasl -l
+# Locate and execute ACPI_EXTRACT directives, output offset info
+#
+# Documentation of ACPI_EXTRACT_* directive tags:
+#
+# These directive tags output offset information from AML for BIOS runtime
+# table generation.
+# Each directive is of the form:
+# ACPI_EXTRACT_<TYPE> <array_name> <Operator> (...)
+# and causes the extractor to create an array
+# named <array_name> with offset, in the generated AML,
+# of an object of a given type in the following <Operator>.
+#
+# A directive must fit on a single code line.
+#
+# Object type in AML is verified, a mismatch causes a build failure.
+#
+# Directives and operators currently supported are:
+# ACPI_EXTRACT_NAME_DWORD_CONST - extract a Dword Const object from Name()
+# ACPI_EXTRACT_NAME_WORD_CONST - extract a Word Const object from Name()
+# ACPI_EXTRACT_NAME_BYTE_CONST - extract a Byte Const object from Name()
+# ACPI_EXTRACT_METHOD_STRING - extract a NameString from Method()
+# ACPI_EXTRACT_NAME_STRING - extract a NameString from Name()
+# ACPI_EXTRACT_PROCESSOR_START - start of Processor() block
+# ACPI_EXTRACT_PROCESSOR_STRING - extract a NameString from Processor()
+# ACPI_EXTRACT_PROCESSOR_END - offset at last byte of Processor() + 1
+# ACPI_EXTRACT_PKG_START - start of Package block
+#
+# ACPI_EXTRACT_ALL_CODE - create an array storing the generated AML bytecode
+#
+# ACPI_EXTRACT is not allowed anywhere else in code, except in comments.
+
+import re;
+import sys;
+import fileinput;
+
+aml = []
+asl = []
+output = {}
+debug = ""
+
+class asl_line:
+    line = None
+    lineno = None
+    aml_offset = None
+
+def die(diag):
+    sys.stderr.write("Error: %s; %s\n" % (diag, debug))
+    sys.exit(1)
+
+#Store an ASL command, matching AML offset, and input line (for debugging)
+def add_asl(lineno, line):
+    l = asl_line()
+    l.line = line
+    l.lineno = lineno
+    l.aml_offset = len(aml)
+    asl.append(l)
+
+#Store an AML byte sequence
+#Verify that offset output by iasl matches # of bytes so far
+def add_aml(offset, line):
+    o = int(offset, 16);
+    # Sanity check: offset must match size of code so far
+    if (o != len(aml)):
+        die("Offset 0x%x != 0x%x" % (o, len(aml)))
+    # Strip any trailing dots and ASCII dump after "
+    line = re.sub(r'\s*\.*\s*".*$',"", line)
+    # Strip traling whitespace
+    line = re.sub(r'\s+$',"", line)
+    # Strip leading whitespace
+    line = re.sub(r'^\s+',"", line)
+    # Split on whitespace
+    code = re.split(r'\s+', line)
+    for c in code:
+        # Require a legal hex number, two digits
+        if (not(re.search(r'^[0-9A-Fa-f][0-9A-Fa-f]$', c))):
+            die("Unexpected octet %s" % c);
+        aml.append(int(c, 16));
+
+# Process aml bytecode array, decoding AML
+def aml_pkglen_bytes(offset):
+    # PkgLength can be multibyte. Bits 8-7 give the # of extra bytes.
+    pkglenbytes = aml[offset] >> 6;
+    return pkglenbytes + 1
+
+def aml_pkglen(offset):
+    pkgstart = offset
+    pkglenbytes = aml_pkglen_bytes(offset)
+    pkglen = aml[offset] & 0x3F
+    # If multibyte, first nibble only uses bits 0-3
+    if ((pkglenbytes > 1) and (pkglen & 0x30)):
+        die("PkgLen bytes 0x%x but first nibble 0x%x expected 0x0X" %
+            (pkglen, pkglen))
+    offset += 1
+    pkglenbytes -= 1
+    for i in range(pkglenbytes):
+        pkglen |= aml[offset + i] << (i * 8 + 4)
+    if (len(aml) < pkgstart + pkglen):
+        die("PckgLen 0x%x at offset 0x%x exceeds AML size 0x%x" %
+            (pkglen, offset, len(aml)))
+    return pkglen
+
+# Given method offset, find its NameString offset
+def aml_method_string(offset):
+    #0x14 MethodOp PkgLength NameString MethodFlags TermList
+    if (aml[offset] != 0x14):
+        die( "Method offset 0x%x: expected 0x14 actual 0x%x" %
+             (offset, aml[offset]));
+    offset += 1;
+    pkglenbytes = aml_pkglen_bytes(offset)
+    offset += pkglenbytes;
+    return offset;
+
+# Given name offset, find its NameString offset
+def aml_name_string(offset):
+    #0x08 NameOp NameString DataRef
+    if (aml[offset] != 0x08):
+        die( "Name offset 0x%x: expected 0x08 actual 0x%x" %
+             (offset, aml[offset]));
+    offset += 1
+    # Block Name Modifier. Skip it.
+    if (aml[offset] == 0x5c or aml[offset] == 0x5e):
+        offset += 1
+    return offset;
+
+# Given data offset, find 8 byte buffer offset
+def aml_data_buffer8(offset):
+    #0x08 NameOp NameString DataRef
+    expect = [0x11, 0x0B, 0x0A, 0x08]
+    if (aml[offset:offset+4] != expect):
+        die( "Name offset 0x%x: expected %s actual %s" %
+             (offset, aml[offset:offset+4], expect))
+    return offset + len(expect)
+
+# Given data offset, find dword const offset
+def aml_data_dword_const(offset):
+    #0x08 NameOp NameString DataRef
+    if (aml[offset] != 0x0C):
+        die( "Name offset 0x%x: expected 0x0C actual 0x%x" %
+             (offset, aml[offset]));
+    return offset + 1;
+
+# Given data offset, find word const offset
+def aml_data_word_const(offset):
+    #0x08 NameOp NameString DataRef
+    if (aml[offset] != 0x0B):
+        die( "Name offset 0x%x: expected 0x0B actual 0x%x" %
+             (offset, aml[offset]));
+    return offset + 1;
+
+# Given data offset, find byte const offset
+def aml_data_byte_const(offset):
+    #0x08 NameOp NameString DataRef
+    if (aml[offset] != 0x0A):
+        die( "Name offset 0x%x: expected 0x0A actual 0x%x" %
+             (offset, aml[offset]));
+    return offset + 1;
+
+# Find name'd buffer8
+def aml_name_buffer8(offset):
+    return aml_data_buffer8(aml_name_string(offset) + 4)
+
+# Given name offset, find dword const offset
+def aml_name_dword_const(offset):
+    return aml_data_dword_const(aml_name_string(offset) + 4)
+
+# Given name offset, find word const offset
+def aml_name_word_const(offset):
+    return aml_data_word_const(aml_name_string(offset) + 4)
+
+# Given name offset, find byte const offset
+def aml_name_byte_const(offset):
+    return aml_data_byte_const(aml_name_string(offset) + 4)
+
+def aml_device_start(offset):
+    #0x5B 0x82 DeviceOp PkgLength NameString
+    if ((aml[offset] != 0x5B) or (aml[offset + 1] != 0x82)):
+        die( "Name offset 0x%x: expected 0x5B 0x82 actual 0x%x 0x%x" %
+             (offset, aml[offset], aml[offset + 1]));
+    return offset
+
+def aml_device_string(offset):
+    #0x5B 0x82 DeviceOp PkgLength NameString
+    start = aml_device_start(offset)
+    offset += 2
+    pkglenbytes = aml_pkglen_bytes(offset)
+    offset += pkglenbytes
+    return offset
+
+def aml_device_end(offset):
+    start = aml_device_start(offset)
+    offset += 2
+    pkglenbytes = aml_pkglen_bytes(offset)
+    pkglen = aml_pkglen(offset)
+    return offset + pkglen
+
+def aml_processor_start(offset):
+    #0x5B 0x83 ProcessorOp PkgLength NameString ProcID
+    if ((aml[offset] != 0x5B) or (aml[offset + 1] != 0x83)):
+        die( "Name offset 0x%x: expected 0x5B 0x83 actual 0x%x 0x%x" %
+             (offset, aml[offset], aml[offset + 1]));
+    return offset
+
+def aml_processor_string(offset):
+    #0x5B 0x83 ProcessorOp PkgLength NameString ProcID
+    start = aml_processor_start(offset)
+    offset += 2
+    pkglenbytes = aml_pkglen_bytes(offset)
+    offset += pkglenbytes
+    return offset
+
+def aml_processor_end(offset):
+    start = aml_processor_start(offset)
+    offset += 2
+    pkglenbytes = aml_pkglen_bytes(offset)
+    pkglen = aml_pkglen(offset)
+    return offset + pkglen
+
+def aml_package_start(offset):
+    offset = aml_name_string(offset) + 4
+    # 0x12 PkgLength NumElements PackageElementList
+    if (aml[offset] != 0x12):
+        die( "Name offset 0x%x: expected 0x12 actual 0x%x" %
+             (offset, aml[offset]));
+    offset += 1
+    return offset + aml_pkglen_bytes(offset) + 1
+
+lineno = 0
+for line in fileinput.input():
+    # Strip trailing newline
+    line = line.rstrip();
+    # line number and debug string to output in case of errors
+    lineno = lineno + 1
+    debug = "input line %d: %s" % (lineno, line)
+    #ASL listing: space, then line#, then ...., then code
+    pasl = re.compile('^\s+([0-9]+)(:\s\s|\.\.\.\.)\s*')
+    m = pasl.search(line)
+    if (m):
+        add_asl(lineno, pasl.sub("", line));
+    # AML listing: offset in hex, then ...., then code
+    paml = re.compile('^([0-9A-Fa-f]+)(:\s\s|\.\.\.\.)\s*')
+    m = paml.search(line)
+    if (m):
+        add_aml(m.group(1), paml.sub("", line))
+
+# Now go over code
+# Track AML offset of a previous non-empty ASL command
+prev_aml_offset = -1
+for i in range(len(asl)):
+    debug = "input line %d: %s" % (asl[i].lineno, asl[i].line)
+
+    l = asl[i].line
+
+    # skip if not an extract directive
+    a = len(re.findall(r'ACPI_EXTRACT', l))
+    if (not a):
+        # If not empty, store AML offset. Will be used for sanity checks
+        # IASL seems to put {}. at random places in the listing.
+        # Ignore any non-words for the purpose of this test.
+        m = re.search(r'\w+', l)
+        if (m):
+                prev_aml_offset = asl[i].aml_offset
+        continue
+
+    if (a > 1):
+        die("Expected at most one ACPI_EXTRACT per line, actual %d" % a)
+
+    mext = re.search(r'''
+                      ^\s* # leading whitespace
+                      /\*\s* # start C comment
+                      (ACPI_EXTRACT_\w+) # directive: group(1)
+                      \s+ # whitspace separates directive from array name
+                      (\w+) # array name: group(2)
+                      \s*\*/ # end of C comment
+                      \s*$ # trailing whitespace
+                      ''', l, re.VERBOSE)
+    if (not mext):
+        die("Stray ACPI_EXTRACT in input")
+
+    # previous command must have produced some AML,
+    # otherwise we are in a middle of a block
+    if (prev_aml_offset == asl[i].aml_offset):
+        die("ACPI_EXTRACT directive in the middle of a block")
+
+    directive = mext.group(1)
+    array = mext.group(2)
+    offset = asl[i].aml_offset
+
+    if (directive == "ACPI_EXTRACT_ALL_CODE"):
+        if array in output:
+            die("%s directive used more than once" % directive)
+        output[array] = aml
+        continue
+    if (directive == "ACPI_EXTRACT_NAME_BUFFER8"):
+        offset = aml_name_buffer8(offset)
+    elif (directive == "ACPI_EXTRACT_NAME_DWORD_CONST"):
+        offset = aml_name_dword_const(offset)
+    elif (directive == "ACPI_EXTRACT_NAME_WORD_CONST"):
+        offset = aml_name_word_const(offset)
+    elif (directive == "ACPI_EXTRACT_NAME_BYTE_CONST"):
+        offset = aml_name_byte_const(offset)
+    elif (directive == "ACPI_EXTRACT_NAME_STRING"):
+        offset = aml_name_string(offset)
+    elif (directive == "ACPI_EXTRACT_METHOD_STRING"):
+        offset = aml_method_string(offset)
+    elif (directive == "ACPI_EXTRACT_DEVICE_START"):
+        offset = aml_device_start(offset)
+    elif (directive == "ACPI_EXTRACT_DEVICE_STRING"):
+        offset = aml_device_string(offset)
+    elif (directive == "ACPI_EXTRACT_DEVICE_END"):
+        offset = aml_device_end(offset)
+    elif (directive == "ACPI_EXTRACT_PROCESSOR_START"):
+        offset = aml_processor_start(offset)
+    elif (directive == "ACPI_EXTRACT_PROCESSOR_STRING"):
+        offset = aml_processor_string(offset)
+    elif (directive == "ACPI_EXTRACT_PROCESSOR_END"):
+        offset = aml_processor_end(offset)
+    elif (directive == "ACPI_EXTRACT_PKG_START"):
+        offset = aml_package_start(offset)
+    else:
+        die("Unsupported directive %s" % directive)
+
+    if array not in output:
+        output[array] = []
+    output[array].append(offset)
+
+debug = "at end of file"
+
+def get_value_type(maxvalue):
+    #Use type large enough to fit the table
+    if (maxvalue >= 0x10000):
+            return "int"
+    elif (maxvalue >= 0x100):
+            return "short"
+    else:
+            return "char"
+
+# Pretty print output
+for array in output.keys():
+    otype = get_value_type(max(output[array]))
+    odata = []
+    for value in output[array]:
+        odata.append("0x%x" % value)
+    sys.stdout.write("static unsigned %s %s[] = {\n" % (otype, array))
+    sys.stdout.write(",\n".join(odata))
+    sys.stdout.write('\n};\n');
diff --git a/scripts/acpi_extract_preprocess.py b/scripts/acpi_extract_preprocess.py
new file mode 100755
index 0000000..69d10d6
--- /dev/null
+++ b/scripts/acpi_extract_preprocess.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+# Copyright (C) 2011 Red Hat, Inc., Michael S. Tsirkin <mst@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, see <http://www.gnu.org/licenses/>.
+
+# Read a preprocessed ASL listing and put each ACPI_EXTRACT
+# directive in a comment, to make iasl skip it.
+# We also put each directive on a new line, the machinery
+# in tools/acpi_extract.py requires this.
+
+import re;
+import sys;
+import fileinput;
+
+def die(diag):
+    sys.stderr.write("Error: %s\n" % (diag))
+    sys.exit(1)
+
+# Note: () around pattern make split return matched string as part of list
+psplit = re.compile(r''' (
+                          \b # At word boundary
+                          ACPI_EXTRACT_\w+ # directive
+                          \s+ # some whitespace
+                          \w+ # array name
+                         )''', re.VERBOSE);
+
+lineno = 0
+for line in fileinput.input():
+    # line number and debug string to output in case of errors
+    lineno = lineno + 1
+    debug = "input line %d: %s" % (lineno, line.rstrip())
+
+    s = psplit.split(line);
+    # The way split works, each odd item is the matching ACPI_EXTRACT directive.
+    # Put each in a comment, and on a line by itself.
+    for i in range(len(s)):
+        if (i % 2):
+            sys.stdout.write("\n/* %s */\n" % s[i])
+        else:
+            sys.stdout.write(s[i])
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 12/27] acpi: add rules to compile ASL source
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (10 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 11/27] i386: add ACPI table files from seabios Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 13/27] acpi: pre-compiled ASL files Michael S. Tsirkin
                   ` (17 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori
  Cc: pbonzini, imammedo, Laszlo Ersek, afaerber, kraxel

Detect presence of IASL compiler and use it
to process ASL source. If not there, use pre-compiled
files in-tree. Add script to update the in-tree files.

Note: distros are known to silently update iasl
so detect correct iasl flags for the installed version on each run as
opposed to at configure time.

Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 configure              |  9 ++++++++-
 hw/i386/Makefile.objs  | 22 ++++++++++++++++++++++
 scripts/update-acpi.sh |  4 ++++
 3 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 scripts/update-acpi.sh

diff --git a/configure b/configure
index 2b83936..15405e1 100755
--- a/configure
+++ b/configure
@@ -119,6 +119,7 @@ path_of() {
 # default parameters
 source_path=`dirname "$0"`
 cpu=""
+iasl="iasl"
 interp_prefix="/usr/gnemul/qemu-%M"
 static="no"
 cross_prefix=""
@@ -257,6 +258,8 @@ for opt do
   ;;
   --cxx=*) CXX="$optarg"
   ;;
+  --iasl=*) iasl="$optarg"
+  ;;
   --source-path=*) source_path="$optarg"
   ;;
   --cpu=*) cpu="$optarg"
@@ -1055,6 +1058,7 @@ echo "Advanced options (experts only):"
 echo "  --source-path=PATH       path of source code [$source_path]"
 echo "  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]"
 echo "  --cc=CC                  use C compiler CC [$cc]"
+echo "  --iasl=IASL              use ACPI compiler IASL [$iasl]"
 echo "  --host-cc=CC             use C compiler CC [$host_cc] for code run at"
 echo "                           build time"
 echo "  --cxx=CXX                use C++ compiler CXX [$cxx]"
@@ -4239,6 +4243,9 @@ else
 fi
 echo "PYTHON=$python" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
+if $iasl -h > /dev/null 2>&1; then
+  echo "IASL=$iasl" >> $config_host_mak
+fi
 echo "CC_I386=$cc_i386" >> $config_host_mak
 echo "HOST_CC=$host_cc" >> $config_host_mak
 echo "CXX=$cxx" >> $config_host_mak
@@ -4691,7 +4698,7 @@ for rom in seabios vgabios ; do
     echo "BCC=bcc" >> $config_mak
     echo "CPP=$cpp" >> $config_mak
     echo "OBJCOPY=objcopy" >> $config_mak
-    echo "IASL=iasl" >> $config_mak
+    echo "IASL=$iasl" >> $config_mak
     echo "LD=$ld" >> $config_mak
 done
 
diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
index 45e6165..f950707 100644
--- a/hw/i386/Makefile.objs
+++ b/hw/i386/Makefile.objs
@@ -5,3 +5,25 @@ obj-y += pc_sysfw.o
 obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
 
 obj-y += kvmvapic.o
+
+iasl-option=$(shell if test -z "`$(1) $(2) 2>&1 > /dev/null`" \
+    ; then echo "$(2)"; else echo "$(3)"; fi ;)
+
+ifdef IASL
+#IASL Present. Generate hex files from .dsl
+hw/i386/%.hex: $(SRC_PATH)/hw/i386/%.dsl $(SRC_PATH)/scripts/acpi_extract_preprocess.py $(SRC_PATH)/scripts/acpi_extract.py
+	$(call quiet-command, cpp -P $< -o $*.dsl.i.orig, "  CPP $(TARGET_DIR)$*.dsl.i.orig")
+	$(call quiet-command, $(PYTHON) $(SRC_PATH)/scripts/acpi_extract_preprocess.py $*.dsl.i.orig > $*.dsl.i, "  ACPI_PREPROCESS $(TARGET_DIR)$*.dsl.i")
+	$(call quiet-command, $(IASL) $(call iasl-option,$(IASL),-Pn,) -vs -l -tc -p $* $*.dsl.i $(if $(V), , > /dev/null) 2>&1 ,"  IASL $(TARGET_DIR)$*.dsl.i")
+	$(call quiet-command, $(SRC_PATH)/scripts/acpi_extract.py $*.lst > $*.off, "  ACPI_EXTRACT $(TARGET_DIR)$*.off")
+	$(call quiet-command, cat $*.off > $@, "  CAT $(TARGET_DIR)$@")
+else
+#IASL Not present. Restore pre-generated hex files.
+hw/i386/%.hex: $(SRC_PATH)/hw/i386/%.hex.generated
+	$(call quiet-command, cp -f $< $@, "  CP $(TARGET_DIR)$@")
+endif
+
+.PHONY: cleanhex
+cleanhex:
+	rm -f hw/i386/*hex
+clean: cleanhex
diff --git a/scripts/update-acpi.sh b/scripts/update-acpi.sh
new file mode 100644
index 0000000..b5f05ff
--- /dev/null
+++ b/scripts/update-acpi.sh
@@ -0,0 +1,4 @@
+cd x86_64-softmmu
+for file in hw/i386/*.hex; do
+    cp -f $file ../$file.generated
+done
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 13/27] acpi: pre-compiled ASL files
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (11 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 12/27] acpi: add rules to compile ASL source Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 14/27] acpi: ssdt pcihp: updat generated file Michael S. Tsirkin
                   ` (16 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Add pre-compiled ASL files. Useful for systems that
do not have IASL.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/acpi-dsdt.hex.generated     | 4409 +++++++++++++++++++++
 hw/i386/q35-acpi-dsdt.hex.generated | 7346 +++++++++++++++++++++++++++++++++++
 hw/i386/ssdt-misc.hex.generated     |  386 ++
 hw/i386/ssdt-pcihp.hex.generated    |  108 +
 hw/i386/ssdt-proc.hex.generated     |  134 +
 5 files changed, 12383 insertions(+)
 create mode 100644 hw/i386/acpi-dsdt.hex.generated
 create mode 100644 hw/i386/q35-acpi-dsdt.hex.generated
 create mode 100644 hw/i386/ssdt-misc.hex.generated
 create mode 100644 hw/i386/ssdt-pcihp.hex.generated
 create mode 100644 hw/i386/ssdt-proc.hex.generated

diff --git a/hw/i386/acpi-dsdt.hex.generated b/hw/i386/acpi-dsdt.hex.generated
new file mode 100644
index 0000000..2c01107
--- /dev/null
+++ b/hw/i386/acpi-dsdt.hex.generated
@@ -0,0 +1,4409 @@
+static unsigned char AcpiDsdtAmlCode[] = {
+0x44,
+0x53,
+0x44,
+0x54,
+0x37,
+0x11,
+0x0,
+0x0,
+0x1,
+0xe0,
+0x42,
+0x58,
+0x50,
+0x43,
+0x0,
+0x0,
+0x42,
+0x58,
+0x44,
+0x53,
+0x44,
+0x54,
+0x0,
+0x0,
+0x1,
+0x0,
+0x0,
+0x0,
+0x49,
+0x4e,
+0x54,
+0x4c,
+0x23,
+0x8,
+0x13,
+0x20,
+0x10,
+0x49,
+0x4,
+0x5c,
+0x0,
+0x5b,
+0x80,
+0x44,
+0x42,
+0x47,
+0x5f,
+0x1,
+0xb,
+0x2,
+0x4,
+0x1,
+0x5b,
+0x81,
+0xb,
+0x44,
+0x42,
+0x47,
+0x5f,
+0x1,
+0x44,
+0x42,
+0x47,
+0x42,
+0x8,
+0x14,
+0x2c,
+0x44,
+0x42,
+0x55,
+0x47,
+0x1,
+0x98,
+0x68,
+0x60,
+0x96,
+0x60,
+0x60,
+0x74,
+0x87,
+0x60,
+0x1,
+0x61,
+0x70,
+0x0,
+0x62,
+0xa2,
+0x10,
+0x95,
+0x62,
+0x61,
+0x70,
+0x83,
+0x88,
+0x60,
+0x62,
+0x0,
+0x44,
+0x42,
+0x47,
+0x42,
+0x75,
+0x62,
+0x70,
+0xa,
+0xa,
+0x44,
+0x42,
+0x47,
+0x42,
+0x10,
+0x22,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x5b,
+0x82,
+0x1b,
+0x50,
+0x43,
+0x49,
+0x30,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xa,
+0x3,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0x0,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x1,
+0x10,
+0x4e,
+0x15,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x8,
+0x43,
+0x52,
+0x45,
+0x53,
+0x11,
+0x42,
+0x7,
+0xa,
+0x6e,
+0x88,
+0xd,
+0x0,
+0x2,
+0xc,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xff,
+0x0,
+0x0,
+0x0,
+0x0,
+0x1,
+0x47,
+0x1,
+0xf8,
+0xc,
+0xf8,
+0xc,
+0x1,
+0x8,
+0x88,
+0xd,
+0x0,
+0x1,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0x0,
+0xf7,
+0xc,
+0x0,
+0x0,
+0xf8,
+0xc,
+0x88,
+0xd,
+0x0,
+0x1,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0xd,
+0xff,
+0xff,
+0x0,
+0x0,
+0x0,
+0xf3,
+0x87,
+0x17,
+0x0,
+0x0,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0xff,
+0xff,
+0xb,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x2,
+0x0,
+0x87,
+0x17,
+0x0,
+0x0,
+0xc,
+0x1,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xe0,
+0xff,
+0xff,
+0xbf,
+0xfe,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xc0,
+0x1e,
+0x79,
+0x0,
+0x8,
+0x43,
+0x52,
+0x36,
+0x34,
+0x11,
+0x33,
+0xa,
+0x30,
+0x8a,
+0x2b,
+0x0,
+0x0,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x80,
+0x0,
+0x0,
+0x0,
+0xff,
+0xff,
+0xff,
+0xff,
+0xff,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x80,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x41,
+0xa,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0x8a,
+0x43,
+0x52,
+0x45,
+0x53,
+0xa,
+0x5c,
+0x50,
+0x53,
+0x33,
+0x32,
+0x8a,
+0x43,
+0x52,
+0x45,
+0x53,
+0xa,
+0x60,
+0x50,
+0x45,
+0x33,
+0x32,
+0x8a,
+0x43,
+0x52,
+0x45,
+0x53,
+0xa,
+0x68,
+0x50,
+0x4c,
+0x33,
+0x32,
+0x70,
+0x50,
+0x30,
+0x53,
+0x5f,
+0x50,
+0x53,
+0x33,
+0x32,
+0x70,
+0x50,
+0x30,
+0x45,
+0x5f,
+0x50,
+0x45,
+0x33,
+0x32,
+0x70,
+0x72,
+0x74,
+0x50,
+0x30,
+0x45,
+0x5f,
+0x50,
+0x30,
+0x53,
+0x5f,
+0x0,
+0x1,
+0x0,
+0x50,
+0x4c,
+0x33,
+0x32,
+0xa0,
+0xc,
+0x93,
+0x50,
+0x31,
+0x56,
+0x5f,
+0x0,
+0xa4,
+0x43,
+0x52,
+0x45,
+0x53,
+0x8f,
+0x43,
+0x52,
+0x36,
+0x34,
+0xa,
+0xe,
+0x50,
+0x53,
+0x36,
+0x34,
+0x8f,
+0x43,
+0x52,
+0x36,
+0x34,
+0xa,
+0x16,
+0x50,
+0x45,
+0x36,
+0x34,
+0x8f,
+0x43,
+0x52,
+0x36,
+0x34,
+0xa,
+0x26,
+0x50,
+0x4c,
+0x36,
+0x34,
+0x70,
+0x50,
+0x31,
+0x53,
+0x5f,
+0x50,
+0x53,
+0x36,
+0x34,
+0x70,
+0x50,
+0x31,
+0x45,
+0x5f,
+0x50,
+0x45,
+0x36,
+0x34,
+0x70,
+0x50,
+0x31,
+0x4c,
+0x5f,
+0x50,
+0x4c,
+0x36,
+0x34,
+0x84,
+0x43,
+0x52,
+0x45,
+0x53,
+0x43,
+0x52,
+0x36,
+0x34,
+0x60,
+0xa4,
+0x60,
+0x10,
+0x4d,
+0x8,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x5b,
+0x82,
+0x45,
+0x8,
+0x48,
+0x50,
+0x45,
+0x54,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x1,
+0x3,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x5b,
+0x80,
+0x48,
+0x50,
+0x54,
+0x4d,
+0x0,
+0xc,
+0x0,
+0x0,
+0xd0,
+0xfe,
+0xb,
+0x0,
+0x4,
+0x5b,
+0x81,
+0x10,
+0x48,
+0x50,
+0x54,
+0x4d,
+0x13,
+0x56,
+0x45,
+0x4e,
+0x44,
+0x20,
+0x50,
+0x52,
+0x44,
+0x5f,
+0x20,
+0x14,
+0x36,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x56,
+0x45,
+0x4e,
+0x44,
+0x60,
+0x70,
+0x50,
+0x52,
+0x44,
+0x5f,
+0x61,
+0x7a,
+0x60,
+0xa,
+0x10,
+0x60,
+0xa0,
+0xc,
+0x91,
+0x93,
+0x60,
+0x0,
+0x93,
+0x60,
+0xb,
+0xff,
+0xff,
+0xa4,
+0x0,
+0xa0,
+0xe,
+0x91,
+0x93,
+0x61,
+0x0,
+0x94,
+0x61,
+0xc,
+0x0,
+0xe1,
+0xf5,
+0x5,
+0xa4,
+0x0,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x11,
+0xa,
+0xe,
+0x86,
+0x9,
+0x0,
+0x0,
+0x0,
+0x0,
+0xd0,
+0xfe,
+0x0,
+0x4,
+0x0,
+0x0,
+0x79,
+0x0,
+0x10,
+0x40,
+0x6,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x82,
+0x43,
+0x5,
+0x56,
+0x47,
+0x41,
+0x5f,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0xc,
+0x0,
+0x0,
+0x2,
+0x0,
+0x5b,
+0x80,
+0x50,
+0x43,
+0x49,
+0x43,
+0x2,
+0x0,
+0xa,
+0x4,
+0x5b,
+0x81,
+0xb,
+0x50,
+0x43,
+0x49,
+0x43,
+0x3,
+0x56,
+0x45,
+0x4e,
+0x44,
+0x20,
+0x14,
+0x8,
+0x5f,
+0x53,
+0x31,
+0x44,
+0x0,
+0xa4,
+0x0,
+0x14,
+0x8,
+0x5f,
+0x53,
+0x32,
+0x44,
+0x0,
+0xa4,
+0x0,
+0x14,
+0x19,
+0x5f,
+0x53,
+0x33,
+0x44,
+0x0,
+0xa0,
+0xe,
+0x93,
+0x56,
+0x45,
+0x4e,
+0x44,
+0xc,
+0x36,
+0x1b,
+0x0,
+0x1,
+0xa4,
+0xa,
+0x3,
+0xa1,
+0x3,
+0xa4,
+0x0,
+0x10,
+0x25,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x82,
+0x19,
+0x50,
+0x58,
+0x31,
+0x33,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0xc,
+0x3,
+0x0,
+0x1,
+0x0,
+0x5b,
+0x80,
+0x50,
+0x31,
+0x33,
+0x43,
+0x2,
+0x0,
+0xa,
+0xff,
+0x10,
+0x46,
+0x5,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x82,
+0x49,
+0x4,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0xc,
+0x0,
+0x0,
+0x1,
+0x0,
+0x5b,
+0x80,
+0x50,
+0x34,
+0x30,
+0x43,
+0x2,
+0xa,
+0x60,
+0xa,
+0x4,
+0x5b,
+0x81,
+0x26,
+0x5e,
+0x2e,
+0x50,
+0x58,
+0x31,
+0x33,
+0x50,
+0x31,
+0x33,
+0x43,
+0x0,
+0x0,
+0x48,
+0x2f,
+0x0,
+0x7,
+0x4c,
+0x50,
+0x45,
+0x4e,
+0x1,
+0x0,
+0x38,
+0x0,
+0x3,
+0x43,
+0x41,
+0x45,
+0x4e,
+0x1,
+0x0,
+0x3,
+0x43,
+0x42,
+0x45,
+0x4e,
+0x1,
+0x8,
+0x46,
+0x44,
+0x45,
+0x4e,
+0x1,
+0x10,
+0x4c,
+0x1b,
+0x2f,
+0x3,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x5b,
+0x82,
+0x2d,
+0x52,
+0x54,
+0x43,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xb,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x18,
+0xa,
+0x15,
+0x47,
+0x1,
+0x70,
+0x0,
+0x70,
+0x0,
+0x10,
+0x2,
+0x22,
+0x0,
+0x1,
+0x47,
+0x1,
+0x72,
+0x0,
+0x72,
+0x0,
+0x2,
+0x6,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x37,
+0x4b,
+0x42,
+0x44,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x3,
+0x3,
+0x14,
+0x9,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x18,
+0xa,
+0x15,
+0x47,
+0x1,
+0x60,
+0x0,
+0x60,
+0x0,
+0x1,
+0x1,
+0x47,
+0x1,
+0x64,
+0x0,
+0x64,
+0x0,
+0x1,
+0x1,
+0x22,
+0x2,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x27,
+0x4d,
+0x4f,
+0x55,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xf,
+0x13,
+0x14,
+0x9,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x8,
+0xa,
+0x5,
+0x22,
+0x0,
+0x10,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x4a,
+0x4,
+0x46,
+0x44,
+0x43,
+0x30,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x7,
+0x0,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x46,
+0x44,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x1b,
+0xa,
+0x18,
+0x47,
+0x1,
+0xf2,
+0x3,
+0xf2,
+0x3,
+0x0,
+0x4,
+0x47,
+0x1,
+0xf7,
+0x3,
+0xf7,
+0x3,
+0x0,
+0x1,
+0x22,
+0x40,
+0x0,
+0x2a,
+0x4,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x3e,
+0x4c,
+0x50,
+0x54,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x4,
+0x0,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x4c,
+0x50,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x10,
+0xa,
+0xd,
+0x47,
+0x1,
+0x78,
+0x3,
+0x78,
+0x3,
+0x8,
+0x8,
+0x22,
+0x80,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x43,
+0x4f,
+0x4d,
+0x31,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x5,
+0x1,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x1,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x43,
+0x41,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x10,
+0xa,
+0xd,
+0x47,
+0x1,
+0xf8,
+0x3,
+0xf8,
+0x3,
+0x0,
+0x8,
+0x22,
+0x10,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x46,
+0x4,
+0x43,
+0x4f,
+0x4d,
+0x32,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x5,
+0x1,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x2,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x43,
+0x42,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x10,
+0xa,
+0xd,
+0x47,
+0x1,
+0xf8,
+0x2,
+0xf8,
+0x2,
+0x0,
+0x8,
+0x22,
+0x8,
+0x0,
+0x79,
+0x0,
+0x10,
+0x4b,
+0x8,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x80,
+0x50,
+0x43,
+0x53,
+0x54,
+0x1,
+0xb,
+0x0,
+0xae,
+0xa,
+0x8,
+0x5b,
+0x81,
+0x10,
+0x50,
+0x43,
+0x53,
+0x54,
+0x43,
+0x50,
+0x43,
+0x49,
+0x55,
+0x20,
+0x50,
+0x43,
+0x49,
+0x44,
+0x20,
+0x5b,
+0x80,
+0x53,
+0x45,
+0x4a,
+0x5f,
+0x1,
+0xb,
+0x8,
+0xae,
+0xa,
+0x4,
+0x5b,
+0x81,
+0xb,
+0x53,
+0x45,
+0x4a,
+0x5f,
+0x43,
+0x42,
+0x30,
+0x45,
+0x4a,
+0x20,
+0x14,
+0x11,
+0x50,
+0x43,
+0x45,
+0x4a,
+0x1,
+0x70,
+0x79,
+0x1,
+0x68,
+0x0,
+0x42,
+0x30,
+0x45,
+0x4a,
+0xa4,
+0x0,
+0x14,
+0x36,
+0x50,
+0x43,
+0x4e,
+0x46,
+0x0,
+0x70,
+0x0,
+0x60,
+0xa2,
+0x2c,
+0x95,
+0x60,
+0xa,
+0x1f,
+0x75,
+0x60,
+0xa0,
+0x11,
+0x7b,
+0x50,
+0x43,
+0x49,
+0x55,
+0x79,
+0x1,
+0x60,
+0x0,
+0x0,
+0x50,
+0x43,
+0x4e,
+0x54,
+0x60,
+0x1,
+0xa0,
+0x12,
+0x7b,
+0x50,
+0x43,
+0x49,
+0x44,
+0x79,
+0x1,
+0x60,
+0x0,
+0x0,
+0x50,
+0x43,
+0x4e,
+0x54,
+0x60,
+0xa,
+0x3,
+0x10,
+0x4a,
+0xa0,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x10,
+0x47,
+0x74,
+0x50,
+0x43,
+0x49,
+0x30,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x54,
+0x12,
+0x4b,
+0x73,
+0x80,
+0x12,
+0xb,
+0x4,
+0xb,
+0xff,
+0xff,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xb,
+0x4,
+0xb,
+0xff,
+0xff,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xc,
+0x4,
+0xb,
+0xff,
+0xff,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xc,
+0x4,
+0xb,
+0xff,
+0xff,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x53,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x5b,
+0x81,
+0x24,
+0x2f,
+0x3,
+0x50,
+0x43,
+0x49,
+0x30,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x50,
+0x34,
+0x30,
+0x43,
+0x1,
+0x50,
+0x52,
+0x51,
+0x30,
+0x8,
+0x50,
+0x52,
+0x51,
+0x31,
+0x8,
+0x50,
+0x52,
+0x51,
+0x32,
+0x8,
+0x50,
+0x52,
+0x51,
+0x33,
+0x8,
+0x14,
+0x13,
+0x49,
+0x51,
+0x53,
+0x54,
+0x1,
+0xa0,
+0x9,
+0x7b,
+0xa,
+0x80,
+0x68,
+0x0,
+0xa4,
+0xa,
+0x9,
+0xa4,
+0xa,
+0xb,
+0x14,
+0x36,
+0x49,
+0x51,
+0x43,
+0x52,
+0x1,
+0x8,
+0x50,
+0x52,
+0x52,
+0x30,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x0,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8a,
+0x50,
+0x52,
+0x52,
+0x30,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0xa0,
+0xb,
+0x95,
+0x68,
+0xa,
+0x80,
+0x70,
+0x68,
+0x50,
+0x52,
+0x52,
+0x49,
+0xa4,
+0x50,
+0x52,
+0x52,
+0x30,
+0x5b,
+0x82,
+0x4c,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x30,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x30,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x30,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x30,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x30,
+0x5b,
+0x82,
+0x4c,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x1,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x31,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x31,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x31,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x31,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x31,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x2,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x32,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x32,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x32,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x32,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x32,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x3,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x33,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x33,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x33,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x33,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x33,
+0x5b,
+0x82,
+0x4f,
+0x4,
+0x4c,
+0x4e,
+0x4b,
+0x53,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x4,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x9,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x9,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0xa,
+0xb,
+0x14,
+0x6,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x14,
+0xb,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x10,
+0x47,
+0xe,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x14,
+0x35,
+0x43,
+0x50,
+0x4d,
+0x41,
+0x1,
+0x70,
+0x83,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x68,
+0x0,
+0x60,
+0x70,
+0x11,
+0xb,
+0xa,
+0x8,
+0x0,
+0x8,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x61,
+0x70,
+0x68,
+0x88,
+0x61,
+0xa,
+0x2,
+0x0,
+0x70,
+0x68,
+0x88,
+0x61,
+0xa,
+0x3,
+0x0,
+0x70,
+0x60,
+0x88,
+0x61,
+0xa,
+0x4,
+0x0,
+0xa4,
+0x61,
+0x14,
+0x1a,
+0x43,
+0x50,
+0x53,
+0x54,
+0x1,
+0x70,
+0x83,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x68,
+0x0,
+0x60,
+0xa0,
+0x5,
+0x60,
+0xa4,
+0xa,
+0xf,
+0xa1,
+0x3,
+0xa4,
+0x0,
+0x14,
+0xa,
+0x43,
+0x50,
+0x45,
+0x4a,
+0x2,
+0x5b,
+0x22,
+0xa,
+0xc8,
+0x5b,
+0x80,
+0x50,
+0x52,
+0x53,
+0x54,
+0x1,
+0xb,
+0x0,
+0xaf,
+0xa,
+0x20,
+0x5b,
+0x81,
+0xc,
+0x50,
+0x52,
+0x53,
+0x54,
+0x1,
+0x50,
+0x52,
+0x53,
+0x5f,
+0x40,
+0x10,
+0x14,
+0x4a,
+0x6,
+0x50,
+0x52,
+0x53,
+0x43,
+0x0,
+0x70,
+0x50,
+0x52,
+0x53,
+0x5f,
+0x65,
+0x70,
+0x0,
+0x62,
+0x70,
+0x0,
+0x60,
+0xa2,
+0x46,
+0x5,
+0x95,
+0x60,
+0x87,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x70,
+0x83,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x60,
+0x0,
+0x61,
+0xa0,
+0xa,
+0x7b,
+0x60,
+0xa,
+0x7,
+0x0,
+0x7a,
+0x62,
+0x1,
+0x62,
+0xa1,
+0xc,
+0x70,
+0x83,
+0x88,
+0x65,
+0x7a,
+0x60,
+0xa,
+0x3,
+0x0,
+0x0,
+0x62,
+0x70,
+0x7b,
+0x62,
+0x1,
+0x0,
+0x63,
+0xa0,
+0x22,
+0x92,
+0x93,
+0x61,
+0x63,
+0x70,
+0x63,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x60,
+0x0,
+0xa0,
+0xa,
+0x93,
+0x63,
+0x1,
+0x4e,
+0x54,
+0x46,
+0x59,
+0x60,
+0x1,
+0xa1,
+0x8,
+0x4e,
+0x54,
+0x46,
+0x59,
+0x60,
+0xa,
+0x3,
+0x75,
+0x60,
+0x10,
+0x4e,
+0x9,
+0x5f,
+0x47,
+0x50,
+0x45,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xd,
+0x41,
+0x43,
+0x50,
+0x49,
+0x30,
+0x30,
+0x30,
+0x36,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x30,
+0x0,
+0x14,
+0x15,
+0x5f,
+0x45,
+0x30,
+0x31,
+0x0,
+0x5c,
+0x2f,
+0x3,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x50,
+0x43,
+0x4e,
+0x46,
+0x14,
+0x10,
+0x5f,
+0x45,
+0x30,
+0x32,
+0x0,
+0x5c,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x43,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x33,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x34,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x35,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x36,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x37,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x38,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x39,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x41,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x42,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x43,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x44,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x45,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x46,
+0x0
+};
diff --git a/hw/i386/q35-acpi-dsdt.hex.generated b/hw/i386/q35-acpi-dsdt.hex.generated
new file mode 100644
index 0000000..32c16ff
--- /dev/null
+++ b/hw/i386/q35-acpi-dsdt.hex.generated
@@ -0,0 +1,7346 @@
+static unsigned char Q35AcpiDsdtAmlCode[] = {
+0x44,
+0x53,
+0x44,
+0x54,
+0xb0,
+0x1c,
+0x0,
+0x0,
+0x1,
+0x6,
+0x42,
+0x58,
+0x50,
+0x43,
+0x0,
+0x0,
+0x42,
+0x58,
+0x44,
+0x53,
+0x44,
+0x54,
+0x0,
+0x0,
+0x2,
+0x0,
+0x0,
+0x0,
+0x49,
+0x4e,
+0x54,
+0x4c,
+0x23,
+0x8,
+0x13,
+0x20,
+0x10,
+0x49,
+0x4,
+0x5c,
+0x0,
+0x5b,
+0x80,
+0x44,
+0x42,
+0x47,
+0x5f,
+0x1,
+0xb,
+0x2,
+0x4,
+0x1,
+0x5b,
+0x81,
+0xb,
+0x44,
+0x42,
+0x47,
+0x5f,
+0x1,
+0x44,
+0x42,
+0x47,
+0x42,
+0x8,
+0x14,
+0x2c,
+0x44,
+0x42,
+0x55,
+0x47,
+0x1,
+0x98,
+0x68,
+0x60,
+0x96,
+0x60,
+0x60,
+0x74,
+0x87,
+0x60,
+0x1,
+0x61,
+0x70,
+0x0,
+0x62,
+0xa2,
+0x10,
+0x95,
+0x62,
+0x61,
+0x70,
+0x83,
+0x88,
+0x60,
+0x62,
+0x0,
+0x44,
+0x42,
+0x47,
+0x42,
+0x75,
+0x62,
+0x70,
+0xa,
+0xa,
+0x44,
+0x42,
+0x47,
+0x42,
+0x10,
+0x29,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x5b,
+0x80,
+0x50,
+0x43,
+0x53,
+0x54,
+0x1,
+0xb,
+0x0,
+0xae,
+0xa,
+0xc,
+0x5b,
+0x80,
+0x50,
+0x43,
+0x53,
+0x42,
+0x1,
+0xb,
+0xc,
+0xae,
+0x1,
+0x5b,
+0x81,
+0xb,
+0x50,
+0x43,
+0x53,
+0x42,
+0x40,
+0x50,
+0x43,
+0x49,
+0x42,
+0x8,
+0x10,
+0x4f,
+0xc,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x5b,
+0x82,
+0x47,
+0xc,
+0x50,
+0x43,
+0x49,
+0x30,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xa,
+0x8,
+0x8,
+0x5f,
+0x43,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xa,
+0x3,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0x0,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x1,
+0x8,
+0x53,
+0x55,
+0x50,
+0x50,
+0x0,
+0x8,
+0x43,
+0x54,
+0x52,
+0x4c,
+0x0,
+0x14,
+0x44,
+0x9,
+0x5f,
+0x4f,
+0x53,
+0x43,
+0x4,
+0x8a,
+0x6b,
+0x0,
+0x43,
+0x44,
+0x57,
+0x31,
+0xa0,
+0x46,
+0x7,
+0x93,
+0x68,
+0x11,
+0x13,
+0xa,
+0x10,
+0x5b,
+0x4d,
+0xdb,
+0x33,
+0xf7,
+0x1f,
+0x1c,
+0x40,
+0x96,
+0x57,
+0x74,
+0x41,
+0xc0,
+0x3d,
+0xd7,
+0x66,
+0x8a,
+0x6b,
+0xa,
+0x4,
+0x43,
+0x44,
+0x57,
+0x32,
+0x8a,
+0x6b,
+0xa,
+0x8,
+0x43,
+0x44,
+0x57,
+0x33,
+0x70,
+0x43,
+0x44,
+0x57,
+0x32,
+0x53,
+0x55,
+0x50,
+0x50,
+0x70,
+0x43,
+0x44,
+0x57,
+0x33,
+0x43,
+0x54,
+0x52,
+0x4c,
+0x7b,
+0x43,
+0x54,
+0x52,
+0x4c,
+0xa,
+0x1d,
+0x43,
+0x54,
+0x52,
+0x4c,
+0xa0,
+0x10,
+0x92,
+0x93,
+0x69,
+0x1,
+0x7d,
+0x43,
+0x44,
+0x57,
+0x31,
+0xa,
+0x8,
+0x43,
+0x44,
+0x57,
+0x31,
+0xa0,
+0x16,
+0x92,
+0x93,
+0x43,
+0x44,
+0x57,
+0x33,
+0x43,
+0x54,
+0x52,
+0x4c,
+0x7d,
+0x43,
+0x44,
+0x57,
+0x31,
+0xa,
+0x10,
+0x43,
+0x44,
+0x57,
+0x31,
+0x70,
+0x43,
+0x54,
+0x52,
+0x4c,
+0x43,
+0x44,
+0x57,
+0x33,
+0xa1,
+0xc,
+0x7d,
+0x43,
+0x44,
+0x57,
+0x31,
+0xa,
+0x4,
+0x43,
+0x44,
+0x57,
+0x31,
+0xa4,
+0x6b,
+0x10,
+0x4e,
+0x15,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x8,
+0x43,
+0x52,
+0x45,
+0x53,
+0x11,
+0x42,
+0x7,
+0xa,
+0x6e,
+0x88,
+0xd,
+0x0,
+0x2,
+0xc,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xff,
+0x0,
+0x0,
+0x0,
+0x0,
+0x1,
+0x47,
+0x1,
+0xf8,
+0xc,
+0xf8,
+0xc,
+0x1,
+0x8,
+0x88,
+0xd,
+0x0,
+0x1,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0x0,
+0xf7,
+0xc,
+0x0,
+0x0,
+0xf8,
+0xc,
+0x88,
+0xd,
+0x0,
+0x1,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0xd,
+0xff,
+0xff,
+0x0,
+0x0,
+0x0,
+0xf3,
+0x87,
+0x17,
+0x0,
+0x0,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0xff,
+0xff,
+0xb,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x2,
+0x0,
+0x87,
+0x17,
+0x0,
+0x0,
+0xc,
+0x1,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xe0,
+0xff,
+0xff,
+0xbf,
+0xfe,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0xc0,
+0x1e,
+0x79,
+0x0,
+0x8,
+0x43,
+0x52,
+0x36,
+0x34,
+0x11,
+0x33,
+0xa,
+0x30,
+0x8a,
+0x2b,
+0x0,
+0x0,
+0xc,
+0x3,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x80,
+0x0,
+0x0,
+0x0,
+0xff,
+0xff,
+0xff,
+0xff,
+0xff,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x80,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x41,
+0xa,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0x8a,
+0x43,
+0x52,
+0x45,
+0x53,
+0xa,
+0x5c,
+0x50,
+0x53,
+0x33,
+0x32,
+0x8a,
+0x43,
+0x52,
+0x45,
+0x53,
+0xa,
+0x60,
+0x50,
+0x45,
+0x33,
+0x32,
+0x8a,
+0x43,
+0x52,
+0x45,
+0x53,
+0xa,
+0x68,
+0x50,
+0x4c,
+0x33,
+0x32,
+0x70,
+0x50,
+0x30,
+0x53,
+0x5f,
+0x50,
+0x53,
+0x33,
+0x32,
+0x70,
+0x50,
+0x30,
+0x45,
+0x5f,
+0x50,
+0x45,
+0x33,
+0x32,
+0x70,
+0x72,
+0x74,
+0x50,
+0x30,
+0x45,
+0x5f,
+0x50,
+0x30,
+0x53,
+0x5f,
+0x0,
+0x1,
+0x0,
+0x50,
+0x4c,
+0x33,
+0x32,
+0xa0,
+0xc,
+0x93,
+0x50,
+0x31,
+0x56,
+0x5f,
+0x0,
+0xa4,
+0x43,
+0x52,
+0x45,
+0x53,
+0x8f,
+0x43,
+0x52,
+0x36,
+0x34,
+0xa,
+0xe,
+0x50,
+0x53,
+0x36,
+0x34,
+0x8f,
+0x43,
+0x52,
+0x36,
+0x34,
+0xa,
+0x16,
+0x50,
+0x45,
+0x36,
+0x34,
+0x8f,
+0x43,
+0x52,
+0x36,
+0x34,
+0xa,
+0x26,
+0x50,
+0x4c,
+0x36,
+0x34,
+0x70,
+0x50,
+0x31,
+0x53,
+0x5f,
+0x50,
+0x53,
+0x36,
+0x34,
+0x70,
+0x50,
+0x31,
+0x45,
+0x5f,
+0x50,
+0x45,
+0x36,
+0x34,
+0x70,
+0x50,
+0x31,
+0x4c,
+0x5f,
+0x50,
+0x4c,
+0x36,
+0x34,
+0x84,
+0x43,
+0x52,
+0x45,
+0x53,
+0x43,
+0x52,
+0x36,
+0x34,
+0x60,
+0xa4,
+0x60,
+0x10,
+0x4d,
+0x8,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x5b,
+0x82,
+0x45,
+0x8,
+0x48,
+0x50,
+0x45,
+0x54,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x1,
+0x3,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x5b,
+0x80,
+0x48,
+0x50,
+0x54,
+0x4d,
+0x0,
+0xc,
+0x0,
+0x0,
+0xd0,
+0xfe,
+0xb,
+0x0,
+0x4,
+0x5b,
+0x81,
+0x10,
+0x48,
+0x50,
+0x54,
+0x4d,
+0x13,
+0x56,
+0x45,
+0x4e,
+0x44,
+0x20,
+0x50,
+0x52,
+0x44,
+0x5f,
+0x20,
+0x14,
+0x36,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x56,
+0x45,
+0x4e,
+0x44,
+0x60,
+0x70,
+0x50,
+0x52,
+0x44,
+0x5f,
+0x61,
+0x7a,
+0x60,
+0xa,
+0x10,
+0x60,
+0xa0,
+0xc,
+0x91,
+0x93,
+0x60,
+0x0,
+0x93,
+0x60,
+0xb,
+0xff,
+0xff,
+0xa4,
+0x0,
+0xa0,
+0xe,
+0x91,
+0x93,
+0x61,
+0x0,
+0x94,
+0x61,
+0xc,
+0x0,
+0xe1,
+0xf5,
+0x5,
+0xa4,
+0x0,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x11,
+0xa,
+0xe,
+0x86,
+0x9,
+0x0,
+0x0,
+0x0,
+0x0,
+0xd0,
+0xfe,
+0x0,
+0x4,
+0x0,
+0x0,
+0x79,
+0x0,
+0x10,
+0x36,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x82,
+0x2a,
+0x56,
+0x47,
+0x41,
+0x5f,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0xc,
+0x0,
+0x0,
+0x1,
+0x0,
+0x14,
+0x8,
+0x5f,
+0x53,
+0x31,
+0x44,
+0x0,
+0xa4,
+0x0,
+0x14,
+0x8,
+0x5f,
+0x53,
+0x32,
+0x44,
+0x0,
+0xa4,
+0x0,
+0x14,
+0x8,
+0x5f,
+0x53,
+0x33,
+0x44,
+0x0,
+0xa4,
+0x0,
+0x10,
+0x4c,
+0x7,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x82,
+0x4f,
+0x6,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0xc,
+0x0,
+0x0,
+0x1f,
+0x0,
+0x5b,
+0x80,
+0x50,
+0x49,
+0x52,
+0x51,
+0x2,
+0xa,
+0x60,
+0xa,
+0xc,
+0x5b,
+0x80,
+0x4c,
+0x50,
+0x43,
+0x44,
+0x2,
+0xa,
+0x80,
+0xa,
+0x2,
+0x5b,
+0x81,
+0x20,
+0x4c,
+0x50,
+0x43,
+0x44,
+0x0,
+0x43,
+0x4f,
+0x4d,
+0x41,
+0x3,
+0x0,
+0x1,
+0x43,
+0x4f,
+0x4d,
+0x42,
+0x3,
+0x0,
+0x1,
+0x4c,
+0x50,
+0x54,
+0x44,
+0x2,
+0x0,
+0x2,
+0x46,
+0x44,
+0x43,
+0x44,
+0x2,
+0x5b,
+0x80,
+0x4c,
+0x50,
+0x43,
+0x45,
+0x2,
+0xa,
+0x82,
+0xa,
+0x2,
+0x5b,
+0x81,
+0x1a,
+0x4c,
+0x50,
+0x43,
+0x45,
+0x0,
+0x43,
+0x41,
+0x45,
+0x4e,
+0x1,
+0x43,
+0x42,
+0x45,
+0x4e,
+0x1,
+0x4c,
+0x50,
+0x45,
+0x4e,
+0x1,
+0x46,
+0x44,
+0x45,
+0x4e,
+0x1,
+0x10,
+0x4c,
+0x1b,
+0x2f,
+0x3,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x5b,
+0x82,
+0x2d,
+0x52,
+0x54,
+0x43,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xb,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x18,
+0xa,
+0x15,
+0x47,
+0x1,
+0x70,
+0x0,
+0x70,
+0x0,
+0x10,
+0x2,
+0x22,
+0x0,
+0x1,
+0x47,
+0x1,
+0x72,
+0x0,
+0x72,
+0x0,
+0x2,
+0x6,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x37,
+0x4b,
+0x42,
+0x44,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x3,
+0x3,
+0x14,
+0x9,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x18,
+0xa,
+0x15,
+0x47,
+0x1,
+0x60,
+0x0,
+0x60,
+0x0,
+0x1,
+0x1,
+0x47,
+0x1,
+0x64,
+0x0,
+0x64,
+0x0,
+0x1,
+0x1,
+0x22,
+0x2,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x27,
+0x4d,
+0x4f,
+0x55,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xf,
+0x13,
+0x14,
+0x9,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x8,
+0xa,
+0x5,
+0x22,
+0x0,
+0x10,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x4a,
+0x4,
+0x46,
+0x44,
+0x43,
+0x30,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x7,
+0x0,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x46,
+0x44,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x1b,
+0xa,
+0x18,
+0x47,
+0x1,
+0xf2,
+0x3,
+0xf2,
+0x3,
+0x0,
+0x4,
+0x47,
+0x1,
+0xf7,
+0x3,
+0xf7,
+0x3,
+0x0,
+0x1,
+0x22,
+0x40,
+0x0,
+0x2a,
+0x4,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x3e,
+0x4c,
+0x50,
+0x54,
+0x5f,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x4,
+0x0,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x4c,
+0x50,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x10,
+0xa,
+0xd,
+0x47,
+0x1,
+0x78,
+0x3,
+0x78,
+0x3,
+0x8,
+0x8,
+0x22,
+0x80,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x43,
+0x4f,
+0x4d,
+0x31,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x5,
+0x1,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x1,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x43,
+0x41,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x10,
+0xa,
+0xd,
+0x47,
+0x1,
+0xf8,
+0x3,
+0xf8,
+0x3,
+0x0,
+0x8,
+0x22,
+0x10,
+0x0,
+0x79,
+0x0,
+0x5b,
+0x82,
+0x46,
+0x4,
+0x43,
+0x4f,
+0x4d,
+0x32,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0x5,
+0x1,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x2,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x43,
+0x42,
+0x45,
+0x4e,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0x10,
+0xa,
+0xd,
+0x47,
+0x1,
+0xf8,
+0x2,
+0xf8,
+0x2,
+0x0,
+0x8,
+0x22,
+0x8,
+0x0,
+0x79,
+0x0,
+0x8,
+0x50,
+0x49,
+0x43,
+0x46,
+0x0,
+0x14,
+0xc,
+0x5f,
+0x50,
+0x49,
+0x43,
+0x1,
+0x70,
+0x68,
+0x50,
+0x49,
+0x43,
+0x46,
+0x10,
+0x8e,
+0x55,
+0x1,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x10,
+0x43,
+0xea,
+0x50,
+0x43,
+0x49,
+0x30,
+0x8,
+0x50,
+0x52,
+0x54,
+0x50,
+0x12,
+0x4b,
+0x73,
+0x80,
+0x12,
+0xb,
+0x4,
+0xb,
+0xff,
+0xff,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xb,
+0x4,
+0xb,
+0xff,
+0xff,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xc,
+0x4,
+0xb,
+0xff,
+0xff,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xc,
+0x4,
+0xb,
+0xff,
+0xff,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0x0,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0x1,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0xa,
+0x2,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0xa,
+0x3,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x0,
+0x8,
+0x50,
+0x52,
+0x54,
+0x41,
+0x12,
+0x4b,
+0x73,
+0x80,
+0x12,
+0xb,
+0x4,
+0xb,
+0xff,
+0xff,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xb,
+0x4,
+0xb,
+0xff,
+0xff,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xc,
+0x4,
+0xb,
+0xff,
+0xff,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xc,
+0x4,
+0xb,
+0xff,
+0xff,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x2,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x3,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x4,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x5,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x6,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x7,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x8,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x9,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xa,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xb,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xc,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xd,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xe,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0xf,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x10,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x11,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x12,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x13,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x14,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x15,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x16,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x17,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x18,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x19,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1a,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1b,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1c,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1d,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x44,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x45,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x46,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x47,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1e,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x48,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0x0,
+0x47,
+0x53,
+0x49,
+0x41,
+0x0,
+0x12,
+0xd,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0x1,
+0x47,
+0x53,
+0x49,
+0x42,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0xa,
+0x2,
+0x47,
+0x53,
+0x49,
+0x43,
+0x0,
+0x12,
+0xe,
+0x4,
+0xc,
+0xff,
+0xff,
+0x1f,
+0x0,
+0xa,
+0x3,
+0x47,
+0x53,
+0x49,
+0x44,
+0x0,
+0x14,
+0x1a,
+0x5f,
+0x50,
+0x52,
+0x54,
+0x0,
+0xa0,
+0xc,
+0x93,
+0x50,
+0x49,
+0x43,
+0x46,
+0x0,
+0xa4,
+0x50,
+0x52,
+0x54,
+0x50,
+0xa1,
+0x6,
+0xa4,
+0x50,
+0x52,
+0x54,
+0x41,
+0x5b,
+0x81,
+0x3a,
+0x2f,
+0x3,
+0x50,
+0x43,
+0x49,
+0x30,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x50,
+0x49,
+0x52,
+0x51,
+0x1,
+0x50,
+0x52,
+0x51,
+0x41,
+0x8,
+0x50,
+0x52,
+0x51,
+0x42,
+0x8,
+0x50,
+0x52,
+0x51,
+0x43,
+0x8,
+0x50,
+0x52,
+0x51,
+0x44,
+0x8,
+0x0,
+0x20,
+0x50,
+0x52,
+0x51,
+0x45,
+0x8,
+0x50,
+0x52,
+0x51,
+0x46,
+0x8,
+0x50,
+0x52,
+0x51,
+0x47,
+0x8,
+0x50,
+0x52,
+0x51,
+0x48,
+0x8,
+0x14,
+0x13,
+0x49,
+0x51,
+0x53,
+0x54,
+0x1,
+0xa0,
+0x9,
+0x7b,
+0xa,
+0x80,
+0x68,
+0x0,
+0xa4,
+0xa,
+0x9,
+0xa4,
+0xa,
+0xb,
+0x14,
+0x34,
+0x49,
+0x51,
+0x43,
+0x52,
+0x1,
+0x8,
+0x50,
+0x52,
+0x52,
+0x30,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x0,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8a,
+0x50,
+0x52,
+0x52,
+0x30,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x7b,
+0x68,
+0xa,
+0xf,
+0x0,
+0x50,
+0x52,
+0x52,
+0x49,
+0xa4,
+0x50,
+0x52,
+0x52,
+0x30,
+0x5b,
+0x82,
+0x4c,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x41,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x41,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x41,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x41,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x41,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x41,
+0x5b,
+0x82,
+0x4c,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x42,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x1,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x42,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x42,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x42,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x42,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x42,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x43,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x2,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x43,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x43,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x43,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x43,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x43,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x44,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x3,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x44,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x44,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x44,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x44,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x44,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x45,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x4,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x45,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x45,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x45,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x45,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x45,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x46,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x5,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x46,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x46,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x46,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x46,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x46,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x47,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x6,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x47,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x47,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x47,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x47,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x47,
+0x5b,
+0x82,
+0x4d,
+0x7,
+0x4c,
+0x4e,
+0x4b,
+0x48,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0xa,
+0x7,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0x16,
+0xa,
+0x13,
+0x89,
+0xe,
+0x0,
+0x9,
+0x3,
+0x5,
+0x0,
+0x0,
+0x0,
+0xa,
+0x0,
+0x0,
+0x0,
+0xb,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x53,
+0x54,
+0x50,
+0x52,
+0x51,
+0x48,
+0x14,
+0x11,
+0x5f,
+0x44,
+0x49,
+0x53,
+0x0,
+0x7d,
+0x50,
+0x52,
+0x51,
+0x48,
+0xa,
+0x80,
+0x50,
+0x52,
+0x51,
+0x48,
+0x14,
+0xf,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x0,
+0xa4,
+0x49,
+0x51,
+0x43,
+0x52,
+0x50,
+0x52,
+0x51,
+0x48,
+0x14,
+0x17,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x8a,
+0x68,
+0xa,
+0x5,
+0x50,
+0x52,
+0x52,
+0x49,
+0x70,
+0x50,
+0x52,
+0x52,
+0x49,
+0x50,
+0x52,
+0x51,
+0x48,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x41,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x10,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x10,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x42,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x11,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x11,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x43,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x12,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x12,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x44,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x13,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x13,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x45,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x14,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x14,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x46,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x15,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x15,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x47,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x16,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x16,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x5b,
+0x82,
+0x45,
+0x4,
+0x47,
+0x53,
+0x49,
+0x48,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xc,
+0x41,
+0xd0,
+0xc,
+0xf,
+0x8,
+0x5f,
+0x55,
+0x49,
+0x44,
+0x0,
+0x8,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x17,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xe,
+0xa,
+0xb,
+0x89,
+0x6,
+0x0,
+0x9,
+0x1,
+0x17,
+0x0,
+0x0,
+0x0,
+0x79,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x53,
+0x52,
+0x53,
+0x1,
+0x10,
+0x47,
+0xe,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x14,
+0x35,
+0x43,
+0x50,
+0x4d,
+0x41,
+0x1,
+0x70,
+0x83,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x68,
+0x0,
+0x60,
+0x70,
+0x11,
+0xb,
+0xa,
+0x8,
+0x0,
+0x8,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x61,
+0x70,
+0x68,
+0x88,
+0x61,
+0xa,
+0x2,
+0x0,
+0x70,
+0x68,
+0x88,
+0x61,
+0xa,
+0x3,
+0x0,
+0x70,
+0x60,
+0x88,
+0x61,
+0xa,
+0x4,
+0x0,
+0xa4,
+0x61,
+0x14,
+0x1a,
+0x43,
+0x50,
+0x53,
+0x54,
+0x1,
+0x70,
+0x83,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x68,
+0x0,
+0x60,
+0xa0,
+0x5,
+0x60,
+0xa4,
+0xa,
+0xf,
+0xa1,
+0x3,
+0xa4,
+0x0,
+0x14,
+0xa,
+0x43,
+0x50,
+0x45,
+0x4a,
+0x2,
+0x5b,
+0x22,
+0xa,
+0xc8,
+0x5b,
+0x80,
+0x50,
+0x52,
+0x53,
+0x54,
+0x1,
+0xb,
+0x0,
+0xaf,
+0xa,
+0x20,
+0x5b,
+0x81,
+0xc,
+0x50,
+0x52,
+0x53,
+0x54,
+0x1,
+0x50,
+0x52,
+0x53,
+0x5f,
+0x40,
+0x10,
+0x14,
+0x4a,
+0x6,
+0x50,
+0x52,
+0x53,
+0x43,
+0x0,
+0x70,
+0x50,
+0x52,
+0x53,
+0x5f,
+0x65,
+0x70,
+0x0,
+0x62,
+0x70,
+0x0,
+0x60,
+0xa2,
+0x46,
+0x5,
+0x95,
+0x60,
+0x87,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x70,
+0x83,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x60,
+0x0,
+0x61,
+0xa0,
+0xa,
+0x7b,
+0x60,
+0xa,
+0x7,
+0x0,
+0x7a,
+0x62,
+0x1,
+0x62,
+0xa1,
+0xc,
+0x70,
+0x83,
+0x88,
+0x65,
+0x7a,
+0x60,
+0xa,
+0x3,
+0x0,
+0x0,
+0x62,
+0x70,
+0x7b,
+0x62,
+0x1,
+0x0,
+0x63,
+0xa0,
+0x22,
+0x92,
+0x93,
+0x61,
+0x63,
+0x70,
+0x63,
+0x88,
+0x43,
+0x50,
+0x4f,
+0x4e,
+0x60,
+0x0,
+0xa0,
+0xa,
+0x93,
+0x63,
+0x1,
+0x4e,
+0x54,
+0x46,
+0x59,
+0x60,
+0x1,
+0xa1,
+0x8,
+0x4e,
+0x54,
+0x46,
+0x59,
+0x60,
+0xa,
+0x3,
+0x75,
+0x60,
+0x10,
+0x4f,
+0x8,
+0x5f,
+0x47,
+0x50,
+0x45,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xd,
+0x41,
+0x43,
+0x50,
+0x49,
+0x30,
+0x30,
+0x30,
+0x36,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x30,
+0x0,
+0x14,
+0x10,
+0x5f,
+0x4c,
+0x30,
+0x31,
+0x0,
+0x5c,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x52,
+0x53,
+0x43,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x32,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x33,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x34,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x35,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x36,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x37,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x38,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x39,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x41,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x42,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x43,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x44,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x45,
+0x0,
+0x14,
+0x6,
+0x5f,
+0x4c,
+0x30,
+0x46,
+0x0
+};
diff --git a/hw/i386/ssdt-misc.hex.generated b/hw/i386/ssdt-misc.hex.generated
new file mode 100644
index 0000000..55e3bd2
--- /dev/null
+++ b/hw/i386/ssdt-misc.hex.generated
@@ -0,0 +1,386 @@
+static unsigned char acpi_pci64_length[] = {
+0x6f
+};
+static unsigned char acpi_s4_pkg[] = {
+0x8f
+};
+static unsigned char acpi_s3_name[] = {
+0x7c
+};
+static unsigned char acpi_pci32_start[] = {
+0x2f
+};
+static unsigned char acpi_pci64_valid[] = {
+0x43
+};
+static unsigned char ssdp_misc_aml[] = {
+0x53,
+0x53,
+0x44,
+0x54,
+0x62,
+0x1,
+0x0,
+0x0,
+0x1,
+0x76,
+0x42,
+0x58,
+0x50,
+0x43,
+0x0,
+0x0,
+0x42,
+0x58,
+0x53,
+0x53,
+0x44,
+0x54,
+0x53,
+0x55,
+0x1,
+0x0,
+0x0,
+0x0,
+0x49,
+0x4e,
+0x54,
+0x4c,
+0x23,
+0x8,
+0x13,
+0x20,
+0x10,
+0x42,
+0x5,
+0x5c,
+0x0,
+0x8,
+0x50,
+0x30,
+0x53,
+0x5f,
+0xc,
+0x78,
+0x56,
+0x34,
+0x12,
+0x8,
+0x50,
+0x30,
+0x45,
+0x5f,
+0xc,
+0x78,
+0x56,
+0x34,
+0x12,
+0x8,
+0x50,
+0x31,
+0x56,
+0x5f,
+0xa,
+0x12,
+0x8,
+0x50,
+0x31,
+0x53,
+0x5f,
+0x11,
+0xb,
+0xa,
+0x8,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x8,
+0x50,
+0x31,
+0x45,
+0x5f,
+0x11,
+0xb,
+0xa,
+0x8,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x8,
+0x50,
+0x31,
+0x4c,
+0x5f,
+0x11,
+0xb,
+0xa,
+0x8,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x0,
+0x10,
+0x29,
+0x5c,
+0x0,
+0x8,
+0x5f,
+0x53,
+0x33,
+0x5f,
+0x12,
+0x6,
+0x4,
+0x1,
+0x1,
+0x0,
+0x0,
+0x8,
+0x5f,
+0x53,
+0x34,
+0x5f,
+0x12,
+0x8,
+0x4,
+0xa,
+0x2,
+0xa,
+0x2,
+0x0,
+0x0,
+0x8,
+0x5f,
+0x53,
+0x35,
+0x5f,
+0x12,
+0x6,
+0x4,
+0x0,
+0x0,
+0x0,
+0x0,
+0x10,
+0x40,
+0xc,
+0x5c,
+0x2f,
+0x3,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x49,
+0x53,
+0x41,
+0x5f,
+0x5b,
+0x82,
+0x4d,
+0xa,
+0x50,
+0x45,
+0x56,
+0x54,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xd,
+0x51,
+0x45,
+0x4d,
+0x55,
+0x30,
+0x30,
+0x30,
+0x31,
+0x0,
+0x8,
+0x50,
+0x45,
+0x53,
+0x54,
+0xb,
+0xff,
+0xff,
+0x5b,
+0x80,
+0x50,
+0x45,
+0x4f,
+0x52,
+0x1,
+0x50,
+0x45,
+0x53,
+0x54,
+0x1,
+0x5b,
+0x81,
+0xb,
+0x50,
+0x45,
+0x4f,
+0x52,
+0x1,
+0x50,
+0x45,
+0x50,
+0x54,
+0x8,
+0x14,
+0x18,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0x70,
+0x50,
+0x45,
+0x53,
+0x54,
+0x60,
+0xa0,
+0x6,
+0x93,
+0x60,
+0x0,
+0xa4,
+0x0,
+0xa1,
+0x4,
+0xa4,
+0xa,
+0xf,
+0x14,
+0xe,
+0x52,
+0x44,
+0x50,
+0x54,
+0x0,
+0x70,
+0x50,
+0x45,
+0x50,
+0x54,
+0x60,
+0xa4,
+0x60,
+0x14,
+0xc,
+0x57,
+0x52,
+0x50,
+0x54,
+0x1,
+0x70,
+0x68,
+0x50,
+0x45,
+0x50,
+0x54,
+0x8,
+0x5f,
+0x43,
+0x52,
+0x53,
+0x11,
+0xd,
+0xa,
+0xa,
+0x47,
+0x1,
+0x0,
+0x0,
+0x0,
+0x0,
+0x1,
+0x1,
+0x79,
+0x0,
+0x8b,
+0x5f,
+0x43,
+0x52,
+0x53,
+0xa,
+0x2,
+0x49,
+0x4f,
+0x4d,
+0x4e,
+0x8b,
+0x5f,
+0x43,
+0x52,
+0x53,
+0xa,
+0x4,
+0x49,
+0x4f,
+0x4d,
+0x58,
+0x14,
+0x18,
+0x5f,
+0x49,
+0x4e,
+0x49,
+0x0,
+0x70,
+0x50,
+0x45,
+0x53,
+0x54,
+0x49,
+0x4f,
+0x4d,
+0x4e,
+0x70,
+0x50,
+0x45,
+0x53,
+0x54,
+0x49,
+0x4f,
+0x4d,
+0x58
+};
+static unsigned char ssdt_isa_pest[] = {
+0xd0
+};
+static unsigned char acpi_s4_name[] = {
+0x88
+};
+static unsigned char acpi_pci64_start[] = {
+0x4d
+};
+static unsigned char acpi_pci64_end[] = {
+0x5e
+};
+static unsigned char acpi_pci32_end[] = {
+0x39
+};
diff --git a/hw/i386/ssdt-pcihp.hex.generated b/hw/i386/ssdt-pcihp.hex.generated
new file mode 100644
index 0000000..0d32a27
--- /dev/null
+++ b/hw/i386/ssdt-pcihp.hex.generated
@@ -0,0 +1,108 @@
+static unsigned char ssdt_pcihp_name[] = {
+0x33
+};
+static unsigned char ssdt_pcihp_adr[] = {
+0x44
+};
+static unsigned char ssdt_pcihp_end[] = {
+0x58
+};
+static unsigned char ssdp_pcihp_aml[] = {
+0x53,
+0x53,
+0x44,
+0x54,
+0x58,
+0x0,
+0x0,
+0x0,
+0x1,
+0x77,
+0x42,
+0x58,
+0x50,
+0x43,
+0x0,
+0x0,
+0x42,
+0x58,
+0x53,
+0x53,
+0x44,
+0x54,
+0x50,
+0x43,
+0x1,
+0x0,
+0x0,
+0x0,
+0x49,
+0x4e,
+0x54,
+0x4c,
+0x28,
+0x5,
+0x10,
+0x20,
+0x10,
+0x33,
+0x5c,
+0x2e,
+0x5f,
+0x53,
+0x42,
+0x5f,
+0x50,
+0x43,
+0x49,
+0x30,
+0x5b,
+0x82,
+0x26,
+0x53,
+0x41,
+0x41,
+0x5f,
+0x8,
+0x5f,
+0x53,
+0x55,
+0x4e,
+0xa,
+0xaa,
+0x8,
+0x5f,
+0x41,
+0x44,
+0x52,
+0xc,
+0x0,
+0x0,
+0xaa,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x45,
+0x4a,
+0x30,
+0x1,
+0xa4,
+0x50,
+0x43,
+0x45,
+0x4a,
+0x5f,
+0x53,
+0x55,
+0x4e
+};
+static unsigned char ssdt_pcihp_start[] = {
+0x30
+};
+static unsigned char ssdt_pcihp_id[] = {
+0x3d
+};
+static unsigned char ssdt_pcihp_ej0[] = {
+0x4a
+};
diff --git a/hw/i386/ssdt-proc.hex.generated b/hw/i386/ssdt-proc.hex.generated
new file mode 100644
index 0000000..a28172e
--- /dev/null
+++ b/hw/i386/ssdt-proc.hex.generated
@@ -0,0 +1,134 @@
+static unsigned char ssdt_proc_name[] = {
+0x28
+};
+static unsigned char ssdp_proc_aml[] = {
+0x53,
+0x53,
+0x44,
+0x54,
+0x78,
+0x0,
+0x0,
+0x0,
+0x1,
+0xb3,
+0x42,
+0x58,
+0x50,
+0x43,
+0x0,
+0x0,
+0x42,
+0x58,
+0x53,
+0x53,
+0x44,
+0x54,
+0x0,
+0x0,
+0x1,
+0x0,
+0x0,
+0x0,
+0x49,
+0x4e,
+0x54,
+0x4c,
+0x28,
+0x5,
+0x10,
+0x20,
+0x5b,
+0x83,
+0x42,
+0x5,
+0x43,
+0x50,
+0x41,
+0x41,
+0xaa,
+0x10,
+0xb0,
+0x0,
+0x0,
+0x6,
+0x8,
+0x49,
+0x44,
+0x5f,
+0x5f,
+0xa,
+0xaa,
+0x8,
+0x5f,
+0x48,
+0x49,
+0x44,
+0xd,
+0x41,
+0x43,
+0x50,
+0x49,
+0x30,
+0x30,
+0x30,
+0x37,
+0x0,
+0x14,
+0xf,
+0x5f,
+0x4d,
+0x41,
+0x54,
+0x0,
+0xa4,
+0x43,
+0x50,
+0x4d,
+0x41,
+0x49,
+0x44,
+0x5f,
+0x5f,
+0x14,
+0xf,
+0x5f,
+0x53,
+0x54,
+0x41,
+0x0,
+0xa4,
+0x43,
+0x50,
+0x53,
+0x54,
+0x49,
+0x44,
+0x5f,
+0x5f,
+0x14,
+0xf,
+0x5f,
+0x45,
+0x4a,
+0x30,
+0x1,
+0x43,
+0x50,
+0x45,
+0x4a,
+0x49,
+0x44,
+0x5f,
+0x5f,
+0x68
+};
+static unsigned char ssdt_proc_id[] = {
+0x38
+};
+static unsigned char ssdt_proc_end[] = {
+0x78
+};
+static unsigned char ssdt_proc_start[] = {
+0x24
+};
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 14/27] acpi: ssdt pcihp: updat generated file
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (12 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 13/27] acpi: pre-compiled ASL files Michael S. Tsirkin
@ 2013-10-07  9:35 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 15/27] loader: use file path size from fw_cfg.h Michael S. Tsirkin
                   ` (15 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:35 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

update generated file, not sure what changed

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/ssdt-pcihp.hex.generated | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/i386/ssdt-pcihp.hex.generated b/hw/i386/ssdt-pcihp.hex.generated
index 0d32a27..b3c2cd5 100644
--- a/hw/i386/ssdt-pcihp.hex.generated
+++ b/hw/i386/ssdt-pcihp.hex.generated
@@ -17,7 +17,7 @@ static unsigned char ssdp_pcihp_aml[] = {
 0x0,
 0x0,
 0x1,
-0x77,
+0x76,
 0x42,
 0x58,
 0x50,
@@ -40,9 +40,9 @@ static unsigned char ssdp_pcihp_aml[] = {
 0x4e,
 0x54,
 0x4c,
-0x28,
-0x5,
-0x10,
+0x23,
+0x8,
+0x13,
 0x20,
 0x10,
 0x33,
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 15/27] loader: use file path size from fw_cfg.h
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (13 preceding siblings ...)
  2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 14/27] acpi: ssdt pcihp: updat generated file Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 16/27] i386: add bios linker/loader Michael S. Tsirkin
                   ` (14 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori
  Cc: pbonzini, imammedo, Laszlo Ersek, afaerber, kraxel

Avoid a bit of code duplication, make
max file path constant reusable.

Suggested-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/nvram/fw_cfg.h | 4 +++-
 hw/core/loader.c          | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/include/hw/nvram/fw_cfg.h b/include/hw/nvram/fw_cfg.h
index 2ab0fc2..72b1549 100644
--- a/include/hw/nvram/fw_cfg.h
+++ b/include/hw/nvram/fw_cfg.h
@@ -46,12 +46,14 @@
 
 #define FW_CFG_INVALID          0xffff
 
+#define FW_CFG_MAX_FILE_PATH    56
+
 #ifndef NO_QEMU_PROTOS
 typedef struct FWCfgFile {
     uint32_t  size;        /* file size */
     uint16_t  select;      /* write this to 0x510 to read it */
     uint16_t  reserved;
-    char      name[56];
+    char      name[FW_CFG_MAX_FILE_PATH];
 } FWCfgFile;
 
 typedef struct FWCfgFiles {
diff --git a/hw/core/loader.c b/hw/core/loader.c
index 449bd4c..060729f 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -663,7 +663,7 @@ int rom_add_file(const char *file, const char *fw_dir,
     rom_insert(rom);
     if (rom->fw_file && fw_cfg) {
         const char *basename;
-        char fw_file_name[56];
+        char fw_file_name[FW_CFG_MAX_FILE_PATH];
         void *data;
 
         basename = strrchr(rom->fw_file, '/');
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 16/27] i386: add bios linker/loader
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (14 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 15/27] loader: use file path size from fw_cfg.h Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 17/27] loader: allow adding ROMs in done callbacks Michael S. Tsirkin
                   ` (13 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

This adds a dynamic bios linker/loader.
This will be used by acpi table generation
code to:
    - load each table in the appropriate memory segment
    - link tables to each other
    - fix up checksums after said linking

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/bios-linker-loader.h |  27 ++++++++
 hw/i386/bios-linker-loader.c | 158 +++++++++++++++++++++++++++++++++++++++++++
 hw/i386/Makefile.objs        |   1 +
 3 files changed, 186 insertions(+)
 create mode 100644 hw/i386/bios-linker-loader.h
 create mode 100644 hw/i386/bios-linker-loader.c

diff --git a/hw/i386/bios-linker-loader.h b/hw/i386/bios-linker-loader.h
new file mode 100644
index 0000000..498c0af
--- /dev/null
+++ b/hw/i386/bios-linker-loader.h
@@ -0,0 +1,27 @@
+#ifndef BIOS_LINKER_LOADER_H
+#define BIOS_LINKER_LOADER_H
+
+#include <glib.h>
+#include <stdbool.h>
+#include <inttypes.h>
+
+GArray *bios_linker_loader_init(void);
+
+void bios_linker_loader_alloc(GArray *linker,
+                              const char *file,
+                              uint32_t alloc_align,
+                              bool alloc_fseg);
+
+void bios_linker_loader_add_checksum(GArray *linker, const char *file,
+                                     void *table,
+                                     void *start, unsigned size,
+                                     uint8_t *checksum);
+
+void bios_linker_loader_add_pointer(GArray *linker,
+                                    const char *dest_file,
+                                    const char *src_file,
+                                    GArray *table, void *pointer,
+                                    uint8_t pointer_size);
+
+void *bios_linker_loader_cleanup(GArray *linker);
+#endif
diff --git a/hw/i386/bios-linker-loader.c b/hw/i386/bios-linker-loader.c
new file mode 100644
index 0000000..0833853
--- /dev/null
+++ b/hw/i386/bios-linker-loader.c
@@ -0,0 +1,158 @@
+/* Dynamic linker/loader of ACPI tables
+ *
+ * Copyright (C) 2013 Red Hat Inc
+ *
+ * Author: Michael S. Tsirkin <mst@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "bios-linker-loader.h"
+#include "hw/nvram/fw_cfg.h"
+
+#include <string.h>
+#include <assert.h>
+#include "qemu/bswap.h"
+
+#define BIOS_LINKER_LOADER_FILESZ FW_CFG_MAX_FILE_PATH
+
+struct BiosLinkerLoaderEntry {
+    uint32_t command;
+    union {
+        /*
+         * COMMAND_ALLOCATE - allocate a table from @alloc.file
+         * subject to @alloc.align alignment (must be power of 2)
+         * and @alloc.zone (can be HIGH or FSEG) requirements.
+         *
+         * Must appear exactly once for each file, and before
+         * this file is referenced by any other command.
+         */
+        struct {
+            char file[BIOS_LINKER_LOADER_FILESZ];
+            uint32_t align;
+            uint8_t zone;
+        } alloc;
+
+        /*
+         * COMMAND_ADD_POINTER - patch the table (originating from
+         * @dest_file) at @pointer.offset, by adding a pointer to the table
+         * originating from @src_file. 1,2,4 or 8 byte unsigned
+         * addition is used depending on @pointer.size.
+         */
+        struct {
+            char dest_file[BIOS_LINKER_LOADER_FILESZ];
+            char src_file[BIOS_LINKER_LOADER_FILESZ];
+            uint32_t offset;
+            uint8_t size;
+        } pointer;
+
+        /*
+         * COMMAND_ADD_CHECKSUM - calculate checksum of the range specified by
+         * @cksum_start and @cksum_length fields,
+         * and then add the value at @cksum.offset.
+         * Checksum simply sums -X for each byte X in the range
+         * using 8-bit math.
+         */
+        struct {
+            char file[BIOS_LINKER_LOADER_FILESZ];
+            uint32_t offset;
+            uint32_t start;
+            uint32_t length;
+        } cksum;
+
+        /* padding */
+        char pad[124];
+    };
+} QEMU_PACKED;
+typedef struct BiosLinkerLoaderEntry BiosLinkerLoaderEntry;
+
+enum {
+    BIOS_LINKER_LOADER_COMMAND_ALLOCATE     = 0x1,
+    BIOS_LINKER_LOADER_COMMAND_ADD_POINTER  = 0x2,
+    BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM = 0x3,
+};
+
+enum {
+    BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH = 0x1,
+    BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG = 0x2,
+};
+
+GArray *bios_linker_loader_init(void)
+{
+    return g_array_new(false, true /* clear */, sizeof(BiosLinkerLoaderEntry));
+}
+
+/* Free linker wrapper and return the linker array. */
+void *bios_linker_loader_cleanup(GArray *linker)
+{
+    return g_array_free(linker, false);
+}
+
+void bios_linker_loader_alloc(GArray *linker,
+                              const char *file,
+                              uint32_t alloc_align,
+                              bool alloc_fseg)
+{
+    BiosLinkerLoaderEntry entry;
+
+    memset(&entry, 0, sizeof entry);
+    strncpy(entry.alloc.file, file, sizeof entry.alloc.file - 1);
+    entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ALLOCATE);
+    entry.alloc.align = cpu_to_le32(alloc_align);
+    entry.alloc.zone = cpu_to_le32(alloc_fseg ?
+                                    BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG :
+                                    BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH);
+
+    /* Alloc entries must come first, so prepend them */
+    g_array_prepend_val(linker, entry);
+}
+
+void bios_linker_loader_add_checksum(GArray *linker, const char *file,
+                                     void *table,
+                                     void *start, unsigned size,
+                                     uint8_t *checksum)
+{
+    BiosLinkerLoaderEntry entry;
+
+    memset(&entry, 0, sizeof entry);
+    strncpy(entry.cksum.file, file, sizeof entry.cksum.file - 1);
+    entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM);
+    entry.cksum.offset = cpu_to_le32(checksum - (uint8_t *)table);
+    entry.cksum.start = cpu_to_le32((uint8_t *)start - (uint8_t *)table);
+    entry.cksum.length = cpu_to_le32(size);
+
+    g_array_append_val(linker, entry);
+}
+
+void bios_linker_loader_add_pointer(GArray *linker,
+                                    const char *dest_file,
+                                    const char *src_file,
+                                    GArray *table, void *pointer,
+                                    uint8_t pointer_size)
+{
+    BiosLinkerLoaderEntry entry;
+
+    memset(&entry, 0, sizeof entry);
+    strncpy(entry.pointer.dest_file, dest_file,
+            sizeof entry.pointer.dest_file - 1);
+    strncpy(entry.pointer.src_file, src_file,
+            sizeof entry.pointer.src_file - 1);
+    entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ADD_POINTER);
+    entry.pointer.offset = cpu_to_le32((gchar *)pointer - table->data);
+    entry.pointer.size = pointer_size;
+    assert(pointer_size == 1 || pointer_size == 2 ||
+           pointer_size == 4 || pointer_size == 8);
+
+    g_array_append_val(linker, entry);
+}
diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
index f950707..b9ca380 100644
--- a/hw/i386/Makefile.objs
+++ b/hw/i386/Makefile.objs
@@ -5,6 +5,7 @@ obj-y += pc_sysfw.o
 obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
 
 obj-y += kvmvapic.o
+obj-y += bios-linker-loader.o
 
 iasl-option=$(shell if test -z "`$(1) $(2) 2>&1 > /dev/null`" \
     ; then echo "$(2)"; else echo "$(3)"; fi ;)
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 17/27] loader: allow adding ROMs in done callbacks
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (15 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 16/27] i386: add bios linker/loader Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 18/27] i386: define pc guest info Michael S. Tsirkin
                   ` (12 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Don't abort if machine done callbacks add ROMs.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/loader.h | 1 +
 hw/core/loader.c    | 6 +++++-
 vl.c                | 3 +++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/include/hw/loader.h b/include/hw/loader.h
index e0c576b..58eca98 100644
--- a/include/hw/loader.h
+++ b/include/hw/loader.h
@@ -46,6 +46,7 @@ void *rom_add_blob(const char *name, const void *blob, size_t len,
 int rom_add_elf_program(const char *name, void *data, size_t datasize,
                         size_t romsize, hwaddr addr);
 int rom_load_all(void);
+void rom_load_done(void);
 void rom_set_fw(FWCfgState *f);
 int rom_copy(uint8_t *dest, hwaddr addr, size_t size);
 void *rom_ptr(hwaddr addr);
diff --git a/hw/core/loader.c b/hw/core/loader.c
index 060729f..60d2ebd 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -812,10 +812,14 @@ int rom_load_all(void)
         memory_region_unref(section.mr);
     }
     qemu_register_reset(rom_reset, NULL);
-    roms_loaded = 1;
     return 0;
 }
 
+void rom_load_done(void)
+{
+    roms_loaded = 1;
+}
+
 void rom_set_fw(FWCfgState *f)
 {
     fw_cfg = f;
diff --git a/vl.c b/vl.c
index fb8006e..46c29c4 100644
--- a/vl.c
+++ b/vl.c
@@ -4339,6 +4339,9 @@ int main(int argc, char **argv, char **envp)
     qemu_register_reset(qbus_reset_all_fn, sysbus_get_default());
     qemu_run_machine_init_done_notifiers();
 
+    /* Done notifiers can load ROMs */
+    rom_load_done();
+
     qemu_system_reset(VMRESET_SILENT);
     if (loadvm) {
         if (load_vmstate(loadvm) < 0) {
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 18/27] i386: define pc guest info
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (16 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 17/27] loader: allow adding ROMs in done callbacks Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 19/27] acpi/piix: add macros for acpi property names Michael S. Tsirkin
                   ` (11 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori
  Cc: kraxel, imammedo, pbonzini, Laszlo Ersek, afaerber

This defines a structure that will be used to fill in acpi tables
where relevant properties are not yet available using QOM.

Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/i386/pc.h |  9 +++++++++
 hw/i386/pc.c         | 21 +++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 9b2ddc4..085a621 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -9,6 +9,9 @@
 #include "hw/i386/ioapic.h"
 
 #include "qemu/range.h"
+#include "qemu/bitmap.h"
+#include "sysemu/sysemu.h"
+#include "hw/pci/pci.h"
 
 /* PC-style peripherals (also used by other machines).  */
 
@@ -20,6 +23,12 @@ typedef struct PcPciInfo {
 struct PcGuestInfo {
     bool has_pci_info;
     bool isapc_ram_fw;
+    hwaddr ram_size;
+    unsigned apic_id_limit;
+    bool apic_xrupt_override;
+    uint64_t numa_nodes;
+    uint64_t *node_mem;
+    uint64_t *node_cpu;
     FWCfgState *fw_cfg;
 };
 
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 0c313fe..d17d1d9 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1047,6 +1047,27 @@ PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
 {
     PcGuestInfoState *guest_info_state = g_malloc0(sizeof *guest_info_state);
     PcGuestInfo *guest_info = &guest_info_state->info;
+    int i, j;
+
+    guest_info->ram_size = below_4g_mem_size + above_4g_mem_size;
+    guest_info->apic_id_limit = pc_apic_id_limit(max_cpus);
+    guest_info->apic_xrupt_override = kvm_allows_irq0_override();
+    guest_info->numa_nodes = nb_numa_nodes;
+    guest_info->node_mem = g_memdup(node_mem, guest_info->numa_nodes *
+                                    sizeof *guest_info->node_mem);
+    guest_info->node_cpu = g_malloc0(guest_info->apic_id_limit *
+                                     sizeof *guest_info->node_cpu);
+
+    for (i = 0; i < max_cpus; i++) {
+        unsigned int apic_id = x86_cpu_apic_id_from_index(i);
+        assert(apic_id < guest_info->apic_id_limit);
+        for (j = 0; j < nb_numa_nodes; j++) {
+            if (test_bit(i, node_cpumask[j])) {
+                guest_info->node_cpu[apic_id] = j;
+                break;
+            }
+        }
+    }
 
     guest_info_state->machine_done.notify = pc_guest_info_machine_done;
     qemu_add_machine_init_done_notifier(&guest_info_state->machine_done);
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 19/27] acpi/piix: add macros for acpi property names
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (17 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 18/27] i386: define pc guest info Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 20/27] piix: APIs for pc guest info Michael S. Tsirkin
                   ` (10 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/i386/pc.h | 10 ++++++++++
 hw/acpi/piix4.c      |  6 +++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 085a621..5aefc5b 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -20,6 +20,16 @@ typedef struct PcPciInfo {
     Range w64;
 } PcPciInfo;
 
+#define ACPI_PM_PROP_S3_DISABLED "disable_s3"
+#define ACPI_PM_PROP_S4_DISABLED "disable_s4"
+#define ACPI_PM_PROP_S4_VAL "s4_val"
+#define ACPI_PM_PROP_SCI_INT "sci_int"
+#define ACPI_PM_PROP_ACPI_ENABLE_CMD "acpi_enable_cmd"
+#define ACPI_PM_PROP_ACPI_DISABLE_CMD "acpi_disable_cmd"
+#define ACPI_PM_PROP_PM_IO_BASE "pm_io_base"
+#define ACPI_PM_PROP_GPE0_BLK "gpe0_blk"
+#define ACPI_PM_PROP_GPE0_BLK_LEN "gpe0_blk_len"
+
 struct PcGuestInfo {
     bool has_pci_info;
     bool isapc_ram_fw;
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index b46bd5e..4b8c1da 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -489,9 +489,9 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
 
 static Property piix4_pm_properties[] = {
     DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0),
-    DEFINE_PROP_UINT8("disable_s3", PIIX4PMState, disable_s3, 0),
-    DEFINE_PROP_UINT8("disable_s4", PIIX4PMState, disable_s4, 0),
-    DEFINE_PROP_UINT8("s4_val", PIIX4PMState, s4_val, 2),
+    DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 0),
+    DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_DISABLED, PIIX4PMState, disable_s4, 0),
+    DEFINE_PROP_UINT8(ACPI_PM_PROP_S4_VAL, PIIX4PMState, s4_val, 2),
     DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 20/27] piix: APIs for pc guest info
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (18 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 19/27] acpi/piix: add macros for acpi property names Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 21/27] ich9: " Michael S. Tsirkin
                   ` (9 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

This adds APIs that will be used to fill in guest acpi tables.
Some required information is still lacking in QOM, so we
fall back on lookups by type and returning explicit types.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/acpi/piix4.h |  8 ++++++++
 include/hw/i386/pc.h    |  1 +
 hw/acpi/piix4.c         | 44 ++++++++++++++++++++++++++++++++++++++++----
 hw/pci-host/piix.c      |  8 ++++++++
 4 files changed, 57 insertions(+), 4 deletions(-)
 create mode 100644 include/hw/acpi/piix4.h

diff --git a/include/hw/acpi/piix4.h b/include/hw/acpi/piix4.h
new file mode 100644
index 0000000..65e6fd7
--- /dev/null
+++ b/include/hw/acpi/piix4.h
@@ -0,0 +1,8 @@
+#ifndef HW_ACPI_PIIX4_H
+#define HW_ACPI_PIIX4_H
+
+#include "qemu/typedefs.h"
+
+Object *piix4_pm_find(void);
+
+#endif
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 5aefc5b..95857be 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -192,6 +192,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
                     MemoryRegion *pci_memory,
                     MemoryRegion *ram_memory);
 
+PCIBus *find_i440fx(void);
 /* piix4.c */
 extern PCIDevice *piix4_dev;
 int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 4b8c1da..3bcd890 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -29,6 +29,7 @@
 #include "exec/ioport.h"
 #include "hw/nvram/fw_cfg.h"
 #include "exec/address-spaces.h"
+#include "hw/acpi/piix4.h"
 
 //#define DEBUG
 
@@ -69,6 +70,8 @@ typedef struct PIIX4PMState {
     /*< public >*/
 
     MemoryRegion io;
+    uint32_t io_base;
+
     MemoryRegion io_gpe;
     MemoryRegion io_pci;
     MemoryRegion io_cpu;
@@ -152,14 +155,13 @@ static void apm_ctrl_changed(uint32_t val, void *arg)
 static void pm_io_space_update(PIIX4PMState *s)
 {
     PCIDevice *d = PCI_DEVICE(s);
-    uint32_t pm_io_base;
 
-    pm_io_base = le32_to_cpu(*(uint32_t *)(d->config + 0x40));
-    pm_io_base &= 0xffc0;
+    s->io_base = le32_to_cpu(*(uint32_t *)(d->config + 0x40));
+    s->io_base &= 0xffc0;
 
     memory_region_transaction_begin();
     memory_region_set_enabled(&s->io, d->config[0x80] & 1);
-    memory_region_set_address(&s->io, pm_io_base);
+    memory_region_set_address(&s->io, s->io_base);
     memory_region_transaction_commit();
 }
 
@@ -407,6 +409,28 @@ static void piix4_pm_machine_ready(Notifier *n, void *opaque)
         (memory_region_present(io_as, 0x2f8) ? 0x90 : 0);
 }
 
+static void piix4_pm_add_propeties(PIIX4PMState *s)
+{
+    static const uint8_t acpi_enable_cmd = ACPI_ENABLE;
+    static const uint8_t acpi_disable_cmd = ACPI_DISABLE;
+    static const uint32_t gpe0_blk = GPE_BASE;
+    static const uint32_t gpe0_blk_len = GPE_LEN;
+    static const uint16_t sci_int = 9;
+
+    object_property_add_uint8_ptr(OBJECT(s), ACPI_PM_PROP_ACPI_ENABLE_CMD,
+                                  &acpi_enable_cmd, NULL);
+    object_property_add_uint8_ptr(OBJECT(s), ACPI_PM_PROP_ACPI_DISABLE_CMD,
+                                  &acpi_disable_cmd, NULL);
+    object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_GPE0_BLK,
+                                  &gpe0_blk, NULL);
+    object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_GPE0_BLK_LEN,
+                                  &gpe0_blk_len, NULL);
+    object_property_add_uint16_ptr(OBJECT(s), ACPI_PM_PROP_SCI_INT,
+                                  &sci_int, NULL);
+    object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_PM_IO_BASE,
+                                  &s->io_base, NULL);
+}
+
 static int piix4_pm_initfn(PCIDevice *dev)
 {
     PIIX4PMState *s = PIIX4_PM(dev);
@@ -456,9 +480,21 @@ static int piix4_pm_initfn(PCIDevice *dev)
 
     piix4_acpi_system_hot_add_init(pci_address_space_io(dev), dev->bus, s);
 
+    piix4_pm_add_propeties(s);
     return 0;
 }
 
+Object *piix4_pm_find(void)
+{
+    bool ambig;
+    Object *o = object_resolve_path_type("", TYPE_PIIX4_PM, &ambig);
+
+    if (ambig || !o) {
+        return NULL;
+    }
+    return o;
+}
+
 i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
                        qemu_irq sci_irq, qemu_irq smi_irq,
                        int kvm_enabled, FWCfgState *fw_cfg)
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index c041149..bad3953 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -416,6 +416,14 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,
     return b;
 }
 
+PCIBus *find_i440fx(void)
+{
+    PCIHostState *s = OBJECT_CHECK(PCIHostState,
+                                   object_resolve_path("/machine/i440fx", NULL),
+                                   TYPE_PCI_HOST_BRIDGE);
+    return s ? s->bus : NULL;
+}
+
 /* PIIX3 PCI to ISA bridge */
 static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq)
 {
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 21/27] ich9: APIs for pc guest info
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (19 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 20/27] piix: APIs for pc guest info Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 22/27] pvpanic: add API to access io port Michael S. Tsirkin
                   ` (8 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

This adds APIs that will be used to fill in
acpi tables, implemented using QOM,
to various ich9 components.
Some information is still missing in QOM,
so we fall back on lookups by type instead.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/acpi/ich9.h    |  2 ++
 include/hw/i386/ich9.h    |  2 ++
 include/hw/pci-host/q35.h |  2 ++
 hw/acpi/ich9.c            | 24 ++++++++++++++++++++++++
 hw/isa/lpc_ich9.c         | 40 ++++++++++++++++++++++++++++++++++++++++
 hw/pci-host/q35.c         | 10 ++++++++++
 6 files changed, 80 insertions(+)

diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h
index b1fe71f..82fcf9f 100644
--- a/include/hw/acpi/ich9.h
+++ b/include/hw/acpi/ich9.h
@@ -49,4 +49,6 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
 void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base);
 extern const VMStateDescription vmstate_ich9_pm;
 
+void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp);
+
 #endif /* HW_ACPI_ICH9_H */
diff --git a/include/hw/i386/ich9.h b/include/hw/i386/ich9.h
index c5f637b..4a68b35 100644
--- a/include/hw/i386/ich9.h
+++ b/include/hw/i386/ich9.h
@@ -66,6 +66,8 @@ typedef struct ICH9LPCState {
     qemu_irq *ioapic;
 } ICH9LPCState;
 
+Object *ich9_lpc_find(void);
+
 #define Q35_MASK(bit, ms_bit, ls_bit) \
 ((uint##bit##_t)(((1ULL << ((ms_bit) + 1)) - 1) & ~((1ULL << ls_bit) - 1)))
 
diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
index 6eb7ab6..f9db770 100644
--- a/include/hw/pci-host/q35.h
+++ b/include/hw/pci-host/q35.h
@@ -156,4 +156,6 @@ typedef struct Q35PCIHost {
 #define MCH_PCIE_DEV                           1
 #define MCH_PCIE_FUNC                          0
 
+uint64_t mch_mcfg_base(void);
+
 #endif /* HW_Q35_H */
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index 3fb443d..7e0429e 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -24,6 +24,7 @@
  * GNU GPL, version 2 or (at your option) any later version.
  */
 #include "hw/hw.h"
+#include "qapi/visitor.h"
 #include "hw/i386/pc.h"
 #include "hw/pci/pci.h"
 #include "qemu/timer.h"
@@ -228,3 +229,26 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
     pm->powerdown_notifier.notify = pm_powerdown_req;
     qemu_register_powerdown_notifier(&pm->powerdown_notifier);
 }
+
+static void ich9_pm_get_gpe0_blk(Object *obj, Visitor *v,
+                                 void *opaque, const char *name,
+                                 Error **errp)
+{
+    ICH9LPCPMRegs *pm = opaque;
+    uint32_t value = pm->pm_io_base + ICH9_PMIO_GPE0_STS;
+
+    visit_type_uint32(v, &value, name, errp);
+}
+
+void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
+{
+    static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
+
+    object_property_add_uint32_ptr(obj, ACPI_PM_PROP_PM_IO_BASE,
+                                   &pm->pm_io_base, errp);
+    object_property_add(obj, ACPI_PM_PROP_GPE0_BLK, "uint32",
+                        ich9_pm_get_gpe0_blk,
+                        NULL, NULL, pm, NULL);
+    object_property_add_uint32_ptr(obj, ACPI_PM_PROP_GPE0_BLK_LEN,
+                                   &gpe0_len, errp);
+}
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 5633d08..19b2198 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -29,6 +29,7 @@
  */
 #include "qemu-common.h"
 #include "hw/hw.h"
+#include "qapi/visitor.h"
 #include "qemu/range.h"
 #include "hw/isa/isa.h"
 #include "hw/sysbus.h"
@@ -525,6 +526,43 @@ static const MemoryRegionOps ich9_rst_cnt_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN
 };
 
+Object *ich9_lpc_find(void)
+{
+    bool ambig;
+    Object *o = object_resolve_path_type("", TYPE_ICH9_LPC_DEVICE, &ambig);
+
+    if (ambig) {
+        return NULL;
+    }
+    return o;
+}
+
+static void ich9_lpc_get_sci_int(Object *obj, Visitor *v,
+                                 void *opaque, const char *name,
+                                 Error **errp)
+{
+    ICH9LPCState *lpc = ICH9_LPC_DEVICE(obj);
+    uint32_t value = ich9_lpc_sci_irq(lpc);
+
+    visit_type_uint32(v, &value, name, errp);
+}
+
+static void ich9_lpc_add_properties(ICH9LPCState *lpc)
+{
+    static const uint8_t acpi_enable_cmd = ICH9_APM_ACPI_ENABLE;
+    static const uint8_t acpi_disable_cmd = ICH9_APM_ACPI_DISABLE;
+
+    object_property_add(OBJECT(lpc), ACPI_PM_PROP_SCI_INT, "uint32",
+                        ich9_lpc_get_sci_int,
+                        NULL, NULL, NULL, NULL);
+    object_property_add_uint8_ptr(OBJECT(lpc), ACPI_PM_PROP_ACPI_ENABLE_CMD,
+                                  &acpi_enable_cmd, NULL);
+    object_property_add_uint8_ptr(OBJECT(lpc), ACPI_PM_PROP_ACPI_DISABLE_CMD,
+                                  &acpi_disable_cmd, NULL);
+
+    ich9_pm_add_properties(OBJECT(lpc), &lpc->pm, NULL);
+}
+
 static int ich9_lpc_initfn(PCIDevice *d)
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(d);
@@ -552,6 +590,8 @@ static int ich9_lpc_initfn(PCIDevice *d)
                                         ICH9_RST_CNT_IOPORT, &lpc->rst_cnt_mem,
                                         1);
 
+    ich9_lpc_add_properties(lpc);
+
     return 0;
 }
 
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index a051b58..50063f8 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -389,6 +389,16 @@ static int mch_init(PCIDevice *d)
     return 0;
 }
 
+uint64_t mch_mcfg_base(void)
+{
+    bool ambiguous;
+    Object *o = object_resolve_path_type("", TYPE_MCH_PCI_DEVICE, &ambiguous);
+    if (!o) {
+        return 0;
+    }
+    return MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT;
+}
+
 static void mch_class_init(ObjectClass *klass, void *data)
 {
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 22/27] pvpanic: add API to access io port
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (20 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 21/27] ich9: " Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 23/27] hpet: add API to find it Michael S. Tsirkin
                   ` (7 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Add API to find pvpanic device and get its io port.
Will be used to fill in guest info structure.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/i386/pc.h |  1 +
 hw/misc/pvpanic.c    | 13 ++++++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 95857be..e3ee0a8 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -235,6 +235,7 @@ void pc_system_firmware_init(MemoryRegion *rom_memory,
 
 /* pvpanic.c */
 void pvpanic_init(ISABus *bus);
+uint16_t pvpanic_port(void);
 
 /* e820 types */
 #define E820_RAM        1
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index b64e3bb..226e298 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -117,8 +117,19 @@ void pvpanic_init(ISABus *bus)
     isa_create_simple(bus, TYPE_ISA_PVPANIC_DEVICE);
 }
 
+#define PVPANIC_IOPORT_PROP "ioport"
+
+uint16_t pvpanic_port(void)
+{
+    Object *o = object_resolve_path_type("", TYPE_ISA_PVPANIC_DEVICE, NULL);
+    if (!o) {
+        return 0;
+    }
+    return object_property_get_int(o, PVPANIC_IOPORT_PROP, NULL);
+}
+
 static Property pvpanic_isa_properties[] = {
-    DEFINE_PROP_UINT16("ioport", PVPanicState, ioport, 0x505),
+    DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicState, ioport, 0x505),
     DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 23/27] hpet: add API to find it
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (21 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 22/27] pvpanic: add API to access io port Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 24/27] i386: ACPI table generation code from seabios Michael S. Tsirkin
                   ` (6 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Add API to find HPET using QOM.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/timer/hpet.h | 2 ++
 hw/timer/hpet.c         | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/include/hw/timer/hpet.h b/include/hw/timer/hpet.h
index 757f79f..ab44bd3 100644
--- a/include/hw/timer/hpet.h
+++ b/include/hw/timer/hpet.h
@@ -71,4 +71,6 @@ struct hpet_fw_config
 } QEMU_PACKED;
 
 extern struct hpet_fw_config hpet_cfg;
+
+bool hpet_find(void);
 #endif
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index fcd22ae..2eb75ea 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -757,6 +757,11 @@ static void hpet_device_class_init(ObjectClass *klass, void *data)
     dc->props = hpet_device_properties;
 }
 
+bool hpet_find(void)
+{
+    return object_resolve_path_type("", TYPE_HPET, NULL);
+}
+
 static const TypeInfo hpet_device_info = {
     .name          = TYPE_HPET,
     .parent        = TYPE_SYS_BUS_DEVICE,
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 24/27] i386: ACPI table generation code from seabios
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (22 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 23/27] hpet: add API to find it Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 25/27] ssdt: fix PBLK length Michael S. Tsirkin
                   ` (5 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

This adds C code for generating ACPI tables at runtime,
imported from seabios git tree
    commit 51684b7ced75fb76776e8ee84833fcfb6ecf12dd

Although ACPI tables come from a system BIOS on real hw,
it makes sense that the ACPI tables are coupled with the
virtual machine, since they have to abstract the x86 machine to
the OS's.

This is widely desired as a way to avoid the churn
and proliferation of QEMU-specific interfaces
associated with ACPI tables in bios code.

Notes:
As BIOS can reprogram devices prior to loading
ACPI tables, we pre-format ACPI tables but defer loading
hardware configuration there until tables are loaded.

The code structure was intentionally kept as close
to the seabios original as possible, to simplify
comparison and making sure we didn't lose anything
in translation.

Minor code duplication results, to help ensure there are no functional
regressions, I think it's better to merge it like this and do more code
changes in follow-up patches.

Cross-version compatibility concerns have been addressed:
    ACPI tables are exposed to guest as FW_CFG entries.
    When running with -M 1.5 and older, this patch disables ACPI
    table generation, and doesn't expose ACPI
    tables to guest.

    As table content is likely to change over time,
    the following measures are taken to simplify
    cross-version migration:
    - All tables besides the RSDP are packed in a single FW CFG entry.
      This entry size is currently 23K. We round it up to 64K
      to avoid too much churn there.
    - Tables are placed in special ROM blob (not mapped into guest memory)
      which is automatically migrated together with the guest, same
      as BIOS code.
    - Offsets where hardware configuration is loaded in ACPI tables
      are also migrated, this is in case future ACPI changes make us
      rearrange the tables in memory.

This patch reuses some code from SeaBIOS, which was originally under
LGPLv2 and then relicensed to GPLv3 or LGPLv3, in QEMU under GPLv2+. This
relicensing has been acked by all contributors that had contributed to the
code since the v2->v3 relicense. ACKs approving the v2+ relicensing are
listed below. The list might include ACKs from people not holding
copyright on any parts of the reused code, but it's better to err on the
side of caution and include them.

Affected SeaBIOS files (GPLv2+ license headers added)
<http://thread.gmane.org/gmane.comp.bios.coreboot.seabios/5949>:

 src/acpi-dsdt-cpu-hotplug.dsl
 src/acpi-dsdt-dbug.dsl
 src/acpi-dsdt-hpet.dsl
 src/acpi-dsdt-isa.dsl
 src/acpi-dsdt-pci-crs.dsl
 src/acpi.c
 src/acpi.h
 src/ssdt-misc.dsl
 src/ssdt-pcihp.dsl
 src/ssdt-proc.dsl
 tools/acpi_extract.py
 tools/acpi_extract_preprocess.py

Each one of the listed people agreed to the following:

> If you allow the use of your contribution in QEMU under the
> terms of GPLv2 or later as proposed by this patch,
> please respond to this mail including the line:
>
> Acked-by: Name <email address>

  Acked-by: Gerd Hoffmann <kraxel@redhat.com>
  Acked-by: Jan Kiszka <jan.kiszka@siemens.com>
  Acked-by: Jason Baron <jbaron@akamai.com>
  Acked-by: David Woodhouse <David.Woodhouse@intel.com>
  Acked-by: Gleb Natapov <gleb@redhat.com>
  Acked-by: Marcelo Tosatti <mtosatti@redhat.com>
  Acked-by: Dave Frodin <dave.frodin@se-eng.com>
  Acked-by: Paolo Bonzini <pbonzini@redhat.com>
  Acked-by: Kevin O'Connor <kevin@koconnor.net>
  Acked-by: Laszlo Ersek <lersek@redhat.com>
  Acked-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
  Acked-by: Isaku Yamahata <yamahata@valinux.co.jp>
  Acked-by: Magnus Christensson <magnus.christensson@intel.com>
  Acked-by: Hu Tao <hutao@cn.fujitsu.com>
  Acked-by: Eduardo Habkost <ehabkost@redhat.com>

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/acpi-build.h  |    9 +
 hw/i386/acpi-defs.h   |  331 ++++++++++++++
 include/hw/i386/pc.h  |    1 +
 hw/i386/acpi-build.c  | 1205 +++++++++++++++++++++++++++++++++++++++++++++++++
 hw/i386/pc.c          |    2 +
 hw/i386/pc_piix.c     |    5 +
 hw/i386/pc_q35.c      |    3 +
 hw/i386/Makefile.objs |    4 +
 8 files changed, 1560 insertions(+)
 create mode 100644 hw/i386/acpi-build.h
 create mode 100644 hw/i386/acpi-defs.h
 create mode 100644 hw/i386/acpi-build.c

diff --git a/hw/i386/acpi-build.h b/hw/i386/acpi-build.h
new file mode 100644
index 0000000..e57b1aa
--- /dev/null
+++ b/hw/i386/acpi-build.h
@@ -0,0 +1,9 @@
+
+#ifndef HW_I386_ACPI_BUILD_H
+#define HW_I386_ACPI_BUILD_H
+
+#include "qemu/typedefs.h"
+
+void acpi_setup(PcGuestInfo *);
+
+#endif
diff --git a/hw/i386/acpi-defs.h b/hw/i386/acpi-defs.h
new file mode 100644
index 0000000..78ca204
--- /dev/null
+++ b/hw/i386/acpi-defs.h
@@ -0,0 +1,331 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef QEMU_ACPI_DEFS_H
+#define QEMU_ACPI_DEFS_H
+
+enum {
+    ACPI_FADT_F_WBINVD,
+    ACPI_FADT_F_WBINVD_FLUSH,
+    ACPI_FADT_F_PROC_C1,
+    ACPI_FADT_F_P_LVL2_UP,
+    ACPI_FADT_F_PWR_BUTTON,
+    ACPI_FADT_F_SLP_BUTTON,
+    ACPI_FADT_F_FIX_RTC,
+    ACPI_FADT_F_RTC_S4,
+    ACPI_FADT_F_TMR_VAL_EXT,
+    ACPI_FADT_F_DCK_CAP,
+    ACPI_FADT_F_RESET_REG_SUP,
+    ACPI_FADT_F_SEALED_CASE,
+    ACPI_FADT_F_HEADLESS,
+    ACPI_FADT_F_CPU_SW_SLP,
+    ACPI_FADT_F_PCI_EXP_WAK,
+    ACPI_FADT_F_USE_PLATFORM_CLOCK,
+    ACPI_FADT_F_S4_RTC_STS_VALID,
+    ACPI_FADT_F_REMOTE_POWER_ON_CAPABLE,
+    ACPI_FADT_F_FORCE_APIC_CLUSTER_MODEL,
+    ACPI_FADT_F_FORCE_APIC_PHYSICAL_DESTINATION_MODE,
+    ACPI_FADT_F_HW_REDUCED_ACPI,
+    ACPI_FADT_F_LOW_POWER_S0_IDLE_CAPABLE,
+};
+
+/*
+ * ACPI 2.0 Generic Address Space definition.
+ */
+struct Acpi20GenericAddress {
+    uint8_t  address_space_id;
+    uint8_t  register_bit_width;
+    uint8_t  register_bit_offset;
+    uint8_t  reserved;
+    uint64_t address;
+} QEMU_PACKED;
+typedef struct Acpi20GenericAddress Acpi20GenericAddress;
+
+#define ACPI_RSDP_SIGNATURE 0x2052545020445352LL // "RSD PTR "
+
+struct AcpiRsdpDescriptor {        /* Root System Descriptor Pointer */
+    uint64_t signature;              /* ACPI signature, contains "RSD PTR " */
+    uint8_t  checksum;               /* To make sum of struct == 0 */
+    uint8_t  oem_id [6];             /* OEM identification */
+    uint8_t  revision;               /* Must be 0 for 1.0, 2 for 2.0 */
+    uint32_t rsdt_physical_address;  /* 32-bit physical address of RSDT */
+    uint32_t length;                 /* XSDT Length in bytes including hdr */
+    uint64_t xsdt_physical_address;  /* 64-bit physical address of XSDT */
+    uint8_t  extended_checksum;      /* Checksum of entire table */
+    uint8_t  reserved [3];           /* Reserved field must be 0 */
+} QEMU_PACKED;
+typedef struct AcpiRsdpDescriptor AcpiRsdpDescriptor;
+
+/* Table structure from Linux kernel (the ACPI tables are under the
+   BSD license) */
+
+
+#define ACPI_TABLE_HEADER_DEF   /* ACPI common table header */ \
+    uint32_t signature;          /* ACPI signature (4 ASCII characters) */ \
+    uint32_t length;                 /* Length of table, in bytes, including header */ \
+    uint8_t  revision;               /* ACPI Specification minor version # */ \
+    uint8_t  checksum;               /* To make sum of entire table == 0 */ \
+    uint8_t  oem_id [6];             /* OEM identification */ \
+    uint8_t  oem_table_id [8];       /* OEM table identification */ \
+    uint32_t oem_revision;           /* OEM revision number */ \
+    uint8_t  asl_compiler_id [4];    /* ASL compiler vendor ID */ \
+    uint32_t asl_compiler_revision;  /* ASL compiler revision number */
+
+
+struct AcpiTableHeader         /* ACPI common table header */
+{
+    ACPI_TABLE_HEADER_DEF
+} QEMU_PACKED;
+typedef struct AcpiTableHeader AcpiTableHeader;
+
+/*
+ * ACPI 1.0 Fixed ACPI Description Table (FADT)
+ */
+#define ACPI_FACP_SIGNATURE 0x50434146 // FACP
+struct AcpiFadtDescriptorRev1
+{
+    ACPI_TABLE_HEADER_DEF     /* ACPI common table header */
+    uint32_t firmware_ctrl;          /* Physical address of FACS */
+    uint32_t dsdt;                   /* Physical address of DSDT */
+    uint8_t  model;                  /* System Interrupt Model */
+    uint8_t  reserved1;              /* Reserved */
+    uint16_t sci_int;                /* System vector of SCI interrupt */
+    uint32_t smi_cmd;                /* Port address of SMI command port */
+    uint8_t  acpi_enable;            /* Value to write to smi_cmd to enable ACPI */
+    uint8_t  acpi_disable;           /* Value to write to smi_cmd to disable ACPI */
+    uint8_t  S4bios_req;             /* Value to write to SMI CMD to enter S4BIOS state */
+    uint8_t  reserved2;              /* Reserved - must be zero */
+    uint32_t pm1a_evt_blk;           /* Port address of Power Mgt 1a acpi_event Reg Blk */
+    uint32_t pm1b_evt_blk;           /* Port address of Power Mgt 1b acpi_event Reg Blk */
+    uint32_t pm1a_cnt_blk;           /* Port address of Power Mgt 1a Control Reg Blk */
+    uint32_t pm1b_cnt_blk;           /* Port address of Power Mgt 1b Control Reg Blk */
+    uint32_t pm2_cnt_blk;            /* Port address of Power Mgt 2 Control Reg Blk */
+    uint32_t pm_tmr_blk;             /* Port address of Power Mgt Timer Ctrl Reg Blk */
+    uint32_t gpe0_blk;               /* Port addr of General Purpose acpi_event 0 Reg Blk */
+    uint32_t gpe1_blk;               /* Port addr of General Purpose acpi_event 1 Reg Blk */
+    uint8_t  pm1_evt_len;            /* Byte length of ports at pm1_x_evt_blk */
+    uint8_t  pm1_cnt_len;            /* Byte length of ports at pm1_x_cnt_blk */
+    uint8_t  pm2_cnt_len;            /* Byte Length of ports at pm2_cnt_blk */
+    uint8_t  pm_tmr_len;             /* Byte Length of ports at pm_tm_blk */
+    uint8_t  gpe0_blk_len;           /* Byte Length of ports at gpe0_blk */
+    uint8_t  gpe1_blk_len;           /* Byte Length of ports at gpe1_blk */
+    uint8_t  gpe1_base;              /* Offset in gpe model where gpe1 events start */
+    uint8_t  reserved3;              /* Reserved */
+    uint16_t plvl2_lat;              /* Worst case HW latency to enter/exit C2 state */
+    uint16_t plvl3_lat;              /* Worst case HW latency to enter/exit C3 state */
+    uint16_t flush_size;             /* Size of area read to flush caches */
+    uint16_t flush_stride;           /* Stride used in flushing caches */
+    uint8_t  duty_offset;            /* Bit location of duty cycle field in p_cnt reg */
+    uint8_t  duty_width;             /* Bit width of duty cycle field in p_cnt reg */
+    uint8_t  day_alrm;               /* Index to day-of-month alarm in RTC CMOS RAM */
+    uint8_t  mon_alrm;               /* Index to month-of-year alarm in RTC CMOS RAM */
+    uint8_t  century;                /* Index to century in RTC CMOS RAM */
+    uint8_t  reserved4;              /* Reserved */
+    uint8_t  reserved4a;             /* Reserved */
+    uint8_t  reserved4b;             /* Reserved */
+    uint32_t flags;
+} QEMU_PACKED;
+typedef struct AcpiFadtDescriptorRev1 AcpiFadtDescriptorRev1;
+
+/*
+ * ACPI 1.0 Root System Description Table (RSDT)
+ */
+#define ACPI_RSDT_SIGNATURE 0x54445352 // RSDT
+struct AcpiRsdtDescriptorRev1
+{
+    ACPI_TABLE_HEADER_DEF       /* ACPI common table header */
+    uint32_t table_offset_entry[0];  /* Array of pointers to other */
+    /* ACPI tables */
+} QEMU_PACKED;
+typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
+
+/*
+ * ACPI 1.0 Firmware ACPI Control Structure (FACS)
+ */
+#define ACPI_FACS_SIGNATURE 0x53434146 // FACS
+struct AcpiFacsDescriptorRev1
+{
+    uint32_t signature;           /* ACPI Signature */
+    uint32_t length;                 /* Length of structure, in bytes */
+    uint32_t hardware_signature;     /* Hardware configuration signature */
+    uint32_t firmware_waking_vector; /* ACPI OS waking vector */
+    uint32_t global_lock;            /* Global Lock */
+    uint32_t flags;
+    uint8_t  resverved3 [40];        /* Reserved - must be zero */
+} QEMU_PACKED;
+typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
+
+/*
+ * Differentiated System Description Table (DSDT)
+ */
+#define ACPI_DSDT_SIGNATURE 0x54445344 // DSDT
+
+/*
+ * MADT values and structures
+ */
+
+/* Values for MADT PCATCompat */
+
+#define ACPI_DUAL_PIC                0
+#define ACPI_MULTIPLE_APIC           1
+
+/* Master MADT */
+
+#define ACPI_APIC_SIGNATURE 0x43495041 // APIC
+struct AcpiMultipleApicTable
+{
+    ACPI_TABLE_HEADER_DEF     /* ACPI common table header */
+    uint32_t local_apic_address;     /* Physical address of local APIC */
+    uint32_t flags;
+} QEMU_PACKED;
+typedef struct AcpiMultipleApicTable AcpiMultipleApicTable;
+
+/* Values for Type in APIC sub-headers */
+
+#define ACPI_APIC_PROCESSOR          0
+#define ACPI_APIC_IO                 1
+#define ACPI_APIC_XRUPT_OVERRIDE     2
+#define ACPI_APIC_NMI                3
+#define ACPI_APIC_LOCAL_NMI          4
+#define ACPI_APIC_ADDRESS_OVERRIDE   5
+#define ACPI_APIC_IO_SAPIC           6
+#define ACPI_APIC_LOCAL_SAPIC        7
+#define ACPI_APIC_XRUPT_SOURCE       8
+#define ACPI_APIC_RESERVED           9           /* 9 and greater are reserved */
+
+/*
+ * MADT sub-structures (Follow MULTIPLE_APIC_DESCRIPTION_TABLE)
+ */
+#define ACPI_SUB_HEADER_DEF   /* Common ACPI sub-structure header */\
+    uint8_t  type;                               \
+    uint8_t  length;
+
+/* Sub-structures for MADT */
+
+struct AcpiMadtProcessorApic
+{
+    ACPI_SUB_HEADER_DEF
+    uint8_t  processor_id;           /* ACPI processor id */
+    uint8_t  local_apic_id;          /* Processor's local APIC id */
+    uint32_t flags;
+} QEMU_PACKED;
+typedef struct AcpiMadtProcessorApic AcpiMadtProcessorApic;
+
+struct AcpiMadtIoApic
+{
+    ACPI_SUB_HEADER_DEF
+    uint8_t  io_apic_id;             /* I/O APIC ID */
+    uint8_t  reserved;               /* Reserved - must be zero */
+    uint32_t address;                /* APIC physical address */
+    uint32_t interrupt;              /* Global system interrupt where INTI
+                                 * lines start */
+} QEMU_PACKED;
+typedef struct AcpiMadtIoApic AcpiMadtIoApic;
+
+struct AcpiMadtIntsrcovr {
+    ACPI_SUB_HEADER_DEF
+    uint8_t  bus;
+    uint8_t  source;
+    uint32_t gsi;
+    uint16_t flags;
+} QEMU_PACKED;
+typedef struct AcpiMadtIntsrcovr AcpiMadtIntsrcovr;
+
+struct AcpiMadtLocalNmi {
+    ACPI_SUB_HEADER_DEF
+    uint8_t  processor_id;           /* ACPI processor id */
+    uint16_t flags;                  /* MPS INTI flags */
+    uint8_t  lint;                   /* Local APIC LINT# */
+} QEMU_PACKED;
+typedef struct AcpiMadtLocalNmi AcpiMadtLocalNmi;
+
+/*
+ * HPET Description Table
+ */
+#define ACPI_HPET_SIGNATURE 0x54455048 // HPET
+struct Acpi20Hpet {
+    ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
+    uint32_t           timer_block_id;
+    Acpi20GenericAddress addr;
+    uint8_t            hpet_number;
+    uint16_t           min_tick;
+    uint8_t            page_protect;
+} QEMU_PACKED;
+typedef struct Acpi20Hpet Acpi20Hpet;
+
+/*
+ * SRAT (NUMA topology description) table
+ */
+
+#define ACPI_SRAT_SIGNATURE 0x54415253 // SRAT
+struct AcpiSystemResourceAffinityTable
+{
+    ACPI_TABLE_HEADER_DEF
+    uint32_t    reserved1;
+    uint32_t    reserved2[2];
+} QEMU_PACKED;
+typedef struct AcpiSystemResourceAffinityTable AcpiSystemResourceAffinityTable;
+
+#define ACPI_SRAT_PROCESSOR          0
+#define ACPI_SRAT_MEMORY             1
+
+struct AcpiSratProcessorAffinity
+{
+    ACPI_SUB_HEADER_DEF
+    uint8_t     proximity_lo;
+    uint8_t     local_apic_id;
+    uint32_t    flags;
+    uint8_t     local_sapic_eid;
+    uint8_t     proximity_hi[3];
+    uint32_t    reserved;
+} QEMU_PACKED;
+typedef struct AcpiSratProcessorAffinity AcpiSratProcessorAffinity;
+
+struct AcpiSratMemoryAffinity
+{
+    ACPI_SUB_HEADER_DEF
+    uint8_t     proximity[4];
+    uint16_t    reserved1;
+    uint64_t    base_addr;
+    uint64_t    range_length;
+    uint32_t    reserved2;
+    uint32_t    flags;
+    uint32_t    reserved3[2];
+} QEMU_PACKED;
+typedef struct AcpiSratMemoryAffinity AcpiSratMemoryAffinity;
+
+/* PCI fw r3.0 MCFG table. */
+/* Subtable */
+struct AcpiMcfgAllocation {
+    uint64_t address;                /* Base address, processor-relative */
+    uint16_t pci_segment;            /* PCI segment group number */
+    uint8_t start_bus_number;       /* Starting PCI Bus number */
+    uint8_t end_bus_number;         /* Final PCI Bus number */
+    uint32_t reserved;
+} QEMU_PACKED;
+typedef struct AcpiMcfgAllocation AcpiMcfgAllocation;
+
+#define ACPI_MCFG_SIGNATURE 0x4746434d       // MCFG
+
+/* Reserved signature: ignored by OSPM */
+#define ACPI_RSRV_SIGNATURE 0x554d4551       // QEMU
+
+struct AcpiTableMcfg {
+    ACPI_TABLE_HEADER_DEF;
+    uint8_t reserved[8];
+    AcpiMcfgAllocation allocation[0];
+} QEMU_PACKED;
+typedef struct AcpiTableMcfg AcpiTableMcfg;
+
+#endif
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index e3ee0a8..39db8cb 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -40,6 +40,7 @@ struct PcGuestInfo {
     uint64_t *node_mem;
     uint64_t *node_cpu;
     FWCfgState *fw_cfg;
+    bool has_acpi_build;
 };
 
 /* parallel.c */
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
new file mode 100644
index 0000000..262d1d6
--- /dev/null
+++ b/hw/i386/acpi-build.c
@@ -0,0 +1,1205 @@
+/* Support for generating ACPI tables and passing them to Guests
+ *
+ * Copyright (C) 2008-2010  Kevin O'Connor <kevin@koconnor.net>
+ * Copyright (C) 2006 Fabrice Bellard
+ * Copyright (C) 2013 Red Hat Inc
+ *
+ * Author: Michael S. Tsirkin <mst@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "acpi-build.h"
+#include <stddef.h>
+#include <glib.h>
+#include "qemu-common.h"
+#include "qemu/bitmap.h"
+#include "qemu/range.h"
+#include "hw/pci/pci.h"
+#include "qom/cpu.h"
+#include "hw/i386/pc.h"
+#include "target-i386/cpu.h"
+#include "hw/timer/hpet.h"
+#include "hw/i386/acpi-defs.h"
+#include "hw/acpi/acpi.h"
+#include "hw/nvram/fw_cfg.h"
+#include "bios-linker-loader.h"
+#include "hw/loader.h"
+
+/* Supported chipsets: */
+#include "hw/acpi/piix4.h"
+#include "hw/i386/ich9.h"
+#include "hw/pci/pci_bus.h"
+#include "hw/pci-host/q35.h"
+
+#include "hw/i386/q35-acpi-dsdt.hex"
+#include "hw/i386/acpi-dsdt.hex"
+
+#include "qapi/qmp/qint.h"
+#include "qom/qom-qobject.h"
+
+typedef struct AcpiCpuInfo {
+    DECLARE_BITMAP(found_cpus, MAX_CPUMASK_BITS + 1);
+} AcpiCpuInfo;
+
+typedef struct AcpiMcfgInfo {
+    uint64_t mcfg_base;
+    uint32_t mcfg_size;
+} AcpiMcfgInfo;
+
+typedef struct AcpiPmInfo {
+    bool s3_disabled;
+    bool s4_disabled;
+    uint8_t s4_val;
+    uint16_t sci_int;
+    uint8_t acpi_enable_cmd;
+    uint8_t acpi_disable_cmd;
+    uint32_t gpe0_blk;
+    uint32_t gpe0_blk_len;
+    uint32_t io_base;
+} AcpiPmInfo;
+
+typedef struct AcpiMiscInfo {
+    bool has_hpet;
+    DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX);
+    const unsigned char *dsdt_code;
+    unsigned dsdt_size;
+    uint16_t pvpanic_port;
+} AcpiMiscInfo;
+
+static void acpi_get_dsdt(AcpiMiscInfo *info)
+{
+    Object *piix = piix4_pm_find();
+    Object *lpc = ich9_lpc_find();
+    assert(!!piix != !!lpc);
+
+    if (piix) {
+        info->dsdt_code = AcpiDsdtAmlCode;
+        info->dsdt_size = sizeof AcpiDsdtAmlCode;
+    }
+    if (lpc) {
+        info->dsdt_code = Q35AcpiDsdtAmlCode;
+        info->dsdt_size = sizeof Q35AcpiDsdtAmlCode;
+    }
+}
+
+static
+int acpi_add_cpu_info(Object *o, void *opaque)
+{
+    AcpiCpuInfo *cpu = opaque;
+    uint64_t apic_id;
+
+    if (object_dynamic_cast(o, TYPE_CPU)) {
+        apic_id = object_property_get_int(o, "apic-id", NULL);
+        assert(apic_id <= MAX_CPUMASK_BITS);
+
+        set_bit(apic_id, cpu->found_cpus);
+    }
+
+    object_child_foreach(o, acpi_add_cpu_info, opaque);
+    return 0;
+}
+
+static void acpi_get_cpu_info(AcpiCpuInfo *cpu)
+{
+    Object *root = object_get_root();
+
+    memset(cpu->found_cpus, 0, sizeof cpu->found_cpus);
+    object_child_foreach(root, acpi_add_cpu_info, cpu);
+}
+
+static void acpi_get_pm_info(AcpiPmInfo *pm)
+{
+    Object *piix = piix4_pm_find();
+    Object *lpc = ich9_lpc_find();
+    Object *obj = NULL;
+    QObject *o;
+
+    if (piix) {
+        obj = piix;
+    }
+    if (lpc) {
+        obj = lpc;
+    }
+    assert(obj);
+
+    /* Fill in optional s3/s4 related properties */
+    o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
+    if (o) {
+        pm->s3_disabled = qint_get_int(qobject_to_qint(o));
+    } else {
+        pm->s3_disabled = false;
+    }
+    o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED, NULL);
+    if (o) {
+        pm->s4_disabled = qint_get_int(qobject_to_qint(o));
+    } else {
+        pm->s4_disabled = false;
+    }
+    o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, NULL);
+    if (o) {
+        pm->s4_val = qint_get_int(qobject_to_qint(o));
+    } else {
+        pm->s4_val = false;
+    }
+
+    /* Fill in mandatory properties */
+    pm->sci_int = object_property_get_int(obj, ACPI_PM_PROP_SCI_INT, NULL);
+
+    pm->acpi_enable_cmd = object_property_get_int(obj,
+                                                  ACPI_PM_PROP_ACPI_ENABLE_CMD,
+                                                  NULL);
+    pm->acpi_disable_cmd = object_property_get_int(obj,
+                                                  ACPI_PM_PROP_ACPI_DISABLE_CMD,
+                                                  NULL);
+    pm->io_base = object_property_get_int(obj, ACPI_PM_PROP_PM_IO_BASE,
+                                          NULL);
+    pm->gpe0_blk = object_property_get_int(obj, ACPI_PM_PROP_GPE0_BLK,
+                                           NULL);
+    pm->gpe0_blk_len = object_property_get_int(obj, ACPI_PM_PROP_GPE0_BLK_LEN,
+                                               NULL);
+}
+
+static void acpi_get_hotplug_info(AcpiMiscInfo *misc)
+{
+    int i;
+    PCIBus *bus = find_i440fx();
+
+    if (!bus) {
+        /* Only PIIX supports ACPI hotplug */
+        memset(misc->slot_hotplug_enable, 0, sizeof misc->slot_hotplug_enable);
+        return;
+    }
+
+    memset(misc->slot_hotplug_enable, 0xff,
+           DIV_ROUND_UP(PCI_SLOT_MAX, BITS_PER_BYTE));
+
+    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
+        PCIDeviceClass *pc;
+        PCIDevice *pdev = bus->devices[i];
+
+        if (!pdev) {
+            continue;
+        }
+
+        pc = PCI_DEVICE_GET_CLASS(pdev);
+
+        if (pc->no_hotplug) {
+            int slot = PCI_SLOT(i);
+
+            clear_bit(slot, misc->slot_hotplug_enable);
+        }
+    }
+}
+
+static void acpi_get_misc_info(AcpiMiscInfo *info)
+{
+    info->has_hpet = hpet_find();
+    info->pvpanic_port = pvpanic_port();
+}
+
+static void acpi_get_pci_info(PcPciInfo *info)
+{
+    Object *pci_host;
+    bool ambiguous;
+
+    pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
+    g_assert(!ambiguous);
+    g_assert(pci_host);
+
+    info->w32.begin = object_property_get_int(pci_host,
+                                              PCI_HOST_PROP_PCI_HOLE_START,
+                                              NULL);
+    info->w32.end = object_property_get_int(pci_host,
+                                            PCI_HOST_PROP_PCI_HOLE_END,
+                                            NULL);
+    info->w64.begin = object_property_get_int(pci_host,
+                                              PCI_HOST_PROP_PCI_HOLE64_START,
+                                              NULL);
+    info->w64.end = object_property_get_int(pci_host,
+                                            PCI_HOST_PROP_PCI_HOLE64_END,
+                                            NULL);
+}
+
+#define ACPI_BUILD_APPNAME  "Bochs"
+#define ACPI_BUILD_APPNAME6 "BOCHS "
+#define ACPI_BUILD_APPNAME4 "BXPC"
+
+#define ACPI_BUILD_DPRINTF(level, fmt, ...) do {} while (0)
+
+#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables"
+#define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp"
+
+static void
+build_header(GArray *linker, GArray *table_data,
+             AcpiTableHeader *h, uint32_t sig, int len, uint8_t rev)
+{
+    h->signature = cpu_to_le32(sig);
+    h->length = cpu_to_le32(len);
+    h->revision = rev;
+    memcpy(h->oem_id, ACPI_BUILD_APPNAME6, 6);
+    memcpy(h->oem_table_id, ACPI_BUILD_APPNAME4, 4);
+    memcpy(h->oem_table_id + 4, (void *)&sig, 4);
+    h->oem_revision = cpu_to_le32(1);
+    memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME4, 4);
+    h->asl_compiler_revision = cpu_to_le32(1);
+    h->checksum = 0;
+    /* Checksum to be filled in by Guest linker */
+    bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
+                                    table_data->data, h, len, &h->checksum);
+}
+
+static inline GArray *build_alloc_array(void)
+{
+        return g_array_new(false, true /* clear */, 1);
+}
+
+static inline void build_free_array(GArray *array)
+{
+        g_array_free(array, true);
+}
+
+static inline void build_prepend_byte(GArray *array, uint8_t val)
+{
+    g_array_prepend_val(array, val);
+}
+
+static inline void build_append_byte(GArray *array, uint8_t val)
+{
+    g_array_append_val(array, val);
+}
+
+static inline void build_append_array(GArray *array, GArray *val)
+{
+    g_array_append_vals(array, val->data, val->len);
+}
+
+static void build_append_nameseg(GArray *array, const char *format, ...)
+{
+    GString *s = g_string_new("");
+    va_list args;
+
+    va_start(args, format);
+    g_string_vprintf(s, format, args);
+    va_end(args);
+
+    assert(s->len == 4);
+    g_array_append_vals(array, s->str, s->len);
+    g_string_free(s, true);
+}
+
+/* 5.4 Definition Block Encoding */
+enum {
+    PACKAGE_LENGTH_1BYTE_SHIFT = 6, /* Up to 63 - use extra 2 bits. */
+    PACKAGE_LENGTH_2BYTE_SHIFT = 4,
+    PACKAGE_LENGTH_3BYTE_SHIFT = 12,
+    PACKAGE_LENGTH_4BYTE_SHIFT = 20,
+};
+
+static void build_prepend_package_length(GArray *package, unsigned min_bytes)
+{
+    uint8_t byte;
+    unsigned length = package->len;
+    unsigned length_bytes;
+
+    if (length + 1 < (1 << PACKAGE_LENGTH_1BYTE_SHIFT)) {
+        length_bytes = 1;
+    } else if (length + 2 < (1 << PACKAGE_LENGTH_3BYTE_SHIFT)) {
+        length_bytes = 2;
+    } else if (length + 3 < (1 << PACKAGE_LENGTH_4BYTE_SHIFT)) {
+        length_bytes = 3;
+    } else {
+        length_bytes = 4;
+    }
+
+    /* Force length to at least min_bytes.
+     * This wastes memory but that's how bios did it.
+     */
+    length_bytes = MAX(length_bytes, min_bytes);
+
+    /* PkgLength is the length of the inclusive length of the data. */
+    length += length_bytes;
+
+    switch (length_bytes) {
+    case 1:
+        byte = length;
+        build_prepend_byte(package, byte);
+        return;
+    case 4:
+        byte = length >> PACKAGE_LENGTH_4BYTE_SHIFT;
+        build_prepend_byte(package, byte);
+        length &= (1 << PACKAGE_LENGTH_4BYTE_SHIFT) - 1;
+        /* fall through */
+    case 3:
+        byte = length >> PACKAGE_LENGTH_3BYTE_SHIFT;
+        build_prepend_byte(package, byte);
+        length &= (1 << PACKAGE_LENGTH_3BYTE_SHIFT) - 1;
+        /* fall through */
+    case 2:
+        byte = length >> PACKAGE_LENGTH_2BYTE_SHIFT;
+        build_prepend_byte(package, byte);
+        length &= (1 << PACKAGE_LENGTH_2BYTE_SHIFT) - 1;
+        /* fall through */
+    }
+    /*
+     * Most significant two bits of byte zero indicate how many following bytes
+     * are in PkgLength encoding.
+     */
+    byte = ((length_bytes - 1) << PACKAGE_LENGTH_1BYTE_SHIFT) | length;
+    build_prepend_byte(package, byte);
+}
+
+static void build_package(GArray *package, uint8_t op, unsigned min_bytes)
+{
+    build_prepend_package_length(package, min_bytes);
+    build_prepend_byte(package, op);
+}
+
+static void build_append_value(GArray *table, uint32_t value, int size)
+{
+    uint8_t prefix;
+    int i;
+
+    switch (size) {
+    case 1:
+        prefix = 0x0A; /* BytePrefix */
+        break;
+    case 2:
+        prefix = 0x0B; /* WordPrefix */
+        break;
+    case 4:
+        prefix = 0x0C; /* DWordPrefix */
+        break;
+    default:
+        assert(0);
+        return;
+    }
+    build_append_byte(table, prefix);
+    for (i = 0; i < size; ++i) {
+        build_append_byte(table, value & 0xFF);
+        value = value >> 8;
+    }
+}
+
+static void build_append_notify_target(GArray *method, GArray *target_name,
+                                       uint32_t value, int size)
+{
+    GArray *notify = build_alloc_array();
+    uint8_t op = 0xA0; /* IfOp */
+
+    build_append_byte(notify, 0x93); /* LEqualOp */
+    build_append_byte(notify, 0x68); /* Arg0Op */
+    build_append_value(notify, value, size);
+    build_append_byte(notify, 0x86); /* NotifyOp */
+    build_append_array(notify, target_name);
+    build_append_byte(notify, 0x69); /* Arg1Op */
+
+    /* Pack it up */
+    build_package(notify, op, 1);
+
+    build_append_array(method, notify);
+
+    build_free_array(notify);
+}
+
+#define ACPI_PORT_SMI_CMD           0x00b2 /* TODO: this is APM_CNT_IOPORT */
+
+static inline void *acpi_data_push(GArray *table_data, unsigned size)
+{
+    unsigned off = table_data->len;
+    g_array_set_size(table_data, off + size);
+    return table_data->data + off;
+}
+
+static unsigned acpi_data_len(GArray *table)
+{
+    return table->len * g_array_get_element_size(table);
+}
+
+static void acpi_align_size(GArray *blob, unsigned align)
+{
+    /* Align size to multiple of given size. This reduces the chance
+     * we need to change size in the future (breaking cross version migration).
+     */
+    g_array_set_size(blob, (ROUND_UP(acpi_data_len(blob), align) +
+                            g_array_get_element_size(blob) - 1) /
+                             g_array_get_element_size(blob));
+}
+
+/* Get pointer within table in a safe manner */
+#define ACPI_BUILD_PTR(table, size, off, type) \
+    ((type *)(acpi_data_get_ptr(table, size, off, sizeof(type))))
+
+static inline void *acpi_data_get_ptr(uint8_t *table_data, unsigned table_size,
+                                      unsigned off, unsigned size)
+{
+    assert(off + size > off);
+    assert(off + size <= table_size);
+    return table_data + off;
+}
+
+static inline void acpi_add_table(GArray *table_offsets, GArray *table_data)
+{
+    uint32_t offset = cpu_to_le32(table_data->len);
+    g_array_append_val(table_offsets, offset);
+}
+
+/* FACS */
+static void
+build_facs(GArray *table_data, GArray *linker, PcGuestInfo *guest_info)
+{
+    AcpiFacsDescriptorRev1 *facs = acpi_data_push(table_data, sizeof *facs);
+    facs->signature = cpu_to_le32(ACPI_FACS_SIGNATURE);
+    facs->length = cpu_to_le32(sizeof(*facs));
+}
+
+/* Load chipset information in FADT */
+static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm)
+{
+    fadt->model = 1;
+    fadt->reserved1 = 0;
+    fadt->sci_int = cpu_to_le16(pm->sci_int);
+    fadt->smi_cmd = cpu_to_le32(ACPI_PORT_SMI_CMD);
+    fadt->acpi_enable = pm->acpi_enable_cmd;
+    fadt->acpi_disable = pm->acpi_disable_cmd;
+    /* EVT, CNT, TMR offset matches hw/acpi/core.c */
+    fadt->pm1a_evt_blk = cpu_to_le32(pm->io_base);
+    fadt->pm1a_cnt_blk = cpu_to_le32(pm->io_base + 0x04);
+    fadt->pm_tmr_blk = cpu_to_le32(pm->io_base + 0x08);
+    fadt->gpe0_blk = cpu_to_le32(pm->gpe0_blk);
+    /* EVT, CNT, TMR length matches hw/acpi/core.c */
+    fadt->pm1_evt_len = 4;
+    fadt->pm1_cnt_len = 2;
+    fadt->pm_tmr_len = 4;
+    fadt->gpe0_blk_len = pm->gpe0_blk_len;
+    fadt->plvl2_lat = cpu_to_le16(0xfff); /* C2 state not supported */
+    fadt->plvl3_lat = cpu_to_le16(0xfff); /* C3 state not supported */
+    fadt->flags = cpu_to_le32((1 << ACPI_FADT_F_WBINVD) |
+                              (1 << ACPI_FADT_F_PROC_C1) |
+                              (1 << ACPI_FADT_F_SLP_BUTTON) |
+                              (1 << ACPI_FADT_F_RTC_S4));
+    fadt->flags |= cpu_to_le32(1 << ACPI_FADT_F_USE_PLATFORM_CLOCK);
+}
+
+
+/* FADT */
+static void
+build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm,
+           unsigned facs, unsigned dsdt)
+{
+    AcpiFadtDescriptorRev1 *fadt = acpi_data_push(table_data, sizeof(*fadt));
+
+    fadt->firmware_ctrl = cpu_to_le32(facs);
+    /* FACS address to be filled by Guest linker */
+    bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
+                                   ACPI_BUILD_TABLE_FILE,
+                                   table_data, &fadt->firmware_ctrl,
+                                   sizeof fadt->firmware_ctrl);
+
+    fadt->dsdt = cpu_to_le32(dsdt);
+    /* DSDT address to be filled by Guest linker */
+    bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
+                                   ACPI_BUILD_TABLE_FILE,
+                                   table_data, &fadt->dsdt,
+                                   sizeof fadt->dsdt);
+
+    fadt_setup(fadt, pm);
+
+    build_header(linker, table_data,
+                 (void *)fadt, ACPI_FACP_SIGNATURE, sizeof(*fadt), 1);
+}
+
+static void
+build_madt(GArray *table_data, GArray *linker, AcpiCpuInfo *cpu,
+           PcGuestInfo *guest_info)
+{
+    int madt_start = table_data->len;
+
+    AcpiMultipleApicTable *madt;
+    AcpiMadtIoApic *io_apic;
+    AcpiMadtIntsrcovr *intsrcovr;
+    AcpiMadtLocalNmi *local_nmi;
+    int i;
+
+    madt = acpi_data_push(table_data, sizeof *madt);
+    madt->local_apic_address = cpu_to_le32(APIC_DEFAULT_ADDRESS);
+    madt->flags = cpu_to_le32(1);
+
+    for (i = 0; i < guest_info->apic_id_limit; i++) {
+        AcpiMadtProcessorApic *apic = acpi_data_push(table_data, sizeof *apic);
+        apic->type = ACPI_APIC_PROCESSOR;
+        apic->length = sizeof(*apic);
+        apic->processor_id = i;
+        apic->local_apic_id = i;
+        if (test_bit(i, cpu->found_cpus)) {
+            apic->flags = cpu_to_le32(1);
+        } else {
+            apic->flags = cpu_to_le32(0);
+        }
+    }
+    io_apic = acpi_data_push(table_data, sizeof *io_apic);
+    io_apic->type = ACPI_APIC_IO;
+    io_apic->length = sizeof(*io_apic);
+#define ACPI_BUILD_IOAPIC_ID 0x0
+    io_apic->io_apic_id = ACPI_BUILD_IOAPIC_ID;
+    io_apic->address = cpu_to_le32(IO_APIC_DEFAULT_ADDRESS);
+    io_apic->interrupt = cpu_to_le32(0);
+
+    if (guest_info->apic_xrupt_override) {
+        intsrcovr = acpi_data_push(table_data, sizeof *intsrcovr);
+        intsrcovr->type   = ACPI_APIC_XRUPT_OVERRIDE;
+        intsrcovr->length = sizeof(*intsrcovr);
+        intsrcovr->source = 0;
+        intsrcovr->gsi    = cpu_to_le32(2);
+        intsrcovr->flags  = cpu_to_le16(0); /* conforms to bus specifications */
+    }
+    for (i = 1; i < 16; i++) {
+#define ACPI_BUILD_PCI_IRQS ((1<<5) | (1<<9) | (1<<10) | (1<<11))
+        if (!(ACPI_BUILD_PCI_IRQS & (1 << i))) {
+            /* No need for a INT source override structure. */
+            continue;
+        }
+        intsrcovr = acpi_data_push(table_data, sizeof *intsrcovr);
+        intsrcovr->type   = ACPI_APIC_XRUPT_OVERRIDE;
+        intsrcovr->length = sizeof(*intsrcovr);
+        intsrcovr->source = i;
+        intsrcovr->gsi    = cpu_to_le32(i);
+        intsrcovr->flags  = cpu_to_le16(0xd); /* active high, level triggered */
+    }
+
+    local_nmi = acpi_data_push(table_data, sizeof *local_nmi);
+    local_nmi->type         = ACPI_APIC_LOCAL_NMI;
+    local_nmi->length       = sizeof(*local_nmi);
+    local_nmi->processor_id = 0xff; /* all processors */
+    local_nmi->flags        = cpu_to_le16(0);
+    local_nmi->lint         = 1; /* ACPI_LINT1 */
+
+    build_header(linker, table_data,
+                 (void *)(table_data->data + madt_start), ACPI_APIC_SIGNATURE,
+                 table_data->len - madt_start, 1);
+}
+
+/* Encode a hex value */
+static inline char acpi_get_hex(uint32_t val)
+{
+    val &= 0x0f;
+    return (val <= 9) ? ('0' + val) : ('A' + val - 10);
+}
+
+#include "hw/i386/ssdt-proc.hex"
+
+/* 0x5B 0x83 ProcessorOp PkgLength NameString ProcID */
+#define ACPI_PROC_OFFSET_CPUHEX (*ssdt_proc_name - *ssdt_proc_start + 2)
+#define ACPI_PROC_OFFSET_CPUID1 (*ssdt_proc_name - *ssdt_proc_start + 4)
+#define ACPI_PROC_OFFSET_CPUID2 (*ssdt_proc_id - *ssdt_proc_start)
+#define ACPI_PROC_SIZEOF (*ssdt_proc_end - *ssdt_proc_start)
+#define ACPI_PROC_AML (ssdp_proc_aml + *ssdt_proc_start)
+
+/* 0x5B 0x82 DeviceOp PkgLength NameString */
+#define ACPI_PCIHP_OFFSET_HEX (*ssdt_pcihp_name - *ssdt_pcihp_start + 1)
+#define ACPI_PCIHP_OFFSET_ID (*ssdt_pcihp_id - *ssdt_pcihp_start)
+#define ACPI_PCIHP_OFFSET_ADR (*ssdt_pcihp_adr - *ssdt_pcihp_start)
+#define ACPI_PCIHP_OFFSET_EJ0 (*ssdt_pcihp_ej0 - *ssdt_pcihp_start)
+#define ACPI_PCIHP_SIZEOF (*ssdt_pcihp_end - *ssdt_pcihp_start)
+#define ACPI_PCIHP_AML (ssdp_pcihp_aml + *ssdt_pcihp_start)
+
+#define ACPI_SSDT_SIGNATURE 0x54445353 /* SSDT */
+#define ACPI_SSDT_HEADER_LENGTH 36
+
+#include "hw/i386/ssdt-misc.hex"
+#include "hw/i386/ssdt-pcihp.hex"
+
+static void
+build_append_notify(GArray *device, const char *name,
+                    const char *format, int skip, int count)
+{
+    int i;
+    GArray *method = build_alloc_array();
+    uint8_t op = 0x14; /* MethodOp */
+
+    build_append_nameseg(method, name);
+    build_append_byte(method, 0x02); /* MethodFlags: ArgCount */
+    for (i = skip; i < count; i++) {
+        GArray *target = build_alloc_array();
+        build_append_nameseg(target, format, i);
+        assert(i < 256); /* Fits in 1 byte */
+        build_append_notify_target(method, target, i, 1);
+        build_free_array(target);
+    }
+    build_package(method, op, 2);
+
+    build_append_array(device, method);
+    build_free_array(method);
+}
+
+static void patch_pcihp(int slot, uint8_t *ssdt_ptr, uint32_t eject)
+{
+    ssdt_ptr[ACPI_PCIHP_OFFSET_HEX] = acpi_get_hex(slot >> 4);
+    ssdt_ptr[ACPI_PCIHP_OFFSET_HEX + 1] = acpi_get_hex(slot);
+    ssdt_ptr[ACPI_PCIHP_OFFSET_ID] = slot;
+    ssdt_ptr[ACPI_PCIHP_OFFSET_ADR + 2] = slot;
+
+    /* Runtime patching of ACPI_EJ0: to disable hotplug for a slot,
+     * replace the method name: _EJ0 by ACPI_EJ0_.
+     */
+    /* Sanity check */
+    assert(!memcmp(ssdt_ptr + ACPI_PCIHP_OFFSET_EJ0, "_EJ0", 4));
+
+    if (!eject) {
+        memcpy(ssdt_ptr + ACPI_PCIHP_OFFSET_EJ0, "EJ0_", 4);
+    }
+}
+
+static void patch_pci_windows(PcPciInfo *pci, uint8_t *start, unsigned size)
+{
+    *ACPI_BUILD_PTR(start, size, acpi_pci32_start[0], uint32_t) =
+        cpu_to_le32(pci->w32.begin);
+
+    *ACPI_BUILD_PTR(start, size, acpi_pci32_end[0], uint32_t) =
+        cpu_to_le32(pci->w32.end - 1);
+
+    if (pci->w64.end || pci->w64.begin) {
+        *ACPI_BUILD_PTR(start, size, acpi_pci64_valid[0], uint8_t) = 1;
+        *ACPI_BUILD_PTR(start, size, acpi_pci64_start[0], uint64_t) =
+            cpu_to_le64(pci->w64.begin);
+        *ACPI_BUILD_PTR(start, size, acpi_pci64_end[0], uint64_t) =
+            cpu_to_le64(pci->w64.end - 1);
+        *ACPI_BUILD_PTR(start, size, acpi_pci64_length[0], uint64_t) =
+            cpu_to_le64(pci->w64.end - pci->w64.begin);
+    } else {
+        *ACPI_BUILD_PTR(start, size, acpi_pci64_valid[0], uint8_t) = 0;
+    }
+}
+
+static void
+build_ssdt(GArray *table_data, GArray *linker,
+           AcpiCpuInfo *cpu, AcpiPmInfo *pm, AcpiMiscInfo *misc,
+           PcPciInfo *pci, PcGuestInfo *guest_info)
+{
+    int acpi_cpus = MIN(0xff, guest_info->apic_id_limit);
+    int ssdt_start = table_data->len;
+    uint8_t *ssdt_ptr;
+    int i;
+
+    /* Copy header and patch values in the S3_ / S4_ / S5_ packages */
+    ssdt_ptr = acpi_data_push(table_data, sizeof(ssdp_misc_aml));
+    memcpy(ssdt_ptr, ssdp_misc_aml, sizeof(ssdp_misc_aml));
+    if (pm->s3_disabled) {
+        ssdt_ptr[acpi_s3_name[0]] = 'X';
+    }
+    if (pm->s4_disabled) {
+        ssdt_ptr[acpi_s4_name[0]] = 'X';
+    } else {
+        ssdt_ptr[acpi_s4_pkg[0] + 1] = ssdt_ptr[acpi_s4_pkg[0] + 3] =
+            pm->s4_val;
+    }
+
+    patch_pci_windows(pci, ssdt_ptr, sizeof(ssdp_misc_aml));
+
+    *(uint16_t *)(ssdt_ptr + *ssdt_isa_pest) =
+        cpu_to_le16(misc->pvpanic_port);
+
+    {
+        GArray *sb_scope = build_alloc_array();
+        uint8_t op = 0x10; /* ScopeOp */
+
+        build_append_nameseg(sb_scope, "_SB_");
+
+        /* build Processor object for each processor */
+        for (i = 0; i < acpi_cpus; i++) {
+            uint8_t *proc = acpi_data_push(sb_scope, ACPI_PROC_SIZEOF);
+            memcpy(proc, ACPI_PROC_AML, ACPI_PROC_SIZEOF);
+            proc[ACPI_PROC_OFFSET_CPUHEX] = acpi_get_hex(i >> 4);
+            proc[ACPI_PROC_OFFSET_CPUHEX+1] = acpi_get_hex(i);
+            proc[ACPI_PROC_OFFSET_CPUID1] = i;
+            proc[ACPI_PROC_OFFSET_CPUID2] = i;
+        }
+
+        /* build this code:
+         *   Method(NTFY, 2) {If (LEqual(Arg0, 0x00)) {Notify(CP00, Arg1)} ...}
+         */
+        /* Arg0 = Processor ID = APIC ID */
+        build_append_notify(sb_scope, "NTFY", "CP%0.02X", 0, acpi_cpus);
+
+        /* build "Name(CPON, Package() { One, One, ..., Zero, Zero, ... })" */
+        build_append_byte(sb_scope, 0x08); /* NameOp */
+        build_append_nameseg(sb_scope, "CPON");
+
+        {
+            GArray *package = build_alloc_array();
+            uint8_t op = 0x12; /* PackageOp */
+
+            build_append_byte(package, acpi_cpus); /* NumElements */
+            for (i = 0; i < acpi_cpus; i++) {
+                uint8_t b = test_bit(i, cpu->found_cpus) ? 0x01 : 0x00;
+                build_append_byte(package, b);
+            }
+
+            build_package(package, op, 2);
+            build_append_array(sb_scope, package);
+            build_free_array(package);
+        }
+
+        {
+            GArray *pci0 = build_alloc_array();
+            uint8_t op = 0x10; /* ScopeOp */;
+
+            build_append_nameseg(pci0, "PCI0");
+
+            /* build Device object for each slot */
+            for (i = 1; i < PCI_SLOT_MAX; i++) {
+                bool eject = test_bit(i, misc->slot_hotplug_enable);
+                void *pcihp = acpi_data_push(pci0, ACPI_PCIHP_SIZEOF);
+
+                memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
+                patch_pcihp(i, pcihp, eject);
+            }
+
+            build_append_notify(pci0, "PCNT", "S%0.02X_", 1, PCI_SLOT_MAX);
+            build_package(pci0, op, 3);
+            build_append_array(sb_scope, pci0);
+            build_free_array(pci0);
+        }
+
+        build_package(sb_scope, op, 3);
+        build_append_array(table_data, sb_scope);
+        build_free_array(sb_scope);
+    }
+
+    build_header(linker, table_data,
+                 (void *)(table_data->data + ssdt_start),
+                 ACPI_SSDT_SIGNATURE, table_data->len - ssdt_start, 1);
+}
+
+static void
+build_hpet(GArray *table_data, GArray *linker)
+{
+    Acpi20Hpet *hpet;
+
+    hpet = acpi_data_push(table_data, sizeof(*hpet));
+    /* Note timer_block_id value must be kept in sync with value advertised by
+     * emulated hpet
+     */
+    hpet->timer_block_id = cpu_to_le32(0x8086a201);
+    hpet->addr.address = cpu_to_le64(HPET_BASE);
+    build_header(linker, table_data,
+                 (void *)hpet, ACPI_HPET_SIGNATURE, sizeof(*hpet), 1);
+}
+
+static void
+acpi_build_srat_memory(AcpiSratMemoryAffinity *numamem,
+                       uint64_t base, uint64_t len, int node, int enabled)
+{
+    numamem->type = ACPI_SRAT_MEMORY;
+    numamem->length = sizeof(*numamem);
+    memset(numamem->proximity, 0, 4);
+    numamem->proximity[0] = node;
+    numamem->flags = cpu_to_le32(!!enabled);
+    numamem->base_addr = cpu_to_le64(base);
+    numamem->range_length = cpu_to_le64(len);
+}
+
+static void
+build_srat(GArray *table_data, GArray *linker,
+           AcpiCpuInfo *cpu, PcGuestInfo *guest_info)
+{
+    AcpiSystemResourceAffinityTable *srat;
+    AcpiSratProcessorAffinity *core;
+    AcpiSratMemoryAffinity *numamem;
+
+    int i;
+    uint64_t curnode;
+    int srat_start, numa_start, slots;
+    uint64_t mem_len, mem_base, next_base;
+
+    srat_start = table_data->len;
+
+    srat = acpi_data_push(table_data, sizeof *srat);
+    srat->reserved1 = cpu_to_le32(1);
+    core = (void *)(srat + 1);
+
+    for (i = 0; i < guest_info->apic_id_limit; ++i) {
+        core = acpi_data_push(table_data, sizeof *core);
+        core->type = ACPI_SRAT_PROCESSOR;
+        core->length = sizeof(*core);
+        core->local_apic_id = i;
+        curnode = guest_info->node_cpu[i];
+        core->proximity_lo = curnode;
+        memset(core->proximity_hi, 0, 3);
+        core->local_sapic_eid = 0;
+        if (test_bit(i, cpu->found_cpus)) {
+            core->flags = cpu_to_le32(1);
+        } else {
+            core->flags = cpu_to_le32(0);
+        }
+    }
+
+
+    /* the memory map is a bit tricky, it contains at least one hole
+     * from 640k-1M and possibly another one from 3.5G-4G.
+     */
+    next_base = 0;
+    numa_start = table_data->len;
+
+    numamem = acpi_data_push(table_data, sizeof *numamem);
+    acpi_build_srat_memory(numamem, 0, 640*1024, 0, 1);
+    next_base = 1024 * 1024;
+    for (i = 1; i < guest_info->numa_nodes + 1; ++i) {
+        mem_base = next_base;
+        mem_len = guest_info->node_mem[i - 1];
+        if (i == 1) {
+            mem_len -= 1024 * 1024;
+        }
+        next_base = mem_base + mem_len;
+
+        /* Cut out the ACPI_PCI hole */
+        if (mem_base <= guest_info->ram_size &&
+            next_base > guest_info->ram_size) {
+            mem_len -= next_base - guest_info->ram_size;
+            if (mem_len > 0) {
+                numamem = acpi_data_push(table_data, sizeof *numamem);
+                acpi_build_srat_memory(numamem, mem_base, mem_len, i-1, 1);
+            }
+            mem_base = 1ULL << 32;
+            mem_len = next_base - guest_info->ram_size;
+            next_base += (1ULL << 32) - guest_info->ram_size;
+        }
+        numamem = acpi_data_push(table_data, sizeof *numamem);
+        acpi_build_srat_memory(numamem, mem_base, mem_len, i - 1, 1);
+    }
+    slots = (table_data->len - numa_start) / sizeof *numamem;
+    for (; slots < guest_info->numa_nodes + 2; slots++) {
+        numamem = acpi_data_push(table_data, sizeof *numamem);
+        acpi_build_srat_memory(numamem, 0, 0, 0, 0);
+    }
+
+    build_header(linker, table_data,
+                 (void *)(table_data->data + srat_start),
+                 ACPI_SRAT_SIGNATURE,
+                 table_data->len - srat_start, 1);
+}
+
+static void
+build_mcfg_q35(GArray *table_data, GArray *linker, AcpiMcfgInfo *info)
+{
+    AcpiTableMcfg *mcfg;
+    uint32_t sig;
+    int len = sizeof(*mcfg) + 1 * sizeof(mcfg->allocation[0]);
+
+    mcfg = acpi_data_push(table_data, len);
+    mcfg->allocation[0].address = cpu_to_le64(info->mcfg_base);
+    /* Only a single allocation so no need to play with segments */
+    mcfg->allocation[0].pci_segment = cpu_to_le16(0);
+    mcfg->allocation[0].start_bus_number = 0;
+    mcfg->allocation[0].end_bus_number = PCIE_MMCFG_BUS(info->mcfg_size - 1);
+
+    /* MCFG is used for ECAM which can be enabled or disabled by guest.
+     * To avoid table size changes (which create migration issues),
+     * always create the table even if there are no allocations,
+     * but set the signature to a reserved value in this case.
+     * ACPI spec requires OSPMs to ignore such tables.
+     */
+    if (info->mcfg_base == PCIE_BASE_ADDR_UNMAPPED) {
+        sig = ACPI_RSRV_SIGNATURE;
+    } else {
+        sig = ACPI_MCFG_SIGNATURE;
+    }
+    build_header(linker, table_data, (void *)mcfg, sig, len, 1);
+}
+
+static void
+build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
+{
+    void *dsdt;
+    assert(misc->dsdt_code && misc->dsdt_size);
+    dsdt = acpi_data_push(table_data, misc->dsdt_size);
+    memcpy(dsdt, misc->dsdt_code, misc->dsdt_size);
+}
+
+/* Build final rsdt table */
+static void
+build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
+{
+    AcpiRsdtDescriptorRev1 *rsdt;
+    size_t rsdt_len;
+    int i;
+
+    rsdt_len = sizeof(*rsdt) + sizeof(uint32_t) * table_offsets->len;
+    rsdt = acpi_data_push(table_data, rsdt_len);
+    memcpy(rsdt->table_offset_entry, table_offsets->data,
+           sizeof(uint32_t) * table_offsets->len);
+    for (i = 0; i < table_offsets->len; ++i) {
+        /* rsdt->table_offset_entry to be filled by Guest linker */
+        bios_linker_loader_add_pointer(linker,
+                                       ACPI_BUILD_TABLE_FILE,
+                                       ACPI_BUILD_TABLE_FILE,
+                                       table_data, &rsdt->table_offset_entry[i],
+                                       sizeof(uint32_t));
+    }
+    build_header(linker, table_data,
+                 (void *)rsdt, ACPI_RSDT_SIGNATURE, rsdt_len, 1);
+}
+
+static GArray *
+build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
+{
+    AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
+
+    bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 1,
+                             true /* fseg memory */);
+
+    rsdp->signature = cpu_to_le64(ACPI_RSDP_SIGNATURE);
+    memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
+    rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
+    /* Address to be filled by Guest linker */
+    bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
+                                   ACPI_BUILD_TABLE_FILE,
+                                   rsdp_table, &rsdp->rsdt_physical_address,
+                                   sizeof rsdp->rsdt_physical_address);
+    rsdp->checksum = 0;
+    /* Checksum to be filled by Guest linker */
+    bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
+                                    rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
+
+    return rsdp_table;
+}
+
+typedef
+struct AcpiBuildTables {
+    GArray *table_data;
+    GArray *rsdp;
+    GArray *linker;
+} AcpiBuildTables;
+
+static inline void acpi_build_tables_init(AcpiBuildTables *tables)
+{
+    tables->rsdp = g_array_new(false, true /* clear */, 1);
+    tables->table_data = g_array_new(false, true /* clear */, 1);
+    tables->linker = bios_linker_loader_init();
+}
+
+static inline void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
+{
+    void *linker_data = bios_linker_loader_cleanup(tables->linker);
+    if (mfre) {
+        g_free(linker_data);
+    }
+    g_array_free(tables->rsdp, mfre);
+    g_array_free(tables->table_data, mfre);
+}
+
+typedef
+struct AcpiBuildState {
+    /* Copy of table in RAM (for patching). */
+    uint8_t *table_ram;
+    uint32_t table_size;
+    /* Is table patched? */
+    uint8_t patched;
+    PcGuestInfo *guest_info;
+} AcpiBuildState;
+
+static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
+{
+    Object *pci_host;
+    QObject *o;
+    bool ambiguous;
+
+    pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
+    g_assert(!ambiguous);
+    g_assert(pci_host);
+
+    o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_BASE, NULL);
+    if (!o) {
+        return false;
+    }
+    mcfg->mcfg_base = qint_get_int(qobject_to_qint(o));
+
+    o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL);
+    assert(o);
+    mcfg->mcfg_size = qint_get_int(qobject_to_qint(o));
+    return true;
+}
+
+static
+void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
+{
+    GArray *table_offsets;
+    unsigned facs, dsdt, rsdt;
+    AcpiCpuInfo cpu;
+    AcpiPmInfo pm;
+    AcpiMiscInfo misc;
+    AcpiMcfgInfo mcfg;
+    PcPciInfo pci;
+
+    acpi_get_cpu_info(&cpu);
+    acpi_get_pm_info(&pm);
+    acpi_get_dsdt(&misc);
+    acpi_get_hotplug_info(&misc);
+    acpi_get_misc_info(&misc);
+    acpi_get_pci_info(&pci);
+
+    table_offsets = g_array_new(false, true /* clear */,
+                                        sizeof(uint32_t));
+    ACPI_BUILD_DPRINTF(3, "init ACPI tables\n");
+
+    bios_linker_loader_alloc(tables->linker, ACPI_BUILD_TABLE_FILE,
+                             64 /* Ensure FACS is aligned */,
+                             false /* high memory */);
+
+    /*
+     * FACS is pointed to by FADT.
+     * We place it first since it's the only table that has alignment
+     * requirements.
+     */
+    facs = tables->table_data->len;
+    build_facs(tables->table_data, tables->linker, guest_info);
+
+    /* DSDT is pointed to by FADT */
+    dsdt = tables->table_data->len;
+    build_dsdt(tables->table_data, tables->linker, &misc);
+
+    /* ACPI tables pointed to by RSDT */
+    acpi_add_table(table_offsets, tables->table_data);
+    build_fadt(tables->table_data, tables->linker, &pm, facs, dsdt);
+    acpi_add_table(table_offsets, tables->table_data);
+
+    build_ssdt(tables->table_data, tables->linker, &cpu, &pm, &misc, &pci,
+               guest_info);
+    acpi_add_table(table_offsets, tables->table_data);
+
+    build_madt(tables->table_data, tables->linker, &cpu, guest_info);
+    acpi_add_table(table_offsets, tables->table_data);
+    if (misc.has_hpet) {
+        build_hpet(tables->table_data, tables->linker);
+    }
+    if (guest_info->numa_nodes) {
+        acpi_add_table(table_offsets, tables->table_data);
+        build_srat(tables->table_data, tables->linker, &cpu, guest_info);
+    }
+    if (acpi_get_mcfg(&mcfg)) {
+        acpi_add_table(table_offsets, tables->table_data);
+        build_mcfg_q35(tables->table_data, tables->linker, &mcfg);
+    }
+
+    /* RSDT is pointed to by RSDP */
+    rsdt = tables->table_data->len;
+    build_rsdt(tables->table_data, tables->linker, table_offsets);
+
+    /* RSDP is in FSEG memory, so allocate it separately */
+    build_rsdp(tables->rsdp, tables->linker, rsdt);
+
+    /* We'll expose it all to Guest so align size to reduce
+     * chance of size changes.
+     * RSDP is small so it's easy to keep it immutable, no need to
+     * bother with alignment.
+     */
+    acpi_align_size(tables->table_data, 0x1000);
+
+    acpi_align_size(tables->linker, 0x1000);
+
+    /* Cleanup memory that's no longer used. */
+    g_array_free(table_offsets, true);
+}
+
+static void acpi_build_update(void *build_opaque, uint32_t offset)
+{
+    AcpiBuildState *build_state = build_opaque;
+    AcpiBuildTables tables;
+
+    /* No state to update or already patched? Nothing to do. */
+    if (!build_state || build_state->patched) {
+        return;
+    }
+    build_state->patched = 1;
+
+    acpi_build_tables_init(&tables);
+
+    acpi_build(build_state->guest_info, &tables);
+
+    assert(acpi_data_len(tables.table_data) == build_state->table_size);
+    memcpy(build_state->table_ram, tables.table_data->data,
+           build_state->table_size);
+
+    acpi_build_tables_cleanup(&tables, true);
+}
+
+static void acpi_build_reset(void *build_opaque)
+{
+    AcpiBuildState *build_state = build_opaque;
+    build_state->patched = 0;
+}
+
+static void *acpi_add_rom_blob(AcpiBuildState *build_state, GArray *blob,
+                               const char *name)
+{
+    return rom_add_blob(name, blob->data, acpi_data_len(blob), -1, name,
+                        acpi_build_update, build_state);
+}
+
+static const VMStateDescription vmstate_acpi_build = {
+    .name = "acpi_build",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields      = (VMStateField[]) {
+        VMSTATE_UINT8(patched, AcpiBuildState),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+void acpi_setup(PcGuestInfo *guest_info)
+{
+    AcpiBuildTables tables;
+    AcpiBuildState *build_state;
+
+    if (!guest_info->fw_cfg) {
+        ACPI_BUILD_DPRINTF(3, "No fw cfg. Bailing out.\n");
+        return;
+    }
+
+    if (!guest_info->has_acpi_build) {
+        ACPI_BUILD_DPRINTF(3, "ACPI build disabled. Bailing out.\n");
+        return;
+    }
+
+    build_state = g_malloc0(sizeof *build_state);
+
+    build_state->guest_info = guest_info;
+
+    acpi_build_tables_init(&tables);
+    acpi_build(build_state->guest_info, &tables);
+
+    /* Now expose it all to Guest */
+    build_state->table_ram = acpi_add_rom_blob(build_state, tables.table_data,
+                                               ACPI_BUILD_TABLE_FILE);
+    build_state->table_size = acpi_data_len(tables.table_data);
+
+    acpi_add_rom_blob(NULL, tables.linker, "etc/table-loader");
+
+    /*
+     * RSDP is small so it's easy to keep it immutable, no need to
+     * bother with ROM blobs.
+     */
+    fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_RSDP_FILE,
+                    tables.rsdp->data, acpi_data_len(tables.rsdp));
+
+    qemu_register_reset(acpi_build_reset, build_state);
+    acpi_build_reset(build_state);
+    vmstate_register(NULL, 0, &vmstate_acpi_build, build_state);
+
+    /* Cleanup tables but don't free the memory: we track it
+     * in build_state.
+     */
+    acpi_build_tables_cleanup(&tables, false);
+}
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index d17d1d9..a7fcbf9 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -56,6 +56,7 @@
 #include "hw/cpu/icc_bus.h"
 #include "hw/boards.h"
 #include "hw/pci/pci_host.h"
+#include "acpi-build.h"
 
 /* debug PC/ISA interrupts */
 //#define DEBUG_IRQ
@@ -1040,6 +1041,7 @@ void pc_guest_info_machine_done(Notifier *notifier, void *data)
                                                       PcGuestInfoState,
                                                       machine_done);
     pc_fw_cfg_guest_info(&guest_info_state->info);
+    acpi_setup(&guest_info_state->info);
 }
 
 PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 907792b..63ae2ae 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -59,6 +59,7 @@ static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
 
 static bool has_pvpanic;
 static bool has_pci_info = true;
+static bool has_acpi_build = true;
 
 /* PC hardware initialisation */
 static void pc_init1(QEMUMachineInitArgs *args,
@@ -122,6 +123,9 @@ static void pc_init1(QEMUMachineInitArgs *args,
     }
 
     guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
+
+    guest_info->has_acpi_build = has_acpi_build;
+
     guest_info->has_pci_info = has_pci_info;
     guest_info->isapc_ram_fw = !pci_enabled;
 
@@ -240,6 +244,7 @@ static void pc_compat_1_6(QEMUMachineInitArgs *args)
 {
     has_pci_info = false;
     rom_file_in_ram = false;
+    has_acpi_build = false;
 }
 
 static void pc_compat_1_5(QEMUMachineInitArgs *args)
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index ca84e1c..4c191d3 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -49,6 +49,7 @@
 
 static bool has_pvpanic;
 static bool has_pci_info = true;
+static bool has_acpi_build = true;
 
 /* PC hardware initialisation */
 static void pc_q35_init(QEMUMachineInitArgs *args)
@@ -111,6 +112,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
     guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
     guest_info->has_pci_info = has_pci_info;
     guest_info->isapc_ram_fw = false;
+    guest_info->has_acpi_build = has_acpi_build;
 
     /* allocate ram and load rom/bios */
     if (!xen_enabled()) {
@@ -224,6 +226,7 @@ static void pc_compat_1_6(QEMUMachineInitArgs *args)
 {
     has_pci_info = false;
     rom_file_in_ram = false;
+    has_acpi_build = false;
 }
 
 static void pc_compat_1_5(QEMUMachineInitArgs *args)
diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
index b9ca380..185aacb 100644
--- a/hw/i386/Makefile.objs
+++ b/hw/i386/Makefile.objs
@@ -5,7 +5,11 @@ obj-y += pc_sysfw.o
 obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
 
 obj-y += kvmvapic.o
+obj-y += acpi-build.o
 obj-y += bios-linker-loader.o
+hw/i386/acpi-build.o: hw/i386/acpi-build.c hw/i386/acpi-dsdt.hex \
+	hw/i386/ssdt-proc.hex hw/i386/ssdt-pcihp.hex hw/i386/ssdt-misc.hex \
+	hw/i386/acpi-dsdt.hex hw/i386/q35-acpi-dsdt.hex
 
 iasl-option=$(shell if test -z "`$(1) $(2) 2>&1 > /dev/null`" \
     ; then echo "$(2)"; else echo "$(3)"; fi ;)
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 25/27] ssdt: fix PBLK length
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (23 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 24/27] i386: ACPI table generation code from seabios Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 26/27] ssdt-proc: update generated file Michael S. Tsirkin
                   ` (4 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

We don't really support CPU throttling, so supply 0 PBLK length.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/ssdt-proc.dsl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/i386/ssdt-proc.dsl b/hw/i386/ssdt-proc.dsl
index 58333c7..8229bfd 100644
--- a/hw/i386/ssdt-proc.dsl
+++ b/hw/i386/ssdt-proc.dsl
@@ -37,7 +37,7 @@ DefinitionBlock ("ssdt-proc.aml", "SSDT", 0x01, "BXPC", "BXSSDT", 0x1)
     ACPI_EXTRACT_PROCESSOR_START ssdt_proc_start
     ACPI_EXTRACT_PROCESSOR_END ssdt_proc_end
     ACPI_EXTRACT_PROCESSOR_STRING ssdt_proc_name
-    Processor(CPAA, 0xAA, 0x0000b010, 0x06) {
+    Processor(CPAA, 0xAA, 0x00000000, 0x0) {
         ACPI_EXTRACT_NAME_BYTE_CONST ssdt_proc_id
         Name(ID, 0xAA)
 /*
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 26/27] ssdt-proc: update generated file
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (24 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 25/27] ssdt: fix PBLK length Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 27/27] don't post me: update bios Michael S. Tsirkin
                   ` (3 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

Update generated ssdt proc hex file (used for systems
lacking IASL) after P_BLK length change.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/ssdt-proc.hex.generated | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/hw/i386/ssdt-proc.hex.generated b/hw/i386/ssdt-proc.hex.generated
index a28172e..bb9920d 100644
--- a/hw/i386/ssdt-proc.hex.generated
+++ b/hw/i386/ssdt-proc.hex.generated
@@ -11,7 +11,7 @@ static unsigned char ssdp_proc_aml[] = {
 0x0,
 0x0,
 0x1,
-0xb3,
+0xb8,
 0x42,
 0x58,
 0x50,
@@ -34,9 +34,9 @@ static unsigned char ssdp_proc_aml[] = {
 0x4e,
 0x54,
 0x4c,
-0x28,
-0x5,
-0x10,
+0x23,
+0x8,
+0x13,
 0x20,
 0x5b,
 0x83,
@@ -51,7 +51,7 @@ static unsigned char ssdp_proc_aml[] = {
 0xb0,
 0x0,
 0x0,
-0x6,
+0x0,
 0x8,
 0x49,
 0x44,
-- 
MST

^ permalink raw reply related	[flat|nested] 31+ messages in thread

* [Qemu-devel] [PATCH v9 27/27] don't post me: update bios
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (25 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 26/27] ssdt-proc: update generated file Michael S. Tsirkin
@ 2013-10-07  9:36 ` Michael S. Tsirkin
  2013-10-07 13:18 ` [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Igor Mammedov
                   ` (2 subsequent siblings)
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-07  9:36 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

update bios binaries to 55480e81704fa46429ac5bb4f8f452fadc9c0416
---
 pc-bios/acpi-dsdt.aml     | Bin 4407 -> 4407 bytes
 pc-bios/bios.bin          | Bin 131072 -> 262144 bytes
 pc-bios/q35-acpi-dsdt.aml | Bin 7344 -> 7344 bytes
 3 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/pc-bios/acpi-dsdt.aml b/pc-bios/acpi-dsdt.aml
index 48dbe3242c0e443a15d07b995e3a53b98a938806..17461a9ab22bc0bb05c8718168bc17c9cb01a29a 100644
GIT binary patch
delta 44
wcmdn4v|UNrCD<jzT#$i*@qtrBfHMPwQv^r^$Y)?+@bnAuQRWcds4OA~0Q3|IlK=n!

delta 44
wcmdn4v|UNrCD<jzT#$i*@u5>hfHMPwQv^r^$Y)?+@bnAu(O?zWs4OA~0Q58olK=n!

diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin
index cccc487814eb68a2d25c3c90e088bcc60a3da2f8..d1b3eb127c43c1570173179794abca8bda4b508b 100644
GIT binary patch
literal 262144
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
Jbt**S{{Z`CU&#Of

literal 131072
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
Te5&1b<K(F~Or9}=MdH5z@2>lr

diff --git a/pc-bios/q35-acpi-dsdt.aml b/pc-bios/q35-acpi-dsdt.aml
index 91ab67cadab4d77eeb1b6f86160bf224ce5bc999..b4e581fcd26083158a73d0ec47b5bcca822f6ce8 100644
GIT binary patch
delta 44
xcmdmBxxrG|CD<iogA4-$Bb!r1fHMPwQv^tafq{vEfx*)+#7CJ!c%yQ!3;^=S3E}_%

delta 44
xcmdmBxxrG|CD<iogA4-$BfC>XfHMPwQv^tafq{vEfx*)+#7BcwV54%c3;^=y3E}_%

-- 
MST

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (26 preceding siblings ...)
  2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 27/27] don't post me: update bios Michael S. Tsirkin
@ 2013-10-07 13:18 ` Igor Mammedov
  2013-10-07 17:18 ` Andreas Färber
  2013-10-13 16:49 ` Michael S. Tsirkin
  29 siblings, 0 replies; 31+ messages in thread
From: Igor Mammedov @ 2013-10-07 13:18 UTC (permalink / raw)
  To: Michael S. Tsirkin
  Cc: pbonzini, kraxel, qemu-devel, Anthony Liguori, afaerber

On Mon, 7 Oct 2013 12:34:46 +0300
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> This code can also be found here:
> git://git.kernel.org/pub/scm/virt/kvm/mst/qemu.git acpi
> 
> While this patch still uses info not available in QOM, I think it's reasonable
> to merge it and then refactor as QOM properties cover more ground.
> 
> In particular, merging this patchset blocks other projects so
> I think its preferable to merge now and not wait
> for all required QOM properties to materialize.
> 
> I added QOM properties in ich/piix where I knew how to
> do this.
> 
> If you already reviewed v8 then the only patch that
> changed significantly is
>   i386: define pc guest info
> it now supplies numa info about all CPUs and not just
> the ones present at init.
> I also made a couple of trivial tweaks to
>   i386: ACPI table generation code from seabios
> 
> If you already reviewed v5 then the only patches that
> changed are:
>   i386: define pc guest info
>   i386: ACPI table generation code from seabios
> 
> Gerd, Laszlo, I kept your Reviewed-by and Tested-by tags
> on these patches to ensure your contribution is recongnized,
> if you don't like this pls let me know.
> Or better yet re-ack this version :)
> 
> Patches 1-3 are QOM patches really.
> Included here for completeness.
> 
> Igor suggested dropping patches 1-2 and including error.h directly.
> I included his patch and dropped mine.
> I hope that's ok.
> 
> If everything's in order, I intend to merge this through my tree.
> 
> Please review, and comment.
> 
> Changes from v8:
> - remove an unused function
> - fix typo in error message, reported by Igor
> - don't assert when adding a 4 byte value
>   (we don't use this now but it's useful for follow-up
>   bridge hotplug patches)
> - fix numa node reporting for hotplugged cpus, reported by Igor
> 
> Changes from v7 reposted:
> - whitespace fixes - issues reported by Igor
> - typo fix in commit log reported by Eric
> 
> Changes from v7:
> - removed all complex table patching and migration code
>   we now only migrate a single byte "patched/non patched"
>   all tables are simply regenerated on access, rewriting
>   old data
>   in particular this fixed a bug that Igor noticed:
>   cpu online status is now updated correctly
> - removed bitmask of found cpus - use QOM to calculate it
> - dropped changes to typedefs.h - use Igor's patch instead
> 
> Changes from v6:
> - fix 64 bit window bug reported by Igor
> - tweak comments in error.h
> 
> Changes from v5:
> - update generated files to fix build on systems without iasl
> - fix mcfg failure reported by Gerd
> Changes from v4:
> - address comments by Paolo:
>     rename loader interface
>     reuse macro for hpet name
>     better struct names
>     move internal headers to hw/i386/
> - fix typos resulting in bugs reported by Gerd
> 
> Changes from v3:
> - reworked code to use QOM properties
>   some info isn't yet available in QOM,
>   use old-style APIs and lookups by type
> - address comments by Gerd: tables are now updated
>   on guest access after pci configuration
> 
> Changes from v2 repost:
> - address comment by Anthony - convert to use APIs implemented
>   using QOM
> - address comment by Anthony - avoid tricky pointer path,
>   use GArray from glib instead
> - Address lots of comments by Hu Tao and Laszlo Ersek
> 
> Changes from v2:
> - added missing patches to make it actually build
> Changes from v1 RFC:
> - added code to address cross version compatibility
> - rebased to latest bits
> - updated seabios code to latest bits (added pvpanic device)
> 
> This patchset moves all generation of ACPI tables
> from guest BIOS to the hypervisor.
> 
> Although ACPI tables come from a system BIOS on real hw,
> it makes sense that the ACPI tables are coupled with the
> virtual machine, since they have to abstract the x86 machine to
> the OS's.
> 
> This is widely desired as a way to avoid the churn
> and proliferation of QEMU-specific interfaces
> associated with ACPI tables in bios code.
> 
> There's a bit of code duplication where we
> already declare similar acpi structures in qemu.
> 
> I think it's best to do it in this order: port
> code directly, and apply cleanups and reduce duplication
> that results, on top.
> This way it's much easier to see that we don't introduce
> regressions.
> 
> In particular, I booted a guest on qemu with and without the
> change, and verified that ACPI tables are
> unchanged except for trivial pointer address changes,
> and the SSDT P_BLK change in the last patch.
> 
> Such binary compatibility makes it easier to be
> confident that this change won't break things.
> 
> Igor Mammedov (1):
>   cleanup object.h: include error.h directly
> 
> Michael S. Tsirkin (26):
>   qom: cleanup struct Error references
>   qom: add pointer to int property helpers
>   pci: fix up w64 size calculation helper
>   fw_cfg: interface to trigger callback on read
>   loader: support for unmapped ROM blobs
>   pcie_host: expose UNMAPPED macro
>   pcie_host: expose address format
>   q35: use macro for MCFG property name
>   q35: expose mmcfg size as a property
>   i386: add ACPI table files from seabios
>   acpi: add rules to compile ASL source
>   acpi: pre-compiled ASL files
>   acpi: ssdt pcihp: updat generated file
>   loader: use file path size from fw_cfg.h
>   i386: add bios linker/loader
>   loader: allow adding ROMs in done callbacks
>   i386: define pc guest info
>   acpi/piix: add macros for acpi property names
>   piix: APIs for pc guest info
>   ich9: APIs for pc guest info
>   pvpanic: add API to access io port
>   hpet: add API to find it
>   i386: ACPI table generation code from seabios
>   ssdt: fix PBLK length
>   ssdt-proc: update generated file
>   don't post me: update bios
> 
>  configure                           |    9 +-
>  hw/i386/acpi-build.h                |    9 +
>  hw/i386/acpi-defs.h                 |  331 ++
>  hw/i386/bios-linker-loader.h        |   27 +
>  hw/lm32/lm32_hwsetup.h              |    2 +-
>  include/hw/acpi/ich9.h              |    2 +
>  include/hw/acpi/piix4.h             |    8 +
>  include/hw/i386/ich9.h              |    2 +
>  include/hw/i386/pc.h                |   22 +
>  include/hw/loader.h                 |    8 +-
>  include/hw/nvram/fw_cfg.h           |    8 +-
>  include/hw/pci-host/q35.h           |    2 +
>  include/hw/pci/pcie_host.h          |   27 +
>  include/hw/timer/hpet.h             |    2 +
>  include/qom/object.h                |   73 +-
>  hw/acpi/ich9.c                      |   24 +
>  hw/acpi/piix4.c                     |   50 +-
>  hw/core/loader.c                    |   31 +-
>  hw/i386/acpi-build.c                | 1205 ++++++
>  hw/i386/bios-linker-loader.c        |  158 +
>  hw/i386/pc.c                        |   23 +
>  hw/i386/pc_piix.c                   |    5 +
>  hw/i386/pc_q35.c                    |    3 +
>  hw/isa/lpc_ich9.c                   |   40 +
>  hw/misc/pvpanic.c                   |   13 +-
>  hw/nvram/fw_cfg.c                   |   33 +-
>  hw/pci-host/piix.c                  |    8 +
>  hw/pci-host/q35.c                   |   26 +-
>  hw/pci/pci.c                        |   20 +-
>  hw/pci/pcie_host.c                  |   24 -
>  hw/timer/hpet.c                     |    5 +
>  qom/object.c                        |   60 +
>  vl.c                                |    3 +
>  hw/i386/Makefile.objs               |   27 +
>  hw/i386/acpi-dsdt-cpu-hotplug.dsl   |   93 +
>  hw/i386/acpi-dsdt-dbug.dsl          |   41 +
>  hw/i386/acpi-dsdt-hpet.dsl          |   51 +
>  hw/i386/acpi-dsdt-isa.dsl           |  117 +
>  hw/i386/acpi-dsdt-pci-crs.dsl       |  105 +
>  hw/i386/acpi-dsdt.dsl               |  343 ++
>  hw/i386/acpi-dsdt.hex.generated     | 4409 +++++++++++++++++++++
>  hw/i386/q35-acpi-dsdt.dsl           |  452 +++
>  hw/i386/q35-acpi-dsdt.hex.generated | 7346 +++++++++++++++++++++++++++++++++++
>  hw/i386/ssdt-misc.dsl               |  119 +
>  hw/i386/ssdt-misc.hex.generated     |  386 ++
>  hw/i386/ssdt-pcihp.dsl              |   51 +
>  hw/i386/ssdt-pcihp.hex.generated    |  108 +
>  hw/i386/ssdt-proc.dsl               |   63 +
>  hw/i386/ssdt-proc.hex.generated     |  134 +
>  pc-bios/acpi-dsdt.aml               |  Bin 4407 -> 4407 bytes
>  pc-bios/bios.bin                    |  Bin 131072 -> 262144 bytes
>  pc-bios/q35-acpi-dsdt.aml           |  Bin 7344 -> 7344 bytes
>  scripts/acpi_extract.py             |  362 ++
>  scripts/acpi_extract_preprocess.py  |   51 +
>  scripts/update-acpi.sh              |    4 +
>  55 files changed, 16442 insertions(+), 83 deletions(-)
>  create mode 100644 hw/i386/acpi-build.h
>  create mode 100644 hw/i386/acpi-defs.h
>  create mode 100644 hw/i386/bios-linker-loader.h
>  create mode 100644 include/hw/acpi/piix4.h
>  create mode 100644 hw/i386/acpi-build.c
>  create mode 100644 hw/i386/bios-linker-loader.c
>  create mode 100644 hw/i386/acpi-dsdt-cpu-hotplug.dsl
>  create mode 100644 hw/i386/acpi-dsdt-dbug.dsl
>  create mode 100644 hw/i386/acpi-dsdt-hpet.dsl
>  create mode 100644 hw/i386/acpi-dsdt-isa.dsl
>  create mode 100644 hw/i386/acpi-dsdt-pci-crs.dsl
>  create mode 100644 hw/i386/acpi-dsdt.dsl
>  create mode 100644 hw/i386/acpi-dsdt.hex.generated
>  create mode 100644 hw/i386/q35-acpi-dsdt.dsl
>  create mode 100644 hw/i386/q35-acpi-dsdt.hex.generated
>  create mode 100644 hw/i386/ssdt-misc.dsl
>  create mode 100644 hw/i386/ssdt-misc.hex.generated
>  create mode 100644 hw/i386/ssdt-pcihp.dsl
>  create mode 100644 hw/i386/ssdt-pcihp.hex.generated
>  create mode 100644 hw/i386/ssdt-proc.dsl
>  create mode 100644 hw/i386/ssdt-proc.hex.generated
>  create mode 100755 scripts/acpi_extract.py
>  create mode 100755 scripts/acpi_extract_preprocess.py
>  create mode 100644 scripts/update-acpi.sh
> 


Tested x64 flavors of rhel6/fc18/ws2008/ws2012/ws2003r2/XP
Tested-by & Reviewed-by: Igor Mammedov <imammedo@redhat.com>

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (27 preceding siblings ...)
  2013-10-07 13:18 ` [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Igor Mammedov
@ 2013-10-07 17:18 ` Andreas Färber
  2013-10-13 16:49 ` Michael S. Tsirkin
  29 siblings, 0 replies; 31+ messages in thread
From: Andreas Färber @ 2013-10-07 17:18 UTC (permalink / raw)
  To: Michael S. Tsirkin, Igor Mammedov
  Cc: pbonzini, qemu-devel, Anthony Liguori, kraxel

Am 07.10.2013 11:34, schrieb Michael S. Tsirkin:
> Patches 1-3 are QOM patches really.
> Included here for completeness.
[...]
> Igor Mammedov (1):
>   cleanup object.h: include error.h directly
> 
> Michael S. Tsirkin (26):
>   qom: cleanup struct Error references
>   qom: add pointer to int property helpers

Picked these up for qom-next pull:
https://github.com/afaerber/qemu-cpu/commits/qom-next

If they go through your tree,

Reviewed-by: Andreas Färber <afaerber@suse.de>

for first two. For third patch I have doubts about the concatenated
documentation, but that could be followed up; functionally it looked
correct.

Thanks,
Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest
  2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
                   ` (28 preceding siblings ...)
  2013-10-07 17:18 ` Andreas Färber
@ 2013-10-13 16:49 ` Michael S. Tsirkin
  29 siblings, 0 replies; 31+ messages in thread
From: Michael S. Tsirkin @ 2013-10-13 16:49 UTC (permalink / raw)
  To: qemu-devel, Anthony Liguori; +Cc: pbonzini, imammedo, afaerber, kraxel

On Mon, Oct 07, 2013 at 12:34:46PM +0300, Michael S. Tsirkin wrote:
> This code can also be found here:
> git://git.kernel.org/pub/scm/virt/kvm/mst/qemu.git acpi

No new issues has been raised in a week, I assume
it's ok to merge now. Will apply around tomorrow.

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2013-10-13 16:47 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-07  9:34 [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Michael S. Tsirkin
2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 01/27] cleanup object.h: include error.h directly Michael S. Tsirkin
2013-10-07  9:34 ` [Qemu-devel] [PATCH v9 02/27] qom: cleanup struct Error references Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 03/27] qom: add pointer to int property helpers Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 04/27] pci: fix up w64 size calculation helper Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 05/27] fw_cfg: interface to trigger callback on read Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 06/27] loader: support for unmapped ROM blobs Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 07/27] pcie_host: expose UNMAPPED macro Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 08/27] pcie_host: expose address format Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 09/27] q35: use macro for MCFG property name Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 10/27] q35: expose mmcfg size as a property Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 11/27] i386: add ACPI table files from seabios Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 12/27] acpi: add rules to compile ASL source Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 13/27] acpi: pre-compiled ASL files Michael S. Tsirkin
2013-10-07  9:35 ` [Qemu-devel] [PATCH v9 14/27] acpi: ssdt pcihp: updat generated file Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 15/27] loader: use file path size from fw_cfg.h Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 16/27] i386: add bios linker/loader Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 17/27] loader: allow adding ROMs in done callbacks Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 18/27] i386: define pc guest info Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 19/27] acpi/piix: add macros for acpi property names Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 20/27] piix: APIs for pc guest info Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 21/27] ich9: " Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 22/27] pvpanic: add API to access io port Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 23/27] hpet: add API to find it Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 24/27] i386: ACPI table generation code from seabios Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 25/27] ssdt: fix PBLK length Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 26/27] ssdt-proc: update generated file Michael S. Tsirkin
2013-10-07  9:36 ` [Qemu-devel] [PATCH v9 27/27] don't post me: update bios Michael S. Tsirkin
2013-10-07 13:18 ` [Qemu-devel] [PATCH v9 00/27] qemu: generate acpi tables for the guest Igor Mammedov
2013-10-07 17:18 ` Andreas Färber
2013-10-13 16:49 ` Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.