All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][SeaBIOS] memory hotplug
@ 2011-08-11 14:39 Vasilis Liaskovitis
  2011-08-29  9:24 ` Lai Jiangshan
  2012-03-15 12:01 ` [PATCH][SeaBIOS] " Gleb Natapov
  0 siblings, 2 replies; 7+ messages in thread
From: Vasilis Liaskovitis @ 2011-08-11 14:39 UTC (permalink / raw)
  To: kvm, seabios

Hi,

I am testing a set of experimental patches for memory-hotplug on x86_64 host /
guest combinations. I have implemented this in a similar way to cpu-hotplug.  

A dynamic SSDT table with all memory devices is created at boot time.  This
table calls static methods from the DSDT.  A byte array indicates which memory
device is online or not. This array is kept in sync with a qemu-kvm bitmap array
through ioport 0xaf20. Qemu-kvm updates this table on a "mem_set" command and
an ACPI event is triggered.

Memory devices are 128MB in size (to match /sys/devices/memory/block_size_bytes 
in x86_64). They are constructed dynamically in src/ssdt-mem.asl , similarly to
hotpluggable-CPUs.  The _CRS memstart-memend attribute for each memory device is
defined accordingly, skipping the hole at 0xe0000000 - 0x100000000.
Hotpluggable memory is always located above 4GB.

Qemu-kvm sets the upper bound of hotpluggable memory with "maxmem = [totalmemory in
MB]" on the command line. Maxmem is an argument for "-m" similar to maxcpus for smp.
E.g. "-m 1024,maxmem=2048" on the qemu command line will create memory devices
for 2GB of RAM, enabling only 1GB initially.

Qemu_monitor triggers a memory hotplug with:
(qemu) mem_set [memory range in MBs] online

Testing:
- Linux guests boot fine and memory hotplug works so far.

- Windows2008 guest complains about "non ACPI compliant BIOS". Specifically:
STOP 0x000000A5 (0x0000000D, Parameter2, Parameter3, Parameter4) 
"This error generally occurs if either the _HID or _ADR object is missing. " 
according to a microsoft support site. I do specify _HID in the memory device
definition. I have tried to specify _ADR to be equal to the memstart parameter
in each memory device, but the problem remains.  Any advice on the _ADR object?
Perhaps the memory layout I describe in the memory devices is not compatible 
with Windows memory usage?

Other comments on the patches are welcome.

The 3 patches are below in order (on top of today's master for both qemu-kvm and
SeaBIOS):

- qemu-kvm patch
- seabios src/ssdt-mem.asl
- seabios patch on existing code

thanks,

- Vasilis


 cpu-all.h       |    1 +
 hmp-commands.hx |   14 ++++++++
 hw/acpi_piix4.c |  101 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/fw_cfg.c     |   13 +++++++
 hw/fw_cfg.h     |    2 +
 hw/loader.c     |    2 +-
 hw/pc.c         |    1 +
 hw/pc.h         |    4 ++
 hw/pc_piix.c    |    4 ++-
 monitor.c       |   22 ++++++++++++
 sysemu.h        |    1 +
 vl.c            |   41 ++++++++++++++++++++++-
 12 files changed, 201 insertions(+), 5 deletions(-)

diff --git a/cpu-all.h b/cpu-all.h
index fa0205c..21aa4ea 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -470,6 +470,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr);
 
 extern int phys_ram_fd;
 extern ram_addr_t ram_size;
+extern ram_addr_t maxram_size;
 
 /* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */
 #define RAM_PREALLOC_MASK   (1 << 0)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index ed5c9b9..5a95c4e 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1229,6 +1229,20 @@ Set CPU @var{cpu} online or offline.
 ETEXI
 
     {
+        .name       = "mem_set",
+        .args_type  = "mem:i,state:s",
+        .params     = "mem [online|offline]",
+        .help       = "change memory device state",
+        .mhandler.cmd  = do_mem_set_nr,
+    },
+
+STEXI
+@item mem_set @var{mem} [online|offline]
+Set MEM @var{mem} online or offline.
+
+ETEXI
+
+    {
         .name       = "set_password",
         .args_type  = "protocol:s,password:s,connected:s?",
         .params     = "protocol password action-if-connected",
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 44eb8ae..7ca33ab 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -24,6 +24,8 @@
 #include "sysemu.h"
 #include "range.h"
 #include "ioport.h"
+#include "fw_cfg.h"
+#include "cpu-all.h"
 
 //#define DEBUG
 
@@ -37,16 +39,19 @@
 
 #define GPE_BASE 0xafe0
 #define PROC_BASE 0xaf00
+#define MEM_BASE 0xaf20
 #define GPE_LEN 4
 #define PCI_BASE 0xae00
 #define PCI_EJ_BASE 0xae08
 #define PCI_RMV_BASE 0xae0c
 
+#define PIIX4_MEM_HOTPLUG_STATUS 8
 #define PIIX4_CPU_HOTPLUG_STATUS 4
 #define PIIX4_PCI_HOTPLUG_STATUS 2
 
 struct gpe_regs {
     uint8_t cpus_sts[32];
+    uint8_t mems_sts[32];
 };
 
 struct pci_status {
@@ -94,7 +99,8 @@ static void pm_update_sci(PIIX4PMState *s)
                    ACPI_BITMASK_POWER_BUTTON_ENABLE |
                    ACPI_BITMASK_GLOBAL_LOCK_ENABLE |
                    ACPI_BITMASK_TIMER_ENABLE)) != 0) ||
-        (((s->gpe.sts[0] & s->gpe.en[0]) & PIIX4_PCI_HOTPLUG_STATUS) != 0);
+        (((s->gpe.sts[0] & s->gpe.en[0]) & 
+          (PIIX4_PCI_HOTPLUG_STATUS | PIIX4_MEM_HOTPLUG_STATUS | PIIX4_CPU_HOTPLUG_STATUS) ) != 0);
 
     qemu_set_irq(s->irq, sci_level);
     /* schedule a timer interruption if needed */
@@ -447,6 +453,9 @@ static uint32_t gpe_readb(void *opaque, uint32_t addr)
         case PROC_BASE ... PROC_BASE+31:
             val = g->cpus_sts[addr - PROC_BASE];
             break;
+        case MEM_BASE ... MEM_BASE+31:
+            val = g->mems_sts[addr - MEM_BASE];    
+            break;
         default:
             val = acpi_gpe_ioport_readb(&s->gpe, addr);
     }
@@ -538,6 +547,7 @@ static void pcirmv_write(void *opaque, uint32_t addr, uint32_t val)
 }
 
 extern const char *global_cpu_model;
+extern FWCfgState *fw_cfg;
 
 static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
                                 PCIHotplugState state);
@@ -545,13 +555,19 @@ static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
 static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
 {
     struct pci_status *pci0_status = &s->pci0_status;
-    int i = 0, cpus = smp_cpus;
+    int i = 0, cpus = smp_cpus, memdev;
 
     while (cpus > 0) {
         s->gpe_cpu.cpus_sts[i++] = (cpus < 8) ? (1 << cpus) - 1 : 0xff;
         cpus -= 8;
     }
 
+    i = 0;
+    memdev = ram_size / LINUX_MIN_BLOCK_SIZE;
+    while (memdev > 0) {
+        s->gpe_cpu.mems_sts[i++] = (memdev < 8) ? (1 << memdev) - 1 : 0xff;
+        memdev -= 8;
+    }
     register_ioport_write(GPE_BASE, GPE_LEN, 1, gpe_writeb, s);
     register_ioport_read(GPE_BASE, GPE_LEN, 1,  gpe_readb, s);
     acpi_gpe_blk(&s->gpe, GPE_BASE);
@@ -559,6 +575,9 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
     register_ioport_write(PROC_BASE, 32, 1, gpe_writeb, s);
     register_ioport_read(PROC_BASE, 32, 1,  gpe_readb, s);
 
+    register_ioport_write(MEM_BASE, 32, 1, gpe_writeb, s);
+    register_ioport_read(MEM_BASE, 32, 1,  gpe_readb, s);
+
     register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, pci0_status);
     register_ioport_read(PCI_BASE, 8, 4,  pcihotplug_read, pci0_status);
 
@@ -571,6 +590,20 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
     pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
 }
 
+static void enable_mem_device(PIIX4PMState *s, int memdevice)
+{
+    struct gpe_regs *g = &s->gpe_cpu;
+    s->gpe.sts[0] |= PIIX4_MEM_HOTPLUG_STATUS;
+    g->mems_sts[memdevice/8] |= (1 << (memdevice%8));
+}
+
+static void disable_mem_device(PIIX4PMState *s, int memdevice)
+{
+    struct gpe_regs *g = &s->gpe_cpu;
+    s->gpe.sts[0] |= PIIX4_MEM_HOTPLUG_STATUS;
+    g->mems_sts[memdevice/8] &= ~(1 << (memdevice%8));
+}
+
 #if defined(TARGET_I386)
 static void enable_processor(PIIX4PMState *s, int cpu)
 {
@@ -611,6 +644,70 @@ void qemu_system_cpu_hot_add(int cpu, int state)
 
     pm_update_sci(s);
 }
+
+void qemu_system_mem_hot_add(int64_t value, int state)
+{
+    PIIX4PMState *s = global_piix4_pm_state;
+    static unsigned int hotmemcount = 1;
+    char buf[32];
+    int64_t memdev, tmpvalue;
+
+    /* Expects memory range in MBs currently. */
+    value = 1024 * 1024 * value;
+
+    if (value % LINUX_MIN_BLOCK_SIZE) {
+        fprintf(stderr, "memory hotadd range must be a multiple of %lu bytes\n", 
+                LINUX_MIN_BLOCK_SIZE);
+        return;
+    }
+
+    if (value + ram_size > maxram_size) {
+        fprintf(stderr, "failure: memory hotadd exceeds total available memory range\n");
+        return;
+    }
+
+    if (state) {
+        ram_addr_t size = value;
+        ram_addr_t ram_addr;
+
+        target_phys_addr_t start_addr;
+        start_addr = global_ram_hotplug_offset;
+
+        sprintf(buf, "pc.extraram%u", hotmemcount);
+        ram_addr = qemu_ram_alloc(NULL, buf, size);
+        cpu_register_physical_memory(start_addr,
+                                        size, ram_addr);
+        e820_add_entry(start_addr, size, E820_RAM);
+
+        tmpvalue = value;
+        memdev = ram_size / LINUX_MIN_BLOCK_SIZE;
+        while (tmpvalue) {
+            enable_mem_device(s, memdev);
+            tmpvalue -= LINUX_MIN_BLOCK_SIZE;
+            memdev++;
+        }
+        ram_size += value;
+
+        fw_cfg_update_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+        global_ram_hotplug_offset += value;
+        hotmemcount++;
+    }
+
+    else {
+        tmpvalue = value;
+        memdev = ram_size / LINUX_MIN_BLOCK_SIZE - 1;
+        while (tmpvalue) {
+            disable_mem_device(s, memdev);
+            tmpvalue -= LINUX_MIN_BLOCK_SIZE;
+            memdev--;
+        }
+        ram_size -= value;
+        fw_cfg_update_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+        
+    }    
+
+    pm_update_sci(s);
+}
 #endif
 
 static void enable_device(PIIX4PMState *s, int slot)
diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
index e4847b7..f9a2b3d 100644
--- a/hw/fw_cfg.c
+++ b/hw/fw_cfg.c
@@ -408,6 +408,19 @@ int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value)
     return fw_cfg_add_bytes(s, key, (uint8_t *)copy, sizeof(value));
 }
 
+int fw_cfg_update_i64(FWCfgState *s, uint64_t key, uint64_t data)
+{
+    int arch = !!(key & FW_CFG_ARCH_LOCAL);
+    uint64_t *p;
+
+    key &= FW_CFG_ENTRY_MASK;
+
+    p = (uint64_t*)s->entries[arch][key].data;
+    *p = cpu_to_le64(data);
+    
+    return 1;
+}
+
 int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
                         void *callback_opaque, uint8_t *data, size_t len)
 {
diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h
index 856bf91..83c2b34 100644
--- a/hw/fw_cfg.h
+++ b/hw/fw_cfg.h
@@ -27,6 +27,7 @@
 #define FW_CFG_SETUP_SIZE       0x17
 #define FW_CFG_SETUP_DATA       0x18
 #define FW_CFG_FILE_DIR         0x19
+#define FW_CFG_MAXRAM_SIZE      0x1A
 
 #define FW_CFG_FILE_FIRST       0x20
 #define FW_CFG_FILE_SLOTS       0x10
@@ -58,6 +59,7 @@ int fw_cfg_add_bytes(FWCfgState *s, uint16_t key, uint8_t *data, uint32_t len);
 int fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value);
 int fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value);
 int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value);
+int fw_cfg_update_i64(FWCfgState *s, uint64_t key, uint64_t data);
 int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
                         void *callback_opaque, uint8_t *data, size_t len);
 int fw_cfg_add_file(FWCfgState *s, const char *filename, uint8_t *data,
diff --git a/hw/loader.c b/hw/loader.c
index 35d792e..2a017d1 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -536,7 +536,7 @@ struct Rom {
     QTAILQ_ENTRY(Rom) next;
 };
 
-static FWCfgState *fw_cfg;
+FWCfgState *fw_cfg;
 static QTAILQ_HEAD(, Rom) roms = QTAILQ_HEAD_INITIALIZER(roms);
 
 static void rom_insert(Rom *rom)
diff --git a/hw/pc.c b/hw/pc.c
index d1dfc83..c6595e1 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -603,6 +603,7 @@ static void *bochs_bios_init(void)
 
     fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+    fw_cfg_add_i64(fw_cfg, FW_CFG_MAXRAM_SIZE, (uint64_t)maxram_size);
     fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, (uint8_t *)acpi_tables,
                      acpi_tables_len);
     fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override());
diff --git a/hw/pc.h b/hw/pc.h
index c8d4280..a00aca6 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -9,6 +9,10 @@
 #include "net.h"
 #include "memory.h"
 
+#define LINUX_MIN_BLOCK_SIZE    0x8000000LU
+#define MEM_HOTPLUG_OFFSET      0x100000000LLU
+
+extern ram_addr_t global_ram_hotplug_offset;
 /* PC-style peripherals (also used by other machines).  */
 
 /* serial.c */
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 3d5f6e7..063b462 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -46,7 +46,7 @@
 #endif
 
 qemu_irq *ioapic_irq_hack;
-
+ram_addr_t global_ram_hotplug_offset;
 #define MAX_IDE_BUS 2
 
 static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
@@ -109,9 +109,11 @@ static void pc_init1(MemoryRegion *system_memory,
     if (ram_size >= 0xe0000000 ) {
         above_4g_mem_size = ram_size - 0xe0000000;
         below_4g_mem_size = 0xe0000000;
+        global_ram_hotplug_offset = ram_size + 0x20000000LLU; 
     } else {
         above_4g_mem_size = 0;
         below_4g_mem_size = ram_size;
+        global_ram_hotplug_offset = MEM_HOTPLUG_OFFSET;
     }
 
     /* allocate ram and load rom/bios */
diff --git a/monitor.c b/monitor.c
index caaa05c..fdf1dc9 100644
--- a/monitor.c
+++ b/monitor.c
@@ -984,6 +984,28 @@ static void do_cpu_set_nr(Monitor *mon, const QDict *qdict)
 #endif
 }
 
