diff options
author | Robert Moore <Robert.Moore@intel.com> | 2014-03-11 12:57:20 -0700 |
---|---|---|
committer | Robert Moore <Robert.Moore@intel.com> | 2014-03-11 12:57:20 -0700 |
commit | 9d14762d53bf486122e07cf5b450fb421dc2e0c8 (patch) | |
tree | c11d0189146308a7f1620a1bb31ff4d216b40297 /source | |
parent | 875abf60130b8a0af4826dea1d9ef476e915e1f4 (diff) | |
download | acpica-9d14762d53bf486122e07cf5b450fb421dc2e0c8.tar.gz |
Disassembler: Emit full pathname comment for target operands.
This changes displays the full pathname (if possible) for target
operands of AML operators. Adds additional information to the
disassembly. The pathnames are emitted within comments so as not
to interfere with compilation.
Diffstat (limited to 'source')
-rw-r--r-- | source/components/disassembler/dmopcode.c | 94 | ||||
-rw-r--r-- | source/components/disassembler/dmwalk.c | 2 | ||||
-rw-r--r-- | source/include/acdisasm.h | 4 |
3 files changed, 100 insertions, 0 deletions
diff --git a/source/components/disassembler/dmopcode.c b/source/components/disassembler/dmopcode.c index e5c1d6292..db30c00a1 100644 --- a/source/components/disassembler/dmopcode.c +++ b/source/components/disassembler/dmopcode.c @@ -119,6 +119,7 @@ #include "amlcode.h" #include "acdisasm.h" #include "acinterp.h" +#include "acnamesp.h" #ifdef ACPI_DISASSEMBLER @@ -134,6 +135,99 @@ AcpiDmMatchKeyword ( /******************************************************************************* * + * FUNCTION: AcpiDmDisplayTargetPathname + * + * PARAMETERS: Op - Parse object + * + * RETURN: None + * + * DESCRIPTION: For AML opcodes that have a target operand, display the full + * pathname for the target, in a comment field. Handles Return() + * statements also. + * + ******************************************************************************/ + +void +AcpiDmDisplayTargetPathname ( + ACPI_PARSE_OBJECT *Op) +{ + ACPI_PARSE_OBJECT *NextOp; + ACPI_PARSE_OBJECT *PrevOp = NULL; + char *Pathname; + const ACPI_OPCODE_INFO *OpInfo; + + + if (Op->Common.AmlOpcode == AML_RETURN_OP) + { + PrevOp = Op->Asl.Value.Arg; + } + else + { + OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); + if (!(OpInfo->Flags & AML_HAS_TARGET)) + { + return; + } + + /* Target is the last Op in the arg list */ + + NextOp = Op->Asl.Value.Arg; + while (NextOp) + { + PrevOp = NextOp; + NextOp = PrevOp->Asl.Next; + } + } + + if (!PrevOp) + { + return; + } + + /* We must have a namepath AML opcode */ + + if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) + { + return; + } + + /* A null string is the "no target specified" case */ + + if (!PrevOp->Asl.Value.String) + { + return; + } + + /* No node means "unresolved external reference" */ + + if (!PrevOp->Asl.Node) + { + AcpiOsPrintf (" /* External reference */"); + return; + } + + /* Ignore if path is already from the root */ + + if (*PrevOp->Asl.Value.String == '\\') + { + return; + } + + /* Now: we can get the full pathname */ + + Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node); + if (!Pathname) + { + return; + } + + AcpiOsPrintf (" /* %s */", Pathname); + ACPI_FREE (Pathname); +} + + +/******************************************************************************* + * * FUNCTION: AcpiDmNotifyDescription * * PARAMETERS: Op - Name() parse object diff --git a/source/components/disassembler/dmwalk.c b/source/components/disassembler/dmwalk.c index 49c9cdfb8..ff72620a2 100644 --- a/source/components/disassembler/dmwalk.c +++ b/source/components/disassembler/dmwalk.c @@ -921,6 +921,8 @@ AcpiDmAscendingOp ( AcpiDmNotifyDescription (Op); } + AcpiDmDisplayTargetPathname (Op); + /* Could be a nested operator, check if comma required */ if (!AcpiDmCommaIfListMember (Op)) diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h index 206280437..df8d2e795 100644 --- a/source/include/acdisasm.h +++ b/source/include/acdisasm.h @@ -624,6 +624,10 @@ AcpiDmMethodFlags ( ACPI_PARSE_OBJECT *Op); void +AcpiDmDisplayTargetPathname ( + ACPI_PARSE_OBJECT *Op); + +void AcpiDmNotifyDescription ( ACPI_PARSE_OBJECT *Op); |