]> xenbits.xensource.com Git - xenclient/xen-pq.git/commitdiff
Merge branch 'master' of git://git.uk.xensource.com/xenclient/xen-pq
authorVincent Hanquez <vincent.hanquez@eu.citrix.com>
Sat, 23 May 2009 17:35:31 +0000 (18:35 +0100)
committerVincent Hanquez <vincent.hanquez@eu.citrix.com>
Sat, 23 May 2009 17:35:31 +0000 (18:35 +0100)
1  2 
master/power-management-enhancement

index b9bdb77dccbf30da0ae9d03a555107d1eaefe405,0000000000000000000000000000000000000000..299d3c0495b740ee19f6cb8a8bad650d52b5a5ff
mode 100644,000000..100644
--- /dev/null
@@@ -1,1066 -1,0 +1,1065 @@@
- 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;
 ++}