diff options
Diffstat (limited to 'source/components/disassembler/dmopcode.c')
-rw-r--r-- | source/components/disassembler/dmopcode.c | 82 |
1 files changed, 52 insertions, 30 deletions
diff --git a/source/components/disassembler/dmopcode.c b/source/components/disassembler/dmopcode.c index 821128f922bb..4bd0ca5db3df 100644 --- a/source/components/disassembler/dmopcode.c +++ b/source/components/disassembler/dmopcode.c @@ -48,6 +48,7 @@ #include "acinterp.h" #include "acnamesp.h" #include "acdebug.h" +#include "acconvert.h" #define _COMPONENT ACPI_CA_DEBUGGER @@ -70,7 +71,8 @@ AcpiDmPromoteSubtree ( static BOOLEAN AcpiDmIsSwitchBlock ( - ACPI_PARSE_OBJECT *Op); + ACPI_PARSE_OBJECT *Op, + char *Temp); static BOOLEAN AcpiDmIsCaseBlock ( @@ -441,6 +443,7 @@ AcpiDmFieldPredefinedDescription ( ACPI_CAST_PTR (char, Info->Description)); } + ACPI_FREE (Tag); /* Tag was allocated in AcpiGetTagPathname */ #endif return; } @@ -716,15 +719,15 @@ AcpiDmDisassembleOneOp ( { switch (Op->Common.AmlOpcode) { - case AML_LEQUAL_OP: + case AML_LOGICAL_EQUAL_OP: AcpiOsPrintf ("LNotEqual"); break; - case AML_LGREATER_OP: + case AML_LOGICAL_GREATER_OP: AcpiOsPrintf ("LLessEqual"); break; - case AML_LLESS_OP: + case AML_LOGICAL_LESS_OP: AcpiOsPrintf ("LGreaterEqual"); break; @@ -747,12 +750,12 @@ AcpiDmDisassembleOneOp ( switch (Op->Common.AmlOpcode) { - case AML_LNOT_OP: + case AML_LOGICAL_NOT_OP: Child = Op->Common.Value.Arg; - if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) || - (Child->Common.AmlOpcode == AML_LGREATER_OP) || - (Child->Common.AmlOpcode == AML_LLESS_OP)) + if ((Child->Common.AmlOpcode == AML_LOGICAL_EQUAL_OP) || + (Child->Common.AmlOpcode == AML_LOGICAL_GREATER_OP) || + (Child->Common.AmlOpcode == AML_LOGICAL_LESS_OP)) { Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX; Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; @@ -881,8 +884,12 @@ AcpiDmDisassembleOneOp ( case AML_INT_NAMEDFIELD_OP: Length = AcpiDmDumpName (Op->Named.Name); - AcpiOsPrintf (",%*.s %u", (unsigned) (5 - Length), " ", + + AcpiOsPrintf (","); + ASL_CV_PRINT_ONE_COMMENT (Op, AML_NAMECOMMENT, NULL, 0); + AcpiOsPrintf ("%*.s %u", (unsigned) (5 - Length), " ", (UINT32) Op->Common.Value.Integer); + AcpiDmCommaIfFieldMember (Op); Info->BitOffset += (UINT32) Op->Common.Value.Integer; @@ -923,6 +930,7 @@ AcpiDmDisassembleOneOp ( AcpiOsPrintf (")"); AcpiDmCommaIfFieldMember (Op); + ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0); break; case AML_INT_CONNECTION_OP: @@ -956,6 +964,8 @@ AcpiDmDisassembleOneOp ( AcpiOsPrintf (")"); AcpiDmCommaIfFieldMember (Op); + ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0); + ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0); AcpiOsPrintf ("\n"); Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */ @@ -977,7 +987,7 @@ AcpiDmDisassembleOneOp ( case AML_WHILE_OP: - if (AcpiDmIsSwitchBlock(Op)) + if (Op->Common.DisasmOpcode == ACPI_DASM_SWITCH) { AcpiOsPrintf ("%s", "Switch"); break; @@ -1006,15 +1016,13 @@ AcpiDmDisassembleOneOp ( if (AcpiGbl_DmEmitExternalOpcodes) { - AcpiOsPrintf ("/* Opcode 0x15 */ "); - - /* Fallthrough */ - } - else - { + AcpiDmEmitExternal (AcpiPsGetArg(Op, 0), + AcpiPsGetArg(Op, 1)); break; } + break; + default: /* Just get the opcode name and print it */ @@ -1255,11 +1263,13 @@ AcpiDmPromoteSubtree ( * * PARAMETERS: Op - Object to be examined * - * RETURN: TRUE if object is a temporary (_T_x) name + * RETURN: TRUE if object is a temporary (_T_x) name for a matching While + * loop that can be converted to a Switch. * - * DESCRIPTION: Determine if an object is a temporary name and ignore it. - * Temporary names are only used for Switch statements. This - * function depends on this restriced usage. + * DESCRIPTION: _T_X objects are only used for Switch statements. If a temporary + * name exists, search the siblings for a matching While (One) loop + * that can be converted to a Switch. Return TRUE if a match was + * found, FALSE otherwise. * ******************************************************************************/ @@ -1267,6 +1277,7 @@ BOOLEAN AcpiDmIsTempName ( ACPI_PARSE_OBJECT *Op) { + ACPI_PARSE_OBJECT *CurrentOp; char *Temp; if (Op->Common.AmlOpcode != AML_NAME_OP) @@ -1282,11 +1293,21 @@ AcpiDmIsTempName ( return (FALSE); } - /* Ignore Op */ + CurrentOp = Op->Common.Next; + while (CurrentOp) + { + if (CurrentOp->Common.AmlOpcode == AML_WHILE_OP && + AcpiDmIsSwitchBlock(CurrentOp, Temp)) + { + Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; + CurrentOp->Common.DisasmOpcode = ACPI_DASM_SWITCH; - Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; + return (TRUE); + } + CurrentOp = CurrentOp->Common.Next; + } - return (TRUE); + return (FALSE); } /******************************************************************************* @@ -1322,7 +1343,8 @@ AcpiDmIsTempName ( static BOOLEAN AcpiDmIsSwitchBlock ( - ACPI_PARSE_OBJECT *Op) + ACPI_PARSE_OBJECT *Op, + char *Temp) { ACPI_PARSE_OBJECT *OneOp; ACPI_PARSE_OBJECT *StoreOp; @@ -1355,7 +1377,7 @@ AcpiDmIsSwitchBlock ( return (FALSE); } - if (strncmp((char *)(NamePathOp->Common.Aml), "_T_", 3)) + if (strncmp((char *)(NamePathOp->Common.Aml), Temp, 4)) { return (FALSE); } @@ -1411,7 +1433,7 @@ AcpiDmIsSwitchBlock ( TempOp = AcpiPsGetArg (CurrentOp, 0); switch (TempOp->Common.AmlOpcode) { - case (AML_LEQUAL_OP): + case (AML_LOGICAL_EQUAL_OP): /* Ignore just the LEqual Op */ @@ -1433,7 +1455,7 @@ AcpiDmIsSwitchBlock ( break; - case (AML_LNOT_OP): + case (AML_LOGICAL_NOT_OP): /* * The Package will be the predicate of the Case statement. @@ -1588,7 +1610,7 @@ AcpiDmIsCaseBlock ( switch (CurrentOp->Common.AmlOpcode) { - case (AML_LEQUAL_OP): + case (AML_LOGICAL_EQUAL_OP): /* Next child must be NamePath with string _T_ */ @@ -1601,12 +1623,12 @@ AcpiDmIsCaseBlock ( break; - case (AML_LNOT_OP): + case (AML_LOGICAL_NOT_OP): /* Child of LNot must be LEqual op */ CurrentOp = AcpiPsGetArg (CurrentOp, 0); - if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_LEQUAL_OP)) + if (!CurrentOp || (CurrentOp->Common.AmlOpcode != AML_LOGICAL_EQUAL_OP)) { return (FALSE); } |