diff options
| author | Jung-uk Kim <jkim@FreeBSD.org> | 2015-07-20 22:31:50 +0000 | 
|---|---|---|
| committer | Jung-uk Kim <jkim@FreeBSD.org> | 2015-07-20 22:31:50 +0000 | 
| commit | 136eac2a0638d3c751b1987603f71a9ae26879fd (patch) | |
| tree | 1e61df024e8a47b6bc4e25d07f455c9dcd7e2dc8 /source/components/disassembler | |
| parent | f3bbb1ca6c1b2b877d015a8f5f0c67e48a7a57ae (diff) | |
Notes
Diffstat (limited to 'source/components/disassembler')
| -rw-r--r-- | source/components/disassembler/dmdeferred.c | 10 | ||||
| -rw-r--r-- | source/components/disassembler/dmnames.c | 2 | ||||
| -rw-r--r-- | source/components/disassembler/dmobject.c | 576 | ||||
| -rw-r--r-- | source/components/disassembler/dmopcode.c | 3 | ||||
| -rw-r--r-- | source/components/disassembler/dmwalk.c | 22 | 
5 files changed, 24 insertions, 589 deletions
| diff --git a/source/components/disassembler/dmdeferred.c b/source/components/disassembler/dmdeferred.c index 1b4ef2057edde..35d5650f82ee4 100644 --- a/source/components/disassembler/dmdeferred.c +++ b/source/components/disassembler/dmdeferred.c @@ -165,7 +165,6 @@ AcpiDmDeferredParse (      ACPI_STATUS             Status;      ACPI_PARSE_OBJECT       *SearchOp;      ACPI_PARSE_OBJECT       *StartOp; -    UINT32                  BaseAmlOffset;      ACPI_PARSE_OBJECT       *NewRootOp;      ACPI_PARSE_OBJECT       *ExtraOp; @@ -202,19 +201,10 @@ AcpiDmDeferredParse (      WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;      Status = AcpiPsParseAml (WalkState); -    /* -     * We need to update all of the AML offsets, since the parser thought -     * that the method began at offset zero. In reality, it began somewhere -     * within the ACPI table, at the BaseAmlOffset. Walk the entire tree that -     * was just created and update the AmlOffset in each Op. -     */ -    BaseAmlOffset = (Op->Common.Value.Arg)->Common.AmlOffset + 1;      StartOp = (Op->Common.Value.Arg)->Common.Next;      SearchOp = StartOp; -      while (SearchOp)      { -        SearchOp->Common.AmlOffset += BaseAmlOffset;          SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);      } diff --git a/source/components/disassembler/dmnames.c b/source/components/disassembler/dmnames.c index f942aead0f72c..fc6a2cc6c3818 100644 --- a/source/components/disassembler/dmnames.c +++ b/source/components/disassembler/dmnames.c @@ -179,7 +179,7 @@ AcpiPsDisplayObjectPathname (      /* Convert NamedDesc/handle to a full pathname */      Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; -    Status = AcpiNsHandleToPathname (Node, &Buffer); +    Status = AcpiNsHandleToPathname (Node, &Buffer, FALSE);      if (ACPI_FAILURE (Status))      {          AcpiOsPrintf ("****Could not get pathname****)"); diff --git a/source/components/disassembler/dmobject.c b/source/components/disassembler/dmobject.c deleted file mode 100644 index 6023c786b1e71..0000000000000 --- a/source/components/disassembler/dmobject.c +++ /dev/null @@ -1,576 +0,0 @@ -/******************************************************************************* - * - * Module Name: dmobject - ACPI object decode and display - * - ******************************************************************************/ - -/* - * Copyright (C) 2000 - 2015, Intel Corp. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - *    notice, this list of conditions, and the following disclaimer, - *    without modification. - * 2. Redistributions in binary form must reproduce at minimum a disclaimer - *    substantially similar to the "NO WARRANTY" disclaimer below - *    ("Disclaimer") and any redistribution must be conditioned upon - *    including a substantially similar Disclaimer requirement for further - *    binary redistribution. - * 3. Neither the names of the above-listed copyright holders nor the names - *    of any contributors may be used to endorse or promote products derived - *    from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - * - * NO WARRANTY - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - */ - -#include "acpi.h" -#include "accommon.h" -#include "acnamesp.h" -#include "acdisasm.h" - - -#ifdef ACPI_DISASSEMBLER - -#define _COMPONENT          ACPI_CA_DEBUGGER -        ACPI_MODULE_NAME    ("dmnames") - -/* Local prototypes */ - -static void -AcpiDmDecodeNode ( -    ACPI_NAMESPACE_NODE     *Node); - - -/******************************************************************************* - * - * FUNCTION:    AcpiDmDumpMethodInfo - * - * PARAMETERS:  Status          - Method execution status - *              WalkState       - Current state of the parse tree walk - *              Op              - Executing parse op - * - * RETURN:      None - * - * DESCRIPTION: Called when a method has been aborted because of an error. - *              Dumps the method execution stack, and the method locals/args, - *              and disassembles the AML opcode that failed. - * - ******************************************************************************/ - -void -AcpiDmDumpMethodInfo ( -    ACPI_STATUS             Status, -    ACPI_WALK_STATE         *WalkState, -    ACPI_PARSE_OBJECT       *Op) -{ -    ACPI_PARSE_OBJECT       *Next; -    ACPI_THREAD_STATE       *Thread; -    ACPI_WALK_STATE         *NextWalkState; -    ACPI_NAMESPACE_NODE     *PreviousMethod = NULL; - - -    /* Ignore control codes, they are not errors */ - -    if ((Status & AE_CODE_MASK) == AE_CODE_CONTROL) -    { -        return; -    } - -    /* We may be executing a deferred opcode */ - -    if (WalkState->DeferredNode) -    { -        AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n"); -        return; -    } - -    /* -     * If there is no Thread, we are not actually executing a method. -     * This can happen when the iASL compiler calls the interpreter -     * to perform constant folding. -     */ -    Thread = WalkState->Thread; -    if (!Thread) -    { -        return; -    } - -    /* Display exception and method name */ - -    AcpiOsPrintf ("\n**** Exception %s during execution of method ", -        AcpiFormatException (Status)); -    AcpiNsPrintNodePathname (WalkState->MethodNode, NULL); - -    /* Display stack of executing methods */ - -    AcpiOsPrintf ("\n\nMethod Execution Stack:\n"); -    NextWalkState = Thread->WalkStateList; - -    /* Walk list of linked walk states */ - -    while (NextWalkState) -    { -        AcpiOsPrintf ("    Method [%4.4s] executing: ", -                AcpiUtGetNodeName (NextWalkState->MethodNode)); - -        /* First method is the currently executing method */ - -        if (NextWalkState == WalkState) -        { -            if (Op) -            { -                /* Display currently executing ASL statement */ - -                Next = Op->Common.Next; -                Op->Common.Next = NULL; - -                AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX); -                Op->Common.Next = Next; -            } -        } -        else -        { -            /* -             * This method has called another method -             * NOTE: the method call parse subtree is already deleted at this -             * point, so we cannot disassemble the method invocation. -             */ -            AcpiOsPrintf ("Call to method "); -            AcpiNsPrintNodePathname (PreviousMethod, NULL); -        } - -        PreviousMethod = NextWalkState->MethodNode; -        NextWalkState = NextWalkState->Next; -        AcpiOsPrintf ("\n"); -    } - -    /* Display the method locals and arguments */ - -    AcpiOsPrintf ("\n"); -    AcpiDmDisplayLocals (WalkState); -    AcpiOsPrintf ("\n"); -    AcpiDmDisplayArguments (WalkState); -    AcpiOsPrintf ("\n"); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDmDecodeInternalObject - * - * PARAMETERS:  ObjDesc         - Object to be displayed - * - * RETURN:      None - * - * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers. - * - ******************************************************************************/ - -void -AcpiDmDecodeInternalObject ( -    ACPI_OPERAND_OBJECT     *ObjDesc) -{ -    UINT32                  i; - - -    if (!ObjDesc) -    { -        AcpiOsPrintf (" Uninitialized"); -        return; -    } - -    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) -    { -        AcpiOsPrintf (" %p [%s]", ObjDesc, AcpiUtGetDescriptorName (ObjDesc)); -        return; -    } - -    AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc)); - -    switch (ObjDesc->Common.Type) -    { -    case ACPI_TYPE_INTEGER: - -        AcpiOsPrintf (" %8.8X%8.8X", -                ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); -        break; - -    case ACPI_TYPE_STRING: - -        AcpiOsPrintf ("(%u) \"%.24s", -                ObjDesc->String.Length, ObjDesc->String.Pointer); - -        if (ObjDesc->String.Length > 24) -        { -            AcpiOsPrintf ("..."); -        } -        else -        { -            AcpiOsPrintf ("\""); -        } -        break; - -    case ACPI_TYPE_BUFFER: - -        AcpiOsPrintf ("(%u)", ObjDesc->Buffer.Length); -        for (i = 0; (i < 8) && (i < ObjDesc->Buffer.Length); i++) -        { -            AcpiOsPrintf (" %2.2X", ObjDesc->Buffer.Pointer[i]); -        } -        break; - -    default: - -        AcpiOsPrintf (" %p", ObjDesc); -        break; -    } -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDmDecodeNode - * - * PARAMETERS:  Node        - Object to be displayed - * - * RETURN:      None - * - * DESCRIPTION: Short display of a namespace node - * - ******************************************************************************/ - -static void -AcpiDmDecodeNode ( -    ACPI_NAMESPACE_NODE     *Node) -{ - -    AcpiOsPrintf ("<Node>            Name %4.4s", -            AcpiUtGetNodeName (Node)); - -    if (Node->Flags & ANOBJ_METHOD_ARG) -    { -        AcpiOsPrintf (" [Method Arg]"); -    } -    if (Node->Flags & ANOBJ_METHOD_LOCAL) -    { -        AcpiOsPrintf (" [Method Local]"); -    } - -    switch (Node->Type) -    { -    /* These types have no attached object */ - -    case ACPI_TYPE_DEVICE: - -        AcpiOsPrintf (" Device"); -        break; - -    case ACPI_TYPE_THERMAL: - -        AcpiOsPrintf (" Thermal Zone"); -        break; - -    default: - -        AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node)); -        break; -    } -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDmDisplayInternalObject - * - * PARAMETERS:  ObjDesc         - Object to be displayed - *              WalkState       - Current walk state - * - * RETURN:      None - * - * DESCRIPTION: Short display of an internal object - * - ******************************************************************************/ - -void -AcpiDmDisplayInternalObject ( -    ACPI_OPERAND_OBJECT     *ObjDesc, -    ACPI_WALK_STATE         *WalkState) -{ -    UINT8                   Type; - - -    AcpiOsPrintf ("%p ", ObjDesc); - -    if (!ObjDesc) -    { -        AcpiOsPrintf ("<Null Object>\n"); -        return; -    } - -    /* Decode the object type */ - -    switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)) -    { -    case ACPI_DESC_TYPE_PARSER: - -        AcpiOsPrintf ("<Parser>  "); -        break; - -    case ACPI_DESC_TYPE_NAMED: - -        AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc); -        break; - -    case ACPI_DESC_TYPE_OPERAND: - -        Type = ObjDesc->Common.Type; -        if (Type > ACPI_TYPE_LOCAL_MAX) -        { -            AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32) Type); -            return; -        } - -        /* Decode the ACPI object type */ - -        switch (ObjDesc->Common.Type) -        { -        case ACPI_TYPE_LOCAL_REFERENCE: - -            AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (ObjDesc)); - -            /* Decode the refererence */ - -            switch (ObjDesc->Reference.Class) -            { -            case ACPI_REFCLASS_LOCAL: - -                AcpiOsPrintf ("%X ", ObjDesc->Reference.Value); -                if (WalkState) -                { -                    ObjDesc = WalkState->LocalVariables -                                [ObjDesc->Reference.Value].Object; -                    AcpiOsPrintf ("%p", ObjDesc); -                    AcpiDmDecodeInternalObject (ObjDesc); -                } -                break; - -            case ACPI_REFCLASS_ARG: - -                AcpiOsPrintf ("%X ", ObjDesc->Reference.Value); -                if (WalkState) -                { -                    ObjDesc = WalkState->Arguments -                                [ObjDesc->Reference.Value].Object; -                    AcpiOsPrintf ("%p", ObjDesc); -                    AcpiDmDecodeInternalObject (ObjDesc); -                } -                break; - -            case ACPI_REFCLASS_INDEX: - -                switch (ObjDesc->Reference.TargetType) -                { -                case ACPI_TYPE_BUFFER_FIELD: - -                    AcpiOsPrintf ("%p", ObjDesc->Reference.Object); -                    AcpiDmDecodeInternalObject (ObjDesc->Reference.Object); -                    break; - -                case ACPI_TYPE_PACKAGE: - -                    AcpiOsPrintf ("%p", ObjDesc->Reference.Where); -                    if (!ObjDesc->Reference.Where) -                    { -                        AcpiOsPrintf (" Uninitialized WHERE pointer"); -                    } -                    else -                    { -                        AcpiDmDecodeInternalObject ( -                            *(ObjDesc->Reference.Where)); -                    } -                    break; - -                default: - -                    AcpiOsPrintf ("Unknown index target type"); -                    break; -                } -                break; - -            case ACPI_REFCLASS_REFOF: - -                if (!ObjDesc->Reference.Object) -                { -                    AcpiOsPrintf ("Uninitialized reference subobject pointer"); -                    break; -                } - -                /* Reference can be to a Node or an Operand object */ - -                switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc->Reference.Object)) -                { -                case ACPI_DESC_TYPE_NAMED: -                    AcpiDmDecodeNode (ObjDesc->Reference.Object); -                    break; - -                case ACPI_DESC_TYPE_OPERAND: -                    AcpiDmDecodeInternalObject (ObjDesc->Reference.Object); -                    break; - -                default: -                    break; -                } -                break; - -            case ACPI_REFCLASS_NAME: - -                AcpiDmDecodeNode (ObjDesc->Reference.Node); -                break; - -            case ACPI_REFCLASS_DEBUG: -            case ACPI_REFCLASS_TABLE: - -                AcpiOsPrintf ("\n"); -                break; - -            default:    /* Unknown reference class */ - -                AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); -                break; -            } -            break; - -        default: - -            AcpiOsPrintf ("<Obj>            "); -            AcpiDmDecodeInternalObject (ObjDesc); -            break; -        } -        break; - -    default: - -        AcpiOsPrintf ("<Not a valid ACPI Object Descriptor> [%s]", -            AcpiUtGetDescriptorName (ObjDesc)); -        break; -    } - -    AcpiOsPrintf ("\n"); -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDmDisplayLocals - * - * PARAMETERS:  WalkState       - State for current method - * - * RETURN:      None - * - * DESCRIPTION: Display all locals for the currently running control method - * - ******************************************************************************/ - -void -AcpiDmDisplayLocals ( -    ACPI_WALK_STATE         *WalkState) -{ -    UINT32                  i; -    ACPI_OPERAND_OBJECT     *ObjDesc; -    ACPI_NAMESPACE_NODE     *Node; - - -    ObjDesc = WalkState->MethodDesc; -    Node    = WalkState->MethodNode; -    if (!Node) -    { -        AcpiOsPrintf ( -            "No method node (Executing subtree for buffer or opregion)\n"); -        return; -    } - -    if (Node->Type != ACPI_TYPE_METHOD) -    { -        AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n"); -        return; -    } - -    AcpiOsPrintf ("Local Variables for method [%4.4s]:\n", -            AcpiUtGetNodeName (Node)); - -    for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) -    { -        ObjDesc = WalkState->LocalVariables[i].Object; -        AcpiOsPrintf ("    Local%X: ", i); -        AcpiDmDisplayInternalObject (ObjDesc, WalkState); -    } -} - - -/******************************************************************************* - * - * FUNCTION:    AcpiDmDisplayArguments - * - * PARAMETERS:  WalkState       - State for current method - * - * RETURN:      None - * - * DESCRIPTION: Display all arguments for the currently running control method - * - ******************************************************************************/ - -void -AcpiDmDisplayArguments ( -    ACPI_WALK_STATE         *WalkState) -{ -    UINT32                  i; -    ACPI_OPERAND_OBJECT     *ObjDesc; -    ACPI_NAMESPACE_NODE     *Node; - - -    ObjDesc = WalkState->MethodDesc; -    Node    = WalkState->MethodNode; -    if (!Node) -    { -        AcpiOsPrintf ( -            "No method node (Executing subtree for buffer or opregion)\n"); -        return; -    } - -    if (Node->Type != ACPI_TYPE_METHOD) -    { -        AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n"); -        return; -    } - -    AcpiOsPrintf ( -        "Arguments for Method [%4.4s]:  (%X arguments defined, max concurrency = %X)\n", -        AcpiUtGetNodeName (Node), ObjDesc->Method.ParamCount, ObjDesc->Method.SyncLevel); - -    for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) -    { -        ObjDesc = WalkState->Arguments[i].Object; -        AcpiOsPrintf ("    Arg%u:   ", i); -        AcpiDmDisplayInternalObject (ObjDesc, WalkState); -    } -} - -#endif diff --git a/source/components/disassembler/dmopcode.c b/source/components/disassembler/dmopcode.c index 60345fcaa599f..35f9eef8251de 100644 --- a/source/components/disassembler/dmopcode.c +++ b/source/components/disassembler/dmopcode.c @@ -48,6 +48,7 @@  #include "acdisasm.h"  #include "acinterp.h"  #include "acnamesp.h" +#include "acdebug.h"  #ifdef ACPI_DISASSEMBLER @@ -967,7 +968,7 @@ AcpiDmDisassembleOneOp (              (WalkState->Results) &&              (WalkState->ResultCount))          { -            AcpiDmDecodeInternalObject ( +            AcpiDbDecodeInternalObject (                  WalkState->Results->Results.ObjDesc [                      (WalkState->ResultCount - 1) %                          ACPI_RESULTS_FRAME_OBJ_NUM]); diff --git a/source/components/disassembler/dmwalk.c b/source/components/disassembler/dmwalk.c index 6a8c505439f46..8ae0dc8d86d23 100644 --- a/source/components/disassembler/dmwalk.c +++ b/source/components/disassembler/dmwalk.c @@ -313,6 +313,8 @@ AcpiDmBlockType (              return (BLOCK_NONE);          } +        /*lint -fallthrough */ +      default:          OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); @@ -410,7 +412,23 @@ AcpiDmDescendingOp (      const ACPI_OPCODE_INFO  *OpInfo;      UINT32                  Name;      ACPI_PARSE_OBJECT       *NextOp; +    UINT32                  AmlOffset; + + +    if (AcpiGbl_DbOpt_Verbose && AcpiGbl_PreviousOp) +    { +        /* Dump the entire statement in AML byte code */ +        if (Op->Common.Aml > AcpiGbl_PreviousOp->Common.Aml) +        { +            AcpiOsPrintf ("\n"); +            AcpiUtDumpBuffer (AcpiGbl_PreviousOp->Common.Aml, +                (Op->Common.Aml - AcpiGbl_PreviousOp->Common.Aml), +                DB_BYTE_DISPLAY, 0); +            AcpiDmIndent (Level); +        } +    } +    AcpiGbl_PreviousOp = Op;      if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)      { @@ -427,10 +445,12 @@ AcpiDmDescendingOp (          if (Info->WalkState)          { +            AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml, +                            Info->WalkState->ParserState.AmlStart);              VERBOSE_PRINT ((DB_FULL_OP_INFO,                  (Info->WalkState->MethodNode ?                      Info->WalkState->MethodNode->Name.Ascii : "   "), -                Op->Common.AmlOffset, (UINT32) Op->Common.AmlOpcode)); +                AmlOffset, (UINT32) Op->Common.AmlOpcode));          }          if (Op->Common.AmlOpcode == AML_SCOPE_OP) | 