+static void do_mem_set_nr(Monitor *mon, const QDict *qdict)
+{
+    int state;
+    int64_t  value;
+    const char *status;
+
+    status = qdict_get_str(qdict, "state");
+    value = qdict_get_int(qdict, "mem");
+
+    if (!strcmp(status, "online"))
+       state = 1;
+    else if (!strcmp(status, "offline"))
+       state = 0;
+    else {
+        monitor_printf(mon, "invalid status: %s\n", status);
+        return;
+    }
+#if defined(TARGET_I386) || defined(TARGET_X86_64)
+    qemu_system_mem_hot_add(value, state);
+#endif
+}
+
 static void do_info_jit(Monitor *mon)
 {
     dump_exec_info((FILE *)mon, monitor_fprintf);
diff --git a/sysemu.h b/sysemu.h
index fc2bf36..c2bb3cd 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -146,6 +146,7 @@ extern unsigned int nb_prom_envs;
 
 /* acpi */
 void qemu_system_cpu_hot_add(int cpu, int state);
+void qemu_system_mem_hot_add(int64_t value, int state);
 
 /* pci-hotplug */
 void pci_device_hot_add(Monitor *mon, const QDict *qdict);
diff --git a/vl.c b/vl.c
index f6a77f7..474c935 100644
--- a/vl.c
+++ b/vl.c
@@ -178,6 +178,7 @@ DisplayType display_type = DT_DEFAULT;
 int display_remote = 0;
 const char* keyboard_layout = NULL;
 ram_addr_t ram_size;
+ram_addr_t maxram_size;
 const char *mem_path = NULL;
 #ifdef MAP_POPULATE
 int mem_prealloc = 0; /* force preallocation of physical target memory */
@@ -2127,6 +2128,7 @@ int main(int argc, char **argv, char **envp)
     cpu_model = NULL;
     initrd_filename = NULL;
     ram_size = 0;
+    maxram_size = 0;
     snapshot = 0;
     kernel_filename = NULL;
     kernel_cmdline = "";
@@ -2455,8 +2457,10 @@ int main(int argc, char **argv, char **envp)
                 break;
             case QEMU_OPTION_m: {
                 int64_t value;
+                char *endptr;
+                char option[128];
 
-                value = strtosz(optarg, NULL);
+                value = strtosz(optarg, &endptr);
                 if (value < 0) {
                     fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
                     exit(1);
@@ -2467,6 +2471,41 @@ int main(int argc, char **argv, char **envp)
                     exit(1);
                 }
                 ram_size = value;
+
+                if (endptr != optarg) {
+                    if (*endptr == ',') {
+                        endptr++;
+                    }
+                }
+
+                if (get_param_value(option, 128, "maxmem", endptr) != 0) {
+                    value = strtosz(option, NULL);
+
+                    if (value < 0) {
+                        fprintf(stderr, "qemu: invalid ram size: %s\n", endptr);
+                        exit(1);
+                    }
+
+                    /* On 32-bit hosts, QEMU is limited by virtual address space */
+                    if (value > (2047 << 20) && HOST_LONG_BITS == 32) {
+                        fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
+                        exit(1);
+                    }
+                    if (value != (uint64_t)(ram_addr_t)value) {
+                        fprintf(stderr, "qemu: ram size too large\n");
+                        exit(1);
+                    }
+                    if (value < ram_size) {
+                        fprintf(stderr, "qemu: max ram size cannot be less than initial ram size\n");
+                        exit(1);
+                    }    
+
+                    maxram_size = value;
+
+                }    
+                else
+                    maxram_size = ram_size;
+                fprintf(stderr, "ramsize = %ld maxramsize = %ld\n", ram_size, maxram_size);
                 break;
             }
             case QEMU_OPTION_mempath:





 src/ssdt-mem.dsl |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/src/ssdt-mem.dsl b/src/ssdt-mem.dsl
new file mode 100644
index 0000000..60abb05
--- /dev/null
+++ b/src/ssdt-mem.dsl
@@ -0,0 +1,65 @@
+/* This file is the basis for the ssdt_mem[] variable in src/acpi.c.
+ * It is similar in design to the ssdt_proc variable.  
+ * 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 memory device in the system.  The 
+ * objects will * be placed in the \_SB_ namespace.
+ *
+ * To generate a new ssdt_memc[], run the commands:
+ *   cpp -P src/ssdt-mem.dsl > out/ssdt-mem.dsl.i
+ *   iasl -ta -p out/ssdt-mem out/ssdt-mem.dsl.i
+ *   tail -c +37 < out/ssdt-mem.aml | hexdump -e '"    " 8/1 "0x%02x," "\n"'
+ * and then cut-and-paste the output into the src/acpi.c ssdt_mem[]
+ * array.
+ *
+ * In addition to the aml code generated from this file, the
+ * src/acpi.c file creates a MEMNTFY method with an entry for each memdevice:
+ *     Method(MTFY, 2) {
+ *         If (LEqual(Arg0, 0x00)) { Notify(MP00, Arg1) }
+ *         If (LEqual(Arg0, 0x01)) { Notify(MP01, Arg1) }
+ *         ...
+ *     }
+ * and a MEON array with the list of active and inactive memory devices:
+ *     Name(MEON, Package() { One, One, ..., Zero, Zero, ... })
+ */
+DefinitionBlock ("ssdt-mem.aml", "SSDT", 0x02, "BXPC", "CSSDT", 0x1)
+/*  v------------------ DO NOT EDIT ------------------v */
+{
+    Device(MPAA) {
+        Name(ID, 0xAA)    
+/*  ^------------------ DO NOT EDIT ------------------^
+ *
+ * The src/acpi.c code requires the above layout so that it can update
+ * MPAA and 0xAA with the appropriate MEMDEVICE id (see
+ * SD_OFFSET_MEMHEX/MEMID1/MEMID2).  Don't change the above without
+ * also updating the C code.
+ */
+        Name(_HID, EISAID("PNP0C80"))
+
+        External(CMST, MethodObj)
+        External(MPEJ, MethodObj)
+
+        Name(_CRS, ResourceTemplate() {
+            QwordMemory(
+               ResourceConsumer,
+               ,
+               MinFixed, 
+               MaxFixed, 
+               Cacheable,
+               ReadWrite, 
+               0x0, 
+               0xDEADBEEF, 
+               0xE6ADBEEE, 
+               0x00000000,
+               0x08000000, 
+               )
+        })
+        Method (_STA, 0) {
+            Return(CMST(ID))        
+        }    
+        Method (_EJ0, 1, NotSerialized) {
+            MPEJ(ID, Arg0)
+        }
+    }
+}    
+





 src/acpi-dsdt.dsl |   55 ++++-
 src/acpi-dsdt.hex |  701 +++++++++++++++++++++++++++--------------------------
 src/acpi.c        |  125 ++++++++++
 src/biosvar.h     |    5 +
 src/paravirt.c    |   22 ++
 src/paravirt.h    |    4 +
 6 files changed, 571 insertions(+), 341 deletions(-)

diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl
index 08412e2..e9b250d 100644
--- a/src/acpi-dsdt.dsl
+++ b/src/acpi-dsdt.dsl
@@ -768,6 +768,9 @@ DefinitionBlock (
         External(NTFY, MethodObj)
         External(CPON, PkgObj)
 
+        External(MTFY, MethodObj)
+        External(MEON, PkgObj)
+
         /* Methods called by run-time generated SSDT Processor objects */
         Method (CPMA, 1, NotSerialized) {
             // _MAT method - create an madt apic buffer
@@ -832,6 +835,56 @@ DefinitionBlock (
             }
             Return(One)
         }
+
+        Method (CMST, 1, NotSerialized) {
+            // _STA method - return ON status of memdevice
+            // Local0 = MEON flag for this cpu
+            Store(DerefOf(Index(MEON, Arg0)), Local0)
+            If (Local0) { Return(0xF) } Else { Return(0x0) }
+        }
+
+        /* Memory hotplug notify method */
+        OperationRegion(MEST, SystemIO, 0xaf20, 32)
+        Field (MEST, ByteAcc, NoLock, Preserve)
+        {
+            MES, 256
+        }
+
+        Method(MESC, 0) {
+            // Local5 = active memdevice bitmap
+            Store (MES, Local5)
+            // Local2 = last read byte from bitmap
+            Store (Zero, Local2)
+            // Local0 = cpuid iterator
+            Store (Zero, Local0)
+            While (LLess(Local0, SizeOf(MEON))) {
+                // Local1 = MEON flag for this cpu
+                Store(DerefOf(Index(MEON, Local0)), Local1)
+                If (And(Local0, 0x07)) {
+                    // Shift down previously read bitmap byte
+                    ShiftRight(Local2, 1, Local2)
+                } Else {
+                    // Read next byte from memdevice 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 MEON with new state
+                    Store(Local3, Index(MEON, Local0))
+                    // Do MEM notify
+                    If (LEqual(Local3, 1)) {
+                        MTFY(Local0, 1)
+                    } Else {
+                        MTFY(Local0, 3)
+                    }
+                }
+                Increment(Local0)
+            }
+            Return(One)
+        }
+
     }
 
     Scope (\_GPE)
@@ -891,7 +944,7 @@ DefinitionBlock (
             Return(\_SB.PRSC())
         }
         Method(_L03) {
-            Return(0x01)
+            Return(\_SB.MESC())
         }
         Method(_L04) {
             Return(0x01)
diff --git a/src/acpi-dsdt.hex b/src/acpi-dsdt.hex
index d0a09f3..d71aca1 100644
--- a/src/acpi-dsdt.hex
+++ b/src/acpi-dsdt.hex
@@ -1,20 +1,20 @@
 /*
  * 
  * Intel ACPI Component Architecture
- * ASL Optimizing Compiler version 20100528 [Jul  1 2010]
+ * ASL Optimizing Compiler version 20100528 [Jul  2 2010]
  * Copyright (c) 2000 - 2010 Intel Corporation
  * Supports ACPI Specification Revision 4.0a
  * 
- * Compilation of "out/acpi-dsdt.dsl.i" - Tue May 24 22:35:17 2011
+ * Compilation of "out/acpi-dsdt.dsl.i" - Thu Aug 11 14:20:43 2011
  * 
  * C source code output
- * AML code block contains 0x2589 bytes
+ * AML code block contains 0x2634 bytes
  *
  */
 unsigned char AmlCode[] =
 {
-    0x44,0x53,0x44,0x54,0x89,0x25,0x00,0x00,  /* 00000000    "DSDT.%.." */
-    0x01,0x13,0x42,0x58,0x50,0x43,0x00,0x00,  /* 00000008    "..BXPC.." */
+    0x44,0x53,0x44,0x54,0x34,0x26,0x00,0x00,  /* 00000000    "DSDT4&.." */
+    0x01,0x45,0x42,0x58,0x50,0x43,0x00,0x00,  /* 00000008    ".EBXPC.." */
     0x42,0x58,0x44,0x53,0x44,0x54,0x00,0x00,  /* 00000010    "BXDSDT.." */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
     0x28,0x05,0x10,0x20,0x10,0x49,0x04,0x5C,  /* 00000020    "(.. .I.\" */
@@ -850,7 +850,7 @@ unsigned char AmlCode[] =
     0x01,0x01,0x00,0x00,0x08,0x5F,0x53,0x34,  /* 00001A10    "....._S4" */
     0x5F,0x12,0x06,0x04,0x00,0x00,0x00,0x00,  /* 00001A18    "_......." */
     0x08,0x5F,0x53,0x35,0x5F,0x12,0x06,0x04,  /* 00001A20    "._S5_..." */
-    0x00,0x00,0x00,0x00,0x10,0x49,0x0E,0x5F,  /* 00001A28    ".....I._" */
+    0x00,0x00,0x00,0x00,0x10,0x4B,0x18,0x5F,  /* 00001A28    ".....K._" */
     0x53,0x42,0x5F,0x14,0x35,0x43,0x50,0x4D,  /* 00001A30    "SB_.5CPM" */
     0x41,0x01,0x70,0x83,0x88,0x43,0x50,0x4F,  /* 00001A38    "A.p..CPO" */
     0x4E,0x68,0x00,0x60,0x70,0x11,0x0B,0x0A,  /* 00001A40    "Nh.`p..." */
@@ -879,340 +879,361 @@ unsigned char AmlCode[] =
     0x43,0x50,0x4F,0x4E,0x60,0x00,0xA0,0x0A,  /* 00001AF8    "CPON`..." */
     0x93,0x63,0x01,0x4E,0x54,0x46,0x59,0x60,  /* 00001B00    ".c.NTFY`" */
     0x01,0xA1,0x08,0x4E,0x54,0x46,0x59,0x60,  /* 00001B08    "...NTFY`" */
-    0x0A,0x03,0x75,0x60,0xA4,0x01,0x10,0x42,  /* 00001B10    "..u`...B" */
-    0xA7,0x5F,0x47,0x50,0x45,0x08,0x5F,0x48,  /* 00001B18    "._GPE._H" */
-    0x49,0x44,0x0D,0x41,0x43,0x50,0x49,0x30,  /* 00001B20    "ID.ACPI0" */
-    0x30,0x30,0x36,0x00,0x14,0x08,0x5F,0x4C,  /* 00001B28    "006..._L" */
-    0x30,0x30,0x00,0xA4,0x01,0x14,0x4C,0x9C,  /* 00001B30    "00....L." */
-    0x5F,0x4C,0x30,0x31,0x00,0xA0,0x25,0x7B,  /* 00001B38    "_L01..%{" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001B40    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0A,  /* 00001B48    "CI0PCIU." */
-    0x02,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001B50    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001B58    "B_PCI0S1" */
-    0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00001B60    "__..&{\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001B68    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x44,0x0A,0x02,0x00,  /* 00001B70    "0PCID..." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001B78    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x31,0x5F,0x5F,  /* 00001B80    "PCI0S1__" */
-    0x0A,0x03,0xA0,0x25,0x7B,0x5C,0x2F,0x03,  /* 00001B88    "...%{\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001B90    "_SB_PCI0" */
-    0x50,0x43,0x49,0x55,0x0A,0x04,0x00,0x86,  /* 00001B98    "PCIU...." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001BA0    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x32,0x5F,0x5F,0x01,  /* 00001BA8    "CI0S2__." */
-    0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001BB0    ".&{\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001BB8    "B_PCI0PC" */
-    0x49,0x44,0x0A,0x04,0x00,0x86,0x5C,0x2F,  /* 00001BC0    "ID....\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001BC8    "._SB_PCI" */
-    0x30,0x53,0x32,0x5F,0x5F,0x0A,0x03,0xA0,  /* 00001BD0    "0S2__..." */
-    0x25,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001BD8    "%{\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001BE0    "_PCI0PCI" */
-    0x55,0x0A,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00001BE8    "U....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001BF0    "_SB_PCI0" */
-    0x53,0x33,0x5F,0x5F,0x01,0xA0,0x26,0x7B,  /* 00001BF8    "S3__..&{" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C00    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0A,  /* 00001C08    "CI0PCID." */
-    0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001C10    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x33,  /* 00001C18    "B_PCI0S3" */
-    0x5F,0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,  /* 00001C20    "__...%{\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C28    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x55,0x0A,0x10,  /* 00001C30    "I0PCIU.." */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001C38    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x34,0x5F,  /* 00001C40    "_PCI0S4_" */
-    0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001C48    "_..&{\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001C50    "_SB_PCI0" */
-    0x50,0x43,0x49,0x44,0x0A,0x10,0x00,0x86,  /* 00001C58    "PCID...." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C60    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x34,0x5F,0x5F,0x0A,  /* 00001C68    "CI0S4__." */
-    0x03,0xA0,0x25,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001C70    "..%{\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001C78    "SB_PCI0P" */
-    0x43,0x49,0x55,0x0A,0x20,0x00,0x86,0x5C,  /* 00001C80    "CIU. ..\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C88    "/._SB_PC" */
-    0x49,0x30,0x53,0x35,0x5F,0x5F,0x01,0xA0,  /* 00001C90    "I0S5__.." */
-    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001C98    "&{\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001CA0    "_PCI0PCI" */
-    0x44,0x0A,0x20,0x00,0x86,0x5C,0x2F,0x03,  /* 00001CA8    "D. ..\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001CB0    "_SB_PCI0" */
-    0x53,0x35,0x5F,0x5F,0x0A,0x03,0xA0,0x25,  /* 00001CB8    "S5__...%" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001CC0    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001CC8    "PCI0PCIU" */
-    0x0A,0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001CD0    ".@..\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001CD8    "SB_PCI0S" */
-    0x36,0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,  /* 00001CE0    "6__..&{\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001CE8    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x44,0x0A,0x40,  /* 00001CF0    "I0PCID.@" */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001CF8    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x36,0x5F,  /* 00001D00    "_PCI0S6_" */
-    0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,0x2F,  /* 00001D08    "_...%{\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D10    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x55,0x0A,0x80,0x00,  /* 00001D18    "0PCIU..." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001D20    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x37,0x5F,0x5F,  /* 00001D28    "PCI0S7__" */
-    0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001D30    "..&{\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001D38    "SB_PCI0P" */
-    0x43,0x49,0x44,0x0A,0x80,0x00,0x86,0x5C,  /* 00001D40    "CID....\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001D48    "/._SB_PC" */
-    0x49,0x30,0x53,0x37,0x5F,0x5F,0x0A,0x03,  /* 00001D50    "I0S7__.." */
-    0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001D58    ".&{\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001D60    "B_PCI0PC" */
-    0x49,0x55,0x0B,0x00,0x01,0x00,0x86,0x5C,  /* 00001D68    "IU.....\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001D70    "/._SB_PC" */
-    0x49,0x30,0x53,0x38,0x5F,0x5F,0x01,0xA0,  /* 00001D78    "I0S8__.." */
-    0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001D80    "'{\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001D88    "_PCI0PCI" */
-    0x44,0x0B,0x00,0x01,0x00,0x86,0x5C,0x2F,  /* 00001D90    "D.....\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D98    "._SB_PCI" */
-    0x30,0x53,0x38,0x5F,0x5F,0x0A,0x03,0xA0,  /* 00001DA0    "0S8__..." */
-    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001DA8    "&{\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001DB0    "_PCI0PCI" */
-    0x55,0x0B,0x00,0x02,0x00,0x86,0x5C,0x2F,  /* 00001DB8    "U.....\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001DC0    "._SB_PCI" */
-    0x30,0x53,0x39,0x5F,0x5F,0x01,0xA0,0x27,  /* 00001DC8    "0S9__..'" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001DD0    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00001DD8    "PCI0PCID" */
-    0x0B,0x00,0x02,0x00,0x86,0x5C,0x2F,0x03,  /* 00001DE0    ".....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001DE8    "_SB_PCI0" */
-    0x53,0x39,0x5F,0x5F,0x0A,0x03,0xA0,0x26,  /* 00001DF0    "S9__...&" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001DF8    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001E00    "PCI0PCIU" */
-    0x0B,0x00,0x04,0x00,0x86,0x5C,0x2F,0x03,  /* 00001E08    ".....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001E10    "_SB_PCI0" */
-    0x53,0x31,0x30,0x5F,0x01,0xA0,0x27,0x7B,  /* 00001E18    "S10_..'{" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E20    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0B,  /* 00001E28    "CI0PCID." */
-    0x00,0x04,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001E30    "....\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001E38    "SB_PCI0S" */
-    0x31,0x30,0x5F,0x0A,0x03,0xA0,0x26,0x7B,  /* 00001E40    "10_...&{" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E48    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0B,  /* 00001E50    "CI0PCIU." */
-    0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001E58    "....\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001E60    "SB_PCI0S" */
-    0x31,0x31,0x5F,0x01,0xA0,0x27,0x7B,0x5C,  /* 00001E68    "11_..'{\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001E70    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x44,0x0B,0x00,  /* 00001E78    "I0PCID.." */
-    0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001E80    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001E88    "B_PCI0S1" */
-    0x31,0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,  /* 00001E90    "1_...&{\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001E98    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x55,0x0B,0x00,  /* 00001EA0    "I0PCIU.." */
-    0x10,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001EA8    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001EB0    "B_PCI0S1" */
-    0x32,0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,  /* 00001EB8    "2_..'{\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001EC0    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x44,0x0B,0x00,0x10,  /* 00001EC8    "0PCID..." */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001ED0    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x32,  /* 00001ED8    "_PCI0S12" */
-    0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00001EE0    "_...&{\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001EE8    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x55,0x0B,0x00,0x20,  /* 00001EF0    "0PCIU.. " */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001EF8    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x33,  /* 00001F00    "_PCI0S13" */
-    0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,  /* 00001F08    "_..'{\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F10    "_SB_PCI0" */
-    0x50,0x43,0x49,0x44,0x0B,0x00,0x20,0x00,  /* 00001F18    "PCID.. ." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F20    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x31,0x33,0x5F,  /* 00001F28    "PCI0S13_" */
-    0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001F30    "...&{\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F38    "_SB_PCI0" */
-    0x50,0x43,0x49,0x55,0x0B,0x00,0x40,0x00,  /* 00001F40    "PCIU..@." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F48    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x31,0x34,0x5F,  /* 00001F50    "PCI0S14_" */
-    0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001F58    "..'{\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001F60    "SB_PCI0P" */
-    0x43,0x49,0x44,0x0B,0x00,0x40,0x00,0x86,  /* 00001F68    "CID..@.." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F70    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x31,0x34,0x5F,0x0A,  /* 00001F78    "CI0S14_." */
-    0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001F80    "..&{\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001F88    "SB_PCI0P" */
-    0x43,0x49,0x55,0x0B,0x00,0x80,0x00,0x86,  /* 00001F90    "CIU....." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F98    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x31,0x35,0x5F,0x01,  /* 00001FA0    "CI0S15_." */
-    0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FA8    ".'{\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001FB0    "B_PCI0PC" */
-    0x49,0x44,0x0B,0x00,0x80,0x00,0x86,0x5C,  /* 00001FB8    "ID.....\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001FC0    "/._SB_PC" */
-    0x49,0x30,0x53,0x31,0x35,0x5F,0x0A,0x03,  /* 00001FC8    "I0S15_.." */
-    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FD0    ".({\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001FD8    "B_PCI0PC" */
-    0x49,0x55,0x0C,0x00,0x00,0x01,0x00,0x00,  /* 00001FE0    "IU......" */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001FE8    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x31,0x36,0x5F,  /* 00001FF0    "PCI0S16_" */
-    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001FF8    "..){\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002000    "SB_PCI0P" */
-    0x43,0x49,0x44,0x0C,0x00,0x00,0x01,0x00,  /* 00002008    "CID....." */
+    0x0A,0x03,0x75,0x60,0xA4,0x01,0x14,0x1A,  /* 00001B10    "..u`...." */
+    0x43,0x4D,0x53,0x54,0x01,0x70,0x83,0x88,  /* 00001B18    "CMST.p.." */
+    0x4D,0x45,0x4F,0x4E,0x68,0x00,0x60,0xA0,  /* 00001B20    "MEONh.`." */
+    0x05,0x60,0xA4,0x0A,0x0F,0xA1,0x03,0xA4,  /* 00001B28    ".`......" */
+    0x00,0x5B,0x80,0x4D,0x45,0x53,0x54,0x01,  /* 00001B30    ".[.MEST." */
+    0x0B,0x20,0xAF,0x0A,0x20,0x5B,0x81,0x0C,  /* 00001B38    ". .. [.." */
+    0x4D,0x45,0x53,0x54,0x01,0x4D,0x45,0x53,  /* 00001B40    "MEST.MES" */
+    0x5F,0x40,0x10,0x14,0x4C,0x06,0x4D,0x45,  /* 00001B48    "_@..L.ME" */
+    0x53,0x43,0x00,0x70,0x4D,0x45,0x53,0x5F,  /* 00001B50    "SC.pMES_" */
+    0x65,0x70,0x00,0x62,0x70,0x00,0x60,0xA2,  /* 00001B58    "ep.bp.`." */
+    0x46,0x05,0x95,0x60,0x87,0x4D,0x45,0x4F,  /* 00001B60    "F..`.MEO" */
+    0x4E,0x70,0x83,0x88,0x4D,0x45,0x4F,0x4E,  /* 00001B68    "Np..MEON" */
+    0x60,0x00,0x61,0xA0,0x0A,0x7B,0x60,0x0A,  /* 00001B70    "`.a..{`." */
+    0x07,0x00,0x7A,0x62,0x01,0x62,0xA1,0x0C,  /* 00001B78    "..zb.b.." */
+    0x70,0x83,0x88,0x65,0x7A,0x60,0x0A,0x03,  /* 00001B80    "p..ez`.." */
+    0x00,0x00,0x62,0x70,0x7B,0x62,0x01,0x00,  /* 00001B88    "..bp{b.." */
+    0x63,0xA0,0x22,0x92,0x93,0x61,0x63,0x70,  /* 00001B90    "c."..acp" */
+    0x63,0x88,0x4D,0x45,0x4F,0x4E,0x60,0x00,  /* 00001B98    "c.MEON`." */
+    0xA0,0x0A,0x93,0x63,0x01,0x4D,0x54,0x46,  /* 00001BA0    "...c.MTF" */
+    0x59,0x60,0x01,0xA1,0x08,0x4D,0x54,0x46,  /* 00001BA8    "Y`...MTF" */
+    0x59,0x60,0x0A,0x03,0x75,0x60,0xA4,0x01,  /* 00001BB0    "Y`..u`.." */
+    0x10,0x4B,0xA7,0x5F,0x47,0x50,0x45,0x08,  /* 00001BB8    ".K._GPE." */
+    0x5F,0x48,0x49,0x44,0x0D,0x41,0x43,0x50,  /* 00001BC0    "_HID.ACP" */
+    0x49,0x30,0x30,0x30,0x36,0x00,0x14,0x08,  /* 00001BC8    "I0006..." */
+    0x5F,0x4C,0x30,0x30,0x00,0xA4,0x01,0x14,  /* 00001BD0    "_L00...." */
+    0x4C,0x9C,0x5F,0x4C,0x30,0x31,0x00,0xA0,  /* 00001BD8    "L._L01.." */
+    0x25,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001BE0    "%{\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001BE8    "_PCI0PCI" */
+    0x55,0x0A,0x02,0x00,0x86,0x5C,0x2F,0x03,  /* 00001BF0    "U....\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001BF8    "_SB_PCI0" */
+    0x53,0x31,0x5F,0x5F,0x01,0xA0,0x26,0x7B,  /* 00001C00    "S1__..&{" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C08    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0A,  /* 00001C10    "CI0PCID." */
+    0x02,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001C18    "...\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001C20    "B_PCI0S1" */
+    0x5F,0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,  /* 00001C28    "__...%{\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C30    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x55,0x0A,0x04,  /* 00001C38    "I0PCIU.." */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001C40    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x5F,  /* 00001C48    "_PCI0S2_" */
+    0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001C50    "_..&{\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001C58    "_SB_PCI0" */
+    0x50,0x43,0x49,0x44,0x0A,0x04,0x00,0x86,  /* 00001C60    "PCID...." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C68    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x32,0x5F,0x5F,0x0A,  /* 00001C70    "CI0S2__." */
+    0x03,0xA0,0x25,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001C78    "..%{\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001C80    "SB_PCI0P" */
+    0x43,0x49,0x55,0x0A,0x08,0x00,0x86,0x5C,  /* 00001C88    "CIU....\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C90    "/._SB_PC" */
+    0x49,0x30,0x53,0x33,0x5F,0x5F,0x01,0xA0,  /* 00001C98    "I0S3__.." */
+    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001CA0    "&{\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001CA8    "_PCI0PCI" */
+    0x44,0x0A,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00001CB0    "D....\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001CB8    "_SB_PCI0" */
+    0x53,0x33,0x5F,0x5F,0x0A,0x03,0xA0,0x25,  /* 00001CC0    "S3__...%" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001CC8    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001CD0    "PCI0PCIU" */
+    0x0A,0x10,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001CD8    "....\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001CE0    "SB_PCI0S" */
+    0x34,0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,  /* 00001CE8    "4__..&{\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001CF0    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x44,0x0A,0x10,  /* 00001CF8    "I0PCID.." */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001D00    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x34,0x5F,  /* 00001D08    "_PCI0S4_" */
+    0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,0x2F,  /* 00001D10    "_...%{\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D18    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x55,0x0A,0x20,0x00,  /* 00001D20    "0PCIU. ." */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001D28    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x35,0x5F,0x5F,  /* 00001D30    "PCI0S5__" */
+    0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001D38    "..&{\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001D40    "SB_PCI0P" */
+    0x43,0x49,0x44,0x0A,0x20,0x00,0x86,0x5C,  /* 00001D48    "CID. ..\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001D50    "/._SB_PC" */
+    0x49,0x30,0x53,0x35,0x5F,0x5F,0x0A,0x03,  /* 00001D58    "I0S5__.." */
+    0xA0,0x25,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001D60    ".%{\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001D68    "B_PCI0PC" */
+    0x49,0x55,0x0A,0x40,0x00,0x86,0x5C,0x2F,  /* 00001D70    "IU.@..\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D78    "._SB_PCI" */
+    0x30,0x53,0x36,0x5F,0x5F,0x01,0xA0,0x26,  /* 00001D80    "0S6__..&" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001D88    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00001D90    "PCI0PCID" */
+    0x0A,0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001D98    ".@..\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001DA0    "SB_PCI0S" */
+    0x36,0x5F,0x5F,0x0A,0x03,0xA0,0x25,0x7B,  /* 00001DA8    "6__...%{" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001DB0    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0A,  /* 00001DB8    "CI0PCIU." */
+    0x80,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001DC0    "...\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x37,  /* 00001DC8    "B_PCI0S7" */
+    0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00001DD0    "__..&{\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001DD8    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x44,0x0A,0x80,0x00,  /* 00001DE0    "0PCID..." */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001DE8    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x37,0x5F,0x5F,  /* 00001DF0    "PCI0S7__" */
+    0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001DF8    "...&{\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001E00    "_SB_PCI0" */
+    0x50,0x43,0x49,0x55,0x0B,0x00,0x01,0x00,  /* 00001E08    "PCIU...." */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001E10    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x38,0x5F,0x5F,  /* 00001E18    "PCI0S8__" */
+    0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001E20    "..'{\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001E28    "SB_PCI0P" */
+    0x43,0x49,0x44,0x0B,0x00,0x01,0x00,0x86,  /* 00001E30    "CID....." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E38    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x38,0x5F,0x5F,0x0A,  /* 00001E40    "CI0S8__." */
+    0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001E48    "..&{\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001E50    "SB_PCI0P" */
+    0x43,0x49,0x55,0x0B,0x00,0x02,0x00,0x86,  /* 00001E58    "CIU....." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E60    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x39,0x5F,0x5F,0x01,  /* 00001E68    "CI0S9__." */
+    0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001E70    ".'{\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001E78    "B_PCI0PC" */
+    0x49,0x44,0x0B,0x00,0x02,0x00,0x86,0x5C,  /* 00001E80    "ID.....\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001E88    "/._SB_PC" */
+    0x49,0x30,0x53,0x39,0x5F,0x5F,0x0A,0x03,  /* 00001E90    "I0S9__.." */
+    0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001E98    ".&{\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001EA0    "B_PCI0PC" */
+    0x49,0x55,0x0B,0x00,0x04,0x00,0x86,0x5C,  /* 00001EA8    "IU.....\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001EB0    "/._SB_PC" */
+    0x49,0x30,0x53,0x31,0x30,0x5F,0x01,0xA0,  /* 00001EB8    "I0S10_.." */
+    0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001EC0    "'{\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001EC8    "_PCI0PCI" */
+    0x44,0x0B,0x00,0x04,0x00,0x86,0x5C,0x2F,  /* 00001ED0    "D.....\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001ED8    "._SB_PCI" */
+    0x30,0x53,0x31,0x30,0x5F,0x0A,0x03,0xA0,  /* 00001EE0    "0S10_..." */
+    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001EE8    "&{\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001EF0    "_PCI0PCI" */
+    0x55,0x0B,0x00,0x08,0x00,0x86,0x5C,0x2F,  /* 00001EF8    "U.....\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001F00    "._SB_PCI" */
+    0x30,0x53,0x31,0x31,0x5F,0x01,0xA0,0x27,  /* 00001F08    "0S11_..'" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F10    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00001F18    "PCI0PCID" */
+    0x0B,0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00001F20    ".....\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F28    "_SB_PCI0" */
+    0x53,0x31,0x31,0x5F,0x0A,0x03,0xA0,0x26,  /* 00001F30    "S11_...&" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F38    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001F40    "PCI0PCIU" */
+    0x0B,0x00,0x10,0x00,0x86,0x5C,0x2F,0x03,  /* 00001F48    ".....\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F50    "_SB_PCI0" */
+    0x53,0x31,0x32,0x5F,0x01,0xA0,0x27,0x7B,  /* 00001F58    "S12_..'{" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F60    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0B,  /* 00001F68    "CI0PCID." */
+    0x00,0x10,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001F70    "....\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001F78    "SB_PCI0S" */
+    0x31,0x32,0x5F,0x0A,0x03,0xA0,0x26,0x7B,  /* 00001F80    "12_...&{" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F88    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0B,  /* 00001F90    "CI0PCIU." */
+    0x00,0x20,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001F98    ". ..\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001FA0    "SB_PCI0S" */
+    0x31,0x33,0x5F,0x01,0xA0,0x27,0x7B,0x5C,  /* 00001FA8    "13_..'{\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001FB0    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x44,0x0B,0x00,  /* 00001FB8    "I0PCID.." */
+    0x20,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FC0    " ..\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001FC8    "B_PCI0S1" */
+    0x33,0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,  /* 00001FD0    "3_...&{\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001FD8    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x55,0x0B,0x00,  /* 00001FE0    "I0PCIU.." */
+    0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FE8    "@..\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001FF0    "B_PCI0S1" */
+    0x34,0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,  /* 00001FF8    "4_..'{\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002000    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x44,0x0B,0x00,0x40,  /* 00002008    "0PCID..@" */
     0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002010    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x36,  /* 00002018    "_PCI0S16" */
-    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 00002020    "_...({\/" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x34,  /* 00002018    "_PCI0S14" */
+    0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00002020    "_...&{\/" */
     0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002028    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 00002030    "0PCIU..." */
-    0x02,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002038    "....\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002040    "SB_PCI0S" */
-    0x31,0x37,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 00002048    "17_..){\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002050    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 00002058    "I0PCID.." */
-    0x00,0x02,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 00002060    ".....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002068    "_SB_PCI0" */
-    0x53,0x31,0x37,0x5F,0x0A,0x03,0xA0,0x28,  /* 00002070    "S17_...(" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002078    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00002080    "PCI0PCIU" */
-    0x0C,0x00,0x00,0x04,0x00,0x00,0x86,0x5C,  /* 00002088    ".......\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002090    "/._SB_PC" */
-    0x49,0x30,0x53,0x31,0x38,0x5F,0x01,0xA0,  /* 00002098    "I0S18_.." */
-    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000020A0    "){\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 000020A8    "_PCI0PCI" */
-    0x44,0x0C,0x00,0x00,0x04,0x00,0x00,0x86,  /* 000020B0    "D......." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000020B8    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x31,0x38,0x5F,0x0A,  /* 000020C0    "CI0S18_." */
-    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 000020C8    "..({\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 000020D0    "SB_PCI0P" */
-    0x43,0x49,0x55,0x0C,0x00,0x00,0x08,0x00,  /* 000020D8    "CIU....." */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000020E0    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x39,  /* 000020E8    "_PCI0S19" */
-    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 000020F0    "_..){\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000020F8    "_SB_PCI0" */
-    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x08,  /* 00002100    "PCID...." */
-    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002108    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00002110    "B_PCI0S1" */
-    0x39,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 00002118    "9_...({\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002120    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 00002128    "I0PCIU.." */
-    0x00,0x10,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 00002130    ".....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002138    "_SB_PCI0" */
-    0x53,0x32,0x30,0x5F,0x01,0xA0,0x29,0x7B,  /* 00002140    "S20_..){" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002148    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 00002150    "CI0PCID." */
-    0x00,0x00,0x10,0x00,0x00,0x86,0x5C,0x2F,  /* 00002158    "......\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002160    "._SB_PCI" */
-    0x30,0x53,0x32,0x30,0x5F,0x0A,0x03,0xA0,  /* 00002168    "0S20_..." */
-    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002170    "({\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002178    "_PCI0PCI" */
-    0x55,0x0C,0x00,0x00,0x20,0x00,0x00,0x86,  /* 00002180    "U... ..." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002188    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x32,0x31,0x5F,0x01,  /* 00002190    "CI0S21_." */
-    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002198    ".){\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 000021A0    "B_PCI0PC" */
-    0x49,0x44,0x0C,0x00,0x00,0x20,0x00,0x00,  /* 000021A8    "ID... .." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000021B0    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x32,0x31,0x5F,  /* 000021B8    "PCI0S21_" */
-    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 000021C0    "...({\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000021C8    "_SB_PCI0" */
-    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x40,  /* 000021D0    "PCIU...@" */
-    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000021D8    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 000021E0    "B_PCI0S2" */
-    0x32,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 000021E8    "2_..){\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000021F0    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 000021F8    "0PCID..." */
-    0x40,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002200    "@...\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002208    "SB_PCI0S" */
-    0x32,0x32,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 00002210    "22_...({" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002218    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 00002220    "CI0PCIU." */
-    0x00,0x00,0x80,0x00,0x00,0x86,0x5C,0x2F,  /* 00002228    "......\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002230    "._SB_PCI" */
-    0x30,0x53,0x32,0x33,0x5F,0x01,0xA0,0x29,  /* 00002238    "0S23_..)" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002240    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00002248    "PCI0PCID" */
-    0x0C,0x00,0x00,0x80,0x00,0x00,0x86,0x5C,  /* 00002250    ".......\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002258    "/._SB_PC" */
-    0x49,0x30,0x53,0x32,0x33,0x5F,0x0A,0x03,  /* 00002260    "I0S23_.." */
-    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002268    ".({\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002270    "B_PCI0PC" */
-    0x49,0x55,0x0C,0x00,0x00,0x00,0x01,0x00,  /* 00002278    "IU......" */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002280    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x32,0x34,0x5F,  /* 00002288    "PCI0S24_" */
-    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002290    "..){\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002298    "SB_PCI0P" */
-    0x43,0x49,0x44,0x0C,0x00,0x00,0x00,0x01,  /* 000022A0    "CID....." */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000022A8    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x34,  /* 000022B0    "_PCI0S24" */
-    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 000022B8    "_...({\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000022C0    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 000022C8    "0PCIU..." */
-    0x00,0x02,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 000022D0    "....\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 000022D8    "SB_PCI0S" */
-    0x32,0x35,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 000022E0    "25_..){\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000022E8    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 000022F0    "I0PCID.." */
-    0x00,0x00,0x02,0x00,0x86,0x5C,0x2F,0x03,  /* 000022F8    ".....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002300    "_SB_PCI0" */
-    0x53,0x32,0x35,0x5F,0x0A,0x03,0xA0,0x28,  /* 00002308    "S25_...(" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002310    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00002318    "PCI0PCIU" */
-    0x0C,0x00,0x00,0x00,0x04,0x00,0x86,0x5C,  /* 00002320    ".......\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002328    "/._SB_PC" */
-    0x49,0x30,0x53,0x32,0x36,0x5F,0x01,0xA0,  /* 00002330    "I0S26_.." */
-    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002338    "){\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002340    "_PCI0PCI" */
-    0x44,0x0C,0x00,0x00,0x00,0x04,0x00,0x86,  /* 00002348    "D......." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002350    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x32,0x36,0x5F,0x0A,  /* 00002358    "CI0S26_." */
-    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002360    "..({\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002368    "SB_PCI0P" */
-    0x43,0x49,0x55,0x0C,0x00,0x00,0x00,0x08,  /* 00002370    "CIU....." */
-    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002378    "..\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x37,  /* 00002380    "_PCI0S27" */
-    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 00002388    "_..){\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002390    "_SB_PCI0" */
-    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x00,  /* 00002398    "PCID...." */
-    0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000023A0    "...\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 000023A8    "B_PCI0S2" */
-    0x37,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 000023B0    "7_...({\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000023B8    "/._SB_PC" */
-    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 000023C0    "I0PCIU.." */
-    0x00,0x00,0x10,0x00,0x86,0x5C,0x2F,0x03,  /* 000023C8    ".....\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000023D0    "_SB_PCI0" */
-    0x53,0x32,0x38,0x5F,0x01,0xA0,0x29,0x7B,  /* 000023D8    "S28_..){" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000023E0    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 000023E8    "CI0PCID." */
-    0x00,0x00,0x00,0x10,0x00,0x86,0x5C,0x2F,  /* 000023F0    "......\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000023F8    "._SB_PCI" */
-    0x30,0x53,0x32,0x38,0x5F,0x0A,0x03,0xA0,  /* 00002400    "0S28_..." */
-    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002408    "({\/._SB" */
-    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002410    "_PCI0PCI" */
-    0x55,0x0C,0x00,0x00,0x00,0x20,0x00,0x86,  /* 00002418    "U.... .." */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002420    "\/._SB_P" */
-    0x43,0x49,0x30,0x53,0x32,0x39,0x5F,0x01,  /* 00002428    "CI0S29_." */
-    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002430    ".){\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002438    "B_PCI0PC" */
-    0x49,0x44,0x0C,0x00,0x00,0x00,0x20,0x00,  /* 00002440    "ID.... ." */
-    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002448    ".\/._SB_" */
-    0x50,0x43,0x49,0x30,0x53,0x32,0x39,0x5F,  /* 00002450    "PCI0S29_" */
-    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 00002458    "...({\/." */
-    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002460    "_SB_PCI0" */
-    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x00,  /* 00002468    "PCIU...." */
-    0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002470    "@..\/._S" */
-    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x33,  /* 00002478    "B_PCI0S3" */
-    0x30,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 00002480    "0_..){\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002488    "._SB_PCI" */
-    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 00002490    "0PCID..." */
-    0x00,0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002498    ".@..\/._" */
-    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 000024A0    "SB_PCI0S" */
-    0x33,0x30,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 000024A8    "30_...({" */
-    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000024B0    "\/._SB_P" */
-    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 000024B8    "CI0PCIU." */
-    0x00,0x00,0x00,0x80,0x00,0x86,0x5C,0x2F,  /* 000024C0    "......\/" */
-    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000024C8    "._SB_PCI" */
-    0x30,0x53,0x33,0x31,0x5F,0x01,0xA0,0x29,  /* 000024D0    "0S31_..)" */
-    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000024D8    "{\/._SB_" */
-    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 000024E0    "PCI0PCID" */
-    0x0C,0x00,0x00,0x00,0x80,0x00,0x86,0x5C,  /* 000024E8    ".......\" */
-    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000024F0    "/._SB_PC" */
-    0x49,0x30,0x53,0x33,0x31,0x5F,0x0A,0x03,  /* 000024F8    "I0S31_.." */
-    0xA4,0x01,0x14,0x11,0x5F,0x4C,0x30,0x32,  /* 00002500    "...._L02" */
-    0x00,0xA4,0x5C,0x2E,0x5F,0x53,0x42,0x5F,  /* 00002508    "..\._SB_" */
-    0x50,0x52,0x53,0x43,0x14,0x08,0x5F,0x4C,  /* 00002510    "PRSC.._L" */
-    0x30,0x33,0x00,0xA4,0x01,0x14,0x08,0x5F,  /* 00002518    "03....._" */
-    0x4C,0x30,0x34,0x00,0xA4,0x01,0x14,0x08,  /* 00002520    "L04....." */
-    0x5F,0x4C,0x30,0x35,0x00,0xA4,0x01,0x14,  /* 00002528    "_L05...." */
-    0x08,0x5F,0x4C,0x30,0x36,0x00,0xA4,0x01,  /* 00002530    "._L06..." */
-    0x14,0x08,0x5F,0x4C,0x30,0x37,0x00,0xA4,  /* 00002538    ".._L07.." */
-    0x01,0x14,0x08,0x5F,0x4C,0x30,0x38,0x00,  /* 00002540    "..._L08." */
-    0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,0x39,  /* 00002548    "...._L09" */
-    0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,  /* 00002550    "....._L0" */
-    0x41,0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,  /* 00002558    "A....._L" */
-    0x30,0x42,0x00,0xA4,0x01,0x14,0x08,0x5F,  /* 00002560    "0B....._" */
-    0x4C,0x30,0x43,0x00,0xA4,0x01,0x14,0x08,  /* 00002568    "L0C....." */
-    0x5F,0x4C,0x30,0x44,0x00,0xA4,0x01,0x14,  /* 00002570    "_L0D...." */
-    0x08,0x5F,0x4C,0x30,0x45,0x00,0xA4,0x01,  /* 00002578    "._L0E..." */
-    0x14,0x08,0x5F,0x4C,0x30,0x46,0x00,0xA4,  /* 00002580    ".._L0F.." */
-    0x01                                      /* 00002588    "."        */
+    0x30,0x50,0x43,0x49,0x55,0x0B,0x00,0x80,  /* 00002030    "0PCIU..." */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002038    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x35,  /* 00002040    "_PCI0S15" */
+    0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,  /* 00002048    "_..'{\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002050    "_SB_PCI0" */
+    0x50,0x43,0x49,0x44,0x0B,0x00,0x80,0x00,  /* 00002058    "PCID...." */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002060    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x31,0x35,0x5F,  /* 00002068    "PCI0S15_" */
+    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 00002070    "...({\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002078    "_SB_PCI0" */
+    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x01,  /* 00002080    "PCIU...." */
+    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002088    "...\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00002090    "B_PCI0S1" */
+    0x36,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 00002098    "6_..){\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000020A0    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 000020A8    "0PCID..." */
+    0x01,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 000020B0    "....\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 000020B8    "SB_PCI0S" */
+    0x31,0x36,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 000020C0    "16_...({" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000020C8    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 000020D0    "CI0PCIU." */
+    0x00,0x00,0x02,0x00,0x00,0x86,0x5C,0x2F,  /* 000020D8    "......\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000020E0    "._SB_PCI" */
+    0x30,0x53,0x31,0x37,0x5F,0x01,0xA0,0x29,  /* 000020E8    "0S17_..)" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000020F0    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 000020F8    "PCI0PCID" */
+    0x0C,0x00,0x00,0x02,0x00,0x00,0x86,0x5C,  /* 00002100    ".......\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002108    "/._SB_PC" */
+    0x49,0x30,0x53,0x31,0x37,0x5F,0x0A,0x03,  /* 00002110    "I0S17_.." */
+    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002118    ".({\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002120    "B_PCI0PC" */
+    0x49,0x55,0x0C,0x00,0x00,0x04,0x00,0x00,  /* 00002128    "IU......" */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002130    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x31,0x38,0x5F,  /* 00002138    "PCI0S18_" */
+    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002140    "..){\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002148    "SB_PCI0P" */
+    0x43,0x49,0x44,0x0C,0x00,0x00,0x04,0x00,  /* 00002150    "CID....." */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002158    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x38,  /* 00002160    "_PCI0S18" */
+    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 00002168    "_...({\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002170    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 00002178    "0PCIU..." */
+    0x08,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002180    "....\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002188    "SB_PCI0S" */
+    0x31,0x39,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 00002190    "19_..){\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002198    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 000021A0    "I0PCID.." */
+    0x00,0x08,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 000021A8    ".....\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000021B0    "_SB_PCI0" */
+    0x53,0x31,0x39,0x5F,0x0A,0x03,0xA0,0x28,  /* 000021B8    "S19_...(" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000021C0    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 000021C8    "PCI0PCIU" */
+    0x0C,0x00,0x00,0x10,0x00,0x00,0x86,0x5C,  /* 000021D0    ".......\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000021D8    "/._SB_PC" */
+    0x49,0x30,0x53,0x32,0x30,0x5F,0x01,0xA0,  /* 000021E0    "I0S20_.." */
+    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000021E8    "){\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 000021F0    "_PCI0PCI" */
+    0x44,0x0C,0x00,0x00,0x10,0x00,0x00,0x86,  /* 000021F8    "D......." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002200    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x32,0x30,0x5F,0x0A,  /* 00002208    "CI0S20_." */
+    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002210    "..({\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002218    "SB_PCI0P" */
+    0x43,0x49,0x55,0x0C,0x00,0x00,0x20,0x00,  /* 00002220    "CIU... ." */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002228    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x31,  /* 00002230    "_PCI0S21" */
+    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 00002238    "_..){\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002240    "_SB_PCI0" */
+    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x20,  /* 00002248    "PCID... " */
+    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002250    "...\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 00002258    "B_PCI0S2" */
+    0x31,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 00002260    "1_...({\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002268    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 00002270    "I0PCIU.." */
+    0x00,0x40,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 00002278    ".@...\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002280    "_SB_PCI0" */
+    0x53,0x32,0x32,0x5F,0x01,0xA0,0x29,0x7B,  /* 00002288    "S22_..){" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002290    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 00002298    "CI0PCID." */
+    0x00,0x00,0x40,0x00,0x00,0x86,0x5C,0x2F,  /* 000022A0    "..@...\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000022A8    "._SB_PCI" */
+    0x30,0x53,0x32,0x32,0x5F,0x0A,0x03,0xA0,  /* 000022B0    "0S22_..." */
+    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000022B8    "({\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 000022C0    "_PCI0PCI" */
+    0x55,0x0C,0x00,0x00,0x80,0x00,0x00,0x86,  /* 000022C8    "U......." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000022D0    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x32,0x33,0x5F,0x01,  /* 000022D8    "CI0S23_." */
+    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 000022E0    ".){\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 000022E8    "B_PCI0PC" */
+    0x49,0x44,0x0C,0x00,0x00,0x80,0x00,0x00,  /* 000022F0    "ID......" */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000022F8    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x32,0x33,0x5F,  /* 00002300    "PCI0S23_" */
+    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 00002308    "...({\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002310    "_SB_PCI0" */
+    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x00,  /* 00002318    "PCIU...." */
+    0x01,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002320    "...\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 00002328    "B_PCI0S2" */
+    0x34,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 00002330    "4_..){\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002338    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 00002340    "0PCID..." */
+    0x00,0x01,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002348    "....\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002350    "SB_PCI0S" */
+    0x32,0x34,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 00002358    "24_...({" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002360    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 00002368    "CI0PCIU." */
+    0x00,0x00,0x00,0x02,0x00,0x86,0x5C,0x2F,  /* 00002370    "......\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002378    "._SB_PCI" */
+    0x30,0x53,0x32,0x35,0x5F,0x01,0xA0,0x29,  /* 00002380    "0S25_..)" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002388    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00002390    "PCI0PCID" */
+    0x0C,0x00,0x00,0x00,0x02,0x00,0x86,0x5C,  /* 00002398    ".......\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000023A0    "/._SB_PC" */
+    0x49,0x30,0x53,0x32,0x35,0x5F,0x0A,0x03,  /* 000023A8    "I0S25_.." */
+    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 000023B0    ".({\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 000023B8    "B_PCI0PC" */
+    0x49,0x55,0x0C,0x00,0x00,0x00,0x04,0x00,  /* 000023C0    "IU......" */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000023C8    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x32,0x36,0x5F,  /* 000023D0    "PCI0S26_" */
+    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 000023D8    "..){\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 000023E0    "SB_PCI0P" */
+    0x43,0x49,0x44,0x0C,0x00,0x00,0x00,0x04,  /* 000023E8    "CID....." */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000023F0    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x36,  /* 000023F8    "_PCI0S26" */
+    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 00002400    "_...({\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002408    "._SB_PCI" */
+    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 00002410    "0PCIU..." */
+    0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002418    "....\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002420    "SB_PCI0S" */
+    0x32,0x37,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 00002428    "27_..){\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002430    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 00002438    "I0PCID.." */
+    0x00,0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00002440    ".....\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002448    "_SB_PCI0" */
+    0x53,0x32,0x37,0x5F,0x0A,0x03,0xA0,0x28,  /* 00002450    "S27_...(" */
+    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002458    "{\/._SB_" */
+    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00002460    "PCI0PCIU" */
+    0x0C,0x00,0x00,0x00,0x10,0x00,0x86,0x5C,  /* 00002468    ".......\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002470    "/._SB_PC" */
+    0x49,0x30,0x53,0x32,0x38,0x5F,0x01,0xA0,  /* 00002478    "I0S28_.." */
+    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002480    "){\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002488    "_PCI0PCI" */
+    0x44,0x0C,0x00,0x00,0x00,0x10,0x00,0x86,  /* 00002490    "D......." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002498    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x32,0x38,0x5F,0x0A,  /* 000024A0    "CI0S28_." */
+    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 000024A8    "..({\/._" */
+    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 000024B0    "SB_PCI0P" */
+    0x43,0x49,0x55,0x0C,0x00,0x00,0x00,0x20,  /* 000024B8    "CIU.... " */
+    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000024C0    "..\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x39,  /* 000024C8    "_PCI0S29" */
+    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 000024D0    "_..){\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000024D8    "_SB_PCI0" */
+    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x00,  /* 000024E0    "PCID...." */
+    0x20,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000024E8    " ..\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 000024F0    "B_PCI0S2" */
+    0x39,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 000024F8    "9_...({\" */
+    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002500    "/._SB_PC" */
+    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 00002508    "I0PCIU.." */
+    0x00,0x00,0x40,0x00,0x86,0x5C,0x2F,0x03,  /* 00002510    "..@..\/." */
+    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002518    "_SB_PCI0" */
+    0x53,0x33,0x30,0x5F,0x01,0xA0,0x29,0x7B,  /* 00002520    "S30_..){" */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002528    "\/._SB_P" */
+    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 00002530    "CI0PCID." */
+    0x00,0x00,0x00,0x40,0x00,0x86,0x5C,0x2F,  /* 00002538    "...@..\/" */
+    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002540    "._SB_PCI" */
+    0x30,0x53,0x33,0x30,0x5F,0x0A,0x03,0xA0,  /* 00002548    "0S30_..." */
+    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002550    "({\/._SB" */
+    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002558    "_PCI0PCI" */
+    0x55,0x0C,0x00,0x00,0x00,0x80,0x00,0x86,  /* 00002560    "U......." */
+    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002568    "\/._SB_P" */
+    0x43,0x49,0x30,0x53,0x33,0x31,0x5F,0x01,  /* 00002570    "CI0S31_." */
+    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002578    ".){\/._S" */
+    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002580    "B_PCI0PC" */
+    0x49,0x44,0x0C,0x00,0x00,0x00,0x80,0x00,  /* 00002588    "ID......" */
+    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002590    ".\/._SB_" */
+    0x50,0x43,0x49,0x30,0x53,0x33,0x31,0x5F,  /* 00002598    "PCI0S31_" */
+    0x0A,0x03,0xA4,0x01,0x14,0x11,0x5F,0x4C,  /* 000025A0    "......_L" */
+    0x30,0x32,0x00,0xA4,0x5C,0x2E,0x5F,0x53,  /* 000025A8    "02..\._S" */
+    0x42,0x5F,0x50,0x52,0x53,0x43,0x14,0x11,  /* 000025B0    "B_PRSC.." */
+    0x5F,0x4C,0x30,0x33,0x00,0xA4,0x5C,0x2E,  /* 000025B8    "_L03..\." */
+    0x5F,0x53,0x42,0x5F,0x4D,0x45,0x53,0x43,  /* 000025C0    "_SB_MESC" */
+    0x14,0x08,0x5F,0x4C,0x30,0x34,0x00,0xA4,  /* 000025C8    ".._L04.." */
+    0x01,0x14,0x08,0x5F,0x4C,0x30,0x35,0x00,  /* 000025D0    "..._L05." */
+    0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,0x36,  /* 000025D8    "...._L06" */
+    0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,  /* 000025E0    "....._L0" */
+    0x37,0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,  /* 000025E8    "7....._L" */
+    0x30,0x38,0x00,0xA4,0x01,0x14,0x08,0x5F,  /* 000025F0    "08....._" */
+    0x4C,0x30,0x39,0x00,0xA4,0x01,0x14,0x08,  /* 000025F8    "L09....." */
+    0x5F,0x4C,0x30,0x41,0x00,0xA4,0x01,0x14,  /* 00002600    "_L0A...." */
+    0x08,0x5F,0x4C,0x30,0x42,0x00,0xA4,0x01,  /* 00002608    "._L0B..." */
+    0x14,0x08,0x5F,0x4C,0x30,0x43,0x00,0xA4,  /* 00002610    ".._L0C.." */
+    0x01,0x14,0x08,0x5F,0x4C,0x30,0x44,0x00,  /* 00002618    "..._L0D." */
+    0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,0x45,  /* 00002620    "...._L0E" */
+    0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,  /* 00002628    "....._L0" */
+    0x46,0x00,0xA4,0x01                       /* 00002630    "F..."     */
 };
diff --git a/src/acpi.c b/src/acpi.c
index ea7b171..7153e3e 100644
--- a/src/acpi.c
+++ b/src/acpi.c
@@ -378,10 +378,14 @@ static unsigned char ssdt_proc[] = {
     0x4a,0x30,0x01,0x43,0x50,0x45,0x4a,0x49,
     0x44,0x5f,0x5f,0x68
 };
+
+
+
 #define SD_OFFSET_CPUHEX 6
 #define SD_OFFSET_CPUID1 8
 #define SD_OFFSET_CPUID2 20
 
+
 #define SSDT_SIGNATURE 0x54445353 // SSDT
 static void*
 build_ssdt(void)
@@ -460,6 +464,126 @@ build_ssdt(void)
     return ssdt;
 }
 
+static unsigned char ssdt_mem[] = {
+
+
+    0x5b,0x82,0x40,0x07,0x4d,0x50,0x41,0x41,
+    0x08,0x49,0x44,0x5f,0x5f,0x0a,0xaa,0x08,
+    0x5f,0x48,0x49,0x44,0x0c,0x41,0xd0,0x0c,
+    0x80,0x08,0x5f,0x43,0x52,0x53,0x11,0x33,
+    0x0a,0x30,0x8a,0x2b,0x00,0x00,0x0d,0x03,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0xef,0xbe,0xad,0xde,0x00,0x00,0x00,0x00,
+    0xee,0xbe,0xad,0xe6,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
+    0x79,0x00,0x14,0x0f,0x5f,0x53,0x54,0x41,
+    0x00,0xa4,0x43,0x4d,0x53,0x54,0x49,0x44,
+    0x5f,0x5f,0x14,0x0f,0x5f,0x45,0x4a,0x30,
+    0x01,0x4d,0x50,0x45,0x4a,0x49,0x44,0x5f,
+    0x5f,0x68
+
+};
+
+#define SD_OFFSET_MEMHEX 6
+#define SD_OFFSET_MEMID1 14
+#define SD_OFFSET_MEMSTART 48
+#define SD_OFFSET_MEMEND   56
+
+
+static void*
+build_memssdt(void)
+{
+    u64  memstart;
+    u64 start_ramsize, ramsize, maxramsize;
+    int memdevs, enabled_memdevs;
+
+    ramsize = qemu_cfg_get_ramsize();
+    maxramsize = qemu_cfg_get_maxramsize();
+    memdevs = maxramsize / LINUX_MIN_BLOCK_SIZE;
+    enabled_memdevs = ramsize / LINUX_MIN_BLOCK_SIZE;
+    start_ramsize = (u64)RamSize;
+
+    // length = ScopeOp + memdevs + MTFY method + MEON package
+    int length = ((1+3+4)
+                  + (memdevs * sizeof(ssdt_mem))
+                  + (1+2+5+(12*memdevs))
+                  + (6+2+1+(1*memdevs)));
+    u8 *ssdt = malloc_high(sizeof(struct acpi_table_header) + length);
+    if (! ssdt) {
+        warn_noalloc();
+        return NULL;
+    }
+    u8 *ssdt_ptr = ssdt + sizeof(struct acpi_table_header);
+
+    // build Scope(_SB_) header
+    *(ssdt_ptr++) = 0x10; // ScopeOp
+    ssdt_ptr = encodeLen(ssdt_ptr, length-1, 3);
+    *(ssdt_ptr++) = '_';
+    *(ssdt_ptr++) = 'S';
+    *(ssdt_ptr++) = 'B';
+    *(ssdt_ptr++) = '_';
+
+    // build Memory Device object for each processor
+    int i;
+    memstart = 0;
+    for (i=0; i<memdevs; i++) {
+        memcpy(ssdt_ptr, ssdt_mem, sizeof(ssdt_mem));
+        ssdt_ptr[SD_OFFSET_MEMHEX] = getHex(i >> 4);
+        ssdt_ptr[SD_OFFSET_MEMHEX+1] = getHex(i);
+        ssdt_ptr[SD_OFFSET_MEMID1] = i;
+        /* initial memory (when >4GB) or hotpluggable memory is above 4GB, due to hole at 0x0e0000000-0x100000000 */
+        if ( (memstart == MEM_HOLE) || (memstart == start_ramsize)) {
+            memstart = MEM_HOTPLUG_OFFSET; 
+        }
+
+        *(u64*)(ssdt_ptr + SD_OFFSET_MEMSTART) = memstart;
+        *(u64*)(ssdt_ptr + SD_OFFSET_MEMEND) = memstart + LINUX_MIN_BLOCK_SIZE - 1;
+        ssdt_ptr += sizeof(ssdt_mem);
+        memstart += LINUX_MIN_BLOCK_SIZE;    
+
+    }
+
+    // build "Method(MTFY, 2) {If (LEqual(Arg0, 0x00)) {Notify(CM00, Arg1)} ...}"
+    *(ssdt_ptr++) = 0x14; // MethodOp
+    ssdt_ptr = encodeLen(ssdt_ptr, 2+5+(12*memdevs), 2);
+    *(ssdt_ptr++) = 'M';
+    *(ssdt_ptr++) = 'T';
+    *(ssdt_ptr++) = 'F';
+    *(ssdt_ptr++) = 'Y';
+    *(ssdt_ptr++) = 0x02;
+    for (i=0; i<memdevs; i++) {
+        *(ssdt_ptr++) = 0xA0; // IfOp
+        ssdt_ptr = encodeLen(ssdt_ptr, 11, 1);
+        *(ssdt_ptr++) = 0x93; // LEqualOp
+        *(ssdt_ptr++) = 0x68; // Arg0Op
+        *(ssdt_ptr++) = 0x0A; // BytePrefix
+        *(ssdt_ptr++) = i;
+        *(ssdt_ptr++) = 0x86; // NotifyOp
+        *(ssdt_ptr++) = 'M';
+        *(ssdt_ptr++) = 'P';
+        *(ssdt_ptr++) = getHex(i >> 4);
+        *(ssdt_ptr++) = getHex(i);
+        *(ssdt_ptr++) = 0x69; // Arg1Op
+    }
+
+    // build "Name(CPON, Package() { One, One, ..., Zero, Zero, ... })"
+    *(ssdt_ptr++) = 0x08; // NameOp
+    *(ssdt_ptr++) = 'M';
+    *(ssdt_ptr++) = 'E';
+    *(ssdt_ptr++) = 'O';
+    *(ssdt_ptr++) = 'N';
+    *(ssdt_ptr++) = 0x12; // PackageOp
+    ssdt_ptr = encodeLen(ssdt_ptr, 2+1+(1*memdevs), 2);
+    *(ssdt_ptr++) = memdevs;
+    for (i=0; i<memdevs; i++)
+        *(ssdt_ptr++) = ( i < enabled_memdevs ) ? 0x01 : 0x00;
+
+    build_header((void*)ssdt, SSDT_SIGNATURE, ssdt_ptr - ssdt, 1);
+
+    return ssdt;
+}
+
 #define HPET_SIGNATURE 0x54455048 //HPET
 static void*
 build_hpet(void)
@@ -635,6 +759,7 @@ acpi_bios_init(void)
     // Add tables
     ACPI_INIT_TABLE(build_fadt(pci));
     ACPI_INIT_TABLE(build_ssdt());
+    ACPI_INIT_TABLE(build_memssdt());
     ACPI_INIT_TABLE(build_madt());
     ACPI_INIT_TABLE(build_hpet());
     ACPI_INIT_TABLE(build_srat());
diff --git a/src/biosvar.h b/src/biosvar.h
index 2b755e3..3356ebd 100644
--- a/src/biosvar.h
+++ b/src/biosvar.h
@@ -329,4 +329,9 @@ struct bios_config_table_s {
 
 extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1);
 
+
+#define LINUX_MIN_BLOCK_SIZE    0x8000000LU
+#define MEM_HOTPLUG_OFFSET      0x100000000LLU
+#define MEM_HOLE                0xe0000000LLU
+
 #endif // __BIOSVAR_H
diff --git a/src/paravirt.c b/src/paravirt.c
index 9cf77de..1e1b83b 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -305,6 +305,28 @@ u16 qemu_cfg_get_max_cpus(void)
     return cnt;
 }
 
