--- /dev/null
- index 28de744..9bc0cc1 100644
+diff --git a/tools/firmware/hvmloader/acpi/Makefile b/tools/firmware/hvmloader/acpi/Makefile
+index c282d01..f9f6bc3 100644
+--- a/tools/firmware/hvmloader/acpi/Makefile
++++ b/tools/firmware/hvmloader/acpi/Makefile
+@@ -19,17 +19,30 @@ XEN_ROOT = ../../../..
+ include $(XEN_ROOT)/tools/firmware/Rules.mk
+
+ C_SRC = build.c dsdt.c static_tables.c
+-H_SRC = $(wildcard *.h)
++H_SRC = $(wildcard *.h) ssdt_pm.h ssdt_tpm.h
+ OBJS = $(patsubst %.c,%.o,$(C_SRC))
+
++build.o: $(H_SRC) build.c
++
++IASL_VER = acpica-unix-20080729
++IASL_URL = http://acpica.org/download/$(IASL_VER).tar.gz
++
+ CFLAGS += -I. -I.. $(CFLAGS_include)
+
+ vpath iasl $(PATH)
+ all: acpi.a
+
+-ssdt_pm.h ssdt_tpm.h: %.h: %.asl
++ssdt_pm.h: ssdt_pm.asl
++ $(MAKE) iasl
++ iasl -tc $<
++ sed -i'' -re 's/AmlCode/AmlCode_PM/g' $*.hex
++ mv $*.hex $@
++ rm -f *.aml
++
++ssdt_tpm.h: ssdt_tpm.asl
+ $(MAKE) iasl
+ iasl -tc $<
++ sed -i'' -re 's/AmlCode/AmlCode_TPM/g' $*.hex
+ mv $*.hex $@
+ rm -f *.aml
+
+diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c
+index 82510fc..97dcdb5 100644
+--- a/tools/firmware/hvmloader/acpi/build.c
++++ b/tools/firmware/hvmloader/acpi/build.c
+@@ -50,7 +50,13 @@ static void set_checksum(
+
+ static uint8_t battery_port_exists(void)
+ {
+- return (inb(0x88) == 0x1F);
++ uint8_t val;
++
++ val = inb(0x88);
++ if ( (val == 0xff) || (val == 0x0) )
++ return 0;
++
++ return 1;
+ }
+
+ static int construct_madt(struct acpi_20_madt *madt)
+diff --git a/tools/firmware/hvmloader/acpi/ssdt_pm.asl b/tools/firmware/hvmloader/acpi/ssdt_pm.asl
+index afb78b6..8f2d7a7 100644
+--- a/tools/firmware/hvmloader/acpi/ssdt_pm.asl
++++ b/tools/firmware/hvmloader/acpi/ssdt_pm.asl
+@@ -95,6 +95,13 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ P88, 8
+ }
+
++ /* OperationRegion for Power Button */
++ OperationRegion (PBOP, SystemIO, 0x200, 0x01)
++ Field (PBOP, ByteAcc, NoLock, WriteAsZeros)
++ {
++ SLP, 1,
++ WAK, 1
++ }
+
+ Mutex (SYNC, 0x01)
+ Name (BUF0, Buffer (0x0100) {})
+@@ -291,8 +298,99 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ Release (SYNC)
+ }
+
+- /* Future patches will extend AC object to better account for
+- * AC to DC transition and more. */
++ Method (E0, 0, NotSerialized)
++ {
++ If (\_SB.SLP)
++ {
++ Store (One, \_SB.SLP)
++ Notify (\_SB.SLPB, 0x80)
++ }
++
++ if (\_SB.WAK)
++ {
++ Store (One, \_SB.WAK)
++ Notify (\_SB.SLPB, 0x2)
++ }
++ }
++
++ Method (E1, 0, NotSerialized)
++ {
++ If (\_SB.SLP)
++ {
++ Store (One, \_SB.SLP)
++ Notify (\_SB.PBTN, 0x80)
++ }
++
++ if (\_SB.WAK)
++ {
++ Store (One, \_SB.WAK)
++ Notify (\_SB.PBTN, 0x2)
++ }
++ }
++
++ Method (E1C, 0, NotSerialized)
++ {
++ Notify (\_SB.AC, 0x80)
++ }
++
++ Method (E17, 0, NotSerialized)
++ {
++ Notify (\_SB.LID, 0x80)
++ }
++
++ Device (LID)
++ {
++ Name (_HID, EisaId ("PNP0C0D"))
++ Method (_LID, 0, NotSerialized)
++ {
++ Store (\_SB.P88, Local0)
++ If (And (Local0, 0x4))
++ {
++ Return (0x1)
++ }
++
++ Return (0x0)
++ }
++
++ Name (_PRW, Package (0x02)
++ {
++ 0x17,
++ 0x03
++ })
++
++ Method (_PSW, 1, NotSerialized)
++ {
++ Store (\_SB.P88, Local0)
++ If (And (Local0, 0x4))
++ {
++ Return (0x1)
++ }
++ Return (0x0)
++ }
++ }
++
++ Device (PBTN)
++ {
++ Name (_HID, EisaId ("PNP0C0C"))
++
++ Name (_PRW, Package (0x02)
++ {
++ 0x01,
++ 0x04
++ })
++ }
++
++ Device (SLPB)
++ {
++ Name (_HID, EisaId ("PNP0C0E"))
++
++ Name (_PRW, Package (0x02)
++ {
++ 0x01,
++ 0x04
++ })
++ }
++
+ Device (AC)
+ {
+ Name (_HID, "ACPI0003")
+@@ -304,6 +402,12 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ })
+ Method (_PSR, 0, NotSerialized)
+ {
++ Store (\_SB.P88, Local0)
++ If (And (Local0, 0x1))
++ {
++ Return (0x1)
++ }
++
+ Return (0x0)
+ }
+
+@@ -348,11 +452,16 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ \_SB
+ })
+
+- /* Always returns 0x1f indicating battery present. */
++ /* Returning 0x1F indicates battery present */
+ Method (_STA, 0, NotSerialized)
+ {
+ Store (\_SB.P88, Local0)
+- Return ( Local0 )
++ If (And (Local0, 0x2))
++ {
++ Return (0x1F)
++ }
++
++ Return (0x0F)
+ }
+
+ /* Battery generic info: design capacity, voltage, model # etc. */
+@@ -367,7 +476,7 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ /* Battery status including battery charging/discharging rate. */
+ Method (_BST, 0, NotSerialized)
+ {
+- Store (1, \_SB.DBG1)
++ /* Store (1, \_SB.DBG1) */
+ ACQR ()
+ INIT (0x02)
+ INIT (0x01)
+@@ -378,7 +487,7 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ Store (HLP7 (), Index (BST0, 0x02))
+ Store (HLP7 (), Index (BST0, 0x03))
+ REL ()
+- Store (2, \_SB.DBG1)
++ /* Store (2, \_SB.DBG1) */
+ Return (BST0)
+ }
+ }
+@@ -419,5 +528,31 @@ DefinitionBlock ("SSDT_PM.aml", "SSDT", 2, "Xen", "HVM", 0)
+ }
+ }
+ }
++
++ /* Wire GPE events to notify power state
++ * changes like ac power to battery use etc.
++ */
++ Scope (\_GPE)
++ {
++ Method (_L00, 0, NotSerialized)
++ {
++ \_SB.E0()
++ }
++
++ Method (_L01, 0, NotSerialized)
++ {
++ \_SB.E1()
++ }
++
++ Method (_L1C, 0, NotSerialized)
++ {
++ \_SB.E1C()
++ }
++
++ Method (_L17, 0, NotSerialized)
++ {
++ \_SB.E17()
++ }
++ }
+ }
+
+diff --git a/tools/firmware/hvmloader/acpi/ssdt_pm.h b/tools/firmware/hvmloader/acpi/ssdt_pm.h
+index 020af0b..f277767 100644
+--- a/tools/firmware/hvmloader/acpi/ssdt_pm.h
++++ b/tools/firmware/hvmloader/acpi/ssdt_pm.h
+@@ -1,22 +1,22 @@
+ /*
+ *
+ * Intel ACPI Component Architecture
+- * ASL Optimizing Compiler version 20061109 [May 18 2007]
+- * Copyright (C) 2000 - 2006 Intel Corporation
++ * ASL Optimizing Compiler version 20080729 [Nov 24 2008]
++ * Copyright (C) 2000 - 2008 Intel Corporation
+ * Supports ACPI Specification Revision 3.0a
+ *
+- * Compilation of "ssdt_pm.asl" - Sun Oct 12 23:57:51 2008
++ * Compilation of "ssdt_pm.asl" - Thu May 14 12:24:23 2009
+ *
+ * C source code output
+ *
+ */
+ unsigned char AmlCode_PM[] =
+ {
+- 0x53,0x53,0x44,0x54,0xD6,0x05,0x00,0x00, /* 00000000 "SSDT...." */
+- 0x02,0xD9,0x58,0x65,0x6E,0x00,0x00,0x00, /* 00000008 "..Xen..." */
++ 0x53,0x53,0x44,0x54,0xA4,0x07,0x00,0x00, /* 00000000 "SSDT...." */
++ 0x02,0x15,0x58,0x65,0x6E,0x00,0x00,0x00, /* 00000008 "..Xen..." */
+ 0x48,0x56,0x4D,0x00,0x00,0x00,0x00,0x00, /* 00000010 "HVM....." */
+ 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
+- 0x09,0x11,0x06,0x20,0x10,0x41,0x5B,0x5C, /* 00000020 "... .A[\" */
++ 0x29,0x07,0x08,0x20,0x10,0x43,0x73,0x5C, /* 00000020 ").. .Cs\" */
+ 0x5F,0x53,0x42,0x5F,0x5B,0x80,0x44,0x42, /* 00000028 "_SB_[.DB" */
+ 0x47,0x41,0x01,0x0B,0x40,0xB0,0x01,0x5B, /* 00000030 "GA..@..[" */
+ 0x81,0x0B,0x44,0x42,0x47,0x41,0x01,0x44, /* 00000038 "..DBGA.D" */
+@@ -39,164 +39,222 @@ unsigned char AmlCode_PM[] =
+ 0x5B,0x80,0x50,0x52,0x54,0x33,0x01,0x0A, /* 000000C0 "[.PRT3.." */
+ 0x88,0x01,0x5B,0x81,0x0B,0x50,0x52,0x54, /* 000000C8 "..[..PRT" */
+ 0x33,0x01,0x50,0x38,0x38,0x5F,0x08,0x5B, /* 000000D0 "3.P88_.[" */
+- 0x01,0x53,0x59,0x4E,0x43,0x01,0x08,0x42, /* 000000D8 ".SYNC..B" */
+- 0x55,0x46,0x30,0x11,0x04,0x0B,0x00,0x01, /* 000000E0 "UF0....." */
+- 0x08,0x42,0x55,0x46,0x31,0x11,0x03,0x0A, /* 000000E8 ".BUF1..." */
+- 0x08,0x8B,0x42,0x55,0x46,0x31,0x00,0x42, /* 000000F0 "..BUF1.B" */
+- 0x55,0x46,0x41,0x8B,0x42,0x55,0x46,0x31, /* 000000F8 "UFA.BUF1" */
+- 0x0A,0x04,0x42,0x55,0x46,0x42,0x14,0x14, /* 00000100 "..BUFB.." */
+- 0x41,0x43,0x51,0x52,0x00,0x5B,0x23,0x53, /* 00000108 "ACQR.[#S" */
+- 0x59,0x4E,0x43,0xFF,0xFF,0x70,0x00,0x42, /* 00000110 "YNC..p.B" */
+- 0x55,0x46,0x41,0x14,0x31,0x49,0x4E,0x49, /* 00000118 "UFA.1INI" */
+- 0x54,0x01,0x70,0x42,0x55,0x46,0x41,0x60, /* 00000120 "T.pBUFA`" */
+- 0x75,0x60,0xA0,0x22,0x92,0x94,0x60,0x87, /* 00000128 "u`."..`." */
+- 0x42,0x55,0x46,0x30,0x8C,0x42,0x55,0x46, /* 00000130 "BUF0.BUF" */
+- 0x30,0x42,0x55,0x46,0x41,0x54,0x4D,0x50, /* 00000138 "0BUFATMP" */
+- 0x31,0x70,0x68,0x54,0x4D,0x50,0x31,0x70, /* 00000140 "1phTMP1p" */
+- 0x60,0x42,0x55,0x46,0x41,0x14,0x48,0x07, /* 00000148 "`BUFA.H." */
+- 0x57,0x50,0x52,0x54,0x02,0x70,0x69,0x5C, /* 00000150 "WPRT.pi\" */
+- 0x2E,0x5F,0x53,0x42,0x5F,0x50,0x38,0x36, /* 00000158 "._SB_P86" */
+- 0x5F,0x70,0x68,0x5C,0x2E,0x5F,0x53,0x42, /* 00000160 "_ph\._SB" */
+- 0x5F,0x50,0x42,0x32,0x5F,0x70,0x68,0x5C, /* 00000168 "_PB2_ph\" */
+- 0x2E,0x5F,0x53,0x42,0x5F,0x44,0x42,0x47, /* 00000170 "._SB_DBG" */
+- 0x32,0x70,0x69,0x5C,0x2E,0x5F,0x53,0x42, /* 00000178 "2pi\._SB" */
+- 0x5F,0x44,0x42,0x47,0x34,0x70,0x5C,0x2E, /* 00000180 "_DBG4p\." */
+- 0x5F,0x53,0x42,0x5F,0x50,0x42,0x32,0x5F, /* 00000188 "_SB_PB2_" */
+- 0x60,0xA2,0x11,0x92,0x93,0x60,0x00,0x70, /* 00000190 "`....`.p" */
+- 0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50,0x42, /* 00000198 "\._SB_PB" */
+- 0x32,0x5F,0x60,0x70,0x5C,0x2E,0x5F,0x53, /* 000001A0 "2_`p\._S" */
+- 0x42,0x5F,0x50,0x38,0x36,0x5F,0x61,0x70, /* 000001A8 "B_P86_ap" */
+- 0x61,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x44, /* 000001B0 "a\._SB_D" */
+- 0x42,0x47,0x33,0xA4,0x5C,0x2E,0x5F,0x53, /* 000001B8 "BG3.\._S" */
+- 0x42,0x5F,0x50,0x38,0x36,0x5F,0x14,0x1D, /* 000001C0 "B_P86_.." */
+- 0x48,0x4C,0x50,0x31,0x02,0xA0,0x16,0x95, /* 000001C8 "HLP1...." */
+- 0x69,0x87,0x68,0x8C,0x68,0x69,0x54,0x4D, /* 000001D0 "i.h.hiTM" */
+- 0x50,0x31,0x57,0x50,0x52,0x54,0x0A,0x7C, /* 000001D8 "P1WPRT.|" */
+- 0x54,0x4D,0x50,0x31,0x14,0x23,0x48,0x4C, /* 000001E0 "TMP1.#HL" */
+- 0x50,0x32,0x00,0x57,0x50,0x52,0x54,0x0A, /* 000001E8 "P2.WPRT." */
+- 0x7B,0x00,0x70,0x00,0x60,0xA2,0x12,0x95, /* 000001F0 "{.p.`..." */
+- 0x60,0x42,0x55,0x46,0x41,0x48,0x4C,0x50, /* 000001F8 "`BUFAHLP" */
+- 0x31,0x42,0x55,0x46,0x30,0x60,0x75,0x60, /* 00000200 "1BUF0`u`" */
+- 0x14,0x1F,0x48,0x4C,0x50,0x33,0x02,0xA0, /* 00000208 "..HLP3.." */
+- 0x18,0x95,0x69,0x87,0x68,0x8C,0x68,0x69, /* 00000210 "..i.h.hi" */
+- 0x54,0x4D,0x50,0x31,0x70,0x57,0x50,0x52, /* 00000218 "TMP1pWPR" */
+- 0x54,0x0A,0x7D,0x00,0x54,0x4D,0x50,0x31, /* 00000220 "T.}.TMP1" */
+- 0x14,0x23,0x48,0x4C,0x50,0x34,0x00,0x70, /* 00000228 ".#HLP4.p" */
+- 0x00,0x60,0xA2,0x19,0x95,0x60,0x42,0x55, /* 00000230 ".`...`BU" */
+- 0x46,0x42,0x72,0x42,0x55,0x46,0x41,0x60, /* 00000238 "FBrBUFA`" */
+- 0x61,0x48,0x4C,0x50,0x33,0x42,0x55,0x46, /* 00000240 "aHLP3BUF" */
+- 0x30,0x61,0x75,0x60,0x14,0x42,0x04,0x48, /* 00000248 "0au`.B.H" */
+- 0x4C,0x50,0x35,0x00,0x48,0x4C,0x50,0x32, /* 00000250 "LP5.HLP2" */
+- 0x70,0x57,0x50,0x52,0x54,0x0A,0x79,0x00, /* 00000258 "pWPRT.y." */
+- 0x42,0x55,0x46,0x42,0x72,0x42,0x55,0x46, /* 00000260 "BUFBrBUF" */
+- 0x41,0x42,0x55,0x46,0x42,0x60,0xA0,0x1C, /* 00000268 "ABUFB`.." */
+- 0x95,0x87,0x42,0x55,0x46,0x30,0x60,0x70, /* 00000270 "..BUF0`p" */
+- 0x87,0x42,0x55,0x46,0x30,0x60,0x74,0x60, /* 00000278 ".BUF0`t`" */
+- 0x42,0x55,0x46,0x41,0x60,0x70,0x60,0x42, /* 00000280 "BUFA`p`B" */
+- 0x55,0x46,0x42,0x48,0x4C,0x50,0x34,0x14, /* 00000288 "UFBHLP4." */
+- 0x32,0x48,0x4C,0x50,0x36,0x00,0x70,0x42, /* 00000290 "2HLP6.pB" */
+- 0x55,0x46,0x41,0x60,0x75,0x60,0xA0,0x21, /* 00000298 "UFA`u`.!" */
+- 0x92,0x94,0x60,0x87,0x42,0x55,0x46,0x30, /* 000002A0 "..`.BUF0" */
+- 0x8C,0x42,0x55,0x46,0x30,0x42,0x55,0x46, /* 000002A8 ".BUF0BUF" */
+- 0x41,0x54,0x4D,0x50,0x31,0x70,0x60,0x42, /* 000002B0 "ATMP1p`B" */
+- 0x55,0x46,0x41,0xA4,0x54,0x4D,0x50,0x31, /* 000002B8 "UFA.TMP1" */
+- 0xA4,0x00,0x14,0x35,0x48,0x4C,0x50,0x37, /* 000002C0 "...5HLP7" */
+- 0x00,0x70,0x42,0x55,0x46,0x41,0x60,0x72, /* 000002C8 ".pBUFA`r" */
+- 0x60,0x0A,0x04,0x60,0xA0,0x21,0x92,0x94, /* 000002D0 "`..`.!.." */
+- 0x60,0x87,0x42,0x55,0x46,0x30,0x8A,0x42, /* 000002D8 "`.BUF0.B" */
+- 0x55,0x46,0x30,0x42,0x55,0x46,0x41,0x53, /* 000002E0 "UF0BUFAS" */
+- 0x58,0x32,0x32,0x70,0x60,0x42,0x55,0x46, /* 000002E8 "X22p`BUF" */
+- 0x41,0xA4,0x53,0x58,0x32,0x32,0xA4,0x00, /* 000002F0 "A.SX22.." */
+- 0x14,0x1C,0x48,0x4C,0x50,0x38,0x02,0xA0, /* 000002F8 "..HLP8.." */
+- 0x15,0x95,0x69,0x87,0x68,0x8C,0x68,0x69, /* 00000300 "..i.h.hi" */
+- 0x54,0x4D,0x50,0x31,0x70,0x48,0x4C,0x50, /* 00000308 "TMP1pHLP" */
+- 0x36,0x54,0x4D,0x50,0x31,0x14,0x16,0x48, /* 00000310 "6TMP1..H" */
+- 0x4C,0x50,0x39,0x02,0x70,0x00,0x60,0xA2, /* 00000318 "LP9.p.`." */
+- 0x0C,0x95,0x60,0x69,0x48,0x4C,0x50,0x38, /* 00000320 "..`iHLP8" */
+- 0x68,0x60,0x75,0x60,0x14,0x22,0x48,0x4C, /* 00000328 "h`u`."HL" */
+- 0x50,0x41,0x00,0x70,0x48,0x4C,0x50,0x36, /* 00000330 "PA.pHLP6" */
+- 0x60,0x08,0x54,0x4D,0x50,0x5F,0x11,0x02, /* 00000338 "`.TMP_.." */
+- 0x60,0x48,0x4C,0x50,0x39,0x54,0x4D,0x50, /* 00000340 "`HLP9TMP" */
+- 0x5F,0x60,0xA4,0x54,0x4D,0x50,0x5F,0x14, /* 00000348 "_`.TMP_." */
+- 0x0C,0x52,0x45,0x4C,0x5F,0x00,0x5B,0x27, /* 00000350 ".REL_.['" */
+- 0x53,0x59,0x4E,0x43,0x5B,0x82,0x3C,0x41, /* 00000358 "SYNC[.<A" */
+- 0x43,0x5F,0x5F,0x08,0x5F,0x48,0x49,0x44, /* 00000360 "C__._HID" */
+- 0x0D,0x41,0x43,0x50,0x49,0x30,0x30,0x30, /* 00000368 ".ACPI000" */
+- 0x33,0x00,0x08,0x5F,0x50,0x43,0x4C,0x12, /* 00000370 "3.._PCL." */
+- 0x0F,0x03,0x5C,0x5F,0x53,0x42,0x5F,0x42, /* 00000378 "..\_SB_B" */
+- 0x41,0x54,0x30,0x42,0x41,0x54,0x31,0x14, /* 00000380 "AT0BAT1." */
+- 0x08,0x5F,0x50,0x53,0x52,0x00,0xA4,0x00, /* 00000388 "._PSR..." */
+- 0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4, /* 00000390 ".._STA.." */
+- 0x0A,0x0F,0x08,0x42,0x49,0x46,0x50,0x12, /* 00000398 "...BIFP." */
+- 0x02,0x0D,0x14,0x49,0x0C,0x42,0x49,0x46, /* 000003A0 "...I.BIF" */
+- 0x5F,0x01,0x41,0x43,0x51,0x52,0x49,0x4E, /* 000003A8 "_.ACQRIN" */
+- 0x49,0x54,0x01,0x49,0x4E,0x49,0x54,0x68, /* 000003B0 "IT.INITh" */
+- 0x48,0x4C,0x50,0x35,0x70,0x48,0x4C,0x50, /* 000003B8 "HLP5pHLP" */
+- 0x37,0x88,0x42,0x49,0x46,0x50,0x00,0x00, /* 000003C0 "7.BIFP.." */
+- 0x70,0x48,0x4C,0x50,0x37,0x88,0x42,0x49, /* 000003C8 "pHLP7.BI" */
+- 0x46,0x50,0x01,0x00,0x70,0x48,0x4C,0x50, /* 000003D0 "FP..pHLP" */
+- 0x37,0x88,0x42,0x49,0x46,0x50,0x0A,0x02, /* 000003D8 "7.BIFP.." */
+- 0x00,0x70,0x48,0x4C,0x50,0x37,0x88,0x42, /* 000003E0 ".pHLP7.B" */
+- 0x49,0x46,0x50,0x0A,0x03,0x00,0x70,0x48, /* 000003E8 "IFP...pH" */
+- 0x4C,0x50,0x37,0x88,0x42,0x49,0x46,0x50, /* 000003F0 "LP7.BIFP" */
+- 0x0A,0x04,0x00,0x70,0x48,0x4C,0x50,0x37, /* 000003F8 "...pHLP7" */
+- 0x88,0x42,0x49,0x46,0x50,0x0A,0x05,0x00, /* 00000400 ".BIFP..." */
+- 0x70,0x48,0x4C,0x50,0x37,0x88,0x42,0x49, /* 00000408 "pHLP7.BI" */
+- 0x46,0x50,0x0A,0x06,0x00,0x70,0x48,0x4C, /* 00000410 "FP...pHL" */
+- 0x50,0x37,0x88,0x42,0x49,0x46,0x50,0x0A, /* 00000418 "P7.BIFP." */
+- 0x07,0x00,0x70,0x48,0x4C,0x50,0x37,0x88, /* 00000420 "..pHLP7." */
+- 0x42,0x49,0x46,0x50,0x0A,0x08,0x00,0x70, /* 00000428 "BIFP...p" */
+- 0x48,0x4C,0x50,0x41,0x88,0x42,0x49,0x46, /* 00000430 "HLPA.BIF" */
+- 0x50,0x0A,0x09,0x00,0x70,0x48,0x4C,0x50, /* 00000438 "P...pHLP" */
+- 0x41,0x88,0x42,0x49,0x46,0x50,0x0A,0x0A, /* 00000440 "A.BIFP.." */
+- 0x00,0x70,0x48,0x4C,0x50,0x41,0x88,0x42, /* 00000448 ".pHLPA.B" */
+- 0x49,0x46,0x50,0x0A,0x0B,0x00,0x70,0x48, /* 00000450 "IFP...pH" */
+- 0x4C,0x50,0x41,0x88,0x42,0x49,0x46,0x50, /* 00000458 "LPA.BIFP" */
+- 0x0A,0x0C,0x00,0x52,0x45,0x4C,0x5F,0xA4, /* 00000460 "...REL_." */
+- 0x42,0x49,0x46,0x50,0x5B,0x82,0x4F,0x0B, /* 00000468 "BIFP[.O." */
+- 0x42,0x41,0x54,0x30,0x08,0x5F,0x48,0x49, /* 00000470 "BAT0._HI" */
+- 0x44,0x0C,0x41,0xD0,0x0C,0x0A,0x08,0x5F, /* 00000478 "D.A...._" */
+- 0x55,0x49,0x44,0x01,0x08,0x5F,0x50,0x43, /* 00000480 "UID.._PC" */
+- 0x4C,0x12,0x07,0x01,0x5C,0x5F,0x53,0x42, /* 00000488 "L...\_SB" */
+- 0x5F,0x14,0x14,0x5F,0x53,0x54,0x41,0x00, /* 00000490 "_.._STA." */
+- 0x70,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50, /* 00000498 "p\._SB_P" */
+- 0x38,0x38,0x5F,0x60,0xA4,0x60,0x14,0x0F, /* 000004A0 "88_`.`.." */
+- 0x5F,0x42,0x49,0x46,0x00,0x70,0x42,0x49, /* 000004A8 "_BIF.pBI" */
+- 0x46,0x5F,0x01,0x60,0xA4,0x60,0x14,0x46, /* 000004B0 "F_.`.`.F" */
+- 0x07,0x5F,0x42,0x53,0x54,0x00,0x70,0x01, /* 000004B8 "._BST.p." */
+- 0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x44,0x42, /* 000004C0 "\._SB_DB" */
+- 0x47,0x31,0x41,0x43,0x51,0x52,0x49,0x4E, /* 000004C8 "G1ACQRIN" */
+- 0x49,0x54,0x0A,0x02,0x49,0x4E,0x49,0x54, /* 000004D0 "IT..INIT" */
+- 0x01,0x48,0x4C,0x50,0x35,0x08,0x42,0x53, /* 000004D8 ".HLP5.BS" */
+- 0x54,0x30,0x12,0x02,0x04,0x70,0x48,0x4C, /* 000004E0 "T0...pHL" */
+- 0x50,0x37,0x88,0x42,0x53,0x54,0x30,0x00, /* 000004E8 "P7.BST0." */
+- 0x00,0x70,0x48,0x4C,0x50,0x37,0x88,0x42, /* 000004F0 ".pHLP7.B" */
+- 0x53,0x54,0x30,0x01,0x00,0x70,0x48,0x4C, /* 000004F8 "ST0..pHL" */
+- 0x50,0x37,0x88,0x42,0x53,0x54,0x30,0x0A, /* 00000500 "P7.BST0." */
+- 0x02,0x00,0x70,0x48,0x4C,0x50,0x37,0x88, /* 00000508 "..pHLP7." */
+- 0x42,0x53,0x54,0x30,0x0A,0x03,0x00,0x52, /* 00000510 "BST0...R" */
+- 0x45,0x4C,0x5F,0x70,0x0A,0x02,0x5C,0x2E, /* 00000518 "EL_p..\." */
+- 0x5F,0x53,0x42,0x5F,0x44,0x42,0x47,0x31, /* 00000520 "_SB_DBG1" */
+- 0xA4,0x42,0x53,0x54,0x30,0x5B,0x82,0x47, /* 00000528 ".BST0[.G" */
+- 0x0A,0x42,0x41,0x54,0x31,0x08,0x5F,0x48, /* 00000530 ".BAT1._H" */
+- 0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0A,0x08, /* 00000538 "ID.A...." */
+- 0x5F,0x55,0x49,0x44,0x0A,0x02,0x08,0x5F, /* 00000540 "_UID..._" */
+- 0x50,0x43,0x4C,0x12,0x07,0x01,0x5C,0x5F, /* 00000548 "PCL...\_" */
+- 0x53,0x42,0x5F,0x14,0x09,0x5F,0x53,0x54, /* 00000550 "SB_.._ST" */
+- 0x41,0x00,0xA4,0x0A,0x0F,0x14,0x19,0x5F, /* 00000558 "A......_" */
+- 0x42,0x49,0x46,0x00,0x70,0x5C,0x2E,0x5F, /* 00000560 "BIF.p\._" */
+- 0x53,0x42,0x5F,0x50,0x42,0x32,0x5F,0x60, /* 00000568 "SB_PB2_`" */
+- 0xA4,0x42,0x49,0x46,0x5F,0x0A,0x02,0x14, /* 00000570 ".BIF_..." */
+- 0x4E,0x05,0x5F,0x42,0x53,0x54,0x00,0x41, /* 00000578 "N._BST.A" */
+- 0x43,0x51,0x52,0x49,0x4E,0x49,0x54,0x0A, /* 00000580 "CQRINIT." */
+- 0x02,0x49,0x4E,0x49,0x54,0x0A,0x02,0x48, /* 00000588 ".INIT..H" */
+- 0x4C,0x50,0x35,0x08,0x42,0x53,0x54,0x31, /* 00000590 "LP5.BST1" */
+- 0x12,0x02,0x04,0x70,0x48,0x4C,0x50,0x37, /* 00000598 "...pHLP7" */
+- 0x88,0x42,0x53,0x54,0x31,0x00,0x00,0x70, /* 000005A0 ".BST1..p" */
+- 0x48,0x4C,0x50,0x37,0x88,0x42,0x53,0x54, /* 000005A8 "HLP7.BST" */
+- 0x31,0x01,0x00,0x70,0x48,0x4C,0x50,0x37, /* 000005B0 "1..pHLP7" */
+- 0x88,0x42,0x53,0x54,0x31,0x0A,0x02,0x00, /* 000005B8 ".BST1..." */
+- 0x70,0x48,0x4C,0x50,0x37,0x88,0x42,0x53, /* 000005C0 "pHLP7.BS" */
+- 0x54,0x31,0x0A,0x03,0x00,0x52,0x45,0x4C, /* 000005C8 "T1...REL" */
+- 0x5F,0xA4,0x42,0x53,0x54,0x31,
++ 0x80,0x50,0x42,0x4F,0x50,0x01,0x0B,0x00, /* 000000D8 ".PBOP..." */
++ 0x02,0x01,0x5B,0x81,0x10,0x50,0x42,0x4F, /* 000000E0 "..[..PBO" */
++ 0x50,0x41,0x53,0x4C,0x50,0x5F,0x01,0x57, /* 000000E8 "PASLP_.W" */
++ 0x41,0x4B,0x5F,0x01,0x5B,0x01,0x53,0x59, /* 000000F0 "AK_.[.SY" */
++ 0x4E,0x43,0x01,0x08,0x42,0x55,0x46,0x30, /* 000000F8 "NC..BUF0" */
++ 0x11,0x04,0x0B,0x00,0x01,0x08,0x42,0x55, /* 00000100 "......BU" */
++ 0x46,0x31,0x11,0x03,0x0A,0x08,0x8B,0x42, /* 00000108 "F1.....B" */
++ 0x55,0x46,0x31,0x00,0x42,0x55,0x46,0x41, /* 00000110 "UF1.BUFA" */
++ 0x8B,0x42,0x55,0x46,0x31,0x0A,0x04,0x42, /* 00000118 ".BUF1..B" */
++ 0x55,0x46,0x42,0x14,0x14,0x41,0x43,0x51, /* 00000120 "UFB..ACQ" */
++ 0x52,0x00,0x5B,0x23,0x53,0x59,0x4E,0x43, /* 00000128 "R.[#SYNC" */
++ 0xFF,0xFF,0x70,0x00,0x42,0x55,0x46,0x41, /* 00000130 "..p.BUFA" */
++ 0x14,0x31,0x49,0x4E,0x49,0x54,0x01,0x70, /* 00000138 ".1INIT.p" */
++ 0x42,0x55,0x46,0x41,0x60,0x75,0x60,0xA0, /* 00000140 "BUFA`u`." */
++ 0x22,0x92,0x94,0x60,0x87,0x42,0x55,0x46, /* 00000148 ""..`.BUF" */
++ 0x30,0x8C,0x42,0x55,0x46,0x30,0x42,0x55, /* 00000150 "0.BUF0BU" */
++ 0x46,0x41,0x54,0x4D,0x50,0x31,0x70,0x68, /* 00000158 "FATMP1ph" */
++ 0x54,0x4D,0x50,0x31,0x70,0x60,0x42,0x55, /* 00000160 "TMP1p`BU" */
++ 0x46,0x41,0x14,0x48,0x07,0x57,0x50,0x52, /* 00000168 "FA.H.WPR" */
++ 0x54,0x02,0x70,0x69,0x5C,0x2E,0x5F,0x53, /* 00000170 "T.pi\._S" */
++ 0x42,0x5F,0x50,0x38,0x36,0x5F,0x70,0x68, /* 00000178 "B_P86_ph" */
++ 0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50,0x42, /* 00000180 "\._SB_PB" */
++ 0x32,0x5F,0x70,0x68,0x5C,0x2E,0x5F,0x53, /* 00000188 "2_ph\._S" */
++ 0x42,0x5F,0x44,0x42,0x47,0x32,0x70,0x69, /* 00000190 "B_DBG2pi" */
++ 0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x44,0x42, /* 00000198 "\._SB_DB" */
++ 0x47,0x34,0x70,0x5C,0x2E,0x5F,0x53,0x42, /* 000001A0 "G4p\._SB" */
++ 0x5F,0x50,0x42,0x32,0x5F,0x60,0xA2,0x11, /* 000001A8 "_PB2_`.." */
++ 0x92,0x93,0x60,0x00,0x70,0x5C,0x2E,0x5F, /* 000001B0 "..`.p\._" */
++ 0x53,0x42,0x5F,0x50,0x42,0x32,0x5F,0x60, /* 000001B8 "SB_PB2_`" */
++ 0x70,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50, /* 000001C0 "p\._SB_P" */
++ 0x38,0x36,0x5F,0x61,0x70,0x61,0x5C,0x2E, /* 000001C8 "86_apa\." */
++ 0x5F,0x53,0x42,0x5F,0x44,0x42,0x47,0x33, /* 000001D0 "_SB_DBG3" */
++ 0xA4,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50, /* 000001D8 ".\._SB_P" */
++ 0x38,0x36,0x5F,0x14,0x1D,0x48,0x4C,0x50, /* 000001E0 "86_..HLP" */
++ 0x31,0x02,0xA0,0x16,0x95,0x69,0x87,0x68, /* 000001E8 "1....i.h" */
++ 0x8C,0x68,0x69,0x54,0x4D,0x50,0x31,0x57, /* 000001F0 ".hiTMP1W" */
++ 0x50,0x52,0x54,0x0A,0x7C,0x54,0x4D,0x50, /* 000001F8 "PRT.|TMP" */
++ 0x31,0x14,0x23,0x48,0x4C,0x50,0x32,0x00, /* 00000200 "1.#HLP2." */
++ 0x57,0x50,0x52,0x54,0x0A,0x7B,0x00,0x70, /* 00000208 "WPRT.{.p" */
++ 0x00,0x60,0xA2,0x12,0x95,0x60,0x42,0x55, /* 00000210 ".`...`BU" */
++ 0x46,0x41,0x48,0x4C,0x50,0x31,0x42,0x55, /* 00000218 "FAHLP1BU" */
++ 0x46,0x30,0x60,0x75,0x60,0x14,0x1F,0x48, /* 00000220 "F0`u`..H" */
++ 0x4C,0x50,0x33,0x02,0xA0,0x18,0x95,0x69, /* 00000228 "LP3....i" */
++ 0x87,0x68,0x8C,0x68,0x69,0x54,0x4D,0x50, /* 00000230 ".h.hiTMP" */
++ 0x31,0x70,0x57,0x50,0x52,0x54,0x0A,0x7D, /* 00000238 "1pWPRT.}" */
++ 0x00,0x54,0x4D,0x50,0x31,0x14,0x23,0x48, /* 00000240 ".TMP1.#H" */
++ 0x4C,0x50,0x34,0x00,0x70,0x00,0x60,0xA2, /* 00000248 "LP4.p.`." */
++ 0x19,0x95,0x60,0x42,0x55,0x46,0x42,0x72, /* 00000250 "..`BUFBr" */
++ 0x42,0x55,0x46,0x41,0x60,0x61,0x48,0x4C, /* 00000258 "BUFA`aHL" */
++ 0x50,0x33,0x42,0x55,0x46,0x30,0x61,0x75, /* 00000260 "P3BUF0au" */
++ 0x60,0x14,0x42,0x04,0x48,0x4C,0x50,0x35, /* 00000268 "`.B.HLP5" */
++ 0x00,0x48,0x4C,0x50,0x32,0x70,0x57,0x50, /* 00000270 ".HLP2pWP" */
++ 0x52,0x54,0x0A,0x79,0x00,0x42,0x55,0x46, /* 00000278 "RT.y.BUF" */
++ 0x42,0x72,0x42,0x55,0x46,0x41,0x42,0x55, /* 00000280 "BrBUFABU" */
++ 0x46,0x42,0x60,0xA0,0x1C,0x95,0x87,0x42, /* 00000288 "FB`....B" */
++ 0x55,0x46,0x30,0x60,0x70,0x87,0x42,0x55, /* 00000290 "UF0`p.BU" */
++ 0x46,0x30,0x60,0x74,0x60,0x42,0x55,0x46, /* 00000298 "F0`t`BUF" */
++ 0x41,0x60,0x70,0x60,0x42,0x55,0x46,0x42, /* 000002A0 "A`p`BUFB" */
++ 0x48,0x4C,0x50,0x34,0x14,0x32,0x48,0x4C, /* 000002A8 "HLP4.2HL" */
++ 0x50,0x36,0x00,0x70,0x42,0x55,0x46,0x41, /* 000002B0 "P6.pBUFA" */
++ 0x60,0x75,0x60,0xA0,0x21,0x92,0x94,0x60, /* 000002B8 "`u`.!..`" */
++ 0x87,0x42,0x55,0x46,0x30,0x8C,0x42,0x55, /* 000002C0 ".BUF0.BU" */
++ 0x46,0x30,0x42,0x55,0x46,0x41,0x54,0x4D, /* 000002C8 "F0BUFATM" */
++ 0x50,0x31,0x70,0x60,0x42,0x55,0x46,0x41, /* 000002D0 "P1p`BUFA" */
++ 0xA4,0x54,0x4D,0x50,0x31,0xA4,0x00,0x14, /* 000002D8 ".TMP1..." */
++ 0x35,0x48,0x4C,0x50,0x37,0x00,0x70,0x42, /* 000002E0 "5HLP7.pB" */
++ 0x55,0x46,0x41,0x60,0x72,0x60,0x0A,0x04, /* 000002E8 "UFA`r`.." */
++ 0x60,0xA0,0x21,0x92,0x94,0x60,0x87,0x42, /* 000002F0 "`.!..`.B" */
++ 0x55,0x46,0x30,0x8A,0x42,0x55,0x46,0x30, /* 000002F8 "UF0.BUF0" */
++ 0x42,0x55,0x46,0x41,0x53,0x58,0x32,0x32, /* 00000300 "BUFASX22" */
++ 0x70,0x60,0x42,0x55,0x46,0x41,0xA4,0x53, /* 00000308 "p`BUFA.S" */
++ 0x58,0x32,0x32,0xA4,0x00,0x14,0x1C,0x48, /* 00000310 "X22....H" */
++ 0x4C,0x50,0x38,0x02,0xA0,0x15,0x95,0x69, /* 00000318 "LP8....i" */
++ 0x87,0x68,0x8C,0x68,0x69,0x54,0x4D,0x50, /* 00000320 ".h.hiTMP" */
++ 0x31,0x70,0x48,0x4C,0x50,0x36,0x54,0x4D, /* 00000328 "1pHLP6TM" */
++ 0x50,0x31,0x14,0x16,0x48,0x4C,0x50,0x39, /* 00000330 "P1..HLP9" */
++ 0x02,0x70,0x00,0x60,0xA2,0x0C,0x95,0x60, /* 00000338 ".p.`...`" */
++ 0x69,0x48,0x4C,0x50,0x38,0x68,0x60,0x75, /* 00000340 "iHLP8h`u" */
++ 0x60,0x14,0x22,0x48,0x4C,0x50,0x41,0x00, /* 00000348 "`."HLPA." */
++ 0x70,0x48,0x4C,0x50,0x36,0x60,0x08,0x54, /* 00000350 "pHLP6`.T" */
++ 0x4D,0x50,0x5F,0x11,0x02,0x60,0x48,0x4C, /* 00000358 "MP_..`HL" */
++ 0x50,0x39,0x54,0x4D,0x50,0x5F,0x60,0xA4, /* 00000360 "P9TMP_`." */
++ 0x54,0x4D,0x50,0x5F,0x14,0x0C,0x52,0x45, /* 00000368 "TMP_..RE" */
++ 0x4C,0x5F,0x00,0x5B,0x27,0x53,0x59,0x4E, /* 00000370 "L_.['SYN" */
++ 0x43,0x14,0x41,0x05,0x45,0x30,0x5F,0x5F, /* 00000378 "C.A.E0__" */
++ 0x00,0xA0,0x24,0x5C,0x2E,0x5F,0x53,0x42, /* 00000380 "..$\._SB" */
++ 0x5F,0x53,0x4C,0x50,0x5F,0x70,0x01,0x5C, /* 00000388 "_SLP_p.\" */
++ 0x2E,0x5F,0x53,0x42,0x5F,0x53,0x4C,0x50, /* 00000390 "._SB_SLP" */
++ 0x5F,0x86,0x5C,0x2E,0x5F,0x53,0x42,0x5F, /* 00000398 "_.\._SB_" */
++ 0x53,0x4C,0x50,0x42,0x0A,0x80,0xA0,0x24, /* 000003A0 "SLPB...$" */
++ 0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x57,0x41, /* 000003A8 "\._SB_WA" */
++ 0x4B,0x5F,0x70,0x01,0x5C,0x2E,0x5F,0x53, /* 000003B0 "K_p.\._S" */
++ 0x42,0x5F,0x57,0x41,0x4B,0x5F,0x86,0x5C, /* 000003B8 "B_WAK_.\" */
++ 0x2E,0x5F,0x53,0x42,0x5F,0x53,0x4C,0x50, /* 000003C0 "._SB_SLP" */
++ 0x42,0x0A,0x02,0x14,0x41,0x05,0x45,0x31, /* 000003C8 "B...A.E1" */
++ 0x5F,0x5F,0x00,0xA0,0x24,0x5C,0x2E,0x5F, /* 000003D0 "__..$\._" */
++ 0x53,0x42,0x5F,0x53,0x4C,0x50,0x5F,0x70, /* 000003D8 "SB_SLP_p" */
++ 0x01,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x53, /* 000003E0 ".\._SB_S" */
++ 0x4C,0x50,0x5F,0x86,0x5C,0x2E,0x5F,0x53, /* 000003E8 "LP_.\._S" */
++ 0x42,0x5F,0x50,0x42,0x54,0x4E,0x0A,0x80, /* 000003F0 "B_PBTN.." */
++ 0xA0,0x24,0x5C,0x2E,0x5F,0x53,0x42,0x5F, /* 000003F8 ".$\._SB_" */
++ 0x57,0x41,0x4B,0x5F,0x70,0x01,0x5C,0x2E, /* 00000400 "WAK_p.\." */
++ 0x5F,0x53,0x42,0x5F,0x57,0x41,0x4B,0x5F, /* 00000408 "_SB_WAK_" */
++ 0x86,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50, /* 00000410 ".\._SB_P" */
++ 0x42,0x54,0x4E,0x0A,0x02,0x14,0x13,0x45, /* 00000418 "BTN....E" */
++ 0x31,0x43,0x5F,0x00,0x86,0x5C,0x2E,0x5F, /* 00000420 "1C_..\._" */
++ 0x53,0x42,0x5F,0x41,0x43,0x5F,0x5F,0x0A, /* 00000428 "SB_AC__." */
++ 0x80,0x14,0x13,0x45,0x31,0x37,0x5F,0x00, /* 00000430 "...E17_." */
++ 0x86,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x4C, /* 00000438 ".\._SB_L" */
++ 0x49,0x44,0x5F,0x0A,0x80,0x5B,0x82,0x48, /* 00000440 "ID_..[.H" */
++ 0x05,0x4C,0x49,0x44,0x5F,0x08,0x5F,0x48, /* 00000448 ".LID_._H" */
++ 0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0D,0x14, /* 00000450 "ID.A...." */
++ 0x1D,0x5F,0x4C,0x49,0x44,0x00,0x70,0x5C, /* 00000458 "._LID.p\" */
++ 0x2E,0x5F,0x53,0x42,0x5F,0x50,0x38,0x38, /* 00000460 "._SB_P88" */
++ 0x5F,0x60,0xA0,0x08,0x7B,0x60,0x0A,0x04, /* 00000468 "_`..{`.." */
++ 0x00,0xA4,0x01,0xA4,0x00,0x08,0x5F,0x50, /* 00000470 "......_P" */
++ 0x52,0x57,0x12,0x06,0x02,0x0A,0x17,0x0A, /* 00000478 "RW......" */
++ 0x03,0x14,0x1D,0x5F,0x50,0x53,0x57,0x01, /* 00000480 "..._PSW." */
++ 0x70,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50, /* 00000488 "p\._SB_P" */
++ 0x38,0x38,0x5F,0x60,0xA0,0x08,0x7B,0x60, /* 00000490 "88_`..{`" */
++ 0x0A,0x04,0x00,0xA4,0x01,0xA4,0x00,0x5B, /* 00000498 ".......[" */
++ 0x82,0x1A,0x50,0x42,0x54,0x4E,0x08,0x5F, /* 000004A0 "..PBTN._" */
++ 0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C,0x0C, /* 000004A8 "HID.A..." */
++ 0x08,0x5F,0x50,0x52,0x57,0x12,0x05,0x02, /* 000004B0 "._PRW..." */
++ 0x01,0x0A,0x04,0x5B,0x82,0x1A,0x53,0x4C, /* 000004B8 "...[..SL" */
++ 0x50,0x42,0x08,0x5F,0x48,0x49,0x44,0x0C, /* 000004C0 "PB._HID." */
++ 0x41,0xD0,0x0C,0x0E,0x08,0x5F,0x50,0x52, /* 000004C8 "A...._PR" */
++ 0x57,0x12,0x05,0x02,0x01,0x0A,0x04,0x5B, /* 000004D0 "W......[" */
++ 0x82,0x41,0x05,0x41,0x43,0x5F,0x5F,0x08, /* 000004D8 ".A.AC__." */
++ 0x5F,0x48,0x49,0x44,0x0D,0x41,0x43,0x50, /* 000004E0 "_HID.ACP" */
++ 0x49,0x30,0x30,0x30,0x33,0x00,0x08,0x5F, /* 000004E8 "I0003.._" */
++ 0x50,0x43,0x4C,0x12,0x0F,0x03,0x5C,0x5F, /* 000004F0 "PCL...\_" */
++ 0x53,0x42,0x5F,0x42,0x41,0x54,0x30,0x42, /* 000004F8 "SB_BAT0B" */
++ 0x41,0x54,0x31,0x14,0x1C,0x5F,0x50,0x53, /* 00000500 "AT1.._PS" */
++ 0x52,0x00,0x70,0x5C,0x2E,0x5F,0x53,0x42, /* 00000508 "R.p\._SB" */
++ 0x5F,0x50,0x38,0x38,0x5F,0x60,0xA0,0x07, /* 00000510 "_P88_`.." */
++ 0x7B,0x60,0x01,0x00,0xA4,0x01,0xA4,0x00, /* 00000518 "{`......" */
++ 0x14,0x09,0x5F,0x53,0x54,0x41,0x00,0xA4, /* 00000520 ".._STA.." */
++ 0x0A,0x0F,0x08,0x42,0x49,0x46,0x50,0x12, /* 00000528 "...BIFP." */
++ 0x02,0x0D,0x14,0x49,0x0C,0x42,0x49,0x46, /* 00000530 "...I.BIF" */
++ 0x5F,0x01,0x41,0x43,0x51,0x52,0x49,0x4E, /* 00000538 "_.ACQRIN" */
++ 0x49,0x54,0x01,0x49,0x4E,0x49,0x54,0x68, /* 00000540 "IT.INITh" */
++ 0x48,0x4C,0x50,0x35,0x70,0x48,0x4C,0x50, /* 00000548 "HLP5pHLP" */
++ 0x37,0x88,0x42,0x49,0x46,0x50,0x00,0x00, /* 00000550 "7.BIFP.." */
++ 0x70,0x48,0x4C,0x50,0x37,0x88,0x42,0x49, /* 00000558 "pHLP7.BI" */
++ 0x46,0x50,0x01,0x00,0x70,0x48,0x4C,0x50, /* 00000560 "FP..pHLP" */
++ 0x37,0x88,0x42,0x49,0x46,0x50,0x0A,0x02, /* 00000568 "7.BIFP.." */
++ 0x00,0x70,0x48,0x4C,0x50,0x37,0x88,0x42, /* 00000570 ".pHLP7.B" */
++ 0x49,0x46,0x50,0x0A,0x03,0x00,0x70,0x48, /* 00000578 "IFP...pH" */
++ 0x4C,0x50,0x37,0x88,0x42,0x49,0x46,0x50, /* 00000580 "LP7.BIFP" */
++ 0x0A,0x04,0x00,0x70,0x48,0x4C,0x50,0x37, /* 00000588 "...pHLP7" */
++ 0x88,0x42,0x49,0x46,0x50,0x0A,0x05,0x00, /* 00000590 ".BIFP..." */
++ 0x70,0x48,0x4C,0x50,0x37,0x88,0x42,0x49, /* 00000598 "pHLP7.BI" */
++ 0x46,0x50,0x0A,0x06,0x00,0x70,0x48,0x4C, /* 000005A0 "FP...pHL" */
++ 0x50,0x37,0x88,0x42,0x49,0x46,0x50,0x0A, /* 000005A8 "P7.BIFP." */
++ 0x07,0x00,0x70,0x48,0x4C,0x50,0x37,0x88, /* 000005B0 "..pHLP7." */
++ 0x42,0x49,0x46,0x50,0x0A,0x08,0x00,0x70, /* 000005B8 "BIFP...p" */
++ 0x48,0x4C,0x50,0x41,0x88,0x42,0x49,0x46, /* 000005C0 "HLPA.BIF" */
++ 0x50,0x0A,0x09,0x00,0x70,0x48,0x4C,0x50, /* 000005C8 "P...pHLP" */
++ 0x41,0x88,0x42,0x49,0x46,0x50,0x0A,0x0A, /* 000005D0 "A.BIFP.." */
++ 0x00,0x70,0x48,0x4C,0x50,0x41,0x88,0x42, /* 000005D8 ".pHLPA.B" */
++ 0x49,0x46,0x50,0x0A,0x0B,0x00,0x70,0x48, /* 000005E0 "IFP...pH" */
++ 0x4C,0x50,0x41,0x88,0x42,0x49,0x46,0x50, /* 000005E8 "LPA.BIFP" */
++ 0x0A,0x0C,0x00,0x52,0x45,0x4C,0x5F,0xA4, /* 000005F0 "...REL_." */
++ 0x42,0x49,0x46,0x50,0x5B,0x82,0x41,0x0B, /* 000005F8 "BIFP[.A." */
++ 0x42,0x41,0x54,0x30,0x08,0x5F,0x48,0x49, /* 00000600 "BAT0._HI" */
++ 0x44,0x0C,0x41,0xD0,0x0C,0x0A,0x08,0x5F, /* 00000608 "D.A...._" */
++ 0x55,0x49,0x44,0x01,0x08,0x5F,0x50,0x43, /* 00000610 "UID.._PC" */
++ 0x4C,0x12,0x07,0x01,0x5C,0x5F,0x53,0x42, /* 00000618 "L...\_SB" */
++ 0x5F,0x14,0x1F,0x5F,0x53,0x54,0x41,0x00, /* 00000620 "_.._STA." */
++ 0x70,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x50, /* 00000628 "p\._SB_P" */
++ 0x38,0x38,0x5F,0x60,0xA0,0x09,0x7B,0x60, /* 00000630 "88_`..{`" */
++ 0x0A,0x02,0x00,0xA4,0x0A,0x1F,0xA4,0x0A, /* 00000638 "........" */
++ 0x0F,0x14,0x0F,0x5F,0x42,0x49,0x46,0x00, /* 00000640 "..._BIF." */
++ 0x70,0x42,0x49,0x46,0x5F,0x01,0x60,0xA4, /* 00000648 "pBIF_.`." */
++ 0x60,0x14,0x4D,0x05,0x5F,0x42,0x53,0x54, /* 00000650 "`.M._BST" */
++ 0x00,0x41,0x43,0x51,0x52,0x49,0x4E,0x49, /* 00000658 ".ACQRINI" */
++ 0x54,0x0A,0x02,0x49,0x4E,0x49,0x54,0x01, /* 00000660 "T..INIT." */
++ 0x48,0x4C,0x50,0x35,0x08,0x42,0x53,0x54, /* 00000668 "HLP5.BST" */
++ 0x30,0x12,0x02,0x04,0x70,0x48,0x4C,0x50, /* 00000670 "0...pHLP" */
++ 0x37,0x88,0x42,0x53,0x54,0x30,0x00,0x00, /* 00000678 "7.BST0.." */
++ 0x70,0x48,0x4C,0x50,0x37,0x88,0x42,0x53, /* 00000680 "pHLP7.BS" */
++ 0x54,0x30,0x01,0x00,0x70,0x48,0x4C,0x50, /* 00000688 "T0..pHLP" */
++ 0x37,0x88,0x42,0x53,0x54,0x30,0x0A,0x02, /* 00000690 "7.BST0.." */
++ 0x00,0x70,0x48,0x4C,0x50,0x37,0x88,0x42, /* 00000698 ".pHLP7.B" */
++ 0x53,0x54,0x30,0x0A,0x03,0x00,0x52,0x45, /* 000006A0 "ST0...RE" */
++ 0x4C,0x5F,0xA4,0x42,0x53,0x54,0x30,0x5B, /* 000006A8 "L_.BST0[" */
++ 0x82,0x47,0x0A,0x42,0x41,0x54,0x31,0x08, /* 000006B0 ".G.BAT1." */
++ 0x5F,0x48,0x49,0x44,0x0C,0x41,0xD0,0x0C, /* 000006B8 "_HID.A.." */
++ 0x0A,0x08,0x5F,0x55,0x49,0x44,0x0A,0x02, /* 000006C0 ".._UID.." */
++ 0x08,0x5F,0x50,0x43,0x4C,0x12,0x07,0x01, /* 000006C8 "._PCL..." */
++ 0x5C,0x5F,0x53,0x42,0x5F,0x14,0x09,0x5F, /* 000006D0 "\_SB_.._" */
++ 0x53,0x54,0x41,0x00,0xA4,0x0A,0x0F,0x14, /* 000006D8 "STA....." */
++ 0x19,0x5F,0x42,0x49,0x46,0x00,0x70,0x5C, /* 000006E0 "._BIF.p\" */
++ 0x2E,0x5F,0x53,0x42,0x5F,0x50,0x42,0x32, /* 000006E8 "._SB_PB2" */
++ 0x5F,0x60,0xA4,0x42,0x49,0x46,0x5F,0x0A, /* 000006F0 "_`.BIF_." */
++ 0x02,0x14,0x4E,0x05,0x5F,0x42,0x53,0x54, /* 000006F8 "..N._BST" */
++ 0x00,0x41,0x43,0x51,0x52,0x49,0x4E,0x49, /* 00000700 ".ACQRINI" */
++ 0x54,0x0A,0x02,0x49,0x4E,0x49,0x54,0x0A, /* 00000708 "T..INIT." */
++ 0x02,0x48,0x4C,0x50,0x35,0x08,0x42,0x53, /* 00000710 ".HLP5.BS" */
++ 0x54,0x31,0x12,0x02,0x04,0x70,0x48,0x4C, /* 00000718 "T1...pHL" */
++ 0x50,0x37,0x88,0x42,0x53,0x54,0x31,0x00, /* 00000720 "P7.BST1." */
++ 0x00,0x70,0x48,0x4C,0x50,0x37,0x88,0x42, /* 00000728 ".pHLP7.B" */
++ 0x53,0x54,0x31,0x01,0x00,0x70,0x48,0x4C, /* 00000730 "ST1..pHL" */
++ 0x50,0x37,0x88,0x42,0x53,0x54,0x31,0x0A, /* 00000738 "P7.BST1." */
++ 0x02,0x00,0x70,0x48,0x4C,0x50,0x37,0x88, /* 00000740 "..pHLP7." */
++ 0x42,0x53,0x54,0x31,0x0A,0x03,0x00,0x52, /* 00000748 "BST1...R" */
++ 0x45,0x4C,0x5F,0xA4,0x42,0x53,0x54,0x31, /* 00000750 "EL_.BST1" */
++ 0x10,0x4B,0x04,0x5C,0x5F,0x47,0x50,0x45, /* 00000758 ".K.\_GPE" */
++ 0x14,0x10,0x5F,0x4C,0x30,0x30,0x00,0x5C, /* 00000760 ".._L00.\" */
++ 0x2E,0x5F,0x53,0x42,0x5F,0x45,0x30,0x5F, /* 00000768 "._SB_E0_" */
++ 0x5F,0x14,0x10,0x5F,0x4C,0x30,0x31,0x00, /* 00000770 "_.._L01." */
++ 0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x45,0x31, /* 00000778 "\._SB_E1" */
++ 0x5F,0x5F,0x14,0x10,0x5F,0x4C,0x31,0x43, /* 00000780 "__.._L1C" */
++ 0x00,0x5C,0x2E,0x5F,0x53,0x42,0x5F,0x45, /* 00000788 ".\._SB_E" */
++ 0x31,0x43,0x5F,0x14,0x10,0x5F,0x4C,0x31, /* 00000790 "1C_.._L1" */
++ 0x37,0x00,0x5C,0x2E,0x5F,0x53,0x42,0x5F, /* 00000798 "7.\._SB_" */
++ 0x45,0x31,0x37,0x5F,
+ };
+diff --git a/tools/xenpmd/Makefile b/tools/xenpmd/Makefile
+index 10cb2fb..6881169 100644
+--- a/tools/xenpmd/Makefile
++++ b/tools/xenpmd/Makefile
+@@ -10,6 +10,8 @@ BIN = xenpmd
+ .PHONY: all
+ all: $(BIN)
+
++$(BIN): xenpmd.o acpi-events.o
++
+ .PHONY: install
+ install: all
+ $(INSTALL_DIR) $(DESTDIR)$(SBINDIR)
+@@ -17,9 +19,8 @@ install: all
+
+ .PHONY: clean
+ clean:
+- $(RM) -f $(BIN) $(DEPS)
++ $(RM) -f $(BIN) *.o
+
+-%: %.c Makefile
++%.o: %.c Makefile
+ $(CC) $(CFLAGS) $< $(LDFLAGS) -o $@
+
+--include $(DEPS)
+diff --git a/tools/xenpmd/acpi-events.c b/tools/xenpmd/acpi-events.c
+new file mode 100644
+index 0000000..9e5ad53
+--- /dev/null
++++ b/tools/xenpmd/acpi-events.c
+@@ -0,0 +1,167 @@
++/*
++ * acpi-events.c
++ *
++ * Register for and monitor acpi events and communicate relevant
++ * events to ioemu by triggering xenstore events.
++ *
++ * Copyright (c) 2008 Kamala Narasimhan
++ * Copyright (c) 2008 Citrix Systems, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <pthread.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++#include <unistd.h>
++#include <xs.h>
++
++#define AC_ADAPTER_STATE_FILE_PATH "/proc/acpi/ac_adapter/AC/state"
++#define LID_STATE_FILE_PATH "/proc/acpi/button/lid/LID/state"
++#define ACPID_SOCKET_PATH "/var/run/acpid.socket"
++
++#define XS_AC_ADAPTER_STATE_PATH "/pm/ac_adapter"
++#define XS_LID_STATE_PATH "/pm/lid_state"
++
++#define XS_AC_ADAPTER_EVENT_PATH "/pm/events/acadapterstatechanged"
++#define XS_LID_EVENT_PATH "/pm/events/lidstatechanged"
++#define XS_PBTN_EVENT_PATH "/pm/events/powerbuttonpressed"
++#define XS_SBTN_EVENT_PATH "/pm/events/sleepbuttonpressed"
++
++static int socket_fd;
++static pthread_t acpi_thread;
++extern struct xs_handle *xs;
++
++void write_state_info_in_xenstore(char *file_path, char *xenstore_path,
++ char *search_str, char *default_value, char *alternate_value)
++{
++ FILE *file;
++ char file_data[1024];
++
++ xs_write(xs, XBT_NULL, xenstore_path, default_value, strlen(default_value));
++ file = fopen(file_path, "r");
++ if ( file == NULL )
++ return;
++
++ memset(file_data, 0, 1024);
++ fgets(file_data, 1024, file);
++ if ( strstr(file_data, search_str) )
++ xs_write(xs, XBT_NULL, xenstore_path, alternate_value,
++ strlen(alternate_value));
++ fclose(file);
++}
++
++void initialize_system_state_info(void)
++{
++ write_state_info_in_xenstore(AC_ADAPTER_STATE_FILE_PATH,
++ XS_AC_ADAPTER_STATE_PATH, "off-line", "1", "0");
++ write_state_info_in_xenstore(LID_STATE_FILE_PATH, XS_LID_STATE_PATH,
++ "closed", "1", "0");
++}
++
++void handle_ac_adapter_state_change(void)
++{
++ write_state_info_in_xenstore(AC_ADAPTER_STATE_FILE_PATH,
++ XS_AC_ADAPTER_STATE_PATH, "off-line", "1", "0");
++ xs_write(xs, XBT_NULL, XS_AC_ADAPTER_EVENT_PATH, "1", 1);
++}
++
++void handle_lid_state_change(void)
++{
++ write_state_info_in_xenstore(LID_STATE_FILE_PATH, XS_LID_STATE_PATH,
++ "closed", "1", "0");
++ xs_write(xs, XBT_NULL, XS_LID_EVENT_PATH, "1", 1);
++}
++
++void handle_pbtn_pressed_event(void)
++{
++ xs_write(xs, XBT_NULL, XS_PBTN_EVENT_PATH, "1", 1);
++}
++
++void handle_sbtn_pressed_event(void)
++{
++ xs_write(xs, XBT_NULL, XS_SBTN_EVENT_PATH, "1", 1);
++}
++
++void process_acpi_message(char *acpi_buffer)
++{
++ if ( strstr(acpi_buffer, "ac_adapter") )
++ {
++ handle_ac_adapter_state_change();
++ return;
++ }
++
++ if ( strstr(acpi_buffer, "LID") )
++ {
++ handle_lid_state_change();
++ return;
++ }
++
++ if ( (strstr(acpi_buffer, "PBTN")) ||
++ (strstr(acpi_buffer, "PWRF")) )
++ {
++ handle_pbtn_pressed_event();
++ return;
++ }
++
++ if ( strstr(acpi_buffer, "SBTN") )
++ handle_sbtn_pressed_event();
++}
++
++static void *acpi_events_thread(void *arg)
++{
++ int ret;
++ struct sockaddr_un addr;
++ char acpi_buffer[1024];
++
++ socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
++ if ( socket_fd == -1)
++ return (void *)socket_fd;
++
++ addr.sun_family = AF_UNIX;
++ strncpy(addr.sun_path, ACPID_SOCKET_PATH, strlen(ACPID_SOCKET_PATH));
++ addr.sun_path[strlen(ACPID_SOCKET_PATH)] = '\0';
++ ret = connect(socket_fd, (struct sockaddr *)&addr, sizeof(addr));
++ if ( ret == -1 )
++ return (void *)ret;
++
++ while( 1 )
++ {
++ memset(acpi_buffer, 0, sizeof(acpi_buffer));
++ ret = recv(socket_fd, acpi_buffer, sizeof(acpi_buffer), 0);
++ if ( ret == 0 )
++ continue;
++
++ process_acpi_message(acpi_buffer);
++ }
++
++ return (void *)1;
++}
++
++void monitor_acpi_events(void)
++{
++ pthread_create(&acpi_thread, NULL, &acpi_events_thread, NULL);
++}
++
++void acpi_events_cleanup(void)
++{
++ if ( socket_fd != -1 )
++ close(socket_fd);
++
++ pthread_cancel(acpi_thread);
++}
++
+diff --git a/tools/xenpmd/xenpmd.c b/tools/xenpmd/xenpmd.c
- @@ -493,24 +513,57 @@ static void daemonize(void)
++index 28de744..db8e292 100644
+--- a/tools/xenpmd/xenpmd.c
++++ b/tools/xenpmd/xenpmd.c
+@@ -40,10 +40,11 @@
+ #include <dirent.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
++#include <pthread.h>
+ #include <xs.h>
+
+ /* #define RUN_STANDALONE */
+-#define RUN_IN_SIMULATE_MODE
++/* #define RUN_IN_SIMULATE_MODE */
+
+ enum BATTERY_INFO_TYPE {
+ BIF,
+@@ -84,7 +85,12 @@ struct battery_status {
+ unsigned long present_voltage;
+ };
+
+-static struct xs_handle *xs;
++struct xs_handle *xs;
++static pthread_t worker_thread;
++
++extern void initialize_system_state_info(void);
++extern void monitor_acpi_events(void);
++extern void acpi_events_cleanup(void);
+
+ #ifdef RUN_IN_SIMULATE_MODE
+ #define BATTERY_DIR_PATH "/tmp/battery"
+@@ -218,11 +224,19 @@ void set_attribute_battery_status(char *attrib_name,
+ {
+ if ( strstr(attrib_name, "charging state") )
+ {
+- /* Check this, below is half baked */
+- if ( strstr(attrib_value, "charged") )
+- status->state = 0;
+- else
+- status->state = 1;
++ if ( strstr(attrib_value, "charging/discharging") )
++ status->state |= 0x3;
++ else if ( strstr(attrib_value, "discharging") )
++ status->state |= 0x1;
++ else if ( strstr(attrib_value, "charging") )
++ status->state |= 0x2;
++ return;
++ }
++
++ if ( strstr(attrib_name, "capacity state") )
++ {
++ if ( strstr(attrib_value, "ok") )
++ status->state |= 4;
+ return;
+ }
+
+@@ -292,11 +306,12 @@ int get_next_battery_info_or_status(DIR *battery_dir,
+ void *info_or_status)
+ {
+ FILE *file;
+- char line_info[256];
++ char line_info[1024];
+
+ if ( !info_or_status )
+ return 0;
+
++ memset(line_info, 0, sizeof (line_info));
+ if (type == BIF)
+ memset(info_or_status, 0, sizeof(struct battery_info));
+ else
+@@ -306,8 +321,11 @@ int get_next_battery_info_or_status(DIR *battery_dir,
+ if ( !file )
+ return 0;
+
+- while ( fgets(line_info, sizeof(line_info), file) != NULL )
++ while ( fgets(line_info, sizeof (line_info), file) != NULL )
++ {
+ parse_battery_info_or_status(line_info, type, info_or_status);
++ memset(line_info, 0, sizeof (line_info));
++ }
+
+ fclose(file);
+ return 1;
+@@ -317,14 +335,14 @@ int get_next_battery_info_or_status(DIR *battery_dir,
+ void print_battery_info(struct battery_info *info)
+ {
+ printf("present: %d\n", info->present);
+- printf("design capacity: %d\n", info->design_capacity);
+- printf("last full capacity: %d\n", info->last_full_capacity);
++ printf("design capacity: %d\n", (int) info->design_capacity);
++ printf("last full capacity: %d\n", (int) info->last_full_capacity);
+ printf("battery technology: %d\n", info->battery_technology);
+- printf("design voltage: %d\n", info->design_voltage);
+- printf("design capacity warning:%d\n", info->design_capacity_warning);
+- printf("design capacity low: %d\n", info->design_capacity_low);
+- printf("capacity granularity 1: %d\n", info->capacity_granularity_1);
+- printf("capacity granularity 2: %d\n", info->capacity_granularity_2);
++ printf("design voltage: %d\n", (int) info->design_voltage);
++ printf("design capacity warning:%d\n", (int) info->design_capacity_warning);
++ printf("design capacity low: %d\n", (int) info->design_capacity_low);
++ printf("capacity granularity 1: %d\n", (int) info->capacity_granularity_1);
++ printf("capacity granularity 2: %d\n", (int) info->capacity_granularity_2);
+ printf("model number: %s\n", info->model_number);
+ printf("serial number: %s\n", info->serial_number);
+ printf("battery type: %s\n", info->battery_type);
+@@ -406,10 +424,11 @@ int write_one_time_battery_info(void)
+ void print_battery_status(struct battery_status *status)
+ {
+ printf("present: %d\n", status->present);
+- printf("Battery state %d\n", status->state);
+- printf("Battery present rate %d\n", status->present_rate);
+- printf("Battery remining capacity %d\n", status->remaining_capacity);
+- printf("Battery present voltage %d\n", status->present_voltage);
++ printf("Battery state %d\n", (int) status->state);
++ printf("Battery present rate %d\n", (int) status->present_rate);
++ printf("Battery remining capacity %d\n",
++ (int) status->remaining_capacity);
++ printf("Battery present voltage %d\n", (int) status->present_voltage);
+ }
+ #endif /*RUN_STANDALONE*/
+
+@@ -469,6 +488,7 @@ int wait_for_and_update_battery_status_request(void)
+ return ret;
+ }
+
++#ifndef RUN_STANDALONE
+ /* Borrowed daemonize from xenstored - Initially written by Stevens. */
+ static void daemonize(void)
+ {
- #ifndef RUN_STANDALONE
- daemonize();
- #endif
++@@ -493,24 +513,53 @@ static void daemonize(void)
+
+ umask(0);
+ }
++#endif
+
+-int main(int argc, char *argv[])
++/*
++ * IMPORTANT: From the child process, we create a new thread
++ * to monitor acpid events. However, due to a bug in uClibc,
++ * the child process main thread does not get time slice
++ * after spawning a new thread. To work around this, we create
++ * a worker thread and then create an acpid monitor thread from
++ * this worker thread. This way both the worker thread and acpid
++ * thread will get time slices. This workaround will be removed
++ * once uClibc bug is fixed.
++ */
++static void *worker_thread_routine(void *arg)
+ {
- + if ( write_one_time_battery_info() == 0 )
++-#ifndef RUN_STANDALONE
++- daemonize();
++-#endif
+ xs = (struct xs_handle *)xs_daemon_open();
+- if ( xs == NULL )
+- return -1;
+-
+- if ( write_one_time_battery_info() == 0 )
++ if ( xs == NULL )
++ return NULL;
++ if ( xs == NULL )
++ return NULL;
++
++ initialize_system_state_info();
++ monitor_acpi_events();
++ if ( write_one_time_battery_info() == 0 )
+ {
+ xs_daemon_close(xs);
+- return -1;
++ return NULL;
+ }
+
+ wait_for_and_update_battery_status_request();
++ acpi_events_cleanup();
+ xs_daemon_close(xs);
+- return 0;
++ return NULL;
+ }
+
++
++int main(int argc, char *argv[])
++{
++#ifndef RUN_STANDALONE
++ daemonize();
++#endif
++
++ /* Refer to worker_thread_routine for why we create additional thread */
++ pthread_create(&worker_thread, NULL, &worker_thread_routine, NULL);
++
++ /* below won't get a time slice because of uClibc bug. */
++ while ( 1 )
++ sleep(60);
++
++ return 0;
++}