Ignore:
Timestamp:
Mar 1, 2012, 9:19:16 AM (13 years ago)
Author:
rlw
Message:

fix ACPI crash, improve ACPI code - from Steve Levine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/branch-1-0/src/helpers/acpih.c

    r408 r409  
    128128    else
    129129    {
     130        char cTmp;                      // Required to ensure code not optimized away
     131        ULONG ulMemSize, ulMemFlags;
     132
    130133        G_ulCount++;
     134        /* Force the shutdown function to be in memory.
     135         * This is probably not the best place to do this, but it is the easiest.
     136         * The function code may or may not cross page boundary and older versions
     137         * of acpi32.dll placed the function as the last function in the DLL,
     138         * so we need to check if the page exists before attempting to force it
     139         * into memory.
     140         * @@added V1.0.9 (2012-02-23) [dazarewicz]: additional ACPI support
     141         */
     142        cTmp = *((volatile char *)pAcpiGoToSleep); /* Ensure paged in */
     143
     144        ulMemSize = 1;
     145        if (DosQueryMem(((char *)pAcpiGoToSleep) + 4096, &ulMemSize, &ulMemFlags) == NO_ERROR)
     146        {
     147            if (ulMemFlags & PAG_COMMIT)
     148                cTmp = *(((volatile char *)pAcpiGoToSleep) + 4096);     /* Ensure paged in */
     149        }
    131150        return(pAcpiStartApi(phACPI));
    132151    }
     
    244263#   ifdef INCL_LONGLONG // VAC 3.6.5 - compiler supports long long
    245264#   define OBJECT_VALUE(index)  (Object[index].Integer.Value)
     265#   define OBJ_VALUE(index)  (Obj[index].Integer.Value)
    246266#   else // VAC 3.08 - compiler does not support long long
    247267#   define OBJECT_VALUE(index)  (Object[index].Integer.Value.ulLo)
     268#   define OBJ_VALUE(index)  (Obj[index].Integer.Value.ulLo)
    248269#   endif
    249270
    250271    if (G_ahAC)
    251272    {
     273        // Have _PSR
    252274        Result.Length = sizeof(Object);
    253275        Result.Pointer = Object;
    254276        Status = pAcpiTkEvaluateObject(G_ahAC, NULL, NULL, &Result);
    255         if (Status != AE_OK) ulTmp = 2;
    256         if (Object[0].Type != ACPI_TYPE_INTEGER) ulTmp = 2;
    257 
    258         ulTmp = OBJECT_VALUE(0);
    259         if (pApm->fUsingAC != ulTmp)
    260         {
    261             pApm->fUsingAC = ulTmp;
     277        if (Status != AE_OK)
     278            ulTmp = 2;
     279        else if (Object[0].Type != ACPI_TYPE_INTEGER)
     280            ulTmp = 2;
     281        else
     282            ulTmp = (UINT32)OBJECT_VALUE(0);
     283        if (pApm->fUsingAC != (BYTE)ulTmp)
     284        {
     285            pApm->fUsingAC = (BYTE)ulTmp;
    262286            fChanged = TRUE;
    263287        }
     
    278302
    279303        Obj = Result.Pointer;
    280         Obj = (ACPI_OBJECT *)Obj[0].Package.Elements;
    281         LastFull = (UINT32)OBJECT_VALUE(2);
     304        Obj = (ACPI_OBJECT *)Obj[0].Package.Elements;   // _BIF package
     305        LastFull = (UINT32)OBJ_VALUE(2);
    282306        if (LastFull == 0xffffffff)
    283307        {
     
    296320
    297321        Obj = Result.Pointer;
    298         Obj = (ACPI_OBJECT *)Obj[0].Package.Elements;
    299 
    300         if (OBJECT_VALUE(2) != 0xffffffff)
    301         {
    302             BRemaining = (UINT32)OBJECT_VALUE(2);
    303         }
    304 
    305         if (OBJECT_VALUE(0) != 0xffffffff)
     322        Obj = (ACPI_OBJECT *)Obj[0].Package.Elements;   // Battery status package
     323
     324        // If voltage known
     325        if ((UINT32)OBJ_VALUE(2) != 0xffffffff)
     326            BRemaining = (UINT32)OBJ_VALUE(2);
     327
     328        // If battery units are mWh or mAh
     329        if ((UINT32)OBJ_VALUE(0) != 0xffffffff)
    306330        {
    307331            if (BRemaining > (LastFull >> 1)) // > 50% is high. < 50% is low
    308             {
    309332                ulTmp = 1; // High
    310             }
    311333            else
    312             {
    313334                ulTmp = 2; // Low
    314             }
    315 
    316             if (OBJECT_VALUE(0) & 4)
    317             {
     335
     336            if (OBJ_VALUE(0) & 4)
    318337                ulTmp = 2; // Critical
    319             }
     338
    320339            // If battery charging - it can't be critical
    321             if (OBJECT_VALUE(0) & 2)
    322             {
     340            if (OBJ_VALUE(0) & 2)
    323341                ulTmp = 3; // Charging
    324             }
     342
    325343            if (pApm->bBatteryStatus != ulTmp)
    326344            {
    327                 pApm->bBatteryStatus = ulTmp;
     345                pApm->bBatteryStatus = (BYTE)ulTmp;
    328346                fChanged = TRUE;
    329347            }
     
    334352        if (pApm->bBatteryLife != ulTmp)
    335353        {
    336             pApm->bBatteryLife = ulTmp;
     354            pApm->bBatteryLife = (BYTE)ulTmp;
    337355            fChanged = TRUE;
    338356        }
     
    345363
    346364#   undef OBJECT_VALUE
     365#   undef OBJ_VALUE
    347366}
    348367
Note: See TracChangeset for help on using the changeset viewer.