+u64 qemu_cfg_get_ramsize(void)
+{
+    u64 cnt;
+
+    if (!qemu_cfg_present)
+        return 0;
+
+    qemu_cfg_read_entry(&cnt, QEMU_CFG_RAMSIZE, sizeof(cnt));
+    return cnt;
+}
+
+u64 qemu_cfg_get_maxramsize(void)
+{
+    u64 cnt;
+
+    if (!qemu_cfg_present)
+        return 0;
+
+    qemu_cfg_read_entry(&cnt, QEMU_CFG_MAXRAMSIZE, sizeof(cnt));
+    return cnt;
+}
+
 static QemuCfgFile LastFile;
 
 static u32
diff --git a/src/paravirt.h b/src/paravirt.h
index 4a370a0..df43534 100644
--- a/src/paravirt.h
+++ b/src/paravirt.h
@@ -29,6 +29,8 @@ static inline int kvm_para_available(void)
 #define QEMU_CFG_SIGNATURE		0x00
 #define QEMU_CFG_ID			0x01
 #define QEMU_CFG_UUID			0x02
+#define QEMU_CFG_RAMSIZE		0x03
+#define QEMU_CFG_MAXRAMSIZE		0x1a
 #define QEMU_CFG_NUMA			0x0d
 #define QEMU_CFG_BOOT_MENU		0x0e
 #define QEMU_CFG_MAX_CPUS		0x0f
