diff options
| author | Jung-uk Kim <jkim@FreeBSD.org> | 2013-08-23 18:01:58 +0000 | 
|---|---|---|
| committer | Jung-uk Kim <jkim@FreeBSD.org> | 2013-08-23 18:01:58 +0000 | 
| commit | 59ce063597ddbda74269a45aba8187dece2fe00a (patch) | |
| tree | 89234dd9f502de2faaf4a280ccd0d3785a7ae96f /source/components | |
| parent | dbded195f9840f9044a6828c8877c6bf0a956482 (diff) | |
Diffstat (limited to 'source/components')
| -rw-r--r-- | source/components/debugger/dbcmds.c | 8 | ||||
| -rw-r--r-- | source/components/debugger/dbfileio.c | 9 | ||||
| -rw-r--r-- | source/components/debugger/dbinput.c | 28 | ||||
| -rw-r--r-- | source/components/debugger/dbnames.c | 31 | ||||
| -rw-r--r-- | source/components/events/evgpeutil.c | 2 | ||||
| -rw-r--r-- | source/components/events/evmisc.c | 18 | ||||
| -rw-r--r-- | source/components/events/evregion.c | 26 | ||||
| -rw-r--r-- | source/components/events/evsci.c | 87 | ||||
| -rw-r--r-- | source/components/events/evxface.c | 163 | ||||
| -rw-r--r-- | source/components/hardware/hwxface.c | 25 | ||||
| -rw-r--r-- | source/components/namespace/nsaccess.c | 4 | ||||
| -rw-r--r-- | source/components/namespace/nsdump.c | 152 | ||||
| -rw-r--r-- | source/components/namespace/nsxfeval.c | 9 | ||||
| -rw-r--r-- | source/components/tables/tbinstal.c | 9 | ||||
| -rw-r--r-- | source/components/tables/tbprint.c | 13 | ||||
| -rw-r--r-- | source/components/tables/tbxfroot.c | 3 | ||||
| -rw-r--r-- | source/components/utilities/utdebug.c | 2 | ||||
| -rw-r--r-- | source/components/utilities/utglobal.c | 3 | 
18 files changed, 527 insertions, 65 deletions
| diff --git a/source/components/debugger/dbcmds.c b/source/components/debugger/dbcmds.c index 307644bb31a2..be35763cd469 100644 --- a/source/components/debugger/dbcmds.c +++ b/source/components/debugger/dbcmds.c @@ -1211,6 +1211,14 @@ AcpiDbGenerateGpe (      (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);  } + +void +AcpiDbGenerateSci ( +    void) +{ +    AcpiEvSciDispatch (); +} +  #endif /* !ACPI_REDUCED_HARDWARE */  #endif /* ACPI_DEBUGGER */ diff --git a/source/components/debugger/dbfileio.c b/source/components/debugger/dbfileio.c index 3a8ece70455b..3ba9653ddc9a 100644 --- a/source/components/debugger/dbfileio.c +++ b/source/components/debugger/dbfileio.c @@ -142,7 +142,8 @@ AcpiDbOpenDebugFile (      }      AcpiOsPrintf ("Debug output file %s opened\n", Name); -    ACPI_STRCPY (AcpiGbl_DbDebugFilename, Name); +    ACPI_STRNCPY (AcpiGbl_DbDebugFilename, Name, +        sizeof (AcpiGbl_DbDebugFilename));      AcpiGbl_DbOutputToFile = TRUE;  #endif @@ -274,11 +275,9 @@ AcpiDbReadTable (      fseek (fp, 0, SEEK_SET); -    /* The RSDT, FACS and S3PT tables do not have standard ACPI headers */ +    /* The RSDP table does not have standard ACPI header */ -    if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD ") || -        ACPI_COMPARE_NAME (TableHeader.Signature, "FACS") || -        ACPI_COMPARE_NAME (TableHeader.Signature, "S3PT")) +    if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD "))      {          *TableLength = FileSize;          StandardHeader = FALSE; diff --git a/source/components/debugger/dbinput.c b/source/components/debugger/dbinput.c index e7d88bcae3af..511e5855d405 100644 --- a/source/components/debugger/dbinput.c +++ b/source/components/debugger/dbinput.c @@ -132,12 +132,14 @@ enum AcpiExDebuggerCommands      CMD_OPEN,      CMD_OSI,      CMD_OWNER, +    CMD_PATHS,      CMD_PREDEFINED,      CMD_PREFIX,      CMD_QUIT,      CMD_REFERENCES,      CMD_RESOURCES,      CMD_RESULTS, +    CMD_SCI,      CMD_SET,      CMD_SLEEP,      CMD_STATS, @@ -203,12 +205,14 @@ static const ACPI_DB_COMMAND_INFO   AcpiGbl_DbCommands[] =      {"OPEN",         1},      {"OSI",          0},      {"OWNER",        1}, +    {"PATHS",        0},      {"PREDEFINED",   0},      {"PREFIX",       0},      {"QUIT",         0},      {"REFERENCES",   1},      {"RESOURCES",    0},      {"RESULTS",      0}, +    {"SCI",          0},      {"SET",          3},      {"SLEEP",        0},      {"STATS",        1}, @@ -259,22 +263,19 @@ static const ACPI_DB_COMMAND_HELP   AcpiGbl_DbCommandHelp[] =      {0, "\nNamespace Access Commands:",        "\n"},      {1, "  Businfo",                           "Display system bus info\n"},      {1, "  Disassemble <Method>",              "Disassemble a control method\n"}, -    {1, "  Event <F|G> <Value>",               "Generate AcpiEvent (Fixed/GPE)\n"},      {1, "  Find <AcpiName> (? is wildcard)",   "Find ACPI name(s) with wildcards\n"}, -    {1, "  Gpe <GpeNum> <GpeBlock>",           "Simulate a GPE\n"}, -    {1, "  Gpes",                              "Display info on all GPEs\n"},      {1, "  Integrity",                         "Validate namespace integrity\n"},      {1, "  Methods",                           "Display list of loaded control methods\n"},      {1, "  Namespace [Object] [Depth]",        "Display loaded namespace tree/subtree\n"},      {1, "  Notify <Object> <Value>",           "Send a notification on Object\n"},      {1, "  Objects <ObjectType>",              "Display all objects of the given type\n"},      {1, "  Owner <OwnerId> [Depth]",           "Display loaded namespace by object owner\n"}, +    {1, "  Paths",                             "Display full pathnames of namespace objects\n"},      {1, "  Predefined",                        "Check all predefined names\n"},      {1, "  Prefix [<NamePath>]",               "Set or Get current execution prefix\n"},      {1, "  References <Addr>",                 "Find all references to object at addr\n"},      {1, "  Resources [DeviceName]",            "Display Device resources (no arg = all devices)\n"},      {1, "  Set N <NamedObject> <Value>",       "Set value for named integer\n"}, -    {1, "  Sleep [SleepState]",                "Simulate sleep/wake sequence(s) (0-5)\n"},      {1, "  Template <Object>",                 "Format/dump a Buffer/ResourceTemplate\n"},      {1, "  Terminate",                         "Delete namespace and all internal objects\n"},      {1, "  Type <Object>",                     "Display object type\n"}, @@ -288,7 +289,7 @@ static const ACPI_DB_COMMAND_HELP   AcpiGbl_DbCommandHelp[] =      {5, "  Execute <Namepath> [Arguments]",    "Execute control method\n"},      {1, "     Hex Integer",                    "Integer method argument\n"},      {1, "     \"Ascii String\"",               "String method argument\n"}, -    {1, "     (Byte List)",                    "Buffer method argument\n"}, +    {1, "     (Hex Byte List)",                "Buffer method argument\n"},      {1, "     [Package Element List]",         "Package method argument\n"},      {1, "  Go",                                "Allow method to run to completion\n"},      {1, "  Information",                       "Display info about the current method\n"}, @@ -303,6 +304,13 @@ static const ACPI_DB_COMMAND_HELP   AcpiGbl_DbCommandHelp[] =      {1, "  Tree",                              "Display control method calling tree\n"},      {1, "  <Enter>",                           "Single step next AML opcode (over calls)\n"}, +    {0, "\nHardware Related Commands:",         "\n"}, +    {1, "  Event <F|G> <Value>",               "Generate AcpiEvent (Fixed/GPE)\n"}, +    {1, "  Gpe <GpeNum> <GpeBlock>",           "Simulate a GPE\n"}, +    {1, "  Gpes",                              "Display info on all GPEs\n"}, +    {1, "  Sci",                               "Generate an SCI\n"}, +    {1, "  Sleep [SleepState]",                "Simulate sleep/wake sequence(s) (0-5)\n"}, +      {0, "\nFile I/O Commands:",                "\n"},      {1, "  Close",                             "Close debug output file\n"},      {1, "  Load <Input Filename>",             "Load ACPI table from a file\n"}, @@ -1002,6 +1010,11 @@ AcpiDbCommandDispatch (          AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);          break; +    case CMD_PATHS: + +        AcpiDbDumpNamespacePaths (); +        break; +      case CMD_PREDEFINED:          AcpiDbCheckPredefinedNames (); @@ -1027,6 +1040,11 @@ AcpiDbCommandDispatch (          AcpiDbDisplayResults ();          break; +    case CMD_SCI: + +        AcpiDbGenerateSci (); +        break; +      case CMD_SET:          AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2], diff --git a/source/components/debugger/dbnames.c b/source/components/debugger/dbnames.c index 1e1543ce9b6d..e3c6d710a940 100644 --- a/source/components/debugger/dbnames.c +++ b/source/components/debugger/dbnames.c @@ -256,6 +256,37 @@ AcpiDbDumpNamespace (  /*******************************************************************************   * + * FUNCTION:    AcpiDbDumpNamespacePaths + * + * PARAMETERS:  None + * + * RETURN:      None + * + * DESCRIPTION: Dump entire namespace with full object pathnames and object + *              type information. Alternative to "namespace" command. + * + ******************************************************************************/ + +void +AcpiDbDumpNamespacePaths ( +    void) +{ + +    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); +    AcpiOsPrintf ("ACPI Namespace (from root):\n"); + +    /* Display the entire namespace */ + +    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); +    AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, +        ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode); + +    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); +} + + +/******************************************************************************* + *   * FUNCTION:    AcpiDbDumpNamespaceByOwner   *   * PARAMETERS:  OwnerArg        - Owner ID whose nodes will be displayed diff --git a/source/components/events/evgpeutil.c b/source/components/events/evgpeutil.c index 5dad4f03978b..492c16f8a2d0 100644 --- a/source/components/events/evgpeutil.c +++ b/source/components/events/evgpeutil.c @@ -216,7 +216,7 @@ AcpiEvGetGpeDevice (   *   * FUNCTION:    AcpiEvGetGpeXruptBlock   * - * PARAMETERS:  InterruptNumber      - Interrupt for a GPE block + * PARAMETERS:  InterruptNumber             - Interrupt for a GPE block   *   * RETURN:      A GPE interrupt block   * diff --git a/source/components/events/evmisc.c b/source/components/events/evmisc.c index 1990a41b8c7c..ad95c5a28a4c 100644 --- a/source/components/events/evmisc.c +++ b/source/components/events/evmisc.c @@ -292,15 +292,6 @@ AcpiEvTerminate (          Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock, NULL); -        /* Remove SCI handler */ - -        Status = AcpiEvRemoveSciHandler (); -        if (ACPI_FAILURE(Status)) -        { -            ACPI_ERROR ((AE_INFO, -                "Could not remove SCI handler")); -        } -          Status = AcpiEvRemoveGlobalLockHandler ();          if (ACPI_FAILURE(Status))          { @@ -311,6 +302,15 @@ AcpiEvTerminate (          AcpiGbl_EventsInitialized = FALSE;      } +    /* Remove SCI handlers */ + +    Status = AcpiEvRemoveAllSciHandlers (); +    if (ACPI_FAILURE(Status)) +    { +        ACPI_ERROR ((AE_INFO, +            "Could not remove SCI handler")); +    } +      /* Deallocate all handler objects installed within GPE info structs */      Status = AcpiEvWalkGpeList (AcpiEvDeleteGpeHandlers, NULL); diff --git a/source/components/events/evregion.c b/source/components/events/evregion.c index 8e11b2944732..278c685dae8f 100644 --- a/source/components/events/evregion.c +++ b/source/components/events/evregion.c @@ -234,18 +234,12 @@ AcpiEvAddressSpaceDispatch (          {              RegionObj->Region.Flags |= AOPOBJ_SETUP_COMPLETE; -            if (RegionObj2->Extra.RegionContext) -            { -                /* The handler for this region was already installed */ - -                ACPI_FREE (RegionContext); -            } -            else +            /* +             * Save the returned context for use in all accesses to +             * the handler for this particular region +             */ +            if (!(RegionObj2->Extra.RegionContext))              { -                /* -                 * Save the returned context for use in all accesses to -                 * this particular region -                 */                  RegionObj2->Extra.RegionContext = RegionContext;              }          } @@ -261,7 +255,6 @@ AcpiEvAddressSpaceDispatch (          ACPI_FORMAT_NATIVE_UINT (RegionObj->Region.Address + RegionOffset),          AcpiUtGetRegionName (RegionObj->Region.SpaceId))); -      /*       * Special handling for GenericSerialBus and GeneralPurposeIo:       * There are three extra parameters that must be passed to the @@ -424,6 +417,15 @@ AcpiEvDetachRegion(                  Status = RegionSetup (RegionObj, ACPI_REGION_DEACTIVATE,                      HandlerObj->AddressSpace.Context, RegionContext); +                /* +                 * RegionContext should have been released by the deactivate +                 * operation. We don't need access to it anymore here. +                 */ +                if (RegionContext) +                { +                    *RegionContext = NULL; +                } +                  /* Init routine may fail, Just ignore errors */                  if (ACPI_FAILURE (Status)) diff --git a/source/components/events/evsci.c b/source/components/events/evsci.c index eca143f8d122..c254356a80a7 100644 --- a/source/components/events/evsci.c +++ b/source/components/events/evsci.c @@ -61,6 +61,57 @@ AcpiEvSciXruptHandler (  /*******************************************************************************   * + * FUNCTION:    AcpiEvSciDispatch + * + * PARAMETERS:  None + * + * RETURN:      Status code indicates whether interrupt was handled. + * + * DESCRIPTION: Dispatch the SCI to all host-installed SCI handlers. + * + ******************************************************************************/ + +UINT32 +AcpiEvSciDispatch ( +    void) +{ +    ACPI_SCI_HANDLER_INFO   *SciHandler; +    ACPI_CPU_FLAGS          Flags; +    UINT32                  IntStatus = ACPI_INTERRUPT_NOT_HANDLED; + + +    ACPI_FUNCTION_NAME (EvSciDispatch); + + +    /* Are there any host-installed SCI handlers? */ + +    if (!AcpiGbl_SciHandlerList) +    { +        return (IntStatus); +    } + +    Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); + +    /* Invoke all host-installed SCI handlers */ + +    SciHandler = AcpiGbl_SciHandlerList; +    while (SciHandler) +    { +        /* Invoke the installed handler (at interrupt level) */ + +        IntStatus |= SciHandler->Address ( +            SciHandler->Context); + +        SciHandler = SciHandler->Next; +    } + +    AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); +    return (IntStatus); +} + + +/******************************************************************************* + *   * FUNCTION:    AcpiEvSciXruptHandler   *   * PARAMETERS:  Context   - Calling Context @@ -100,6 +151,10 @@ AcpiEvSciXruptHandler (       */      InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); +    /* Invoke all host-installed SCI handlers */ + +    InterruptHandled |= AcpiEvSciDispatch (); +      AcpiSciCount++;      return_UINT32 (InterruptHandled);  } @@ -129,14 +184,13 @@ AcpiEvGpeXruptHandler (      /* -     * We are guaranteed by the ACPI CA initialization/shutdown code that +     * We are guaranteed by the ACPICA initialization/shutdown code that       * if this interrupt handler is installed, ACPI is enabled.       */      /* GPEs: Check for and dispatch any GPEs that have occurred */      InterruptHandled |= AcpiEvGpeDetect (GpeXruptList); -      return_UINT32 (InterruptHandled);  } @@ -171,15 +225,15 @@ AcpiEvInstallSciHandler (  /******************************************************************************   * - * FUNCTION:    AcpiEvRemoveSciHandler + * FUNCTION:    AcpiEvRemoveAllSciHandlers   *   * PARAMETERS:  none   * - * RETURN:      E_OK if handler uninstalled OK, E_ERROR if handler was not + * RETURN:      AE_OK if handler uninstalled, AE_ERROR if handler was not   *              installed to begin with   *   * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be - *              taken. + *              taken. Remove all host-installed SCI handlers.   *   * Note:  It doesn't seem important to disable all events or set the event   *        enable registers to their original values. The OS should disable @@ -189,13 +243,15 @@ AcpiEvInstallSciHandler (   ******************************************************************************/  ACPI_STATUS -AcpiEvRemoveSciHandler ( +AcpiEvRemoveAllSciHandlers (      void)  { +    ACPI_SCI_HANDLER_INFO   *SciHandler; +    ACPI_CPU_FLAGS          Flags;      ACPI_STATUS             Status; -    ACPI_FUNCTION_TRACE (EvRemoveSciHandler); +    ACPI_FUNCTION_TRACE (EvRemoveAllSciHandlers);      /* Just let the OS remove the handler and disable the level */ @@ -203,6 +259,23 @@ AcpiEvRemoveSciHandler (      Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,                  AcpiEvSciXruptHandler); +    if (!AcpiGbl_SciHandlerList) +    { +        return (Status); +    } + +    Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); + +    /* Free all host-installed SCI handlers */ + +    while (AcpiGbl_SciHandlerList) +    { +        SciHandler = AcpiGbl_SciHandlerList; +        AcpiGbl_SciHandlerList = SciHandler->Next; +        ACPI_FREE (SciHandler); +    } + +    AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);      return_ACPI_STATUS (Status);  } diff --git a/source/components/events/evxface.c b/source/components/events/evxface.c index 99ea6cc7ae01..0e8393097afb 100644 --- a/source/components/events/evxface.c +++ b/source/components/events/evxface.c @@ -435,6 +435,169 @@ ACPI_EXPORT_SYMBOL (AcpiInstallExceptionHandler)  #if (!ACPI_REDUCED_HARDWARE)  /*******************************************************************************   * + * FUNCTION:    AcpiInstallSciHandler + * + * PARAMETERS:  Address             - Address of the handler + *              Context             - Value passed to the handler on each SCI + * + * RETURN:      Status + * + * DESCRIPTION: Install a handler for a System Control Interrupt. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiInstallSciHandler ( +    ACPI_SCI_HANDLER        Address, +    void                    *Context) +{ +    ACPI_SCI_HANDLER_INFO   *NewSciHandler; +    ACPI_SCI_HANDLER_INFO   *SciHandler; +    ACPI_CPU_FLAGS          Flags; +    ACPI_STATUS             Status; + + +    ACPI_FUNCTION_TRACE (AcpiInstallSciHandler); + + +    if (!Address) +    { +        return_ACPI_STATUS (AE_BAD_PARAMETER); +    } + +    /* Allocate and init a handler object */ + +    NewSciHandler = ACPI_ALLOCATE (sizeof (ACPI_SCI_HANDLER_INFO)); +    if (!NewSciHandler) +    { +        return_ACPI_STATUS (AE_NO_MEMORY); +    } + +    NewSciHandler->Address = Address; +    NewSciHandler->Context = Context; + +    Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); +    if (ACPI_FAILURE (Status)) +    { +        goto Exit; +    } + +    /* Lock list during installation */ + +    Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); +    SciHandler = AcpiGbl_SciHandlerList; + +    /* Ensure handler does not already exist */ + +    while (SciHandler) +    { +        if (Address == SciHandler->Address) +        { +            Status = AE_ALREADY_EXISTS; +            goto UnlockAndExit; +        } + +        SciHandler = SciHandler->Next; +    } + +    /* Install the new handler into the global list (at head) */ + +    NewSciHandler->Next = AcpiGbl_SciHandlerList; +    AcpiGbl_SciHandlerList = NewSciHandler; + + +UnlockAndExit: + +    AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); +    (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); + +Exit: +    if (ACPI_FAILURE (Status)) +    { +        ACPI_FREE (NewSciHandler); +    } +    return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiRemoveSciHandler + * + * PARAMETERS:  Address             - Address of the handler + * + * RETURN:      Status + * + * DESCRIPTION: Remove a handler for a System Control Interrupt. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiRemoveSciHandler ( +    ACPI_SCI_HANDLER        Address) +{ +    ACPI_SCI_HANDLER_INFO   *PrevSciHandler; +    ACPI_SCI_HANDLER_INFO   *NextSciHandler; +    ACPI_CPU_FLAGS          Flags; +    ACPI_STATUS             Status; + + +    ACPI_FUNCTION_TRACE (AcpiRemoveSciHandler); + + +    if (!Address) +    { +        return_ACPI_STATUS (AE_BAD_PARAMETER); +    } + +    Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); +    if (ACPI_FAILURE (Status)) +    { +        return_ACPI_STATUS (Status); +    } + +    /* Remove the SCI handler with lock */ + +    Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); + +    PrevSciHandler = NULL; +    NextSciHandler = AcpiGbl_SciHandlerList; +    while (NextSciHandler) +    { +        if (NextSciHandler->Address == Address) +        { +            /* Unlink and free the SCI handler info block */ + +            if (PrevSciHandler) +            { +                PrevSciHandler->Next = NextSciHandler->Next; +            } +            else +            { +                AcpiGbl_SciHandlerList = NextSciHandler->Next; +            } + +            AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); +            ACPI_FREE (NextSciHandler); +            goto UnlockAndExit; +        } + +        PrevSciHandler = NextSciHandler; +        NextSciHandler = NextSciHandler->Next; +    } + +    AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); +    Status = AE_NOT_EXIST; + + +UnlockAndExit: +    (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); +    return_ACPI_STATUS (Status); +} + + +/******************************************************************************* + *   * FUNCTION:    AcpiInstallGlobalEventHandler   *   * PARAMETERS:  Handler         - Pointer to the global event handler function diff --git a/source/components/hardware/hwxface.c b/source/components/hardware/hwxface.c index 25ad60a4212a..45d56540fb96 100644 --- a/source/components/hardware/hwxface.c +++ b/source/components/hardware/hwxface.c @@ -131,7 +131,8 @@ AcpiRead (      UINT64                  *ReturnValue,      ACPI_GENERIC_ADDRESS    *Reg)  { -    UINT32                  Value; +    UINT32                  ValueLo; +    UINT32                  ValueHi;      UINT32                  Width;      UINT64                  Address;      ACPI_STATUS             Status; @@ -153,13 +154,8 @@ AcpiRead (          return (Status);      } -    /* Initialize entire 64-bit return value to zero */ - -    *ReturnValue = 0; -    Value = 0; -      /* -     * Two address spaces supported: Memory or IO. PCI_Config is +     * Two address spaces supported: Memory or I/O. PCI_Config is       * not supported here because the GAS structure is insufficient       */      if (Reg->SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) @@ -173,6 +169,9 @@ AcpiRead (      }      else /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */      { +        ValueLo = 0; +        ValueHi = 0; +          Width = Reg->BitWidth;          if (Width == 64)          { @@ -180,25 +179,27 @@ AcpiRead (          }          Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) -                    Address, &Value, Width); +                    Address, &ValueLo, Width);          if (ACPI_FAILURE (Status))          {              return (Status);          } -        *ReturnValue = Value;          if (Reg->BitWidth == 64)          {              /* Read the top 32 bits */              Status = AcpiHwReadPort ((ACPI_IO_ADDRESS) -                        (Address + 4), &Value, 32); +                        (Address + 4), &ValueHi, 32);              if (ACPI_FAILURE (Status))              {                  return (Status);              } -            *ReturnValue |= ((UINT64) Value << 32);          } + +        /* Set the return value only if status is AE_OK */ + +        *ReturnValue = (ValueLo | ((UINT64) ValueHi << 32));      }      ACPI_DEBUG_PRINT ((ACPI_DB_IO, @@ -207,7 +208,7 @@ AcpiRead (          ACPI_FORMAT_UINT64 (Address),          AcpiUtGetRegionName (Reg->SpaceId))); -    return (Status); +    return (AE_OK);  }  ACPI_EXPORT_SYMBOL (AcpiRead) diff --git a/source/components/namespace/nsaccess.c b/source/components/namespace/nsaccess.c index ad94f6c16ea5..d1271a44387b 100644 --- a/source/components/namespace/nsaccess.c +++ b/source/components/namespace/nsaccess.c @@ -448,8 +448,8 @@ AcpiNsLookup (                      /* Current scope has no parent scope */                      ACPI_ERROR ((AE_INFO, -                        "ACPI path has too many parent prefixes (^) " -                        "- reached beyond root node")); +                        "%s: Path has too many parent prefixes (^) " +                        "- reached beyond root node", Pathname));                      return_ACPI_STATUS (AE_NOT_FOUND);                  }              } diff --git a/source/components/namespace/nsdump.c b/source/components/namespace/nsdump.c index 82e66027acd0..5559d9a9e41a 100644 --- a/source/components/namespace/nsdump.c +++ b/source/components/namespace/nsdump.c @@ -69,6 +69,22 @@ AcpiNsDumpOneDevice (  #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) + +static ACPI_STATUS +AcpiNsDumpOneObjectPath ( +    ACPI_HANDLE             ObjHandle, +    UINT32                  Level, +    void                    *Context, +    void                    **ReturnValue); + +static ACPI_STATUS +AcpiNsGetMaxDepth ( +    ACPI_HANDLE             ObjHandle, +    UINT32                  Level, +    void                    *Context, +    void                    **ReturnValue); + +  /*******************************************************************************   *   * FUNCTION:    AcpiNsPrintPathname @@ -697,6 +713,142 @@ AcpiNsDumpObjects (  /*******************************************************************************   * + * FUNCTION:    AcpiNsDumpOneObjectPath, AcpiNsGetMaxDepth + * + * PARAMETERS:  ObjHandle           - Node to be dumped + *              Level               - Nesting level of the handle + *              Context             - Passed into WalkNamespace + *              ReturnValue         - Not used + * + * RETURN:      Status + * + * DESCRIPTION: Dump the full pathname to a namespace object. AcpNsGetMaxDepth + *              computes the maximum nesting depth in the namespace tree, in + *              order to simplify formatting in AcpiNsDumpOneObjectPath. + *              These procedures are UserFunctions called by AcpiNsWalkNamespace. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsDumpOneObjectPath ( +    ACPI_HANDLE             ObjHandle, +    UINT32                  Level, +    void                    *Context, +    void                    **ReturnValue) +{ +    UINT32                  MaxLevel = *((UINT32 *) Context); +    char                    *Pathname; +    ACPI_NAMESPACE_NODE     *Node; +    int                     PathIndent; + + +    if (!ObjHandle) +    { +        return (AE_OK); +    } + +    Node = AcpiNsValidateHandle (ObjHandle); +    Pathname = AcpiNsGetExternalPathname (Node); + +    PathIndent = 1; +    if (Level <= MaxLevel) +    { +        PathIndent = MaxLevel - Level + 1; +    } + +    AcpiOsPrintf ("%2d%*s%-12s%*s", +        Level, Level, " ", AcpiUtGetTypeName (Node->Type), +        PathIndent, " "); + +    AcpiOsPrintf ("%s\n", &Pathname[1]); +    ACPI_FREE (Pathname); +    return (AE_OK); +} + + +static ACPI_STATUS +AcpiNsGetMaxDepth ( +    ACPI_HANDLE             ObjHandle, +    UINT32                  Level, +    void                    *Context, +    void                    **ReturnValue) +{ +    UINT32                  *MaxLevel = (UINT32 *) Context; + + +    if (Level > *MaxLevel) +    { +        *MaxLevel = Level; +    } +    return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiNsDumpObjectPaths + * + * PARAMETERS:  Type                - Object type to be dumped + *              DisplayType         - 0 or ACPI_DISPLAY_SUMMARY + *              MaxDepth            - Maximum depth of dump. Use ACPI_UINT32_MAX + *                                    for an effectively unlimited depth. + *              OwnerId             - Dump only objects owned by this ID. Use + *                                    ACPI_UINT32_MAX to match all owners. + *              StartHandle         - Where in namespace to start/end search + * + * RETURN:      None + * + * DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses + *              AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObjectPath. + * + ******************************************************************************/ + +void +AcpiNsDumpObjectPaths ( +    ACPI_OBJECT_TYPE        Type, +    UINT8                   DisplayType, +    UINT32                  MaxDepth, +    ACPI_OWNER_ID           OwnerId, +    ACPI_HANDLE             StartHandle) +{ +    ACPI_STATUS             Status; +    UINT32                  MaxLevel = 0; + + +    ACPI_FUNCTION_ENTRY (); + + +    /* +     * Just lock the entire namespace for the duration of the dump. +     * We don't want any changes to the namespace during this time, +     * especially the temporary nodes since we are going to display +     * them also. +     */ +    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); +    if (ACPI_FAILURE (Status)) +    { +        AcpiOsPrintf ("Could not acquire namespace mutex\n"); +        return; +    } + +    /* Get the max depth of the namespace tree, for formatting later */ + +    (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, +                ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, +                AcpiNsGetMaxDepth, NULL, (void *) &MaxLevel, NULL); + +    /* Now dump the entire namespace */ + +    (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, +                ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, +                AcpiNsDumpOneObjectPath, NULL, (void *) &MaxLevel, NULL); + +    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); +} + + +/******************************************************************************* + *   * FUNCTION:    AcpiNsDumpEntry   *   * PARAMETERS:  Handle              - Node to be dumped diff --git a/source/components/namespace/nsxfeval.c b/source/components/namespace/nsxfeval.c index e5c1e17f2027..007ade31bd8a 100644 --- a/source/components/namespace/nsxfeval.c +++ b/source/components/namespace/nsxfeval.c @@ -654,10 +654,19 @@ AcpiWalkNamespace (          goto UnlockAndExit;      } +    /* Now we can validate the starting node */ + +    if (!AcpiNsValidateHandle (StartObject)) +    { +        Status = AE_BAD_PARAMETER; +        goto UnlockAndExit2; +    } +      Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,                  ACPI_NS_WALK_UNLOCK, DescendingCallback,                  AscendingCallback, Context, ReturnValue); +UnlockAndExit2:      (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);  UnlockAndExit: diff --git a/source/components/tables/tbinstal.c b/source/components/tables/tbinstal.c index e480749a23a8..ecbf25686231 100644 --- a/source/components/tables/tbinstal.c +++ b/source/components/tables/tbinstal.c @@ -93,14 +93,9 @@ AcpiTbVerifyTable (          }      } -    /* FACS is the odd table, has no standard ACPI header and no checksum */ +    /* Always calculate checksum, ignore bad checksum if requested */ -    if (!ACPI_COMPARE_NAME (&TableDesc->Signature, ACPI_SIG_FACS)) -    { -        /* Always calculate checksum, ignore bad checksum if requested */ - -        Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length); -    } +    Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);      return_ACPI_STATUS (Status);  } diff --git a/source/components/tables/tbprint.c b/source/components/tables/tbprint.c index 7823ffc1d914..f24de49a339e 100644 --- a/source/components/tables/tbprint.c +++ b/source/components/tables/tbprint.c @@ -158,7 +158,7 @@ AcpiTbPrintTableHeader (              Header->Signature, ACPI_CAST_PTR (void, Address),              Header->Length));      } -    else if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_RSDP)) +    else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature))      {          /* RSDP has no common fields */ @@ -211,6 +211,17 @@ AcpiTbVerifyChecksum (      UINT8                   Checksum; +    /* +     * FACS/S3PT: +     * They are the odd tables, have no standard ACPI header and no checksum +     */ + +    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || +        ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) +    { +        return (AE_OK); +    } +      /* Compute the checksum on the table */      Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); diff --git a/source/components/tables/tbxfroot.c b/source/components/tables/tbxfroot.c index fa67781cb14f..812f18003579 100644 --- a/source/components/tables/tbxfroot.c +++ b/source/components/tables/tbxfroot.c @@ -75,8 +75,7 @@ AcpiTbValidateRsdp (       * Note: Sometimes there exists more than one RSDP in memory; the valid       * RSDP has a valid checksum, all others have an invalid checksum.       */ -    if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP, -            sizeof (ACPI_SIG_RSDP)-1) != 0) +    if (!ACPI_VALIDATE_RSDP_SIG (Rsdp->Signature))      {          /* Nope, BAD Signature */ diff --git a/source/components/utilities/utdebug.c b/source/components/utilities/utdebug.c index e8799679c944..712c188dc7e7 100644 --- a/source/components/utilities/utdebug.c +++ b/source/components/utilities/utdebug.c @@ -216,7 +216,7 @@ AcpiDebugPrint (       * Display the module name, current line number, thread ID (if requested),       * current procedure nesting level, and the current procedure name       */ -    AcpiOsPrintf ("%8s-%04ld ", ModuleName, LineNumber); +    AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);      if (ACPI_LV_THREADS & AcpiDbgLevel)      { diff --git a/source/components/utilities/utglobal.c b/source/components/utilities/utglobal.c index 56c4e0693573..ff245159417a 100644 --- a/source/components/utilities/utglobal.c +++ b/source/components/utilities/utglobal.c @@ -274,7 +274,7 @@ AcpiUtInitGlobals (  #if (!ACPI_REDUCED_HARDWARE) -    /* GPE support */ +    /* GPE/SCI support */      AcpiGbl_AllGpesInitialized          = FALSE;      AcpiGbl_GpeXruptListHead            = NULL; @@ -283,6 +283,7 @@ AcpiUtInitGlobals (      AcpiCurrentGpeCount                 = 0;      AcpiGbl_GlobalEventHandler          = NULL; +    AcpiGbl_SciHandlerList              = NULL;  #endif /* !ACPI_REDUCED_HARDWARE */ | 