@@ -55,6 +57,8 @@ int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs,
 int qemu_cfg_get_numa_nodes(void);
 void qemu_cfg_get_numa_data(u64 *data, int n);
 u16 qemu_cfg_get_max_cpus(void);
+u64 qemu_cfg_get_ramsize(void);
+u64 qemu_cfg_get_maxramsize(void);
 
 typedef struct QemuCfgFile {
     u32  size;        /* file size */

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

* Re: [PATCH][SeaBIOS] memory hotplug
  2011-08-11 14:39 [PATCH][SeaBIOS] memory hotplug Vasilis Liaskovitis
@ 2011-08-29  9:24 ` Lai Jiangshan
  2011-09-06  8:07   ` Vasilis Liaskovitis
  2012-03-15 12:01 ` [PATCH][SeaBIOS] " Gleb Natapov
  1 sibling, 1 reply; 7+ messages in thread
From: Lai Jiangshan @ 2011-08-29  9:24 UTC (permalink / raw)
  To: Vasilis Liaskovitis; +Cc: kvm, seabios

Hi, Vasilis Liaskovitis

When I test it, the guest OS become non-available, but it does not crash.
It also cause the disk fault.

It is hard to dig the reason. Or I missed something?

Thank,
Lai

dmesg:



Hotplug Mem Device 
init_memory_mapping: 0000000100000000-0000000108000000
 0100000000 - 0108000000 page 2M
Built 1 zonelists in Node order, mobility grouping on.  Total pages: 274232
Policy zone: Normal
nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata1.00: failed command: WRITE DMA
ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
         res 50/01:00:40:11:84/00:00:00:00:00/e0 Emask 0x40 (internal error)
ata1.00: status: { DRDY }
ata1.00: configured for MWDMA2
ata1: EH complete
nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata1.00: failed command: WRITE DMA
ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
         res 50/01:00:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
ata1.00: status: { DRDY }
ata1.00: configured for MWDMA2
ata1: EH complete
nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata1.00: failed command: WRITE DMA
ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
         res 50/01:00:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
ata1.00: status: { DRDY }
ata1.00: configured for MWDMA2
ata1: EH complete
nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata1.00: failed command: WRITE DMA
ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
         res 50/01:00:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
ata1.00: status: { DRDY }
ata1.00: configured for MWDMA2
ata1: EH complete

......



On 08/11/2011 10:39 PM, Vasilis Liaskovitis wrote:
> Hi,
> 
> I am testing a set of experimental patches for memory-hotplug on x86_64 host /
> guest combinations. I have implemented this in a similar way to cpu-hotplug.  
> 
> A dynamic SSDT table with all memory devices is created at boot time.  This
> table calls static methods from the DSDT.  A byte array indicates which memory
> device is online or not. This array is kept in sync with a qemu-kvm bitmap array
> through ioport 0xaf20. Qemu-kvm updates this table on a "mem_set" command and
> an ACPI event is triggered.
> 
> Memory devices are 128MB in size (to match /sys/devices/memory/block_size_bytes 
> in x86_64). They are constructed dynamically in src/ssdt-mem.asl , similarly to
> hotpluggable-CPUs.  The _CRS memstart-memend attribute for each memory device is
> defined accordingly, skipping the hole at 0xe0000000 - 0x100000000.
> Hotpluggable memory is always located above 4GB.
> 
> Qemu-kvm sets the upper bound of hotpluggable memory with "maxmem = [totalmemory in
> MB]" on the command line. Maxmem is an argument for "-m" similar to maxcpus for smp.
> E.g. "-m 1024,maxmem=2048" on the qemu command line will create memory devices
> for 2GB of RAM, enabling only 1GB initially.
> 
> Qemu_monitor triggers a memory hotplug with:
> (qemu) mem_set [memory range in MBs] online
> 
> Testing:
> - Linux guests boot fine and memory hotplug works so far.
> 
> - Windows2008 guest complains about "non ACPI compliant BIOS". Specifically:
> STOP 0x000000A5 (0x0000000D, Parameter2, Parameter3, Parameter4) 
> "This error generally occurs if either the _HID or _ADR object is missing. " 
> according to a microsoft support site. I do specify _HID in the memory device
> definition. I have tried to specify _ADR to be equal to the memstart parameter
> in each memory device, but the problem remains.  Any advice on the _ADR object?
> Perhaps the memory layout I describe in the memory devices is not compatible 
> with Windows memory usage?
> 
> Other comments on the patches are welcome.
> 
> The 3 patches are below in order (on top of today's master for both qemu-kvm and
> SeaBIOS):
> 
> - qemu-kvm patch
> - seabios src/ssdt-mem.asl
> - seabios patch on existing code
> 
> thanks,
> 
> - Vasilis
> 
> 
>  cpu-all.h       |    1 +
>  hmp-commands.hx |   14 ++++++++
>  hw/acpi_piix4.c |  101 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  hw/fw_cfg.c     |   13 +++++++
>  hw/fw_cfg.h     |    2 +
>  hw/loader.c     |    2 +-
>  hw/pc.c         |    1 +
>  hw/pc.h         |    4 ++
>  hw/pc_piix.c    |    4 ++-
>  monitor.c       |   22 ++++++++++++
>  sysemu.h        |    1 +
>  vl.c            |   41 ++++++++++++++++++++++-
>  12 files changed, 201 insertions(+), 5 deletions(-)
> 
> diff --git a/cpu-all.h b/cpu-all.h
> index fa0205c..21aa4ea 100644
> --- a/cpu-all.h
> +++ b/cpu-all.h
> @@ -470,6 +470,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr);
>  
>  extern int phys_ram_fd;
>  extern ram_addr_t ram_size;
> +extern ram_addr_t maxram_size;
>  
>  /* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */
>  #define RAM_PREALLOC_MASK   (1 << 0)
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index ed5c9b9..5a95c4e 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1229,6 +1229,20 @@ Set CPU @var{cpu} online or offline.
>  ETEXI
>  
>      {
> +        .name       = "mem_set",
> +        .args_type  = "mem:i,state:s",
> +        .params     = "mem [online|offline]",
> +        .help       = "change memory device state",
> +        .mhandler.cmd  = do_mem_set_nr,
> +    },
> +
> +STEXI
> +@item mem_set @var{mem} [online|offline]
> +Set MEM @var{mem} online or offline.
> +
> +ETEXI
> +
> +    {
>          .name       = "set_password",
>          .args_type  = "protocol:s,password:s,connected:s?",
>          .params     = "protocol password action-if-connected",
> diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
> index 44eb8ae..7ca33ab 100644
> --- a/hw/acpi_piix4.c
> +++ b/hw/acpi_piix4.c
> @@ -24,6 +24,8 @@
>  #include "sysemu.h"
>  #include "range.h"
>  #include "ioport.h"
> +#include "fw_cfg.h"
> +#include "cpu-all.h"
>  
>  //#define DEBUG
>  
> @@ -37,16 +39,19 @@
>  
>  #define GPE_BASE 0xafe0
>  #define PROC_BASE 0xaf00
> +#define MEM_BASE 0xaf20
>  #define GPE_LEN 4
>  #define PCI_BASE 0xae00
>  #define PCI_EJ_BASE 0xae08
>  #define PCI_RMV_BASE 0xae0c
>  
> +#define PIIX4_MEM_HOTPLUG_STATUS 8
>  #define PIIX4_CPU_HOTPLUG_STATUS 4
>  #define PIIX4_PCI_HOTPLUG_STATUS 2
>  
>  struct gpe_regs {
>      uint8_t cpus_sts[32];
> +    uint8_t mems_sts[32];
>  };
>  
>  struct pci_status {
> @@ -94,7 +99,8 @@ static void pm_update_sci(PIIX4PMState *s)
>                     ACPI_BITMASK_POWER_BUTTON_ENABLE |
>                     ACPI_BITMASK_GLOBAL_LOCK_ENABLE |
>                     ACPI_BITMASK_TIMER_ENABLE)) != 0) ||
> -        (((s->gpe.sts[0] & s->gpe.en[0]) & PIIX4_PCI_HOTPLUG_STATUS) != 0);
> +        (((s->gpe.sts[0] & s->gpe.en[0]) & 
> +          (PIIX4_PCI_HOTPLUG_STATUS | PIIX4_MEM_HOTPLUG_STATUS | PIIX4_CPU_HOTPLUG_STATUS) ) != 0);
>  
>      qemu_set_irq(s->irq, sci_level);
>      /* schedule a timer interruption if needed */
> @@ -447,6 +453,9 @@ static uint32_t gpe_readb(void *opaque, uint32_t addr)
>          case PROC_BASE ... PROC_BASE+31:
>              val = g->cpus_sts[addr - PROC_BASE];
>              break;
> +        case MEM_BASE ... MEM_BASE+31:
> +            val = g->mems_sts[addr - MEM_BASE];    
> +            break;
>          default:
>              val = acpi_gpe_ioport_readb(&s->gpe, addr);
>      }
> @@ -538,6 +547,7 @@ static void pcirmv_write(void *opaque, uint32_t addr, uint32_t val)
>  }
>  
>  extern const char *global_cpu_model;
> +extern FWCfgState *fw_cfg;
>  
>  static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
>                                  PCIHotplugState state);
> @@ -545,13 +555,19 @@ static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
>  static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
>  {
>      struct pci_status *pci0_status = &s->pci0_status;
> -    int i = 0, cpus = smp_cpus;
> +    int i = 0, cpus = smp_cpus, memdev;
>  
>      while (cpus > 0) {
>          s->gpe_cpu.cpus_sts[i++] = (cpus < 8) ? (1 << cpus) - 1 : 0xff;
>          cpus -= 8;
>      }
>  
> +    i = 0;
> +    memdev = ram_size / LINUX_MIN_BLOCK_SIZE;
> +    while (memdev > 0) {
> +        s->gpe_cpu.mems_sts[i++] = (memdev < 8) ? (1 << memdev) - 1 : 0xff;
> +        memdev -= 8;
> +    }
>      register_ioport_write(GPE_BASE, GPE_LEN, 1, gpe_writeb, s);
>      register_ioport_read(GPE_BASE, GPE_LEN, 1,  gpe_readb, s);
>      acpi_gpe_blk(&s->gpe, GPE_BASE);
> @@ -559,6 +575,9 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
>      register_ioport_write(PROC_BASE, 32, 1, gpe_writeb, s);
>      register_ioport_read(PROC_BASE, 32, 1,  gpe_readb, s);
>  
> +    register_ioport_write(MEM_BASE, 32, 1, gpe_writeb, s);
> +    register_ioport_read(MEM_BASE, 32, 1,  gpe_readb, s);
> +
>      register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, pci0_status);
>      register_ioport_read(PCI_BASE, 8, 4,  pcihotplug_read, pci0_status);
>  
> @@ -571,6 +590,20 @@ static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
>      pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
>  }
>  
> +static void enable_mem_device(PIIX4PMState *s, int memdevice)
> +{
> +    struct gpe_regs *g = &s->gpe_cpu;
> +    s->gpe.sts[0] |= PIIX4_MEM_HOTPLUG_STATUS;
> +    g->mems_sts[memdevice/8] |= (1 << (memdevice%8));
> +}
> +
> +static void disable_mem_device(PIIX4PMState *s, int memdevice)
> +{
> +    struct gpe_regs *g = &s->gpe_cpu;
> +    s->gpe.sts[0] |= PIIX4_MEM_HOTPLUG_STATUS;
> +    g->mems_sts[memdevice/8] &= ~(1 << (memdevice%8));
> +}
> +
>  #if defined(TARGET_I386)
>  static void enable_processor(PIIX4PMState *s, int cpu)
>  {
> @@ -611,6 +644,70 @@ void qemu_system_cpu_hot_add(int cpu, int state)
>  
>      pm_update_sci(s);
>  }
> +
> +void qemu_system_mem_hot_add(int64_t value, int state)
> +{
> +    PIIX4PMState *s = global_piix4_pm_state;
> +    static unsigned int hotmemcount = 1;
> +    char buf[32];
> +    int64_t memdev, tmpvalue;
> +
> +    /* Expects memory range in MBs currently. */
> +    value = 1024 * 1024 * value;
> +
> +    if (value % LINUX_MIN_BLOCK_SIZE) {
> +        fprintf(stderr, "memory hotadd range must be a multiple of %lu bytes\n", 
> +                LINUX_MIN_BLOCK_SIZE);
> +        return;
> +    }
> +
> +    if (value + ram_size > maxram_size) {
> +        fprintf(stderr, "failure: memory hotadd exceeds total available memory range\n");
> +        return;
> +    }
> +
> +    if (state) {
> +        ram_addr_t size = value;
> +        ram_addr_t ram_addr;
> +
> +        target_phys_addr_t start_addr;
> +        start_addr = global_ram_hotplug_offset;
> +
> +        sprintf(buf, "pc.extraram%u", hotmemcount);
> +        ram_addr = qemu_ram_alloc(NULL, buf, size);
> +        cpu_register_physical_memory(start_addr,
> +                                        size, ram_addr);
> +        e820_add_entry(start_addr, size, E820_RAM);
> +
> +        tmpvalue = value;
> +        memdev = ram_size / LINUX_MIN_BLOCK_SIZE;
> +        while (tmpvalue) {
> +            enable_mem_device(s, memdev);
> +            tmpvalue -= LINUX_MIN_BLOCK_SIZE;
> +            memdev++;
> +        }
> +        ram_size += value;
> +
> +        fw_cfg_update_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
> +        global_ram_hotplug_offset += value;
> +        hotmemcount++;
> +    }
> +
> +    else {
> +        tmpvalue = value;
> +        memdev = ram_size / LINUX_MIN_BLOCK_SIZE - 1;
> +        while (tmpvalue) {
> +            disable_mem_device(s, memdev);
> +            tmpvalue -= LINUX_MIN_BLOCK_SIZE;
> +            memdev--;
> +        }
> +        ram_size -= value;
> +        fw_cfg_update_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
> +        
> +    }    
> +
> +    pm_update_sci(s);
> +}
>  #endif
>  
>  static void enable_device(PIIX4PMState *s, int slot)
> diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
> index e4847b7..f9a2b3d 100644
> --- a/hw/fw_cfg.c
> +++ b/hw/fw_cfg.c
> @@ -408,6 +408,19 @@ int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value)
>      return fw_cfg_add_bytes(s, key, (uint8_t *)copy, sizeof(value));
>  }
>  
> +int fw_cfg_update_i64(FWCfgState *s, uint64_t key, uint64_t data)
> +{
> +    int arch = !!(key & FW_CFG_ARCH_LOCAL);
> +    uint64_t *p;
> +
> +    key &= FW_CFG_ENTRY_MASK;
> +
> +    p = (uint64_t*)s->entries[arch][key].data;
> +    *p = cpu_to_le64(data);
> +    
> +    return 1;
> +}
> +
>  int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
>                          void *callback_opaque, uint8_t *data, size_t len)
>  {
> diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h
> index 856bf91..83c2b34 100644
> --- a/hw/fw_cfg.h
> +++ b/hw/fw_cfg.h
> @@ -27,6 +27,7 @@
>  #define FW_CFG_SETUP_SIZE       0x17
>  #define FW_CFG_SETUP_DATA       0x18
>  #define FW_CFG_FILE_DIR         0x19
> +#define FW_CFG_MAXRAM_SIZE      0x1A
>  
>  #define FW_CFG_FILE_FIRST       0x20
>  #define FW_CFG_FILE_SLOTS       0x10
> @@ -58,6 +59,7 @@ int fw_cfg_add_bytes(FWCfgState *s, uint16_t key, uint8_t *data, uint32_t len);
>  int fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value);
>  int fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value);
>  int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value);
> +int fw_cfg_update_i64(FWCfgState *s, uint64_t key, uint64_t data);
>  int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
>                          void *callback_opaque, uint8_t *data, size_t len);
>  int fw_cfg_add_file(FWCfgState *s, const char *filename, uint8_t *data,
> diff --git a/hw/loader.c b/hw/loader.c
> index 35d792e..2a017d1 100644
> --- a/hw/loader.c
> +++ b/hw/loader.c
> @@ -536,7 +536,7 @@ struct Rom {
>      QTAILQ_ENTRY(Rom) next;
>  };
>  
> -static FWCfgState *fw_cfg;
> +FWCfgState *fw_cfg;
>  static QTAILQ_HEAD(, Rom) roms = QTAILQ_HEAD_INITIALIZER(roms);
>  
>  static void rom_insert(Rom *rom)
> diff --git a/hw/pc.c b/hw/pc.c
> index d1dfc83..c6595e1 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -603,6 +603,7 @@ static void *bochs_bios_init(void)
>  
>      fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
>      fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
> +    fw_cfg_add_i64(fw_cfg, FW_CFG_MAXRAM_SIZE, (uint64_t)maxram_size);
>      fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, (uint8_t *)acpi_tables,
>                       acpi_tables_len);
>      fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override());
> diff --git a/hw/pc.h b/hw/pc.h
> index c8d4280..a00aca6 100644
> --- a/hw/pc.h
> +++ b/hw/pc.h
> @@ -9,6 +9,10 @@
>  #include "net.h"
>  #include "memory.h"
>  
> +#define LINUX_MIN_BLOCK_SIZE    0x8000000LU
> +#define MEM_HOTPLUG_OFFSET      0x100000000LLU
> +
> +extern ram_addr_t global_ram_hotplug_offset;
>  /* PC-style peripherals (also used by other machines).  */
>  
>  /* serial.c */
> diff --git a/hw/pc_piix.c b/hw/pc_piix.c
> index 3d5f6e7..063b462 100644
> --- a/hw/pc_piix.c
> +++ b/hw/pc_piix.c
> @@ -46,7 +46,7 @@
>  #endif
>  
>  qemu_irq *ioapic_irq_hack;
> -
> +ram_addr_t global_ram_hotplug_offset;
>  #define MAX_IDE_BUS 2
>  
>  static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
> @@ -109,9 +109,11 @@ static void pc_init1(MemoryRegion *system_memory,
>      if (ram_size >= 0xe0000000 ) {
>          above_4g_mem_size = ram_size - 0xe0000000;
>          below_4g_mem_size = 0xe0000000;
> +        global_ram_hotplug_offset = ram_size + 0x20000000LLU; 
>      } else {
>          above_4g_mem_size = 0;
>          below_4g_mem_size = ram_size;
> +        global_ram_hotplug_offset = MEM_HOTPLUG_OFFSET;
>      }
>  
>      /* allocate ram and load rom/bios */
> diff --git a/monitor.c b/monitor.c
> index caaa05c..fdf1dc9 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -984,6 +984,28 @@ static void do_cpu_set_nr(Monitor *mon, const QDict *qdict)
>  #endif
>  }
>  
> +static void do_mem_set_nr(Monitor *mon, const QDict *qdict)
> +{
> +    int state;
> +    int64_t  value;
> +    const char *status;
> +
> +    status = qdict_get_str(qdict, "state");
> +    value = qdict_get_int(qdict, "mem");
> +
> +    if (!strcmp(status, "online"))
> +       state = 1;
> +    else if (!strcmp(status, "offline"))
> +       state = 0;
> +    else {
> +        monitor_printf(mon, "invalid status: %s\n", status);
> +        return;
> +    }
> +#if defined(TARGET_I386) || defined(TARGET_X86_64)
> +    qemu_system_mem_hot_add(value, state);
> +#endif
> +}
> +
>  static void do_info_jit(Monitor *mon)
>  {
>      dump_exec_info((FILE *)mon, monitor_fprintf);
> diff --git a/sysemu.h b/sysemu.h
> index fc2bf36..c2bb3cd 100644
> --- a/sysemu.h
> +++ b/sysemu.h
> @@ -146,6 +146,7 @@ extern unsigned int nb_prom_envs;
>  
>  /* acpi */
>  void qemu_system_cpu_hot_add(int cpu, int state);
> +void qemu_system_mem_hot_add(int64_t value, int state);
>  
>  /* pci-hotplug */
>  void pci_device_hot_add(Monitor *mon, const QDict *qdict);
> diff --git a/vl.c b/vl.c
> index f6a77f7..474c935 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -178,6 +178,7 @@ DisplayType display_type = DT_DEFAULT;
>  int display_remote = 0;
>  const char* keyboard_layout = NULL;
>  ram_addr_t ram_size;
> +ram_addr_t maxram_size;
>  const char *mem_path = NULL;
>  #ifdef MAP_POPULATE
>  int mem_prealloc = 0; /* force preallocation of physical target memory */
> @@ -2127,6 +2128,7 @@ int main(int argc, char **argv, char **envp)
>      cpu_model = NULL;
>      initrd_filename = NULL;
>      ram_size = 0;
> +    maxram_size = 0;
>      snapshot = 0;
>      kernel_filename = NULL;
>      kernel_cmdline = "";
> @@ -2455,8 +2457,10 @@ int main(int argc, char **argv, char **envp)
>                  break;
>              case QEMU_OPTION_m: {
>                  int64_t value;
> +                char *endptr;
> +                char option[128];
>  
> -                value = strtosz(optarg, NULL);
> +                value = strtosz(optarg, &endptr);
>                  if (value < 0) {
>                      fprintf(stderr, "qemu: invalid ram size: %s\n", optarg);
>                      exit(1);
> @@ -2467,6 +2471,41 @@ int main(int argc, char **argv, char **envp)
>                      exit(1);
>                  }
>                  ram_size = value;
> +
> +                if (endptr != optarg) {
> +                    if (*endptr == ',') {
> +                        endptr++;
> +                    }
> +                }
> +
> +                if (get_param_value(option, 128, "maxmem", endptr) != 0) {
> +                    value = strtosz(option, NULL);
> +
> +                    if (value < 0) {
> +                        fprintf(stderr, "qemu: invalid ram size: %s\n", endptr);
> +                        exit(1);
> +                    }
> +
> +                    /* On 32-bit hosts, QEMU is limited by virtual address space */
> +                    if (value > (2047 << 20) && HOST_LONG_BITS == 32) {
> +                        fprintf(stderr, "qemu: at most 2047 MB RAM can be simulated\n");
> +                        exit(1);
> +                    }
> +                    if (value != (uint64_t)(ram_addr_t)value) {
> +                        fprintf(stderr, "qemu: ram size too large\n");
> +                        exit(1);
> +                    }
> +                    if (value < ram_size) {
> +                        fprintf(stderr, "qemu: max ram size cannot be less than initial ram size\n");
> +                        exit(1);
> +                    }    
> +
> +                    maxram_size = value;
> +
> +                }    
> +                else
> +                    maxram_size = ram_size;
> +                fprintf(stderr, "ramsize = %ld maxramsize = %ld\n", ram_size, maxram_size);
>                  break;
>              }
>              case QEMU_OPTION_mempath:
> 
> 
> 
> 
> 
>  src/ssdt-mem.dsl |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 65 insertions(+), 0 deletions(-)
> 
> diff --git a/src/ssdt-mem.dsl b/src/ssdt-mem.dsl
> new file mode 100644
> index 0000000..60abb05
> --- /dev/null
> +++ b/src/ssdt-mem.dsl
> @@ -0,0 +1,65 @@
> +/* This file is the basis for the ssdt_mem[] variable in src/acpi.c.
> + * It is similar in design to the ssdt_proc variable.  
> + * 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 memory device in the system.  The 
> + * objects will * be placed in the \_SB_ namespace.
> + *
> + * To generate a new ssdt_memc[], run the commands:
> + *   cpp -P src/ssdt-mem.dsl > out/ssdt-mem.dsl.i
> + *   iasl -ta -p out/ssdt-mem out/ssdt-mem.dsl.i
> + *   tail -c +37 < out/ssdt-mem.aml | hexdump -e '"    " 8/1 "0x%02x," "\n"'
> + * and then cut-and-paste the output into the src/acpi.c ssdt_mem[]
> + * array.
> + *
> + * In addition to the aml code generated from this file, the
> + * src/acpi.c file creates a MEMNTFY method with an entry for each memdevice:
> + *     Method(MTFY, 2) {
> + *         If (LEqual(Arg0, 0x00)) { Notify(MP00, Arg1) }
> + *         If (LEqual(Arg0, 0x01)) { Notify(MP01, Arg1) }
> + *         ...
> + *     }
> + * and a MEON array with the list of active and inactive memory devices:
> + *     Name(MEON, Package() { One, One, ..., Zero, Zero, ... })
> + */
> +DefinitionBlock ("ssdt-mem.aml", "SSDT", 0x02, "BXPC", "CSSDT", 0x1)
> +/*  v------------------ DO NOT EDIT ------------------v */
> +{
> +    Device(MPAA) {
> +        Name(ID, 0xAA)    
> +/*  ^------------------ DO NOT EDIT ------------------^
> + *
> + * The src/acpi.c code requires the above layout so that it can update
> + * MPAA and 0xAA with the appropriate MEMDEVICE id (see
> + * SD_OFFSET_MEMHEX/MEMID1/MEMID2).  Don't change the above without
> + * also updating the C code.
> + */
> +        Name(_HID, EISAID("PNP0C80"))
> +
> +        External(CMST, MethodObj)
> +        External(MPEJ, MethodObj)
> +
> +        Name(_CRS, ResourceTemplate() {
> +            QwordMemory(
> +               ResourceConsumer,
> +               ,
> +               MinFixed, 
> +               MaxFixed, 
> +               Cacheable,
> +               ReadWrite, 
> +               0x0, 
> +               0xDEADBEEF, 
> +               0xE6ADBEEE, 
> +               0x00000000,
> +               0x08000000, 
> +               )
> +        })
> +        Method (_STA, 0) {
> +            Return(CMST(ID))        
> +        }    
> +        Method (_EJ0, 1, NotSerialized) {
> +            MPEJ(ID, Arg0)
> +        }
> +    }
> +}    
> +
> 
> 
> 
> 
> 
>  src/acpi-dsdt.dsl |   55 ++++-
>  src/acpi-dsdt.hex |  701 +++++++++++++++++++++++++++--------------------------
>  src/acpi.c        |  125 ++++++++++
>  src/biosvar.h     |    5 +
>  src/paravirt.c    |   22 ++
>  src/paravirt.h    |    4 +
>  6 files changed, 571 insertions(+), 341 deletions(-)
> 
> diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl
> index 08412e2..e9b250d 100644
> --- a/src/acpi-dsdt.dsl
> +++ b/src/acpi-dsdt.dsl
> @@ -768,6 +768,9 @@ DefinitionBlock (
>          External(NTFY, MethodObj)
>          External(CPON, PkgObj)
>  
> +        External(MTFY, MethodObj)
> +        External(MEON, PkgObj)
> +
>          /* Methods called by run-time generated SSDT Processor objects */
>          Method (CPMA, 1, NotSerialized) {
>              // _MAT method - create an madt apic buffer
> @@ -832,6 +835,56 @@ DefinitionBlock (
>              }
>              Return(One)
>          }
> +
> +        Method (CMST, 1, NotSerialized) {
> +            // _STA method - return ON status of memdevice
> +            // Local0 = MEON flag for this cpu
> +            Store(DerefOf(Index(MEON, Arg0)), Local0)
> +            If (Local0) { Return(0xF) } Else { Return(0x0) }
> +        }
> +
> +        /* Memory hotplug notify method */
> +        OperationRegion(MEST, SystemIO, 0xaf20, 32)
> +        Field (MEST, ByteAcc, NoLock, Preserve)
> +        {
> +            MES, 256
> +        }
> +
> +        Method(MESC, 0) {
> +            // Local5 = active memdevice bitmap
> +            Store (MES, Local5)
> +            // Local2 = last read byte from bitmap
> +            Store (Zero, Local2)
> +            // Local0 = cpuid iterator
> +            Store (Zero, Local0)
> +            While (LLess(Local0, SizeOf(MEON))) {
> +                // Local1 = MEON flag for this cpu
> +                Store(DerefOf(Index(MEON, Local0)), Local1)
> +                If (And(Local0, 0x07)) {
> +                    // Shift down previously read bitmap byte
> +                    ShiftRight(Local2, 1, Local2)
> +                } Else {
> +                    // Read next byte from memdevice 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 MEON with new state
> +                    Store(Local3, Index(MEON, Local0))
> +                    // Do MEM notify
> +                    If (LEqual(Local3, 1)) {
> +                        MTFY(Local0, 1)
> +                    } Else {
> +                        MTFY(Local0, 3)
> +                    }
> +                }
> +                Increment(Local0)
> +            }
> +            Return(One)
> +        }
> +
>      }
>  
>      Scope (\_GPE)
> @@ -891,7 +944,7 @@ DefinitionBlock (
>              Return(\_SB.PRSC())
>          }
>          Method(_L03) {
> -            Return(0x01)
> +            Return(\_SB.MESC())
>          }
>          Method(_L04) {
>              Return(0x01)
> diff --git a/src/acpi-dsdt.hex b/src/acpi-dsdt.hex
> index d0a09f3..d71aca1 100644
> --- a/src/acpi-dsdt.hex
> +++ b/src/acpi-dsdt.hex
> @@ -1,20 +1,20 @@
>  /*
>   * 
>   * Intel ACPI Component Architecture
> - * ASL Optimizing Compiler version 20100528 [Jul  1 2010]
> + * ASL Optimizing Compiler version 20100528 [Jul  2 2010]
>   * Copyright (c) 2000 - 2010 Intel Corporation
>   * Supports ACPI Specification Revision 4.0a
>   * 
> - * Compilation of "out/acpi-dsdt.dsl.i" - Tue May 24 22:35:17 2011
> + * Compilation of "out/acpi-dsdt.dsl.i" - Thu Aug 11 14:20:43 2011
>   * 
>   * C source code output
> - * AML code block contains 0x2589 bytes
> + * AML code block contains 0x2634 bytes
>   *
>   */
>  unsigned char AmlCode[] =
>  {
> -    0x44,0x53,0x44,0x54,0x89,0x25,0x00,0x00,  /* 00000000    "DSDT.%.." */
> -    0x01,0x13,0x42,0x58,0x50,0x43,0x00,0x00,  /* 00000008    "..BXPC.." */
> +    0x44,0x53,0x44,0x54,0x34,0x26,0x00,0x00,  /* 00000000    "DSDT4&.." */
> +    0x01,0x45,0x42,0x58,0x50,0x43,0x00,0x00,  /* 00000008    ".EBXPC.." */
>      0x42,0x58,0x44,0x53,0x44,0x54,0x00,0x00,  /* 00000010    "BXDSDT.." */
>      0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
>      0x28,0x05,0x10,0x20,0x10,0x49,0x04,0x5C,  /* 00000020    "(.. .I.\" */
> @@ -850,7 +850,7 @@ unsigned char AmlCode[] =
>      0x01,0x01,0x00,0x00,0x08,0x5F,0x53,0x34,  /* 00001A10    "....._S4" */
>      0x5F,0x12,0x06,0x04,0x00,0x00,0x00,0x00,  /* 00001A18    "_......." */
>      0x08,0x5F,0x53,0x35,0x5F,0x12,0x06,0x04,  /* 00001A20    "._S5_..." */
> -    0x00,0x00,0x00,0x00,0x10,0x49,0x0E,0x5F,  /* 00001A28    ".....I._" */
> +    0x00,0x00,0x00,0x00,0x10,0x4B,0x18,0x5F,  /* 00001A28    ".....K._" */
>      0x53,0x42,0x5F,0x14,0x35,0x43,0x50,0x4D,  /* 00001A30    "SB_.5CPM" */
>      0x41,0x01,0x70,0x83,0x88,0x43,0x50,0x4F,  /* 00001A38    "A.p..CPO" */
>      0x4E,0x68,0x00,0x60,0x70,0x11,0x0B,0x0A,  /* 00001A40    "Nh.`p..." */
> @@ -879,340 +879,361 @@ unsigned char AmlCode[] =
>      0x43,0x50,0x4F,0x4E,0x60,0x00,0xA0,0x0A,  /* 00001AF8    "CPON`..." */
>      0x93,0x63,0x01,0x4E,0x54,0x46,0x59,0x60,  /* 00001B00    ".c.NTFY`" */
>      0x01,0xA1,0x08,0x4E,0x54,0x46,0x59,0x60,  /* 00001B08    "...NTFY`" */
> -    0x0A,0x03,0x75,0x60,0xA4,0x01,0x10,0x42,  /* 00001B10    "..u`...B" */
> -    0xA7,0x5F,0x47,0x50,0x45,0x08,0x5F,0x48,  /* 00001B18    "._GPE._H" */
> -    0x49,0x44,0x0D,0x41,0x43,0x50,0x49,0x30,  /* 00001B20    "ID.ACPI0" */
> -    0x30,0x30,0x36,0x00,0x14,0x08,0x5F,0x4C,  /* 00001B28    "006..._L" */
> -    0x30,0x30,0x00,0xA4,0x01,0x14,0x4C,0x9C,  /* 00001B30    "00....L." */
> -    0x5F,0x4C,0x30,0x31,0x00,0xA0,0x25,0x7B,  /* 00001B38    "_L01..%{" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001B40    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0A,  /* 00001B48    "CI0PCIU." */
> -    0x02,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001B50    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001B58    "B_PCI0S1" */
> -    0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00001B60    "__..&{\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001B68    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x44,0x0A,0x02,0x00,  /* 00001B70    "0PCID..." */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001B78    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x31,0x5F,0x5F,  /* 00001B80    "PCI0S1__" */
> -    0x0A,0x03,0xA0,0x25,0x7B,0x5C,0x2F,0x03,  /* 00001B88    "...%{\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001B90    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x55,0x0A,0x04,0x00,0x86,  /* 00001B98    "PCIU...." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001BA0    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x32,0x5F,0x5F,0x01,  /* 00001BA8    "CI0S2__." */
> -    0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001BB0    ".&{\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001BB8    "B_PCI0PC" */
> -    0x49,0x44,0x0A,0x04,0x00,0x86,0x5C,0x2F,  /* 00001BC0    "ID....\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001BC8    "._SB_PCI" */
> -    0x30,0x53,0x32,0x5F,0x5F,0x0A,0x03,0xA0,  /* 00001BD0    "0S2__..." */
> -    0x25,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001BD8    "%{\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001BE0    "_PCI0PCI" */
> -    0x55,0x0A,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00001BE8    "U....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001BF0    "_SB_PCI0" */
> -    0x53,0x33,0x5F,0x5F,0x01,0xA0,0x26,0x7B,  /* 00001BF8    "S3__..&{" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C00    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0A,  /* 00001C08    "CI0PCID." */
> -    0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001C10    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x33,  /* 00001C18    "B_PCI0S3" */
> -    0x5F,0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,  /* 00001C20    "__...%{\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C28    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x55,0x0A,0x10,  /* 00001C30    "I0PCIU.." */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001C38    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x34,0x5F,  /* 00001C40    "_PCI0S4_" */
> -    0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001C48    "_..&{\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001C50    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x44,0x0A,0x10,0x00,0x86,  /* 00001C58    "PCID...." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C60    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x34,0x5F,0x5F,0x0A,  /* 00001C68    "CI0S4__." */
> -    0x03,0xA0,0x25,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001C70    "..%{\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001C78    "SB_PCI0P" */
> -    0x43,0x49,0x55,0x0A,0x20,0x00,0x86,0x5C,  /* 00001C80    "CIU. ..\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C88    "/._SB_PC" */
> -    0x49,0x30,0x53,0x35,0x5F,0x5F,0x01,0xA0,  /* 00001C90    "I0S5__.." */
> -    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001C98    "&{\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001CA0    "_PCI0PCI" */
> -    0x44,0x0A,0x20,0x00,0x86,0x5C,0x2F,0x03,  /* 00001CA8    "D. ..\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001CB0    "_SB_PCI0" */
> -    0x53,0x35,0x5F,0x5F,0x0A,0x03,0xA0,0x25,  /* 00001CB8    "S5__...%" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001CC0    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001CC8    "PCI0PCIU" */
> -    0x0A,0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001CD0    ".@..\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001CD8    "SB_PCI0S" */
> -    0x36,0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,  /* 00001CE0    "6__..&{\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001CE8    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x44,0x0A,0x40,  /* 00001CF0    "I0PCID.@" */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001CF8    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x36,0x5F,  /* 00001D00    "_PCI0S6_" */
> -    0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,0x2F,  /* 00001D08    "_...%{\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D10    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x55,0x0A,0x80,0x00,  /* 00001D18    "0PCIU..." */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001D20    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x37,0x5F,0x5F,  /* 00001D28    "PCI0S7__" */
> -    0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001D30    "..&{\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001D38    "SB_PCI0P" */
> -    0x43,0x49,0x44,0x0A,0x80,0x00,0x86,0x5C,  /* 00001D40    "CID....\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001D48    "/._SB_PC" */
> -    0x49,0x30,0x53,0x37,0x5F,0x5F,0x0A,0x03,  /* 00001D50    "I0S7__.." */
> -    0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001D58    ".&{\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001D60    "B_PCI0PC" */
> -    0x49,0x55,0x0B,0x00,0x01,0x00,0x86,0x5C,  /* 00001D68    "IU.....\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001D70    "/._SB_PC" */
> -    0x49,0x30,0x53,0x38,0x5F,0x5F,0x01,0xA0,  /* 00001D78    "I0S8__.." */
> -    0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001D80    "'{\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001D88    "_PCI0PCI" */
> -    0x44,0x0B,0x00,0x01,0x00,0x86,0x5C,0x2F,  /* 00001D90    "D.....\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D98    "._SB_PCI" */
> -    0x30,0x53,0x38,0x5F,0x5F,0x0A,0x03,0xA0,  /* 00001DA0    "0S8__..." */
> -    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001DA8    "&{\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001DB0    "_PCI0PCI" */
> -    0x55,0x0B,0x00,0x02,0x00,0x86,0x5C,0x2F,  /* 00001DB8    "U.....\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001DC0    "._SB_PCI" */
> -    0x30,0x53,0x39,0x5F,0x5F,0x01,0xA0,0x27,  /* 00001DC8    "0S9__..'" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001DD0    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00001DD8    "PCI0PCID" */
> -    0x0B,0x00,0x02,0x00,0x86,0x5C,0x2F,0x03,  /* 00001DE0    ".....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001DE8    "_SB_PCI0" */
> -    0x53,0x39,0x5F,0x5F,0x0A,0x03,0xA0,0x26,  /* 00001DF0    "S9__...&" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001DF8    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001E00    "PCI0PCIU" */
> -    0x0B,0x00,0x04,0x00,0x86,0x5C,0x2F,0x03,  /* 00001E08    ".....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001E10    "_SB_PCI0" */
> -    0x53,0x31,0x30,0x5F,0x01,0xA0,0x27,0x7B,  /* 00001E18    "S10_..'{" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E20    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0B,  /* 00001E28    "CI0PCID." */
> -    0x00,0x04,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001E30    "....\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001E38    "SB_PCI0S" */
> -    0x31,0x30,0x5F,0x0A,0x03,0xA0,0x26,0x7B,  /* 00001E40    "10_...&{" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E48    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0B,  /* 00001E50    "CI0PCIU." */
> -    0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001E58    "....\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001E60    "SB_PCI0S" */
> -    0x31,0x31,0x5F,0x01,0xA0,0x27,0x7B,0x5C,  /* 00001E68    "11_..'{\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001E70    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x44,0x0B,0x00,  /* 00001E78    "I0PCID.." */
> -    0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001E80    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001E88    "B_PCI0S1" */
> -    0x31,0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,  /* 00001E90    "1_...&{\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001E98    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x55,0x0B,0x00,  /* 00001EA0    "I0PCIU.." */
> -    0x10,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001EA8    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001EB0    "B_PCI0S1" */
> -    0x32,0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,  /* 00001EB8    "2_..'{\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001EC0    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x44,0x0B,0x00,0x10,  /* 00001EC8    "0PCID..." */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001ED0    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x32,  /* 00001ED8    "_PCI0S12" */
> -    0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00001EE0    "_...&{\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001EE8    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x55,0x0B,0x00,0x20,  /* 00001EF0    "0PCIU.. " */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001EF8    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x33,  /* 00001F00    "_PCI0S13" */
> -    0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,  /* 00001F08    "_..'{\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F10    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x44,0x0B,0x00,0x20,0x00,  /* 00001F18    "PCID.. ." */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F20    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x31,0x33,0x5F,  /* 00001F28    "PCI0S13_" */
> -    0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001F30    "...&{\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F38    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x55,0x0B,0x00,0x40,0x00,  /* 00001F40    "PCIU..@." */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F48    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x31,0x34,0x5F,  /* 00001F50    "PCI0S14_" */
> -    0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001F58    "..'{\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001F60    "SB_PCI0P" */
> -    0x43,0x49,0x44,0x0B,0x00,0x40,0x00,0x86,  /* 00001F68    "CID..@.." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F70    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x31,0x34,0x5F,0x0A,  /* 00001F78    "CI0S14_." */
> -    0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001F80    "..&{\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001F88    "SB_PCI0P" */
> -    0x43,0x49,0x55,0x0B,0x00,0x80,0x00,0x86,  /* 00001F90    "CIU....." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F98    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x31,0x35,0x5F,0x01,  /* 00001FA0    "CI0S15_." */
> -    0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FA8    ".'{\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001FB0    "B_PCI0PC" */
> -    0x49,0x44,0x0B,0x00,0x80,0x00,0x86,0x5C,  /* 00001FB8    "ID.....\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001FC0    "/._SB_PC" */
> -    0x49,0x30,0x53,0x31,0x35,0x5F,0x0A,0x03,  /* 00001FC8    "I0S15_.." */
> -    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FD0    ".({\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001FD8    "B_PCI0PC" */
> -    0x49,0x55,0x0C,0x00,0x00,0x01,0x00,0x00,  /* 00001FE0    "IU......" */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001FE8    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x31,0x36,0x5F,  /* 00001FF0    "PCI0S16_" */
> -    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001FF8    "..){\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002000    "SB_PCI0P" */
> -    0x43,0x49,0x44,0x0C,0x00,0x00,0x01,0x00,  /* 00002008    "CID....." */
> +    0x0A,0x03,0x75,0x60,0xA4,0x01,0x14,0x1A,  /* 00001B10    "..u`...." */
> +    0x43,0x4D,0x53,0x54,0x01,0x70,0x83,0x88,  /* 00001B18    "CMST.p.." */
> +    0x4D,0x45,0x4F,0x4E,0x68,0x00,0x60,0xA0,  /* 00001B20    "MEONh.`." */
> +    0x05,0x60,0xA4,0x0A,0x0F,0xA1,0x03,0xA4,  /* 00001B28    ".`......" */
> +    0x00,0x5B,0x80,0x4D,0x45,0x53,0x54,0x01,  /* 00001B30    ".[.MEST." */
> +    0x0B,0x20,0xAF,0x0A,0x20,0x5B,0x81,0x0C,  /* 00001B38    ". .. [.." */
> +    0x4D,0x45,0x53,0x54,0x01,0x4D,0x45,0x53,  /* 00001B40    "MEST.MES" */
> +    0x5F,0x40,0x10,0x14,0x4C,0x06,0x4D,0x45,  /* 00001B48    "_@..L.ME" */
> +    0x53,0x43,0x00,0x70,0x4D,0x45,0x53,0x5F,  /* 00001B50    "SC.pMES_" */
> +    0x65,0x70,0x00,0x62,0x70,0x00,0x60,0xA2,  /* 00001B58    "ep.bp.`." */
> +    0x46,0x05,0x95,0x60,0x87,0x4D,0x45,0x4F,  /* 00001B60    "F..`.MEO" */
> +    0x4E,0x70,0x83,0x88,0x4D,0x45,0x4F,0x4E,  /* 00001B68    "Np..MEON" */
> +    0x60,0x00,0x61,0xA0,0x0A,0x7B,0x60,0x0A,  /* 00001B70    "`.a..{`." */
> +    0x07,0x00,0x7A,0x62,0x01,0x62,0xA1,0x0C,  /* 00001B78    "..zb.b.." */
> +    0x70,0x83,0x88,0x65,0x7A,0x60,0x0A,0x03,  /* 00001B80    "p..ez`.." */
> +    0x00,0x00,0x62,0x70,0x7B,0x62,0x01,0x00,  /* 00001B88    "..bp{b.." */
> +    0x63,0xA0,0x22,0x92,0x93,0x61,0x63,0x70,  /* 00001B90    "c."..acp" */
> +    0x63,0x88,0x4D,0x45,0x4F,0x4E,0x60,0x00,  /* 00001B98    "c.MEON`." */
> +    0xA0,0x0A,0x93,0x63,0x01,0x4D,0x54,0x46,  /* 00001BA0    "...c.MTF" */
> +    0x59,0x60,0x01,0xA1,0x08,0x4D,0x54,0x46,  /* 00001BA8    "Y`...MTF" */
> +    0x59,0x60,0x0A,0x03,0x75,0x60,0xA4,0x01,  /* 00001BB0    "Y`..u`.." */
> +    0x10,0x4B,0xA7,0x5F,0x47,0x50,0x45,0x08,  /* 00001BB8    ".K._GPE." */
> +    0x5F,0x48,0x49,0x44,0x0D,0x41,0x43,0x50,  /* 00001BC0    "_HID.ACP" */
> +    0x49,0x30,0x30,0x30,0x36,0x00,0x14,0x08,  /* 00001BC8    "I0006..." */
> +    0x5F,0x4C,0x30,0x30,0x00,0xA4,0x01,0x14,  /* 00001BD0    "_L00...." */
> +    0x4C,0x9C,0x5F,0x4C,0x30,0x31,0x00,0xA0,  /* 00001BD8    "L._L01.." */
> +    0x25,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001BE0    "%{\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001BE8    "_PCI0PCI" */
> +    0x55,0x0A,0x02,0x00,0x86,0x5C,0x2F,0x03,  /* 00001BF0    "U....\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001BF8    "_SB_PCI0" */
> +    0x53,0x31,0x5F,0x5F,0x01,0xA0,0x26,0x7B,  /* 00001C00    "S1__..&{" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C08    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0A,  /* 00001C10    "CI0PCID." */
> +    0x02,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001C18    "...\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001C20    "B_PCI0S1" */
> +    0x5F,0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,  /* 00001C28    "__...%{\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C30    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x55,0x0A,0x04,  /* 00001C38    "I0PCIU.." */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001C40    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x5F,  /* 00001C48    "_PCI0S2_" */
> +    0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001C50    "_..&{\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001C58    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x44,0x0A,0x04,0x00,0x86,  /* 00001C60    "PCID...." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001C68    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x32,0x5F,0x5F,0x0A,  /* 00001C70    "CI0S2__." */
> +    0x03,0xA0,0x25,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001C78    "..%{\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001C80    "SB_PCI0P" */
> +    0x43,0x49,0x55,0x0A,0x08,0x00,0x86,0x5C,  /* 00001C88    "CIU....\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001C90    "/._SB_PC" */
> +    0x49,0x30,0x53,0x33,0x5F,0x5F,0x01,0xA0,  /* 00001C98    "I0S3__.." */
> +    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001CA0    "&{\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001CA8    "_PCI0PCI" */
> +    0x44,0x0A,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00001CB0    "D....\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001CB8    "_SB_PCI0" */
> +    0x53,0x33,0x5F,0x5F,0x0A,0x03,0xA0,0x25,  /* 00001CC0    "S3__...%" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001CC8    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001CD0    "PCI0PCIU" */
> +    0x0A,0x10,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001CD8    "....\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001CE0    "SB_PCI0S" */
> +    0x34,0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,  /* 00001CE8    "4__..&{\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001CF0    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x44,0x0A,0x10,  /* 00001CF8    "I0PCID.." */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001D00    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x34,0x5F,  /* 00001D08    "_PCI0S4_" */
> +    0x5F,0x0A,0x03,0xA0,0x25,0x7B,0x5C,0x2F,  /* 00001D10    "_...%{\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D18    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x55,0x0A,0x20,0x00,  /* 00001D20    "0PCIU. ." */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001D28    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x35,0x5F,0x5F,  /* 00001D30    "PCI0S5__" */
> +    0x01,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001D38    "..&{\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001D40    "SB_PCI0P" */
> +    0x43,0x49,0x44,0x0A,0x20,0x00,0x86,0x5C,  /* 00001D48    "CID. ..\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001D50    "/._SB_PC" */
> +    0x49,0x30,0x53,0x35,0x5F,0x5F,0x0A,0x03,  /* 00001D58    "I0S5__.." */
> +    0xA0,0x25,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001D60    ".%{\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001D68    "B_PCI0PC" */
> +    0x49,0x55,0x0A,0x40,0x00,0x86,0x5C,0x2F,  /* 00001D70    "IU.@..\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001D78    "._SB_PCI" */
> +    0x30,0x53,0x36,0x5F,0x5F,0x01,0xA0,0x26,  /* 00001D80    "0S6__..&" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001D88    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00001D90    "PCI0PCID" */
> +    0x0A,0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001D98    ".@..\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001DA0    "SB_PCI0S" */
> +    0x36,0x5F,0x5F,0x0A,0x03,0xA0,0x25,0x7B,  /* 00001DA8    "6__...%{" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001DB0    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0A,  /* 00001DB8    "CI0PCIU." */
> +    0x80,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001DC0    "...\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x37,  /* 00001DC8    "B_PCI0S7" */
> +    0x5F,0x5F,0x01,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00001DD0    "__..&{\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001DD8    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x44,0x0A,0x80,0x00,  /* 00001DE0    "0PCID..." */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001DE8    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x37,0x5F,0x5F,  /* 00001DF0    "PCI0S7__" */
> +    0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,  /* 00001DF8    "...&{\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001E00    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x55,0x0B,0x00,0x01,0x00,  /* 00001E08    "PCIU...." */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001E10    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x38,0x5F,0x5F,  /* 00001E18    "PCI0S8__" */
> +    0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001E20    "..'{\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001E28    "SB_PCI0P" */
> +    0x43,0x49,0x44,0x0B,0x00,0x01,0x00,0x86,  /* 00001E30    "CID....." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E38    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x38,0x5F,0x5F,0x0A,  /* 00001E40    "CI0S8__." */
> +    0x03,0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00001E48    "..&{\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00001E50    "SB_PCI0P" */
> +    0x43,0x49,0x55,0x0B,0x00,0x02,0x00,0x86,  /* 00001E58    "CIU....." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001E60    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x39,0x5F,0x5F,0x01,  /* 00001E68    "CI0S9__." */
> +    0xA0,0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001E70    ".'{\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001E78    "B_PCI0PC" */
> +    0x49,0x44,0x0B,0x00,0x02,0x00,0x86,0x5C,  /* 00001E80    "ID.....\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001E88    "/._SB_PC" */
> +    0x49,0x30,0x53,0x39,0x5F,0x5F,0x0A,0x03,  /* 00001E90    "I0S9__.." */
> +    0xA0,0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001E98    ".&{\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00001EA0    "B_PCI0PC" */
> +    0x49,0x55,0x0B,0x00,0x04,0x00,0x86,0x5C,  /* 00001EA8    "IU.....\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001EB0    "/._SB_PC" */
> +    0x49,0x30,0x53,0x31,0x30,0x5F,0x01,0xA0,  /* 00001EB8    "I0S10_.." */
> +    0x27,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001EC0    "'{\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001EC8    "_PCI0PCI" */
> +    0x44,0x0B,0x00,0x04,0x00,0x86,0x5C,0x2F,  /* 00001ED0    "D.....\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001ED8    "._SB_PCI" */
> +    0x30,0x53,0x31,0x30,0x5F,0x0A,0x03,0xA0,  /* 00001EE0    "0S10_..." */
> +    0x26,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00001EE8    "&{\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00001EF0    "_PCI0PCI" */
> +    0x55,0x0B,0x00,0x08,0x00,0x86,0x5C,0x2F,  /* 00001EF8    "U.....\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00001F00    "._SB_PCI" */
> +    0x30,0x53,0x31,0x31,0x5F,0x01,0xA0,0x27,  /* 00001F08    "0S11_..'" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F10    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00001F18    "PCI0PCID" */
> +    0x0B,0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00001F20    ".....\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F28    "_SB_PCI0" */
> +    0x53,0x31,0x31,0x5F,0x0A,0x03,0xA0,0x26,  /* 00001F30    "S11_...&" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00001F38    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00001F40    "PCI0PCIU" */
> +    0x0B,0x00,0x10,0x00,0x86,0x5C,0x2F,0x03,  /* 00001F48    ".....\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00001F50    "_SB_PCI0" */
> +    0x53,0x31,0x32,0x5F,0x01,0xA0,0x27,0x7B,  /* 00001F58    "S12_..'{" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F60    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0B,  /* 00001F68    "CI0PCID." */
> +    0x00,0x10,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001F70    "....\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001F78    "SB_PCI0S" */
> +    0x31,0x32,0x5F,0x0A,0x03,0xA0,0x26,0x7B,  /* 00001F80    "12_...&{" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00001F88    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0B,  /* 00001F90    "CI0PCIU." */
> +    0x00,0x20,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00001F98    ". ..\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00001FA0    "SB_PCI0S" */
> +    0x31,0x33,0x5F,0x01,0xA0,0x27,0x7B,0x5C,  /* 00001FA8    "13_..'{\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001FB0    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x44,0x0B,0x00,  /* 00001FB8    "I0PCID.." */
> +    0x20,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FC0    " ..\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001FC8    "B_PCI0S1" */
> +    0x33,0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,  /* 00001FD0    "3_...&{\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00001FD8    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x55,0x0B,0x00,  /* 00001FE0    "I0PCIU.." */
> +    0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00001FE8    "@..\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00001FF0    "B_PCI0S1" */
> +    0x34,0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,  /* 00001FF8    "4_..'{\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002000    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x44,0x0B,0x00,0x40,  /* 00002008    "0PCID..@" */
>      0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002010    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x36,  /* 00002018    "_PCI0S16" */
> -    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 00002020    "_...({\/" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x34,  /* 00002018    "_PCI0S14" */
> +    0x5F,0x0A,0x03,0xA0,0x26,0x7B,0x5C,0x2F,  /* 00002020    "_...&{\/" */
>      0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002028    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 00002030    "0PCIU..." */
> -    0x02,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002038    "....\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002040    "SB_PCI0S" */
> -    0x31,0x37,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 00002048    "17_..){\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002050    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 00002058    "I0PCID.." */
> -    0x00,0x02,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 00002060    ".....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002068    "_SB_PCI0" */
> -    0x53,0x31,0x37,0x5F,0x0A,0x03,0xA0,0x28,  /* 00002070    "S17_...(" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002078    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00002080    "PCI0PCIU" */
> -    0x0C,0x00,0x00,0x04,0x00,0x00,0x86,0x5C,  /* 00002088    ".......\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002090    "/._SB_PC" */
> -    0x49,0x30,0x53,0x31,0x38,0x5F,0x01,0xA0,  /* 00002098    "I0S18_.." */
> -    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000020A0    "){\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 000020A8    "_PCI0PCI" */
> -    0x44,0x0C,0x00,0x00,0x04,0x00,0x00,0x86,  /* 000020B0    "D......." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000020B8    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x31,0x38,0x5F,0x0A,  /* 000020C0    "CI0S18_." */
> -    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 000020C8    "..({\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 000020D0    "SB_PCI0P" */
> -    0x43,0x49,0x55,0x0C,0x00,0x00,0x08,0x00,  /* 000020D8    "CIU....." */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000020E0    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x39,  /* 000020E8    "_PCI0S19" */
> -    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 000020F0    "_..){\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000020F8    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x08,  /* 00002100    "PCID...." */
> -    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002108    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00002110    "B_PCI0S1" */
> -    0x39,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 00002118    "9_...({\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002120    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 00002128    "I0PCIU.." */
> -    0x00,0x10,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 00002130    ".....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002138    "_SB_PCI0" */
> -    0x53,0x32,0x30,0x5F,0x01,0xA0,0x29,0x7B,  /* 00002140    "S20_..){" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002148    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 00002150    "CI0PCID." */
> -    0x00,0x00,0x10,0x00,0x00,0x86,0x5C,0x2F,  /* 00002158    "......\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002160    "._SB_PCI" */
> -    0x30,0x53,0x32,0x30,0x5F,0x0A,0x03,0xA0,  /* 00002168    "0S20_..." */
> -    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002170    "({\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002178    "_PCI0PCI" */
> -    0x55,0x0C,0x00,0x00,0x20,0x00,0x00,0x86,  /* 00002180    "U... ..." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002188    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x32,0x31,0x5F,0x01,  /* 00002190    "CI0S21_." */
> -    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002198    ".){\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 000021A0    "B_PCI0PC" */
> -    0x49,0x44,0x0C,0x00,0x00,0x20,0x00,0x00,  /* 000021A8    "ID... .." */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000021B0    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x32,0x31,0x5F,  /* 000021B8    "PCI0S21_" */
> -    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 000021C0    "...({\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000021C8    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x40,  /* 000021D0    "PCIU...@" */
> -    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000021D8    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 000021E0    "B_PCI0S2" */
> -    0x32,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 000021E8    "2_..){\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000021F0    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 000021F8    "0PCID..." */
> -    0x40,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002200    "@...\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002208    "SB_PCI0S" */
> -    0x32,0x32,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 00002210    "22_...({" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002218    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 00002220    "CI0PCIU." */
> -    0x00,0x00,0x80,0x00,0x00,0x86,0x5C,0x2F,  /* 00002228    "......\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002230    "._SB_PCI" */
> -    0x30,0x53,0x32,0x33,0x5F,0x01,0xA0,0x29,  /* 00002238    "0S23_..)" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002240    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00002248    "PCI0PCID" */
> -    0x0C,0x00,0x00,0x80,0x00,0x00,0x86,0x5C,  /* 00002250    ".......\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002258    "/._SB_PC" */
> -    0x49,0x30,0x53,0x32,0x33,0x5F,0x0A,0x03,  /* 00002260    "I0S23_.." */
> -    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002268    ".({\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002270    "B_PCI0PC" */
> -    0x49,0x55,0x0C,0x00,0x00,0x00,0x01,0x00,  /* 00002278    "IU......" */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002280    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x32,0x34,0x5F,  /* 00002288    "PCI0S24_" */
> -    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002290    "..){\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002298    "SB_PCI0P" */
> -    0x43,0x49,0x44,0x0C,0x00,0x00,0x00,0x01,  /* 000022A0    "CID....." */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000022A8    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x34,  /* 000022B0    "_PCI0S24" */
> -    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 000022B8    "_...({\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000022C0    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 000022C8    "0PCIU..." */
> -    0x00,0x02,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 000022D0    "....\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 000022D8    "SB_PCI0S" */
> -    0x32,0x35,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 000022E0    "25_..){\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000022E8    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 000022F0    "I0PCID.." */
> -    0x00,0x00,0x02,0x00,0x86,0x5C,0x2F,0x03,  /* 000022F8    ".....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002300    "_SB_PCI0" */
> -    0x53,0x32,0x35,0x5F,0x0A,0x03,0xA0,0x28,  /* 00002308    "S25_...(" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002310    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00002318    "PCI0PCIU" */
> -    0x0C,0x00,0x00,0x00,0x04,0x00,0x86,0x5C,  /* 00002320    ".......\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002328    "/._SB_PC" */
> -    0x49,0x30,0x53,0x32,0x36,0x5F,0x01,0xA0,  /* 00002330    "I0S26_.." */
> -    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002338    "){\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002340    "_PCI0PCI" */
> -    0x44,0x0C,0x00,0x00,0x00,0x04,0x00,0x86,  /* 00002348    "D......." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002350    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x32,0x36,0x5F,0x0A,  /* 00002358    "CI0S26_." */
> -    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002360    "..({\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002368    "SB_PCI0P" */
> -    0x43,0x49,0x55,0x0C,0x00,0x00,0x00,0x08,  /* 00002370    "CIU....." */
> -    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002378    "..\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x37,  /* 00002380    "_PCI0S27" */
> -    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 00002388    "_..){\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002390    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x00,  /* 00002398    "PCID...." */
> -    0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000023A0    "...\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 000023A8    "B_PCI0S2" */
> -    0x37,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 000023B0    "7_...({\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000023B8    "/._SB_PC" */
> -    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 000023C0    "I0PCIU.." */
> -    0x00,0x00,0x10,0x00,0x86,0x5C,0x2F,0x03,  /* 000023C8    ".....\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000023D0    "_SB_PCI0" */
> -    0x53,0x32,0x38,0x5F,0x01,0xA0,0x29,0x7B,  /* 000023D8    "S28_..){" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000023E0    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 000023E8    "CI0PCID." */
> -    0x00,0x00,0x00,0x10,0x00,0x86,0x5C,0x2F,  /* 000023F0    "......\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000023F8    "._SB_PCI" */
> -    0x30,0x53,0x32,0x38,0x5F,0x0A,0x03,0xA0,  /* 00002400    "0S28_..." */
> -    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002408    "({\/._SB" */
> -    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002410    "_PCI0PCI" */
> -    0x55,0x0C,0x00,0x00,0x00,0x20,0x00,0x86,  /* 00002418    "U.... .." */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002420    "\/._SB_P" */
> -    0x43,0x49,0x30,0x53,0x32,0x39,0x5F,0x01,  /* 00002428    "CI0S29_." */
> -    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002430    ".){\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002438    "B_PCI0PC" */
> -    0x49,0x44,0x0C,0x00,0x00,0x00,0x20,0x00,  /* 00002440    "ID.... ." */
> -    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002448    ".\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x53,0x32,0x39,0x5F,  /* 00002450    "PCI0S29_" */
> -    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 00002458    "...({\/." */
> -    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002460    "_SB_PCI0" */
> -    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x00,  /* 00002468    "PCIU...." */
> -    0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002470    "@..\/._S" */
> -    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x33,  /* 00002478    "B_PCI0S3" */
> -    0x30,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 00002480    "0_..){\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002488    "._SB_PCI" */
> -    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 00002490    "0PCID..." */
> -    0x00,0x40,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002498    ".@..\/._" */
> -    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 000024A0    "SB_PCI0S" */
> -    0x33,0x30,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 000024A8    "30_...({" */
> -    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000024B0    "\/._SB_P" */
> -    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 000024B8    "CI0PCIU." */
> -    0x00,0x00,0x00,0x80,0x00,0x86,0x5C,0x2F,  /* 000024C0    "......\/" */
> -    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000024C8    "._SB_PCI" */
> -    0x30,0x53,0x33,0x31,0x5F,0x01,0xA0,0x29,  /* 000024D0    "0S31_..)" */
> -    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000024D8    "{\/._SB_" */
> -    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 000024E0    "PCI0PCID" */
> -    0x0C,0x00,0x00,0x00,0x80,0x00,0x86,0x5C,  /* 000024E8    ".......\" */
> -    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000024F0    "/._SB_PC" */
> -    0x49,0x30,0x53,0x33,0x31,0x5F,0x0A,0x03,  /* 000024F8    "I0S31_.." */
> -    0xA4,0x01,0x14,0x11,0x5F,0x4C,0x30,0x32,  /* 00002500    "...._L02" */
> -    0x00,0xA4,0x5C,0x2E,0x5F,0x53,0x42,0x5F,  /* 00002508    "..\._SB_" */
> -    0x50,0x52,0x53,0x43,0x14,0x08,0x5F,0x4C,  /* 00002510    "PRSC.._L" */
> -    0x30,0x33,0x00,0xA4,0x01,0x14,0x08,0x5F,  /* 00002518    "03....._" */
> -    0x4C,0x30,0x34,0x00,0xA4,0x01,0x14,0x08,  /* 00002520    "L04....." */
> -    0x5F,0x4C,0x30,0x35,0x00,0xA4,0x01,0x14,  /* 00002528    "_L05...." */
> -    0x08,0x5F,0x4C,0x30,0x36,0x00,0xA4,0x01,  /* 00002530    "._L06..." */
> -    0x14,0x08,0x5F,0x4C,0x30,0x37,0x00,0xA4,  /* 00002538    ".._L07.." */
> -    0x01,0x14,0x08,0x5F,0x4C,0x30,0x38,0x00,  /* 00002540    "..._L08." */
> -    0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,0x39,  /* 00002548    "...._L09" */
> -    0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,  /* 00002550    "....._L0" */
> -    0x41,0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,  /* 00002558    "A....._L" */
> -    0x30,0x42,0x00,0xA4,0x01,0x14,0x08,0x5F,  /* 00002560    "0B....._" */
> -    0x4C,0x30,0x43,0x00,0xA4,0x01,0x14,0x08,  /* 00002568    "L0C....." */
> -    0x5F,0x4C,0x30,0x44,0x00,0xA4,0x01,0x14,  /* 00002570    "_L0D...." */
> -    0x08,0x5F,0x4C,0x30,0x45,0x00,0xA4,0x01,  /* 00002578    "._L0E..." */
> -    0x14,0x08,0x5F,0x4C,0x30,0x46,0x00,0xA4,  /* 00002580    ".._L0F.." */
> -    0x01                                      /* 00002588    "."        */
> +    0x30,0x50,0x43,0x49,0x55,0x0B,0x00,0x80,  /* 00002030    "0PCIU..." */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002038    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x35,  /* 00002040    "_PCI0S15" */
> +    0x5F,0x01,0xA0,0x27,0x7B,0x5C,0x2F,0x03,  /* 00002048    "_..'{\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002050    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x44,0x0B,0x00,0x80,0x00,  /* 00002058    "PCID...." */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002060    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x31,0x35,0x5F,  /* 00002068    "PCI0S15_" */
> +    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 00002070    "...({\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002078    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x01,  /* 00002080    "PCIU...." */
> +    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002088    "...\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x31,  /* 00002090    "B_PCI0S1" */
> +    0x36,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 00002098    "6_..){\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000020A0    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 000020A8    "0PCID..." */
> +    0x01,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 000020B0    "....\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 000020B8    "SB_PCI0S" */
> +    0x31,0x36,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 000020C0    "16_...({" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000020C8    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 000020D0    "CI0PCIU." */
> +    0x00,0x00,0x02,0x00,0x00,0x86,0x5C,0x2F,  /* 000020D8    "......\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000020E0    "._SB_PCI" */
> +    0x30,0x53,0x31,0x37,0x5F,0x01,0xA0,0x29,  /* 000020E8    "0S17_..)" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000020F0    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 000020F8    "PCI0PCID" */
> +    0x0C,0x00,0x00,0x02,0x00,0x00,0x86,0x5C,  /* 00002100    ".......\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002108    "/._SB_PC" */
> +    0x49,0x30,0x53,0x31,0x37,0x5F,0x0A,0x03,  /* 00002110    "I0S17_.." */
> +    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002118    ".({\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002120    "B_PCI0PC" */
> +    0x49,0x55,0x0C,0x00,0x00,0x04,0x00,0x00,  /* 00002128    "IU......" */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002130    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x31,0x38,0x5F,  /* 00002138    "PCI0S18_" */
> +    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002140    "..){\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002148    "SB_PCI0P" */
> +    0x43,0x49,0x44,0x0C,0x00,0x00,0x04,0x00,  /* 00002150    "CID....." */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002158    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x31,0x38,  /* 00002160    "_PCI0S18" */
> +    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 00002168    "_...({\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002170    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 00002178    "0PCIU..." */
> +    0x08,0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002180    "....\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002188    "SB_PCI0S" */
> +    0x31,0x39,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 00002190    "19_..){\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002198    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 000021A0    "I0PCID.." */
> +    0x00,0x08,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 000021A8    ".....\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000021B0    "_SB_PCI0" */
> +    0x53,0x31,0x39,0x5F,0x0A,0x03,0xA0,0x28,  /* 000021B8    "S19_...(" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000021C0    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 000021C8    "PCI0PCIU" */
> +    0x0C,0x00,0x00,0x10,0x00,0x00,0x86,0x5C,  /* 000021D0    ".......\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000021D8    "/._SB_PC" */
> +    0x49,0x30,0x53,0x32,0x30,0x5F,0x01,0xA0,  /* 000021E0    "I0S20_.." */
> +    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000021E8    "){\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 000021F0    "_PCI0PCI" */
> +    0x44,0x0C,0x00,0x00,0x10,0x00,0x00,0x86,  /* 000021F8    "D......." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002200    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x32,0x30,0x5F,0x0A,  /* 00002208    "CI0S20_." */
> +    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 00002210    "..({\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 00002218    "SB_PCI0P" */
> +    0x43,0x49,0x55,0x0C,0x00,0x00,0x20,0x00,  /* 00002220    "CIU... ." */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002228    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x31,  /* 00002230    "_PCI0S21" */
> +    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 00002238    "_..){\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002240    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x20,  /* 00002248    "PCID... " */
> +    0x00,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002250    "...\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 00002258    "B_PCI0S2" */
> +    0x31,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 00002260    "1_...({\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002268    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 00002270    "I0PCIU.." */
> +    0x00,0x40,0x00,0x00,0x86,0x5C,0x2F,0x03,  /* 00002278    ".@...\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002280    "_SB_PCI0" */
> +    0x53,0x32,0x32,0x5F,0x01,0xA0,0x29,0x7B,  /* 00002288    "S22_..){" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002290    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 00002298    "CI0PCID." */
> +    0x00,0x00,0x40,0x00,0x00,0x86,0x5C,0x2F,  /* 000022A0    "..@...\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 000022A8    "._SB_PCI" */
> +    0x30,0x53,0x32,0x32,0x5F,0x0A,0x03,0xA0,  /* 000022B0    "0S22_..." */
> +    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000022B8    "({\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 000022C0    "_PCI0PCI" */
> +    0x55,0x0C,0x00,0x00,0x80,0x00,0x00,0x86,  /* 000022C8    "U......." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 000022D0    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x32,0x33,0x5F,0x01,  /* 000022D8    "CI0S23_." */
> +    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 000022E0    ".){\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 000022E8    "B_PCI0PC" */
> +    0x49,0x44,0x0C,0x00,0x00,0x80,0x00,0x00,  /* 000022F0    "ID......" */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000022F8    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x32,0x33,0x5F,  /* 00002300    "PCI0S23_" */
> +    0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,  /* 00002308    "...({\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002310    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x55,0x0C,0x00,0x00,0x00,  /* 00002318    "PCIU...." */
> +    0x01,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002320    "...\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 00002328    "B_PCI0S2" */
> +    0x34,0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,  /* 00002330    "4_..){\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002338    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x44,0x0C,0x00,0x00,  /* 00002340    "0PCID..." */
> +    0x00,0x01,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002348    "....\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002350    "SB_PCI0S" */
> +    0x32,0x34,0x5F,0x0A,0x03,0xA0,0x28,0x7B,  /* 00002358    "24_...({" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002360    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x55,0x0C,  /* 00002368    "CI0PCIU." */
> +    0x00,0x00,0x00,0x02,0x00,0x86,0x5C,0x2F,  /* 00002370    "......\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002378    "._SB_PCI" */
> +    0x30,0x53,0x32,0x35,0x5F,0x01,0xA0,0x29,  /* 00002380    "0S25_..)" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002388    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x44,  /* 00002390    "PCI0PCID" */
> +    0x0C,0x00,0x00,0x00,0x02,0x00,0x86,0x5C,  /* 00002398    ".......\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 000023A0    "/._SB_PC" */
> +    0x49,0x30,0x53,0x32,0x35,0x5F,0x0A,0x03,  /* 000023A8    "I0S25_.." */
> +    0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 000023B0    ".({\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 000023B8    "B_PCI0PC" */
> +    0x49,0x55,0x0C,0x00,0x00,0x00,0x04,0x00,  /* 000023C0    "IU......" */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 000023C8    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x32,0x36,0x5F,  /* 000023D0    "PCI0S26_" */
> +    0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,  /* 000023D8    "..){\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 000023E0    "SB_PCI0P" */
> +    0x43,0x49,0x44,0x0C,0x00,0x00,0x00,0x04,  /* 000023E8    "CID....." */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000023F0    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x36,  /* 000023F8    "_PCI0S26" */
> +    0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,0x2F,  /* 00002400    "_...({\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002408    "._SB_PCI" */
> +    0x30,0x50,0x43,0x49,0x55,0x0C,0x00,0x00,  /* 00002410    "0PCIU..." */
> +    0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,0x5F,  /* 00002418    "....\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x53,  /* 00002420    "SB_PCI0S" */
> +    0x32,0x37,0x5F,0x01,0xA0,0x29,0x7B,0x5C,  /* 00002428    "27_..){\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002430    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x44,0x0C,0x00,  /* 00002438    "I0PCID.." */
> +    0x00,0x00,0x08,0x00,0x86,0x5C,0x2F,0x03,  /* 00002440    ".....\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002448    "_SB_PCI0" */
> +    0x53,0x32,0x37,0x5F,0x0A,0x03,0xA0,0x28,  /* 00002450    "S27_...(" */
> +    0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002458    "{\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x50,0x43,0x49,0x55,  /* 00002460    "PCI0PCIU" */
> +    0x0C,0x00,0x00,0x00,0x10,0x00,0x86,0x5C,  /* 00002468    ".......\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002470    "/._SB_PC" */
> +    0x49,0x30,0x53,0x32,0x38,0x5F,0x01,0xA0,  /* 00002478    "I0S28_.." */
> +    0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002480    "){\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002488    "_PCI0PCI" */
> +    0x44,0x0C,0x00,0x00,0x00,0x10,0x00,0x86,  /* 00002490    "D......." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002498    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x32,0x38,0x5F,0x0A,  /* 000024A0    "CI0S28_." */
> +    0x03,0xA0,0x28,0x7B,0x5C,0x2F,0x03,0x5F,  /* 000024A8    "..({\/._" */
> +    0x53,0x42,0x5F,0x50,0x43,0x49,0x30,0x50,  /* 000024B0    "SB_PCI0P" */
> +    0x43,0x49,0x55,0x0C,0x00,0x00,0x00,0x20,  /* 000024B8    "CIU.... " */
> +    0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 000024C0    "..\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x53,0x32,0x39,  /* 000024C8    "_PCI0S29" */
> +    0x5F,0x01,0xA0,0x29,0x7B,0x5C,0x2F,0x03,  /* 000024D0    "_..){\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 000024D8    "_SB_PCI0" */
> +    0x50,0x43,0x49,0x44,0x0C,0x00,0x00,0x00,  /* 000024E0    "PCID...." */
> +    0x20,0x00,0x86,0x5C,0x2F,0x03,0x5F,0x53,  /* 000024E8    " ..\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x53,0x32,  /* 000024F0    "B_PCI0S2" */
> +    0x39,0x5F,0x0A,0x03,0xA0,0x28,0x7B,0x5C,  /* 000024F8    "9_...({\" */
> +    0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,  /* 00002500    "/._SB_PC" */
> +    0x49,0x30,0x50,0x43,0x49,0x55,0x0C,0x00,  /* 00002508    "I0PCIU.." */
> +    0x00,0x00,0x40,0x00,0x86,0x5C,0x2F,0x03,  /* 00002510    "..@..\/." */
> +    0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,0x30,  /* 00002518    "_SB_PCI0" */
> +    0x53,0x33,0x30,0x5F,0x01,0xA0,0x29,0x7B,  /* 00002520    "S30_..){" */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002528    "\/._SB_P" */
> +    0x43,0x49,0x30,0x50,0x43,0x49,0x44,0x0C,  /* 00002530    "CI0PCID." */
> +    0x00,0x00,0x00,0x40,0x00,0x86,0x5C,0x2F,  /* 00002538    "...@..\/" */
> +    0x03,0x5F,0x53,0x42,0x5F,0x50,0x43,0x49,  /* 00002540    "._SB_PCI" */
> +    0x30,0x53,0x33,0x30,0x5F,0x0A,0x03,0xA0,  /* 00002548    "0S30_..." */
> +    0x28,0x7B,0x5C,0x2F,0x03,0x5F,0x53,0x42,  /* 00002550    "({\/._SB" */
> +    0x5F,0x50,0x43,0x49,0x30,0x50,0x43,0x49,  /* 00002558    "_PCI0PCI" */
> +    0x55,0x0C,0x00,0x00,0x00,0x80,0x00,0x86,  /* 00002560    "U......." */
> +    0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,0x50,  /* 00002568    "\/._SB_P" */
> +    0x43,0x49,0x30,0x53,0x33,0x31,0x5F,0x01,  /* 00002570    "CI0S31_." */
> +    0xA0,0x29,0x7B,0x5C,0x2F,0x03,0x5F,0x53,  /* 00002578    ".){\/._S" */
> +    0x42,0x5F,0x50,0x43,0x49,0x30,0x50,0x43,  /* 00002580    "B_PCI0PC" */
> +    0x49,0x44,0x0C,0x00,0x00,0x00,0x80,0x00,  /* 00002588    "ID......" */
> +    0x86,0x5C,0x2F,0x03,0x5F,0x53,0x42,0x5F,  /* 00002590    ".\/._SB_" */
> +    0x50,0x43,0x49,0x30,0x53,0x33,0x31,0x5F,  /* 00002598    "PCI0S31_" */
> +    0x0A,0x03,0xA4,0x01,0x14,0x11,0x5F,0x4C,  /* 000025A0    "......_L" */
> +    0x30,0x32,0x00,0xA4,0x5C,0x2E,0x5F,0x53,  /* 000025A8    "02..\._S" */
> +    0x42,0x5F,0x50,0x52,0x53,0x43,0x14,0x11,  /* 000025B0    "B_PRSC.." */
> +    0x5F,0x4C,0x30,0x33,0x00,0xA4,0x5C,0x2E,  /* 000025B8    "_L03..\." */
> +    0x5F,0x53,0x42,0x5F,0x4D,0x45,0x53,0x43,  /* 000025C0    "_SB_MESC" */
> +    0x14,0x08,0x5F,0x4C,0x30,0x34,0x00,0xA4,  /* 000025C8    ".._L04.." */
> +    0x01,0x14,0x08,0x5F,0x4C,0x30,0x35,0x00,  /* 000025D0    "..._L05." */
> +    0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,0x36,  /* 000025D8    "...._L06" */
> +    0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,  /* 000025E0    "....._L0" */
> +    0x37,0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,  /* 000025E8    "7....._L" */
> +    0x30,0x38,0x00,0xA4,0x01,0x14,0x08,0x5F,  /* 000025F0    "08....._" */
> +    0x4C,0x30,0x39,0x00,0xA4,0x01,0x14,0x08,  /* 000025F8    "L09....." */
> +    0x5F,0x4C,0x30,0x41,0x00,0xA4,0x01,0x14,  /* 00002600    "_L0A...." */
> +    0x08,0x5F,0x4C,0x30,0x42,0x00,0xA4,0x01,  /* 00002608    "._L0B..." */
> +    0x14,0x08,0x5F,0x4C,0x30,0x43,0x00,0xA4,  /* 00002610    ".._L0C.." */
> +    0x01,0x14,0x08,0x5F,0x4C,0x30,0x44,0x00,  /* 00002618    "..._L0D." */
> +    0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,0x45,  /* 00002620    "...._L0E" */
> +    0x00,0xA4,0x01,0x14,0x08,0x5F,0x4C,0x30,  /* 00002628    "....._L0" */
> +    0x46,0x00,0xA4,0x01                       /* 00002630    "F..."     */
>  };
> diff --git a/src/acpi.c b/src/acpi.c
> index ea7b171..7153e3e 100644
> --- a/src/acpi.c
> +++ b/src/acpi.c
> @@ -378,10 +378,14 @@ static unsigned char ssdt_proc[] = {
>      0x4a,0x30,0x01,0x43,0x50,0x45,0x4a,0x49,
>      0x44,0x5f,0x5f,0x68
>  };
> +
> +
> +
>  #define SD_OFFSET_CPUHEX 6
>  #define SD_OFFSET_CPUID1 8
>  #define SD_OFFSET_CPUID2 20
>  
> +
>  #define SSDT_SIGNATURE 0x54445353 // SSDT
>  static void*
>  build_ssdt(void)
> @@ -460,6 +464,126 @@ build_ssdt(void)
>      return ssdt;
>  }
>  
> +static unsigned char ssdt_mem[] = {
> +
> +
> +    0x5b,0x82,0x40,0x07,0x4d,0x50,0x41,0x41,
> +    0x08,0x49,0x44,0x5f,0x5f,0x0a,0xaa,0x08,
> +    0x5f,0x48,0x49,0x44,0x0c,0x41,0xd0,0x0c,
> +    0x80,0x08,0x5f,0x43,0x52,0x53,0x11,0x33,
> +    0x0a,0x30,0x8a,0x2b,0x00,0x00,0x0d,0x03,
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> +    0xef,0xbe,0xad,0xde,0x00,0x00,0x00,0x00,
> +    0xee,0xbe,0xad,0xe6,0x00,0x00,0x00,0x00,
> +    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> +    0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
> +    0x79,0x00,0x14,0x0f,0x5f,0x53,0x54,0x41,
> +    0x00,0xa4,0x43,0x4d,0x53,0x54,0x49,0x44,
> +    0x5f,0x5f,0x14,0x0f,0x5f,0x45,0x4a,0x30,
> +    0x01,0x4d,0x50,0x45,0x4a,0x49,0x44,0x5f,
> +    0x5f,0x68
> +
> +};
> +
> +#define SD_OFFSET_MEMHEX 6
> +#define SD_OFFSET_MEMID1 14
> +#define SD_OFFSET_MEMSTART 48
> +#define SD_OFFSET_MEMEND   56
> +
> +
> +static void*
> +build_memssdt(void)
> +{
> +    u64  memstart;
> +    u64 start_ramsize, ramsize, maxramsize;
> +    int memdevs, enabled_memdevs;
> +
> +    ramsize = qemu_cfg_get_ramsize();
> +    maxramsize = qemu_cfg_get_maxramsize();
> +    memdevs = maxramsize / LINUX_MIN_BLOCK_SIZE;
> +    enabled_memdevs = ramsize / LINUX_MIN_BLOCK_SIZE;
> +    start_ramsize = (u64)RamSize;
> +
> +    // length = ScopeOp + memdevs + MTFY method + MEON package
> +    int length = ((1+3+4)
> +                  + (memdevs * sizeof(ssdt_mem))
> +                  + (1+2+5+(12*memdevs))
> +                  + (6+2+1+(1*memdevs)));
> +    u8 *ssdt = malloc_high(sizeof(struct acpi_table_header) + length);
> +    if (! ssdt) {
> +        warn_noalloc();
> +        return NULL;
> +    }
> +    u8 *ssdt_ptr = ssdt + sizeof(struct acpi_table_header);
> +
> +    // build Scope(_SB_) header
> +    *(ssdt_ptr++) = 0x10; // ScopeOp
> +    ssdt_ptr = encodeLen(ssdt_ptr, length-1, 3);
> +    *(ssdt_ptr++) = '_';
> +    *(ssdt_ptr++) = 'S';
> +    *(ssdt_ptr++) = 'B';
> +    *(ssdt_ptr++) = '_';
> +
> +    // build Memory Device object for each processor
> +    int i;
> +    memstart = 0;
> +    for (i=0; i<memdevs; i++) {
> +        memcpy(ssdt_ptr, ssdt_mem, sizeof(ssdt_mem));
> +        ssdt_ptr[SD_OFFSET_MEMHEX] = getHex(i >> 4);
> +        ssdt_ptr[SD_OFFSET_MEMHEX+1] = getHex(i);
> +        ssdt_ptr[SD_OFFSET_MEMID1] = i;
> +        /* initial memory (when >4GB) or hotpluggable memory is above 4GB, due to hole at 0x0e0000000-0x100000000 */
> +        if ( (memstart == MEM_HOLE) || (memstart == start_ramsize)) {
> +            memstart = MEM_HOTPLUG_OFFSET; 
> +        }
> +
> +        *(u64*)(ssdt_ptr + SD_OFFSET_MEMSTART) = memstart;
> +        *(u64*)(ssdt_ptr + SD_OFFSET_MEMEND) = memstart + LINUX_MIN_BLOCK_SIZE - 1;
> +        ssdt_ptr += sizeof(ssdt_mem);
> +        memstart += LINUX_MIN_BLOCK_SIZE;    
> +
> +    }
> +
> +    // build "Method(MTFY, 2) {If (LEqual(Arg0, 0x00)) {Notify(CM00, Arg1)} ...}"
> +    *(ssdt_ptr++) = 0x14; // MethodOp
> +    ssdt_ptr = encodeLen(ssdt_ptr, 2+5+(12*memdevs), 2);
> +    *(ssdt_ptr++) = 'M';
> +    *(ssdt_ptr++) = 'T';
> +    *(ssdt_ptr++) = 'F';
> +    *(ssdt_ptr++) = 'Y';
> +    *(ssdt_ptr++) = 0x02;
> +    for (i=0; i<memdevs; i++) {
> +        *(ssdt_ptr++) = 0xA0; // IfOp
> +        ssdt_ptr = encodeLen(ssdt_ptr, 11, 1);
> +        *(ssdt_ptr++) = 0x93; // LEqualOp
> +        *(ssdt_ptr++) = 0x68; // Arg0Op
> +        *(ssdt_ptr++) = 0x0A; // BytePrefix
> +        *(ssdt_ptr++) = i;
> +        *(ssdt_ptr++) = 0x86; // NotifyOp
> +        *(ssdt_ptr++) = 'M';
> +        *(ssdt_ptr++) = 'P';
> +        *(ssdt_ptr++) = getHex(i >> 4);
> +        *(ssdt_ptr++) = getHex(i);
> +        *(ssdt_ptr++) = 0x69; // Arg1Op
> +    }
> +
> +    // build "Name(CPON, Package() { One, One, ..., Zero, Zero, ... })"
> +    *(ssdt_ptr++) = 0x08; // NameOp
> +    *(ssdt_ptr++) = 'M';
> +    *(ssdt_ptr++) = 'E';
> +    *(ssdt_ptr++) = 'O';
> +    *(ssdt_ptr++) = 'N';
> +    *(ssdt_ptr++) = 0x12; // PackageOp
> +    ssdt_ptr = encodeLen(ssdt_ptr, 2+1+(1*memdevs), 2);
> +    *(ssdt_ptr++) = memdevs;
> +    for (i=0; i<memdevs; i++)
> +        *(ssdt_ptr++) = ( i < enabled_memdevs ) ? 0x01 : 0x00;
> +
> +    build_header((void*)ssdt, SSDT_SIGNATURE, ssdt_ptr - ssdt, 1);
> +
> +    return ssdt;
> +}
> +
>  #define HPET_SIGNATURE 0x54455048 //HPET
>  static void*
>  build_hpet(void)
> @@ -635,6 +759,7 @@ acpi_bios_init(void)
>      // Add tables
>      ACPI_INIT_TABLE(build_fadt(pci));
>      ACPI_INIT_TABLE(build_ssdt());
> +    ACPI_INIT_TABLE(build_memssdt());
>      ACPI_INIT_TABLE(build_madt());
>      ACPI_INIT_TABLE(build_hpet());
>      ACPI_INIT_TABLE(build_srat());
> diff --git a/src/biosvar.h b/src/biosvar.h
> index 2b755e3..3356ebd 100644
> --- a/src/biosvar.h
> +++ b/src/biosvar.h
> @@ -329,4 +329,9 @@ struct bios_config_table_s {
>  
>  extern struct bios_config_table_s BIOS_CONFIG_TABLE __aligned(1);
>  
> +
> +#define LINUX_MIN_BLOCK_SIZE    0x8000000LU
> +#define MEM_HOTPLUG_OFFSET      0x100000000LLU
> +#define MEM_HOLE                0xe0000000LLU
> +
>  #endif // __BIOSVAR_H
> diff --git a/src/paravirt.c b/src/paravirt.c
> index 9cf77de..1e1b83b 100644
> --- a/src/paravirt.c
> +++ b/src/paravirt.c
> @@ -305,6 +305,28 @@ u16 qemu_cfg_get_max_cpus(void)
>      return cnt;
>  }
>  
> +u64 qemu_cfg_get_ramsize(void)
> +{
> +    u64 cnt;
> +
> +    if (!qemu_cfg_present)
> +        return 0;
> +
> +    qemu_cfg_read_entry(&cnt, QEMU_CFG_RAMSIZE, sizeof(cnt));
> +    return cnt;
> +}
> +
> +u64 qemu_cfg_get_maxramsize(void)
> +{
> +    u64 cnt;
> +
> +    if (!qemu_cfg_present)
> +        return 0;
> +
> +    qemu_cfg_read_entry(&cnt, QEMU_CFG_MAXRAMSIZE, sizeof(cnt));
> +    return cnt;
> +}
> +
>  static QemuCfgFile LastFile;
>  
>  static u32
> diff --git a/src/paravirt.h b/src/paravirt.h
> index 4a370a0..df43534 100644
> --- a/src/paravirt.h
> +++ b/src/paravirt.h
> @@ -29,6 +29,8 @@ static inline int kvm_para_available(void)
>  #define QEMU_CFG_SIGNATURE		0x00
>  #define QEMU_CFG_ID			0x01
>  #define QEMU_CFG_UUID			0x02
> +#define QEMU_CFG_RAMSIZE		0x03
> +#define QEMU_CFG_MAXRAMSIZE		0x1a
>  #define QEMU_CFG_NUMA			0x0d
>  #define QEMU_CFG_BOOT_MENU		0x0e
>  #define QEMU_CFG_MAX_CPUS		0x0f
> @@ -55,6 +57,8 @@ int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs,
>  int qemu_cfg_get_numa_nodes(void);
>  void qemu_cfg_get_numa_data(u64 *data, int n);
>  u16 qemu_cfg_get_max_cpus(void);
> +u64 qemu_cfg_get_ramsize(void);
> +u64 qemu_cfg_get_maxramsize(void);
>  
>  typedef struct QemuCfgFile {
>      u32  size;        /* file size */
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


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

* Re: [PATCH][SeaBIOS] memory hotplug
  2011-08-29  9:24 ` Lai Jiangshan
@ 2011-09-06  8:07   ` Vasilis Liaskovitis
       [not found]     ` <4E674059.9070307@cn.fujitsu.com>
  0 siblings, 1 reply; 7+ messages in thread
From: Vasilis Liaskovitis @ 2011-09-06  8:07 UTC (permalink / raw)
  To: Lai Jiangshan; +Cc: kvm, seabios

Hi Lai,

On Mon, Aug 29, 2011 at 05:24:31PM +0800, Lai Jiangshan wrote:
> 
> When I test it, the guest OS become non-available, but it does not crash.
> It also cause the disk fault.
> 
> It is hard to dig the reason. Or I missed something?

thanks for testing. Can you share your full qemu-kvm command line? I may be able
to reproduce the error if I try your exact config.

I have not seen a hard-disk error with these patches. Is this a virtio disk?

thanks,

- Vasilis

> 
> 
> Hotplug Mem Device 
> init_memory_mapping: 0000000100000000-0000000108000000
>  0100000000 - 0108000000 page 2M
> Built 1 zonelists in Node order, mobility grouping on.  Total pages: 274232
> Policy zone: Normal
> nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
> ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
> ata1.00: failed command: WRITE DMA
> ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
>          res 50/01:00:40:11:84/00:00:00:00:00/e0 Emask 0x40 (internal error)
> ata1.00: status: { DRDY }
> ata1.00: configured for MWDMA2
> ata1: EH complete
> nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
> ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
> ata1.00: failed command: WRITE DMA
> ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
>          res 50/01:00:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
> ata1.00: status: { DRDY }
> ata1.00: configured for MWDMA2
> ata1: EH complete
> nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
> ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
> ata1.00: failed command: WRITE DMA
> ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
>          res 50/01:00:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
> ata1.00: status: { DRDY }
> ata1.00: configured for MWDMA2
> ata1: EH complete
> nommu_map_sg: overflow 107861000+4096 of device mask ffffffff
> ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
> ata1.00: failed command: WRITE DMA
> ata1.00: cmd ca/00:08:28:08:44/00:00:00:00:00/e0 tag 0 dma 4096 out
>          res 50/01:00:00:00:00/00:00:00:00:00/a0 Emask 0x40 (internal error)
> ata1.00: status: { DRDY }
> ata1.00: configured for MWDMA2
> ata1: EH complete
> 
> ......
> 
> 
> 

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

* Re: [PATCH] memory hotplug
       [not found]     ` <4E674059.9070307@cn.fujitsu.com>
@ 2011-09-08 16:21       ` Vasilis Liaskovitis
  0 siblings, 0 replies; 7+ messages in thread
From: Vasilis Liaskovitis @ 2011-09-08 16:21 UTC (permalink / raw)
  To: Lai Jiangshan; +Cc: seabios, kvm

Hi,
On Wed, Sep 07, 2011 at 05:58:49PM +0800, Lai Jiangshan wrote:
> On 09/06/2011 04:07 PM, Vasilis Liaskovitis wrote:
> > Hi Lai,
> 
> Yes, it is virtio disk. (the guest kernel is 2.6.32-71.el6)
> 
> [root@lai qemu-kvm]# x86_64-softmmu/qemu-system-x86_64 -drive file=/home/laijs/Machines/rhel6.img,if=none,id=drive-virtio-disk0,format=qcow2 -device virtio-blk-pci,bus=pci.0,multifunction=on,addr=0x5.0x0,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -m 1024,maxmem=2048 -smp 2,maxcpus=8  -bios ../seabios/out/bios.bin
> 
> When I changed it to IDE disk: (the guest kernel is 3.1.0-rc4-tip)
> [root@lai qemu-kvm]# x86_64-softmmu/qemu-system-x86_64 /home/laijs/Machines/rhel6.img -m 1024,maxmem=2048 -smp 2,maxcpus=8 -bios ../seabios/out/bios.bin
> 
> The memory block was successfully added, but when after
> "echo online > /sys/devices/system/memory/memory3/state",
> the result are the same: disk failed.
>
I notice that you only have 2 memory devices initially, for 1GB initial memory.
This suggests your /sys/devices/system/memory/block_size_bytes is 512MB, can you
verify?

Currently the draft patches I sent only work with x86_64 guest, where
block_size_bytes are 128 MB. You 'll have to change the definition of the
constant LINUX_MIN_BLOCK_SIZE to whatever block_size_bytes your guest uses (in
both the qemu-kvm and seabios patch).
Additionally, in SeaBIOS the final line of the QWordMemory descriptor in 
src/ssdt-mem.dsl will need to match the new block_size_bytes as well.

Is your rhel6 guest 32-bit with PAE? This combination has SECTION_SIZE_BITS==29
in arch/x86/include/asm/sparsemem.h which would explain the number of memory
devices you are seeing.

thanks,
- Vasilis

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

* Re: [PATCH][SeaBIOS] memory hotplug
  2011-08-11 14:39 [PATCH][SeaBIOS] memory hotplug Vasilis Liaskovitis
  2011-08-29  9:24 ` Lai Jiangshan
@ 2012-03-15 12:01 ` Gleb Natapov
  2012-03-16 14:09   ` Vasilis Liaskovitis
  1 sibling, 1 reply; 7+ messages in thread
From: Gleb Natapov @ 2012-03-15 12:01 UTC (permalink / raw)
  To: Vasilis Liaskovitis; +Cc: kvm, seabios

Commenting a little bit late, but since you've said that you are working on
a new version of the patch... better late than never.

On Thu, Aug 11, 2011 at 04:39:38PM +0200, Vasilis Liaskovitis wrote:
> Hi,
> 
> I am testing a set of experimental patches for memory-hotplug on x86_64 host /
> guest combinations. I have implemented this in a similar way to cpu-hotplug.  
> 
> A dynamic SSDT table with all memory devices is created at boot time.  This
> table calls static methods from the DSDT.  A byte array indicates which memory
> device is online or not. This array is kept in sync with a qemu-kvm bitmap array
> through ioport 0xaf20. Qemu-kvm updates this table on a "mem_set" command and
> an ACPI event is triggered.
> 
> Memory devices are 128MB in size (to match /sys/devices/memory/block_size_bytes 
> in x86_64). They are constructed dynamically in src/ssdt-mem.asl , similarly to
> hotpluggable-CPUs.  The _CRS memstart-memend attribute for each memory device is
> defined accordingly, skipping the hole at 0xe0000000 - 0x100000000.
> Hotpluggable memory is always located above 4GB.
> 
What is the reason for this limitation?

> Qemu-kvm sets the upper bound of hotpluggable memory with "maxmem = [totalmemory in
> MB]" on the command line. Maxmem is an argument for "-m" similar to maxcpus for smp.
> E.g. "-m 1024,maxmem=2048" on the qemu command line will create memory devices
> for 2GB of RAM, enabling only 1GB initially.
> 
> Qemu_monitor triggers a memory hotplug with:
> (qemu) mem_set [memory range in MBs] online
> 
As far as I see mem_set does not get memory range as a parameter. The
parameter is amount of memory to add/remove and memory is added/removed
to/from the top.

This is not flexible enough.  Find grained control for memory slots is
needed. What about exposing memory slot configuration to command line
like this: 

-memslot mem=size,populated=yes|no

adding one of those for each slot.

mem_set will get slot id to populate/depopulate just like cpu_set gets
cpu slot number to remove and not just yanks cpus with highest slot id.

--
			Gleb.

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

* Re: [PATCH][SeaBIOS] memory hotplug
  2012-03-15 12:01 ` [PATCH][SeaBIOS] " Gleb Natapov
@ 2012-03-16 14:09   ` Vasilis Liaskovitis
  2012-03-16 14:31     ` Igor Mammedov
  0 siblings, 1 reply; 7+ messages in thread
From: Vasilis Liaskovitis @ 2012-03-16 14:09 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kvm, seabios

Hi,

On Thu, Mar 15, 2012 at 02:01:38PM +0200, Gleb Natapov wrote:
> Commenting a little bit late, but since you've said that you are working on
> a new version of the patch... better late than never.
> 
> On Thu, Aug 11, 2011 at 04:39:38PM +0200, Vasilis Liaskovitis wrote:
> > Hi,
> > 
> > I am testing a set of experimental patches for memory-hotplug on x86_64 host /
> > guest combinations. I have implemented this in a similar way to cpu-hotplug.  
> > 
> > A dynamic SSDT table with all memory devices is created at boot time.  This
> > table calls static methods from the DSDT.  A byte array indicates which memory
> > device is online or not. This array is kept in sync with a qemu-kvm bitmap array
> > through ioport 0xaf20. Qemu-kvm updates this table on a "mem_set" command and
> > an ACPI event is triggered.
> > 
> > Memory devices are 128MB in size (to match /sys/devices/memory/block_size_bytes 
> > in x86_64). They are constructed dynamically in src/ssdt-mem.asl , similarly to
> > hotpluggable-CPUs.  The _CRS memstart-memend attribute for each memory device is
> > defined accordingly, skipping the hole at 0xe0000000 - 0x100000000.
> > Hotpluggable memory is always located above 4GB.
> > 
> What is the reason for this limitation?

We currently model a PCI hole from below_4g_mem_size to 4GB, see i440fx_init
call in pc_init1. The decision was discussed here:
http://patchwork.ozlabs.org/patch/105892/
afaict because there was no clear resolution on using a top-of-memory register.
So, hotplugging will start at 4GB + above_4g_mem_size. Unless we can model the
pci hole more accurately hardware-wise.

> 
> > Qemu-kvm sets the upper bound of hotpluggable memory with "maxmem = [totalmemory in
> > MB]" on the command line. Maxmem is an argument for "-m" similar to maxcpus for smp.
> > E.g. "-m 1024,maxmem=2048" on the qemu command line will create memory devices
> > for 2GB of RAM, enabling only 1GB initially.
> > 
> > Qemu_monitor triggers a memory hotplug with:
> > (qemu) mem_set [memory range in MBs] online
> > 
> As far as I see mem_set does not get memory range as a parameter. The
> parameter is amount of memory to add/remove and memory is added/removed
> to/from the top.
> 
> This is not flexible enough.  Find grained control for memory slots is
> needed. What about exposing memory slot configuration to command line
> like this: 
> 
> -memslot mem=size,populated=yes|no
> 
> adding one of those for each slot.
> 
yes, I agree we need this.
Is the idea to model all physical DIMMs? For initial system RAM does it make
sense to explicitly specify slots at the command line, or infer them? 

I think we can allocate a new qemu ram MemoryRegion for each new hotplugged
slot/DIMM, so there will be a 1-1 mapping between new populated slots and
qemu memory ram regions.  Perhaps we want initial memory allocation to also 
comply with physical slot/DIMM modeling. Initial (cold) RAM is created as
a single MemoryRegion pc.ram

Also in kvm we can easily run out of kvm_memory_slots (10 slots per VM and 32
system-wide I think)

> mem_set will get slot id to populate/depopulate just like cpu_set gets
> cpu slot number to remove and not just yanks cpus with highest slot id.

right, but I think for upstream qemu, people would like to eventually use device_add,
instead of a new mem_set command. Pretty much the same way as cpu hotplug?

For this to happen, memory devices should be modeled in QOM/qdev. Are we planning
on keeping a CPUSocket structures for CPUs? or perhaps modelling a memory controller
is the right way. What type should the memory controller/devices be a child of?

I 'll try to resubmit in a few weeks time, though depending on feedack qom/qdev of
memory devices will probably take longer.

thanks,

- Vasilis


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

* Re: [PATCH][SeaBIOS] memory hotplug
  2012-03-16 14:09   ` Vasilis Liaskovitis
@ 2012-03-16 14:31     ` Igor Mammedov
  0 siblings, 0 replies; 7+ messages in thread
From: Igor Mammedov @ 2012-03-16 14:31 UTC (permalink / raw)
  To: Vasilis Liaskovitis; +Cc: Gleb Natapov, kvm, seabios

On 03/16/2012 03:09 PM, Vasilis Liaskovitis wrote:
> Hi,
>
> On Thu, Mar 15, 2012 at 02:01:38PM +0200, Gleb Natapov wrote:
>> Commenting a little bit late, but since you've said that you are working on
>> a new version of the patch... better late than never.
>>
>> On Thu, Aug 11, 2011 at 04:39:38PM +0200, Vasilis Liaskovitis wrote:
>>> Hi,
>>>
>>> I am testing a set of experimental patches for memory-hotplug on x86_64 host /
>>> guest combinations. I have implemented this in a similar way to cpu-hotplug.
>>>
>>> A dynamic SSDT table with all memory devices is created at boot time.  This
>>> table calls static methods from the DSDT.  A byte array indicates which memory
>>> device is online or not. This array is kept in sync with a qemu-kvm bitmap array
>>> through ioport 0xaf20. Qemu-kvm updates this table on a "mem_set" command and
>>> an ACPI event is triggered.
>>>
>>> Memory devices are 128MB in size (to match /sys/devices/memory/block_size_bytes
>>> in x86_64). They are constructed dynamically in src/ssdt-mem.asl , similarly to
>>> hotpluggable-CPUs.  The _CRS memstart-memend attribute for each memory device is
>>> defined accordingly, skipping the hole at 0xe0000000 - 0x100000000.
>>> Hotpluggable memory is always located above 4GB.
>>>
>> What is the reason for this limitation?
>
> We currently model a PCI hole from below_4g_mem_size to 4GB, see i440fx_init
> call in pc_init1. The decision was discussed here:
> http://patchwork.ozlabs.org/patch/105892/
> afaict because there was no clear resolution on using a top-of-memory register.
> So, hotplugging will start at 4GB + above_4g_mem_size. Unless we can model the
> pci hole more accurately hardware-wise.
>
>>
>>> Qemu-kvm sets the upper bound of hotpluggable memory with "maxmem = [totalmemory in
>>> MB]" on the command line. Maxmem is an argument for "-m" similar to maxcpus for smp.
>>> E.g. "-m 1024,maxmem=2048" on the qemu command line will create memory devices
>>> for 2GB of RAM, enabling only 1GB initially.
>>>
>>> Qemu_monitor triggers a memory hotplug with:
>>> (qemu) mem_set [memory range in MBs] online
>>>
>> As far as I see mem_set does not get memory range as a parameter. The
>> parameter is amount of memory to add/remove and memory is added/removed
>> to/from the top.
>>
>> This is not flexible enough.  Find grained control for memory slots is
>> needed. What about exposing memory slot configuration to command line
>> like this:
>>
>> -memslot mem=size,populated=yes|no
>>
>> adding one of those for each slot.
>>
> yes, I agree we need this.
> Is the idea to model all physical DIMMs? For initial system RAM does it make
> sense to explicitly specify slots at the command line, or infer them?
>
> I think we can allocate a new qemu ram MemoryRegion for each new hotplugged
> slot/DIMM, so there will be a 1-1 mapping between new populated slots and
> qemu memory ram regions.  Perhaps we want initial memory allocation to also
> comply with physical slot/DIMM modeling. Initial (cold) RAM is created as
> a single MemoryRegion pc.ram
>
> Also in kvm we can easily run out of kvm_memory_slots (10 slots per VM and 32
> system-wide I think)
>
>> mem_set will get slot id to populate/depopulate just like cpu_set gets
>> cpu slot number to remove and not just yanks cpus with highest slot id.
>
> right, but I think for upstream qemu, people would like to eventually use device_add,
> instead of a new mem_set command. Pretty much the same way as cpu hotplug?
>
> For this to happen, memory devices should be modeled in QOM/qdev. Are we planning
> on keeping a CPUSocket structures for CPUs? or perhaps modelling a memory controller
I'd rather dump CPUSocket structure unless it's really required, it was introduced just
for providing hotplug-able icc bus for cpus since hot-plug on sysbus was disabled.

> is the right way. What type should the memory controller/devices be a child of?
>
> I 'll try to resubmit in a few weeks time, though depending on feedack qom/qdev of
> memory devices will probably take longer.
>
> thanks,
>
> - Vasilis
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
-----
  Igor

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

end of thread, other threads:[~2012-03-16 14:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-11 14:39 [PATCH][SeaBIOS] memory hotplug Vasilis Liaskovitis
2011-08-29  9:24 ` Lai Jiangshan
2011-09-06  8:07   ` Vasilis Liaskovitis
     [not found]     ` <4E674059.9070307@cn.fujitsu.com>
2011-09-08 16:21       ` [PATCH] " Vasilis Liaskovitis
2012-03-15 12:01 ` [PATCH][SeaBIOS] " Gleb Natapov
2012-03-16 14:09   ` Vasilis Liaskovitis
2012-03-16 14:31     ` Igor Mammedov

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.