diff options
59 files changed, 2207 insertions, 1368 deletions
| diff --git a/changes.txt b/changes.txt index 49c88a49bbe66..52bc749dfe5c6 100644 --- a/changes.txt +++ b/changes.txt @@ -1,4 +1,83 @@  ---------------------------------------- +17 November 2016. Summary of changes for version 20161117: + + +1) ACPICA kernel-resident subsystem: + +Table Manager: Fixed a regression introduced in 20160729, "FADT support  +cleanup". This was an attempt to remove all references in the source to  +the FADT version 2, which never was a legal version number. It was  +skipped because it was an early version of 64-bit support that was  +eventually abandoned for the current 64-bit support. + +Interpreter: Fixed a problem where runtime implicit conversion was  +incorrectly disabled for the ASL operators below. This brings the  +behavior into compliance with the ACPI specification: +    FromBCD +    ToBCD +    ToDecimalString +    ToHexString +    ToInteger +    ToBuffer + +Table Manager: Added a new public interface, AcpiPutTable, used to  +release and free an ACPI table returned by AcpiGetTable and related  +interfaces. Lv Zheng. + +Example Code and Data Size: These are the sizes for the OS-independent  +acpica.lib produced by the Microsoft Visual C++ 9.0 32-bit compiler. The  +debug version of the code includes the debug output trace mechanism and  +has a much larger code and data size. + +  Current Release: +    Non-Debug Version: 140.5K Code, 58.5K Data, 198.9K Total +    Debug Version:     201.3K Code, 82.7K Data, 284.0K Total +  Previous Release: +    Non-Debug Version: 140.4K Code, 58.1K Data, 198.5K Total +    Debug Version:     200.7K Code, 82.1K Data, 282.8K Total + + +2) iASL Compiler/Disassembler and Tools: + +Disassembler: Fixed a regression for disassembly of Resource Template.  +Detection of templates in the AML stream missed some types of templates. + +iASL: Fixed a problem where an Access Size error was returned for the PCC  +address space when the AccessSize of the GAS register is greater than a  +DWORD. Hoan Tran. + +iASL: Implemented several grammar changes for the operators below. These  +changes are slated for the next version of the ACPI specification: +    RefOf        - Disallow method invocation as an operand +    CondRefOf    - Disallow method invocation as an operand +    DerefOf      - Disallow operands that use the result from operators  +that +                   do not return a reference (Changed TermArg to  +SuperName). + +iASL: Control method invocations are now allowed for Target operands, as  +per the ACPI specification. Removed error for using a control method  +invocation as a Target operand. + +Disassembler: Improved detection of Resource Templates, Unicode, and  +Strings within Buffer objects. These subtypes do not contain a specific  +opcode to indicate the originating ASL code, and they must be detected by  +other means within the disassembler.  + +iASL: Implemented an optimization improvement for 32-bit ACPI tables  +(DSDT/SSDT). For the 32-bit case only, compute the optimum integer opcode  +only after 64-bit to 32-bit truncation. A truncation warning message is  +still emitted, however. + +AcpiXtract: Implemented handling for both types of line terminators (LF  +or CR/LF) so that it can accept AcpiDump output files from any system.  +Peter Wu. + +AcpiBin: Added two new options for comparing AML files: +    -a: compare and display ALL mismatches +    -o: start compare at this offset into the second file + +----------------------------------------  30 September 2016. Summary of changes for version 20160930: diff --git a/source/common/acfileio.c b/source/common/acfileio.c index 409e16f0684fb..ffa23a64e25da 100644 --- a/source/common/acfileio.c +++ b/source/common/acfileio.c @@ -112,7 +112,7 @@ AcGetAllTablesFromFile (      if (FileSize == ACPI_UINT32_MAX)      {          Status = AE_ERROR; -        goto ErrorExit; +        goto Exit;      }      fprintf (stderr, @@ -124,7 +124,7 @@ AcGetAllTablesFromFile (      if (FileSize < sizeof (ACPI_TABLE_HEADER))      {          Status = AE_BAD_HEADER; -        goto ErrorExit; +        goto Exit;      }      /* Check for an non-binary file */ @@ -134,7 +134,8 @@ AcGetAllTablesFromFile (          fprintf (stderr,              "    %s: File does not appear to contain a valid AML table\n",              Filename); -        return (AE_TYPE); +        Status = AE_TYPE; +        goto Exit;      }      /* Read all tables within the file */ @@ -153,23 +154,31 @@ AcGetAllTablesFromFile (          }          else if (Status == AE_TYPE)          { -            return (AE_OK); +            Status = AE_OK; +            goto Exit;          }          else if (ACPI_FAILURE (Status))          { -            goto ErrorExit; +            goto Exit;          }          /* Print table header for iASL/disassembler only */  #ifdef ACPI_ASL_COMPILER -            AcpiTbPrintTableHeader (0, Table); +        AcpiTbPrintTableHeader (0, Table);  #endif          /* Allocate and link a table descriptor */          TableDesc = AcpiOsAllocate (sizeof (ACPI_NEW_TABLE_DESC)); +        if (!TableDesc) +        { +            AcpiOsFree (Table); +            Status = AE_NO_MEMORY; +            goto Exit; +        } +          TableDesc->Table = Table;          TableDesc->Next = NULL; @@ -204,7 +213,7 @@ AcGetAllTablesFromFile (          *ReturnListHead = ListHead;      } -ErrorExit: +Exit:      fclose(File);      return (Status);  } @@ -262,7 +271,6 @@ AcGetOneTableFromFile (          return (Status);      } -      if (GetOnlyAmlTables)      {          /* diff --git a/source/common/dmtbdump.c b/source/common/dmtbdump.c index 4ef670d0ce9c4..789256c12d3b4 100644 --- a/source/common/dmtbdump.c +++ b/source/common/dmtbdump.c @@ -52,31 +52,12 @@          ACPI_MODULE_NAME    ("dmtbdump") -/* Table of revision-dependent FADT sizes */ +/* Local prototypes */ -static const UINT32         FadtRevisionLength [ACPI_FADT_MAX_VERSION + 1] = -{ -    0,                      /* 0 - illegal */ -    ACPI_FADT_V1_SIZE,      /* 1 - ACPI 1.0 */ -    0,                      /* 2 - illegal */ -    ACPI_FADT_V3_SIZE,      /* 3 - ACPI 2.0 */ -    ACPI_FADT_V4_SIZE,      /* 4 - ACPI 3.0 and ACPI 4.0 */ -    ACPI_FADT_V5_SIZE,      /* 5 - ACPI 5.0 */ -    ACPI_FADT_V6_SIZE       /* 6 - ACPI 6.0 */ -}; - -/* Table of revision-dependent FADT info tables */ - -ACPI_DMTABLE_INFO           *FadtRevisionInfo [ACPI_FADT_MAX_VERSION + 1] = -{ -    NULL,                   /* 0 - illegal */ -    AcpiDmTableInfoFadt1,   /* 1 - ACPI 1.0 */ -    NULL,                   /* 2 - illegal */ -    AcpiDmTableInfoFadt3,   /* 3 - ACPI 2.0 */ -    AcpiDmTableInfoFadt4,   /* 4 - ACPI 3.0 and ACPI 4.0 */ -    AcpiDmTableInfoFadt5,   /* 5 - ACPI 5.0 */ -    AcpiDmTableInfoFadt6    /* 6 - ACPI 6.0 */ -}; +static void +AcpiDmValidateFadtLength ( +    UINT32                  Revision, +    UINT32                  Length);  /******************************************************************************* @@ -366,11 +347,6 @@ AcpiDmDumpXsdt (   *   * DESCRIPTION: Format the contents of a FADT   * - *              Check the FADT revision against the expected table length for - *              that revision. Issue a warning if the length is not what was - *              expected. This seems to be such a common BIOS bug that the - *              FADT revision has been rendered virtually meaningless. - *   * NOTE:        We cannot depend on the FADT version to indicate the actual   *              contents of the FADT because of BIOS bugs. The table length   *              is the only reliable indicator. @@ -382,72 +358,142 @@ AcpiDmDumpFadt (      ACPI_TABLE_HEADER       *Table)  {      ACPI_STATUS             Status; -    UINT8                   FadtRevision; -    UINT32                  ExpectedLength; -    UINT32                  i; - -    FadtRevision = Table->Revision; -    /* FADT revision/length validation */ +    /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ -    if ((FadtRevision == 0) || -        (FadtRevision == 2)) +    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, +        AcpiDmTableInfoFadt1); +    if (ACPI_FAILURE (Status))      { -        AcpiOsPrintf ( -            "// ACPI Warning: Invalid or unsupported FADT revision: %u\n", -            FadtRevision);          return;      } -    if (FadtRevision > ACPI_FADT_MAX_VERSION) -    { -        AcpiOsPrintf ("// ACPI Warning: Revision %u is not fully supported, " -            "disassembling known fields (up to revision %u)\n\n", -            FadtRevision, ACPI_FADT_MAX_VERSION); -    } -    else +    /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ + +    if ((Table->Length > ACPI_FADT_V1_SIZE) && +        (Table->Length <= ACPI_FADT_V2_SIZE))      { -        ExpectedLength = FadtRevisionLength[FadtRevision]; -        if (Table->Length != ExpectedLength) +        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, +            AcpiDmTableInfoFadt2); +        if (ACPI_FAILURE (Status))          { -            AcpiOsPrintf ( -                "// ACPI Warning: Input FADT revision %X does not match " -                "expected length: found 0x%X expected 0x%X\n", -                FadtRevision, Table->Length, ExpectedLength); +            return;          }      } -    /* -     * Dump the input table on a per-version basis, but is actually -     * based upon the length of the table. Table length must -     * be larger than the required length of the previous version. -     */ -    for (i = 1; i <= ACPI_FADT_MAX_VERSION; i++) +    /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ + +    else if (Table->Length > ACPI_FADT_V2_SIZE)      { -        if (!FadtRevisionLength[i]) /* Skip any empty slots */ +        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, +            AcpiDmTableInfoFadt3); +        if (ACPI_FAILURE (Status))          { -            continue; +            return;          } -        /* Dump the fields specific to FADT revision[i] */ +        /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ -        Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, -            FadtRevisionInfo[i]); -        if (ACPI_FAILURE (Status)) +        if (Table->Length > ACPI_FADT_V3_SIZE)          { -            return; +            Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, +                AcpiDmTableInfoFadt5); +            if (ACPI_FAILURE (Status)) +            { +                return; +            }          } -        if (Table->Length <= FadtRevisionLength[i]) +        /* Check for FADT revision 6 fields and up (ACPI 6.0+) */ + +        if (Table->Length > ACPI_FADT_V3_SIZE)          { -            break;  /* End of table */ +            Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, +                AcpiDmTableInfoFadt6); +            if (ACPI_FAILURE (Status)) +            { +                return; +            }          }      } -    /* Build a local FADT to test some FADT values */ +    /* Validate various fields in the FADT, including length */      AcpiTbCreateLocalFadt (Table, Table->Length); + +    /* Validate FADT length against the revision */ + +    AcpiDmValidateFadtLength (Table->Revision, Table->Length); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDmValidateFadtLength + * + * PARAMETERS:  Revision            - FADT revision (Header->Revision) + *              Length              - FADT length (Header->Length + * + * RETURN:      None + * + * DESCRIPTION: Check the FADT revision against the expected table length for + *              that revision. Issue a warning if the length is not what was + *              expected. This seems to be such a common BIOS bug that the + *              FADT revision has been rendered virtually meaningless. + * + ******************************************************************************/ + +static void +AcpiDmValidateFadtLength ( +    UINT32                  Revision, +    UINT32                  Length) +{ +    UINT32                  ExpectedLength; + + +    switch (Revision) +    { +    case 0: + +        AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); +        return; + +    case 1: + +        ExpectedLength = ACPI_FADT_V1_SIZE; +        break; + +    case 2: + +        ExpectedLength = ACPI_FADT_V2_SIZE; +        break; + +    case 3: +    case 4: + +        ExpectedLength = ACPI_FADT_V3_SIZE; +        break; + +    case 5: + +        ExpectedLength = ACPI_FADT_V5_SIZE; +        break; + +    default: + +        return; +    } + +    if (Length == ExpectedLength) +    { +        return; +    } + +    AcpiOsPrintf ( +        "\n// ACPI Warning: FADT revision %X does not match length: " +        "found %X expected %X\n", +        Revision, Length, ExpectedLength);  } diff --git a/source/common/dmtbinfo.c b/source/common/dmtbinfo.c index e0a6070f06a8e..1cc37ef31df56 100644 --- a/source/common/dmtbinfo.c +++ b/source/common/dmtbinfo.c @@ -400,7 +400,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoFacs[] =   *   ******************************************************************************/ -/* FADT version 1 (ACPI 1.0) */ +/* ACPI 1.0 FADT (Version 1) */  ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt1[] =  { @@ -486,7 +486,18 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt1[] =      ACPI_DMT_TERMINATOR  }; -/* FADT version 3 (ACPI 2.0) */ +/* ACPI 1.0 MS Extensions (FADT version 2) */ + +ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt2[] = +{ +    {ACPI_DMT_GAS,      ACPI_FADT_OFFSET (ResetRegister),           "Reset Register", 0}, +    {ACPI_DMT_UINT8,    ACPI_FADT_OFFSET (ResetValue),              "Value to cause reset", 0}, +    {ACPI_DMT_UINT16,   ACPI_FADT_OFFSET (ArmBootFlags),            "Reserved", 0}, +    {ACPI_DMT_UINT8,    ACPI_FADT_OFFSET (MinorRevision),           "Reserved", 0}, +    ACPI_DMT_TERMINATOR +}; + +/* ACPI 2.0+ Extensions (FADT version 3, 4, and 5) */  ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt3[] =  { @@ -510,23 +521,16 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt3[] =      ACPI_DMT_TERMINATOR  }; -/* FADT version 4 (ACPI 3.0 and ACPI 4.0) */ - -ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt4[] = -{ -    {ACPI_DMT_GAS,      ACPI_FADT_OFFSET (SleepControl),            "Sleep Control Register", 0}, -    ACPI_DMT_TERMINATOR -}; - -/* FADT version 5 (ACPI 5.0) */ +/* ACPI 5.0 Extensions (FADT version 5) */  ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt5[] =  { +    {ACPI_DMT_GAS,      ACPI_FADT_OFFSET (SleepControl),            "Sleep Control Register", 0},      {ACPI_DMT_GAS,      ACPI_FADT_OFFSET (SleepStatus),             "Sleep Status Register", 0},      ACPI_DMT_TERMINATOR  }; -/* FADT version 6 (ACPI 6.0) */ +/* ACPI 6.0 Extensions (FADT version 6) */  ACPI_DMTABLE_INFO           AcpiDmTableInfoFadt6[] =  { diff --git a/source/compiler/aslbtypes.c b/source/compiler/aslbtypes.c index c956516f8ba21..10ec3d49b3429 100644 --- a/source/compiler/aslbtypes.c +++ b/source/compiler/aslbtypes.c @@ -151,7 +151,6 @@ AnMapArgTypeToBtype (          return (ACPI_BTYPE_DATA | ACPI_BTYPE_DEBUG_OBJECT |              ACPI_BTYPE_REFERENCE_OBJECT); -    case ARGI_FIXED_TARGET:      case ARGI_SIMPLE_TARGET:          return (ACPI_BTYPE_OBJECTS_AND_REFS); diff --git a/source/compiler/aslcompiler.l b/source/compiler/aslcompiler.l index 15c9dae0d1137..228db8b90d641 100644 --- a/source/compiler/aslcompiler.l +++ b/source/compiler/aslcompiler.l @@ -156,8 +156,14 @@ NamePathTail                [.]{NameSeg}  "^="                        { count (3); return (PARSEOP_EXP_XOR_EQ); }  "|="                        { count (3); return (PARSEOP_EXP_OR_EQ); } -"["                         { count (3); return(PARSEOP_EXP_INDEX_LEFT); } -"]"                         { count (0); return(PARSEOP_EXP_INDEX_RIGHT); } +"["                         { count (3); return (PARSEOP_EXP_INDEX_LEFT); } +"]"                         { count (0); return (PARSEOP_EXP_INDEX_RIGHT); } +"("                         { count (0); return (PARSEOP_OPEN_PAREN); } +")"                         { count (0); return (PARSEOP_CLOSE_PAREN); } + +"{"                         { count (0); return ('{'); } +"}"                         { count (0); return ('}'); } +","                         { count (0); return (','); }      /* @@ -691,12 +697,6 @@ NamePathTail                [.]{NameSeg}  "__PATH__"                  { count (0); return (PARSEOP___PATH__); } -"{"                         { count (0); return('{'); } -"}"                         { count (0); return('}'); } -","                         { count (0); return(','); } -"("                         { count (0); return('('); } -")"                         { count (0); return(')'); } -  {NameSeg}                   { char *s;                                  count (0);                                  s=UtStringCacheCalloc (ACPI_NAME_SIZE + 1); diff --git a/source/compiler/aslcstyle.y b/source/compiler/aslcstyle.y index fc7d5933df190..d4034a5f2e43c 100644 --- a/source/compiler/aslcstyle.y +++ b/source/compiler/aslcstyle.y @@ -149,21 +149,30 @@ Expression      /* Parentheses */ -    | '(' TermArg ')'                   { $$ = $2;} +    | PARSEOP_OPEN_PAREN +        Expression +        PARSEOP_CLOSE_PAREN             {$$ = $2;}      /* Index term -- "= BUF1[5]" on right-hand side of an equals (source) */ -    | SuperName PARSEOP_EXP_INDEX_LEFT -        TermArg PARSEOP_EXP_INDEX_RIGHT {$$ = TrCreateLeafNode (PARSEOP_INDEX); -                                        TrLinkChildren ($$,3,$1,$3,TrCreateNullTarget ());} +    | IndexExpTerm      ; -    /* Index term -- "BUF1[5] = " on left-hand side of an equals (target) */ - +    /* +     * Index term -- "BUF1[5] = " or " = BUF1[5] on either the left side +     * of an equals (target) or the right side (source) +     * Currently used in these terms: +     *      Expression +     *      ObjectTypeSource +     *      DerefOfSource +     *      Type6Opcode +     */  IndexExpTerm -    : SuperName PARSEOP_EXP_INDEX_LEFT -        TermArg PARSEOP_EXP_INDEX_RIGHT {$$ = TrCreateLeafNode (PARSEOP_INDEX); +    : SuperName +        PARSEOP_EXP_INDEX_LEFT +        TermArg +        PARSEOP_EXP_INDEX_RIGHT         {$$ = TrCreateLeafNode (PARSEOP_INDEX);                                          TrLinkChildren ($$,3,$1,$3,TrCreateNullTarget ());}      ; @@ -177,11 +186,26 @@ IndexExpTerm  EqualsTerm +    /* Allow parens anywhere */ + +    : PARSEOP_OPEN_PAREN +        EqualsTerm +        PARSEOP_CLOSE_PAREN             {$$ = $2;} +      /* Simple Store() operation */ -    : SuperName PARSEOP_EXP_EQUALS +    | SuperName +        PARSEOP_EXP_EQUALS          TermArg                         {$$ = TrCreateAssignmentNode ($1, $3);} +    /* Chained equals: (a=RefOf)=b, a=b=c=d etc. */ + +    | PARSEOP_OPEN_PAREN +        EqualsTerm +        PARSEOP_CLOSE_PAREN +        PARSEOP_EXP_EQUALS +        TermArg                         {$$ = TrCreateAssignmentNode ($2, $5);} +      /* Compound assignments -- Add (operand, operand, target) */      | TermArg PARSEOP_EXP_ADD_EQ        {$<n>$ = TrCreateLeafNode (PARSEOP_ADD);} diff --git a/source/compiler/aslexternal.c b/source/compiler/aslexternal.c index a814efddd5460..8e76aa7236c71 100644 --- a/source/compiler/aslexternal.c +++ b/source/compiler/aslexternal.c @@ -325,6 +325,7 @@ ExMoveExternals (      ACPI_PARSE_OBJECT       *NextOp;      ACPI_PARSE_OBJECT       *Prev;      ACPI_PARSE_OBJECT       *Next; +    char                    *ExternalName;      ACPI_OBJECT_TYPE        ObjType;      UINT32                  i; @@ -345,6 +346,12 @@ ExMoveExternals (           */          ExternalOp = NextOp->Asl.Child; +        /* Get/set the fully qualified name */ + +        ExternalName = AcpiNsGetNormalizedPathname (ExternalOp->Asl.Node, TRUE); +        ExternalOp->Asl.ExternalName = ExternalName; +        ExternalOp->Asl.Namepath = ExternalName; +          /* Set line numbers (for listings, etc.) */          ExternalOp->Asl.LineNumber = 0; @@ -354,6 +361,14 @@ ExMoveExternals (          Next->Asl.LineNumber = 0;          Next->Asl.LogicalLineNumber = 0; +        if (Next->Asl.ParseOpcode == PARSEOP_NAMESEG) +        { +            Next->Asl.ParseOpcode = PARSEOP_NAMESTRING; +        } +        Next->Asl.ExternalName = ExternalName; +        UtInternalizeName (ExternalName, &Next->Asl.Value.String); +        Next->Asl.AmlLength = strlen (Next->Asl.Value.String); +          Next = Next->Asl.Next;          Next->Asl.LineNumber = 0;          Next->Asl.LogicalLineNumber = 0; diff --git a/source/compiler/aslkeywords.y b/source/compiler/aslkeywords.y index 51af1c684a310..c908ae401c523 100644 --- a/source/compiler/aslkeywords.y +++ b/source/compiler/aslkeywords.y @@ -58,15 +58,18 @@ AccessAttribKeyword      | PARSEOP_ACCESSATTRIB_SND_RCV          {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_SND_RCV);}      | PARSEOP_ACCESSATTRIB_WORD             {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_WORD);}      | PARSEOP_ACCESSATTRIB_WORD_CALL        {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_WORD_CALL);} -    | PARSEOP_ACCESSATTRIB_MULTIBYTE '('    {$<n>$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_MULTIBYTE);} +    | PARSEOP_ACCESSATTRIB_MULTIBYTE +        PARSEOP_OPEN_PAREN                  {$<n>$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_MULTIBYTE);}          ByteConst -        ')'                                 {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_ACCESSATTRIB_RAW_BYTES '('    {$<n>$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_RAW_BYTES);} +        PARSEOP_CLOSE_PAREN                 {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_ACCESSATTRIB_RAW_BYTES +        PARSEOP_OPEN_PAREN                  {$<n>$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_RAW_BYTES);}          ByteConst -        ')'                                 {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_ACCESSATTRIB_RAW_PROCESS '('  {$<n>$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_RAW_PROCESS);} +        PARSEOP_CLOSE_PAREN                 {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_ACCESSATTRIB_RAW_PROCESS +        PARSEOP_OPEN_PAREN                  {$<n>$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_RAW_PROCESS);}          ByteConst -        ')'                                 {$$ = TrLinkChildren ($<n>3,1,$4);} +        PARSEOP_CLOSE_PAREN                 {$$ = TrLinkChildren ($<n>3,1,$4);}      ;  AccessTypeKeyword diff --git a/source/compiler/aslopcodes.c b/source/compiler/aslopcodes.c index de9ffe1baf097..c981f07c4d742 100644 --- a/source/compiler/aslopcodes.c +++ b/source/compiler/aslopcodes.c @@ -289,7 +289,7 @@ OpcSetOptimalIntegerSize (          Op->Asl.AmlOpcode = AML_DWORD_OP;          return (4);      } -    else +    else /* 64-bit integer */      {          if (AcpiGbl_IntegerByteWidth == 4)          { @@ -299,8 +299,12 @@ OpcSetOptimalIntegerSize (              if (!Gbl_IgnoreErrors)              {                  /* Truncate the integer to 32-bit */ -                Op->Asl.AmlOpcode = AML_DWORD_OP; -                return (4); + +                Op->Asl.Value.Integer &= ACPI_UINT32_MAX; + +                /* Now set the optimal integer size */ + +                return (OpcSetOptimalIntegerSize (Op));              }          } diff --git a/source/compiler/aslprimaries.y b/source/compiler/aslprimaries.y index 742213ab623b6..b52bbcdc6718a 100644 --- a/source/compiler/aslprimaries.y +++ b/source/compiler/aslprimaries.y @@ -52,51 +52,61 @@ NoEcho('   ******************************************************************************/  AccessAsTerm -    : PARSEOP_ACCESSAS '(' +    : PARSEOP_ACCESSAS +        PARSEOP_OPEN_PAREN          AccessTypeKeyword          OptionalAccessAttribTerm -        ')'                         {$$ = TrCreateNode (PARSEOP_ACCESSAS,2,$3,$4);} -    | PARSEOP_ACCESSAS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_ACCESSAS,2,$3,$4);} +    | PARSEOP_ACCESSAS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  AcquireTerm -    : PARSEOP_ACQUIRE '('           {$<n>$ = TrCreateLeafNode (PARSEOP_ACQUIRE);} +    : PARSEOP_ACQUIRE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_ACQUIRE);}          SuperName          ',' WordConstExpr -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$6);} -    | PARSEOP_ACQUIRE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$6);} +    | PARSEOP_ACQUIRE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  AddTerm -    : PARSEOP_ADD '('               {$<n>$ = TrCreateLeafNode (PARSEOP_ADD);} +    : PARSEOP_ADD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_ADD);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_ADD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_ADD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  AliasTerm -    : PARSEOP_ALIAS '('             {$<n>$ = TrCreateLeafNode (PARSEOP_ALIAS);} +    : PARSEOP_ALIAS +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_ALIAS);}          NameString          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,                                          TrSetNodeFlags ($5, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_ALIAS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_ALIAS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  AndTerm -    : PARSEOP_AND '('               {$<n>$ = TrCreateLeafNode (PARSEOP_AND);} +    : PARSEOP_AND +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_AND);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_AND '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_AND +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ArgTerm @@ -110,18 +120,21 @@ ArgTerm      ;  BankFieldTerm -    : PARSEOP_BANKFIELD '('         {$<n>$ = TrCreateLeafNode (PARSEOP_BANKFIELD);} +    : PARSEOP_BANKFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_BANKFIELD);}          NameString          NameStringItem          TermArgItem          ',' AccessTypeKeyword          ',' LockRuleKeyword          ',' UpdateRuleKeyword -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              FieldUnitList '}'       {$$ = TrLinkChildren ($<n>3,7,                                          $4,$5,$6,$8,$10,$12,$15);} -    | PARSEOP_BANKFIELD '(' -        error ')' '{' error '}'     {$$ = AslDoError(); yyclearin;} +    | PARSEOP_BANKFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN +        '{' error '}'               {$$ = AslDoError(); yyclearin;}      ;  BreakTerm @@ -144,58 +157,69 @@ BufferTermData      ;  CaseTerm -    : PARSEOP_CASE '('              {$<n>$ = TrCreateLeafNode (PARSEOP_CASE);} +    : PARSEOP_CASE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CASE);}          DataObject -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_CASE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CASE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ConcatTerm -    : PARSEOP_CONCATENATE '('       {$<n>$ = TrCreateLeafNode (PARSEOP_CONCATENATE);} +    : PARSEOP_CONCATENATE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CONCATENATE);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_CONCATENATE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_CONCATENATE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ConcatResTerm -    : PARSEOP_CONCATENATERESTEMPLATE '(' {$<n>$ = TrCreateLeafNode ( -                                            PARSEOP_CONCATENATERESTEMPLATE);} +    : PARSEOP_CONCATENATERESTEMPLATE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode ( +                                        PARSEOP_CONCATENATERESTEMPLATE);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_CONCATENATERESTEMPLATE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_CONCATENATERESTEMPLATE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;} +    ; + +CondRefOfTerm +    : PARSEOP_CONDREFOF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CONDREFOF);} +        CondRefOfSource +        Target +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_CONDREFOF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ConnectionTerm -    : PARSEOP_CONNECTION '(' +    : PARSEOP_CONNECTION +        PARSEOP_OPEN_PAREN          NameString -        ')'                         {$$ = TrCreateNode (PARSEOP_CONNECTION,1,$3);} -    | PARSEOP_CONNECTION '('        {$<n>$ = TrCreateLeafNode (PARSEOP_CONNECTION);} +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_CONNECTION,1,$3);} +    | PARSEOP_CONNECTION +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CONNECTION);}          ResourceMacroTerm -        ')'                         {$$ = TrLinkChildren ($<n>3, 1, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3, 1,                                          TrLinkChildren (                                              TrCreateLeafNode (PARSEOP_RESOURCETEMPLATE), 3,                                              TrCreateLeafNode (PARSEOP_DEFAULT_ARG),                                              TrCreateLeafNode (PARSEOP_DEFAULT_ARG),                                              $4));} -    | PARSEOP_CONNECTION '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} -    ; - -CondRefOfTerm -    : PARSEOP_CONDREFOF '('         {$<n>$ = TrCreateLeafNode (PARSEOP_CONDREFOF);} -        SuperName -        Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_CONDREFOF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CONNECTION +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ContinueTerm @@ -203,92 +227,108 @@ ContinueTerm      ;  CopyObjectTerm -    : PARSEOP_COPYOBJECT '('        {$<n>$ = TrCreateLeafNode (PARSEOP_COPYOBJECT);} +    : PARSEOP_COPYOBJECT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_COPYOBJECT);}          TermArg -        ',' SimpleTarget -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4, +        ',' SimpleName +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,                                          TrSetNodeFlags ($6, NODE_IS_TARGET));} -    | PARSEOP_COPYOBJECT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_COPYOBJECT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  CreateBitFieldTerm -    : PARSEOP_CREATEBITFIELD '('    {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBITFIELD);} +    : PARSEOP_CREATEBITFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBITFIELD);}          TermArg          TermArgItem          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,                                          TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_CREATEBITFIELD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CREATEBITFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  CreateByteFieldTerm -    : PARSEOP_CREATEBYTEFIELD '('   {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBYTEFIELD);} +    : PARSEOP_CREATEBYTEFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEBYTEFIELD);}          TermArg          TermArgItem          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,                                          TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_CREATEBYTEFIELD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CREATEBYTEFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  CreateDWordFieldTerm -    : PARSEOP_CREATEDWORDFIELD '('  {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEDWORDFIELD);} +    : PARSEOP_CREATEDWORDFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEDWORDFIELD);}          TermArg          TermArgItem          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,                                          TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_CREATEDWORDFIELD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CREATEDWORDFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  CreateFieldTerm -    : PARSEOP_CREATEFIELD '('       {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEFIELD);} +    : PARSEOP_CREATEFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEFIELD);}          TermArg          TermArgItem          TermArgItem          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,                                          TrSetNodeFlags ($7, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_CREATEFIELD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CREATEFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  CreateQWordFieldTerm -    : PARSEOP_CREATEQWORDFIELD '('  {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEQWORDFIELD);} +    : PARSEOP_CREATEQWORDFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEQWORDFIELD);}          TermArg          TermArgItem          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,                                          TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_CREATEQWORDFIELD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CREATEQWORDFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  CreateWordFieldTerm -    : PARSEOP_CREATEWORDFIELD '('   {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEWORDFIELD);} +    : PARSEOP_CREATEWORDFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_CREATEWORDFIELD);}          TermArg          TermArgItem          NameStringItem -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,                                          TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_CREATEWORDFIELD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_CREATEWORDFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DataRegionTerm -    : PARSEOP_DATATABLEREGION '('   {$<n>$ = TrCreateLeafNode (PARSEOP_DATATABLEREGION);} +    : PARSEOP_DATATABLEREGION +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DATATABLEREGION);}          NameString          TermArgItem          TermArgItem          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,4, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,4,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$6,$7);} -    | PARSEOP_DATATABLEREGION '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DATATABLEREGION +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DebugTerm @@ -296,11 +336,13 @@ DebugTerm      ;  DecTerm -    : PARSEOP_DECREMENT '('         {$<n>$ = TrCreateLeafNode (PARSEOP_DECREMENT);} +    : PARSEOP_DECREMENT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DECREMENT);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_DECREMENT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_DECREMENT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DefaultTerm @@ -311,39 +353,48 @@ DefaultTerm      ;  DerefOfTerm -    : PARSEOP_DEREFOF '('           {$<n>$ = TrCreateLeafNode (PARSEOP_DEREFOF);} -        TermArg -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_DEREFOF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    : PARSEOP_DEREFOF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DEREFOF);} +        DerefOfSource +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_DEREFOF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DeviceTerm -    : PARSEOP_DEVICE '('            {$<n>$ = TrCreateLeafNode (PARSEOP_DEVICE);} +    : PARSEOP_DEVICE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DEVICE);}          NameString -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,2,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);} -    | PARSEOP_DEVICE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DEVICE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DivideTerm -    : PARSEOP_DIVIDE '('            {$<n>$ = TrCreateLeafNode (PARSEOP_DIVIDE);} +    : PARSEOP_DIVIDE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DIVIDE);}          TermArg          TermArgItem          Target          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,$7);} -    | PARSEOP_DIVIDE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,$7);} +    | PARSEOP_DIVIDE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  EISAIDTerm -    : PARSEOP_EISAID '(' -        StringData ')'              {$$ = TrUpdateNode (PARSEOP_EISAID, $3);} -    | PARSEOP_EISAID '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    : PARSEOP_EISAID +        PARSEOP_OPEN_PAREN +        StringData +        PARSEOP_CLOSE_PAREN         {$$ = TrUpdateNode (PARSEOP_EISAID, $3);} +    | PARSEOP_EISAID +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ElseIfTerm @@ -361,88 +412,105 @@ ElseTerm      | PARSEOP_ELSE          error                       {$$ = AslDoError(); yyclearin;} -    | PARSEOP_ELSEIF '('            {$<n>$ = TrCreateLeafNode (PARSEOP_ELSE);} +    | PARSEOP_ELSEIF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_ELSE);}          TermArg                     {$<n>$ = TrCreateLeafNode (PARSEOP_IF);} -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {TrLinkChildren ($<n>5,2,$4,$8);}          ElseTerm                    {TrLinkPeerNode ($<n>5,$11);}                                      {$$ = TrLinkChildren ($<n>3,1,$<n>5);} -    | PARSEOP_ELSEIF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_ELSEIF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      | PARSEOP_ELSEIF          error                       {$$ = AslDoError(); yyclearin;}      ;  EventTerm -    : PARSEOP_EVENT '('             {$<n>$ = TrCreateLeafNode (PARSEOP_EVENT);} +    : PARSEOP_EVENT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_EVENT);}          NameString -        ')'                         {$$ = TrLinkChildren ($<n>3,1, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION));} -    | PARSEOP_EVENT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_EVENT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ExternalTerm -    : PARSEOP_EXTERNAL '(' +    : PARSEOP_EXTERNAL +        PARSEOP_OPEN_PAREN          NameString          OptionalObjectTypeKeyword          OptionalParameterTypePackage          OptionalParameterTypesPackage -        ')'                         {$$ = TrCreateNode (PARSEOP_EXTERNAL,4,$3,$4,$5,$6);} -    | PARSEOP_EXTERNAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_EXTERNAL,4,$3,$4,$5,$6);} +    | PARSEOP_EXTERNAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  FatalTerm -    : PARSEOP_FATAL '('             {$<n>$ = TrCreateLeafNode (PARSEOP_FATAL);} +    : PARSEOP_FATAL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FATAL);}          ByteConstExpr          ',' DWordConstExpr          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);} -    | PARSEOP_FATAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);} +    | PARSEOP_FATAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  FieldTerm -    : PARSEOP_FIELD '('             {$<n>$ = TrCreateLeafNode (PARSEOP_FIELD);} +    : PARSEOP_FIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FIELD);}          NameString          ',' AccessTypeKeyword          ',' LockRuleKeyword          ',' UpdateRuleKeyword -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              FieldUnitList '}'       {$$ = TrLinkChildren ($<n>3,5,$4,$6,$8,$10,$13);} -    | PARSEOP_FIELD '(' -        error ')' '{' error '}'     {$$ = AslDoError(); yyclearin;} +    | PARSEOP_FIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN +        '{' error '}'               {$$ = AslDoError(); yyclearin;}      ;  FindSetLeftBitTerm -    : PARSEOP_FINDSETLEFTBIT '('    {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETLEFTBIT);} +    : PARSEOP_FINDSETLEFTBIT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETLEFTBIT);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_FINDSETLEFTBIT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_FINDSETLEFTBIT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  FindSetRightBitTerm -    : PARSEOP_FINDSETRIGHTBIT '('   {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETRIGHTBIT);} +    : PARSEOP_FINDSETRIGHTBIT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FINDSETRIGHTBIT);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_FINDSETRIGHTBIT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_FINDSETRIGHTBIT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;      /* Convert a For() loop to a While() loop */  ForTerm -    : PARSEOP_FOR '('               {$<n>$ = TrCreateLeafNode (PARSEOP_WHILE);} +    : PARSEOP_FOR +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_WHILE);}          OptionalTermArg ','         {}          OptionalPredicate ','          OptionalTermArg             {$<n>$ = TrLinkPeerNode ($4,$<n>3); -                                        TrSetParent ($9,$<n>3);}                /* New parent is WHILE */ -        ')' '{' TermList '}'        {$<n>$ = TrLinkChildren ($<n>3,2,$7,$13);} +                                            TrSetParent ($9,$<n>3);}                /* New parent is WHILE */ +        PARSEOP_CLOSE_PAREN +        '{' TermList '}'            {$<n>$ = TrLinkChildren ($<n>3,2,$7,$13);}                                      {$<n>$ = TrLinkPeerNode ($13,$9);                                          $$ = $<n>10;}      ; @@ -453,52 +521,62 @@ OptionalPredicate      ;  FprintfTerm -    : PARSEOP_FPRINTF '('            {$<n>$ = TrCreateLeafNode (PARSEOP_FPRINTF);} +    : PARSEOP_FPRINTF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FPRINTF);}          TermArg ','          StringData          PrintfArgList -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);} -    | PARSEOP_FPRINTF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);} +    | PARSEOP_FPRINTF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  FromBCDTerm -    : PARSEOP_FROMBCD '('           {$<n>$ = TrCreateLeafNode (PARSEOP_FROMBCD);} +    : PARSEOP_FROMBCD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FROMBCD);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_FROMBCD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_FROMBCD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  FunctionTerm -    : PARSEOP_FUNCTION '('          {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);} +    : PARSEOP_FUNCTION +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);}          NameString          OptionalParameterTypePackage          OptionalParameterTypesPackage -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,7,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),                                          TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),                                          TrCreateLeafNode (PARSEOP_SERIALIZERULE_NOTSERIAL),                                          TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),$5,$6,$9);} -    | PARSEOP_FUNCTION '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_FUNCTION +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  IfTerm -    : PARSEOP_IF '('                {$<n>$ = TrCreateLeafNode (PARSEOP_IF);} +    : PARSEOP_IF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_IF);}          TermArg -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_IF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_IF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  IncludeTerm -    : PARSEOP_INCLUDE '(' -        String  ')'                 {$$ = TrUpdateNode (PARSEOP_INCLUDE, $3); +    : PARSEOP_INCLUDE +        PARSEOP_OPEN_PAREN +        String +        PARSEOP_CLOSE_PAREN         {$$ = TrUpdateNode (PARSEOP_INCLUDE, $3);                                          FlOpenIncludeFile ($3);}      ; @@ -508,130 +586,157 @@ IncludeEndTerm      ;  IncTerm -    : PARSEOP_INCREMENT '('         {$<n>$ = TrCreateLeafNode (PARSEOP_INCREMENT);} +    : PARSEOP_INCREMENT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_INCREMENT);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_INCREMENT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_INCREMENT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  IndexFieldTerm -    : PARSEOP_INDEXFIELD '('        {$<n>$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);} +    : PARSEOP_INDEXFIELD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);}          NameString          NameStringItem          ',' AccessTypeKeyword          ',' LockRuleKeyword          ',' UpdateRuleKeyword -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              FieldUnitList '}'       {$$ = TrLinkChildren ($<n>3,6,$4,$5,$7,$9,$11,$14);} -    | PARSEOP_INDEXFIELD '(' -        error ')' '{' error '}'     {$$ = AslDoError(); yyclearin;} +    | PARSEOP_INDEXFIELD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN +        '{' error '}'               {$$ = AslDoError(); yyclearin;}      ;  IndexTerm -    : PARSEOP_INDEX '('             {$<n>$ = TrCreateLeafNode (PARSEOP_INDEX);} +    : PARSEOP_INDEX +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_INDEX);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_INDEX '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_INDEX +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LAndTerm -    : PARSEOP_LAND '('              {$<n>$ = TrCreateLeafNode (PARSEOP_LAND);} +    : PARSEOP_LAND +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LAND);}          TermArg          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_LAND '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_LAND +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LEqualTerm -    : PARSEOP_LEQUAL '('            {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);} +    : PARSEOP_LEQUAL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);}          TermArg          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_LEQUAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_LEQUAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LGreaterEqualTerm -    : PARSEOP_LGREATEREQUAL '('     {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);} +    : PARSEOP_LGREATEREQUAL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);}          TermArg          TermArgItem -        ')'                         {$$ = TrCreateNode (PARSEOP_LNOT, 1, +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_LNOT, 1,                                          TrLinkChildren ($<n>3,2,$4,$5));} -    | PARSEOP_LGREATEREQUAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_LGREATEREQUAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LGreaterTerm -    : PARSEOP_LGREATER '('          {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);} +    : PARSEOP_LGREATER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}          TermArg          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_LGREATER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_LGREATER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LLessEqualTerm -    : PARSEOP_LLESSEQUAL '('        {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);} +    : PARSEOP_LLESSEQUAL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}          TermArg          TermArgItem -        ')'                         {$$ = TrCreateNode (PARSEOP_LNOT, 1, +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_LNOT, 1,                                          TrLinkChildren ($<n>3,2,$4,$5));} -    | PARSEOP_LLESSEQUAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_LLESSEQUAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LLessTerm -    : PARSEOP_LLESS '('             {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);} +    : PARSEOP_LLESS +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LLESS);}          TermArg          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_LLESS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_LLESS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LNotEqualTerm -    : PARSEOP_LNOTEQUAL '('         {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);} +    : PARSEOP_LNOTEQUAL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LEQUAL);}          TermArg          TermArgItem -        ')'                         {$$ = TrCreateNode (PARSEOP_LNOT, 1, +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_LNOT, 1,                                          TrLinkChildren ($<n>3,2,$4,$5));} -    | PARSEOP_LNOTEQUAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_LNOTEQUAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LNotTerm -    : PARSEOP_LNOT '('              {$<n>$ = TrCreateLeafNode (PARSEOP_LNOT);} +    : PARSEOP_LNOT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LNOT);}          TermArg -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_LNOT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_LNOT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LoadTableTerm -    : PARSEOP_LOADTABLE '('         {$<n>$ = TrCreateLeafNode (PARSEOP_LOADTABLE);} +    : PARSEOP_LOADTABLE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LOADTABLE);}          TermArg          TermArgItem          TermArgItem          OptionalListString          OptionalListString          OptionalReference -        ')'                         {$$ = TrLinkChildren ($<n>3,6,$4,$5,$6,$7,$8,$9);} -    | PARSEOP_LOADTABLE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,6,$4,$5,$6,$7,$8,$9);} +    | PARSEOP_LOADTABLE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LoadTerm -    : PARSEOP_LOAD '('              {$<n>$ = TrCreateLeafNode (PARSEOP_LOAD);} +    : PARSEOP_LOAD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LOAD);}          NameString          RequiredTarget -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_LOAD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_LOAD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  LocalTerm @@ -646,102 +751,120 @@ LocalTerm      ;  LOrTerm -    : PARSEOP_LOR '('               {$<n>$ = TrCreateLeafNode (PARSEOP_LOR);} +    : PARSEOP_LOR +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_LOR);}          TermArg          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_LOR '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_LOR +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  MatchTerm -    : PARSEOP_MATCH '('             {$<n>$ = TrCreateLeafNode (PARSEOP_MATCH);} +    : PARSEOP_MATCH +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MATCH);}          TermArg          ',' MatchOpKeyword          TermArgItem          ',' MatchOpKeyword          TermArgItem          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$7,$9,$10,$11);} -    | PARSEOP_MATCH '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$7,$9,$10,$11);} +    | PARSEOP_MATCH +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  MethodTerm -    : PARSEOP_METHOD  '('           {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);} +    : PARSEOP_METHOD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_METHOD);}          NameString          OptionalByteConstExpr       {UtCheckIntegerRange ($5, 0, 7);}          OptionalSerializeRuleKeyword          OptionalByteConstExpr          OptionalParameterTypePackage          OptionalParameterTypesPackage -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,7,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),                                          $5,$7,$8,$9,$10,$13);} -    | PARSEOP_METHOD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_METHOD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  MidTerm -    : PARSEOP_MID '('               {$<n>$ = TrCreateLeafNode (PARSEOP_MID);} +    : PARSEOP_MID +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MID);}          TermArg          TermArgItem          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,$7);} -    | PARSEOP_MID '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,$7);} +    | PARSEOP_MID +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ModTerm -    : PARSEOP_MOD '('               {$<n>$ = TrCreateLeafNode (PARSEOP_MOD);} +    : PARSEOP_MOD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MOD);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_MOD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_MOD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  MultiplyTerm -    : PARSEOP_MULTIPLY '('          {$<n>$ = TrCreateLeafNode (PARSEOP_MULTIPLY);} +    : PARSEOP_MULTIPLY +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MULTIPLY);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_MULTIPLY '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_MULTIPLY +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  MutexTerm -    : PARSEOP_MUTEX '('             {$<n>$ = TrCreateLeafNode (PARSEOP_MUTEX);} +    : PARSEOP_MUTEX +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MUTEX);}          NameString          ',' ByteConstExpr -        ')'                         {$$ = TrLinkChildren ($<n>3,2, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6);} -    | PARSEOP_MUTEX '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_MUTEX +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  NameTerm -    : PARSEOP_NAME '('              {$<n>$ = TrCreateLeafNode (PARSEOP_NAME);} +    : PARSEOP_NAME +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_NAME);}          NameString          ',' DataObject -        ')'                         {$$ = TrLinkChildren ($<n>3,2, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6);} -    | PARSEOP_NAME '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_NAME +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  NAndTerm -    : PARSEOP_NAND '('              {$<n>$ = TrCreateLeafNode (PARSEOP_NAND);} +    : PARSEOP_NAND +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_NAND);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_NAND '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_NAND +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  NoOpTerm @@ -749,60 +872,72 @@ NoOpTerm      ;  NOrTerm -    : PARSEOP_NOR '('               {$<n>$ = TrCreateLeafNode (PARSEOP_NOR);} +    : PARSEOP_NOR +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_NOR);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_NOR '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_NOR +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  NotifyTerm -    : PARSEOP_NOTIFY '('            {$<n>$ = TrCreateLeafNode (PARSEOP_NOTIFY);} +    : PARSEOP_NOTIFY +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_NOTIFY);}          SuperName          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_NOTIFY '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_NOTIFY +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  NotTerm -    : PARSEOP_NOT '('               {$<n>$ = TrCreateLeafNode (PARSEOP_NOT);} +    : PARSEOP_NOT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_NOT);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_NOT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_NOT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ObjectTypeTerm -    : PARSEOP_OBJECTTYPE '('        {$<n>$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE);} -        ObjectTypeName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_OBJECTTYPE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    : PARSEOP_OBJECTTYPE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE);} +        ObjectTypeSource +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_OBJECTTYPE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  OffsetTerm -    : PARSEOP_OFFSET '(' +    : PARSEOP_OFFSET +        PARSEOP_OPEN_PAREN          AmlPackageLengthTerm -        ')'                         {$$ = TrCreateNode (PARSEOP_OFFSET,1,$3);} -    | PARSEOP_OFFSET '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateNode (PARSEOP_OFFSET,1,$3);} +    | PARSEOP_OFFSET +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  OpRegionTerm -    : PARSEOP_OPERATIONREGION '('   {$<n>$ = TrCreateLeafNode (PARSEOP_OPERATIONREGION);} +    : PARSEOP_OPERATIONREGION +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_OPERATIONREGION);}          NameString          ',' OpRegionSpaceIdTerm          TermArgItem          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,4, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,4,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),                                          $6,$7,$8);} -    | PARSEOP_OPERATIONREGION '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_OPERATIONREGION +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  OpRegionSpaceIdTerm @@ -811,13 +946,15 @@ OpRegionSpaceIdTerm      ;  OrTerm -    : PARSEOP_OR '('                {$<n>$ = TrCreateLeafNode (PARSEOP_OR);} +    : PARSEOP_OR +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_OR);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_OR '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_OR +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  PackageTerm @@ -826,25 +963,29 @@ PackageTerm          '{' PackageList '}'         {$$ = TrLinkChildren ($<n>2,2,$3,$5);}  PowerResTerm -    : PARSEOP_POWERRESOURCE '('     {$<n>$ = TrCreateLeafNode (PARSEOP_POWERRESOURCE);} +    : PARSEOP_POWERRESOURCE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_POWERRESOURCE);}          NameString          ',' ByteConstExpr          ',' WordConstExpr -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,4,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),                                          $6,$8,$11);} -    | PARSEOP_POWERRESOURCE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_POWERRESOURCE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  PrintfTerm -    : PARSEOP_PRINTF '('            {$<n>$ = TrCreateLeafNode (PARSEOP_PRINTF);} +    : PARSEOP_PRINTF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PRINTF);}          StringData          PrintfArgList -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_PRINTF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_PRINTF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  PrintfArgList @@ -855,26 +996,30 @@ PrintfArgList      ;  ProcessorTerm -    : PARSEOP_PROCESSOR '('         {$<n>$ = TrCreateLeafNode (PARSEOP_PROCESSOR);} +    : PARSEOP_PROCESSOR +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_PROCESSOR);}          NameString          ',' ByteConstExpr          OptionalDWordConstExpr          OptionalByteConstExpr -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,5,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),                                          $6,$7,$8,$11);} -    | PARSEOP_PROCESSOR '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_PROCESSOR +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  RawDataBufferTerm -    : PARSEOP_DATABUFFER  '('       {$<n>$ = TrCreateLeafNode (PARSEOP_DATABUFFER);} +    : PARSEOP_DATABUFFER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DATABUFFER);}          OptionalWordConst -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              ByteList '}'            {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_DATABUFFER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DATABUFFER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  /* @@ -882,204 +1027,247 @@ RawDataBufferTerm   * we've taken a pointer to it. (hard to tell if a local becomes initialized this way.)   */  RefOfTerm -    : PARSEOP_REFOF '('             {$<n>$ = TrCreateLeafNode (PARSEOP_REFOF);} -        SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1, +    : PARSEOP_REFOF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_REFOF);} +        RefOfSource +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,                                          TrSetNodeFlags ($4, NODE_IS_TARGET));} -    | PARSEOP_REFOF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_REFOF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ReleaseTerm -    : PARSEOP_RELEASE '('           {$<n>$ = TrCreateLeafNode (PARSEOP_RELEASE);} +    : PARSEOP_RELEASE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_RELEASE);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_RELEASE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_RELEASE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ResetTerm -    : PARSEOP_RESET '('             {$<n>$ = TrCreateLeafNode (PARSEOP_RESET);} +    : PARSEOP_RESET +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_RESET);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_RESET '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_RESET +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ReturnTerm -    : PARSEOP_RETURN '('            {$<n>$ = TrCreateLeafNode (PARSEOP_RETURN);} +    : PARSEOP_RETURN +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_RETURN);}          OptionalReturnArg -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);}      | PARSEOP_RETURN                {$$ = TrLinkChildren (                                          TrCreateLeafNode (PARSEOP_RETURN),1,                                          TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO),                                              NODE_IS_NULL_RETURN));} -    | PARSEOP_RETURN '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_RETURN +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ScopeTerm -    : PARSEOP_SCOPE '('             {$<n>$ = TrCreateLeafNode (PARSEOP_SCOPE);} +    : PARSEOP_SCOPE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SCOPE);}          NameString -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,2,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);} -    | PARSEOP_SCOPE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_SCOPE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ShiftLeftTerm -    : PARSEOP_SHIFTLEFT '('         {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTLEFT);} +    : PARSEOP_SHIFTLEFT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTLEFT);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_SHIFTLEFT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_SHIFTLEFT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ShiftRightTerm -    : PARSEOP_SHIFTRIGHT '('        {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTRIGHT);} +    : PARSEOP_SHIFTRIGHT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTRIGHT);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_SHIFTRIGHT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_SHIFTRIGHT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SignalTerm -    : PARSEOP_SIGNAL '('            {$<n>$ = TrCreateLeafNode (PARSEOP_SIGNAL);} +    : PARSEOP_SIGNAL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SIGNAL);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_SIGNAL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_SIGNAL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SizeOfTerm -    : PARSEOP_SIZEOF '('            {$<n>$ = TrCreateLeafNode (PARSEOP_SIZEOF);} +    : PARSEOP_SIZEOF +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SIZEOF);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_SIZEOF '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_SIZEOF +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SleepTerm -    : PARSEOP_SLEEP '('             {$<n>$ = TrCreateLeafNode (PARSEOP_SLEEP);} +    : PARSEOP_SLEEP +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SLEEP);}          TermArg -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_SLEEP '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_SLEEP +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  StallTerm -    : PARSEOP_STALL '('             {$<n>$ = TrCreateLeafNode (PARSEOP_STALL);} +    : PARSEOP_STALL +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_STALL);}          TermArg -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_STALL '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_STALL +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  StoreTerm -    : PARSEOP_STORE '('             {$<n>$ = TrCreateLeafNode (PARSEOP_STORE);} +    : PARSEOP_STORE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_STORE);}          TermArg          ',' SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4, -                                        TrSetNodeFlags ($6, NODE_IS_TARGET));} -    | PARSEOP_STORE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4, +                                            TrSetNodeFlags ($6, NODE_IS_TARGET));} +    | PARSEOP_STORE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SubtractTerm -    : PARSEOP_SUBTRACT '('          {$<n>$ = TrCreateLeafNode (PARSEOP_SUBTRACT);} +    : PARSEOP_SUBTRACT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SUBTRACT);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_SUBTRACT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_SUBTRACT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SwitchTerm -    : PARSEOP_SWITCH '('            {$<n>$ = TrCreateLeafNode (PARSEOP_SWITCH);} +    : PARSEOP_SWITCH +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SWITCH);}          TermArg -        ')' '{' -            CaseDefaultTermList '}' -                                    {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_SWITCH '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN '{' +            CaseDefaultTermList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);} +    | PARSEOP_SWITCH +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ThermalZoneTerm -    : PARSEOP_THERMALZONE '('       {$<n>$ = TrCreateLeafNode (PARSEOP_THERMALZONE);} +    : PARSEOP_THERMALZONE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_THERMALZONE);}          NameString -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              TermList '}'            {$$ = TrLinkChildren ($<n>3,2,                                          TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);} -    | PARSEOP_THERMALZONE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_THERMALZONE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  TimerTerm -    : PARSEOP_TIMER '('             {$<n>$ = TrCreateLeafNode (PARSEOP_TIMER);} -        ')'                         {$$ = TrLinkChildren ($<n>3,0);} +    : PARSEOP_TIMER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TIMER);} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,0);}      | PARSEOP_TIMER                 {$$ = TrLinkChildren (                                          TrCreateLeafNode (PARSEOP_TIMER),0);} -    | PARSEOP_TIMER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_TIMER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToBCDTerm -    : PARSEOP_TOBCD '('             {$<n>$ = TrCreateLeafNode (PARSEOP_TOBCD);} +    : PARSEOP_TOBCD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TOBCD);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_TOBCD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_TOBCD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToBufferTerm -    : PARSEOP_TOBUFFER '('          {$<n>$ = TrCreateLeafNode (PARSEOP_TOBUFFER);} +    : PARSEOP_TOBUFFER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TOBUFFER);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_TOBUFFER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_TOBUFFER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToDecimalStringTerm -    : PARSEOP_TODECIMALSTRING '('   {$<n>$ = TrCreateLeafNode (PARSEOP_TODECIMALSTRING);} +    : PARSEOP_TODECIMALSTRING +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TODECIMALSTRING);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_TODECIMALSTRING '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_TODECIMALSTRING +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToHexStringTerm -    : PARSEOP_TOHEXSTRING '('       {$<n>$ = TrCreateLeafNode (PARSEOP_TOHEXSTRING);} +    : PARSEOP_TOHEXSTRING +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TOHEXSTRING);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_TOHEXSTRING '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_TOHEXSTRING +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToIntegerTerm -    : PARSEOP_TOINTEGER '('         {$<n>$ = TrCreateLeafNode (PARSEOP_TOINTEGER);} +    : PARSEOP_TOINTEGER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TOINTEGER);}          TermArg          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_TOINTEGER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_TOINTEGER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToPLDTerm -    : PARSEOP_TOPLD '('             {$<n>$ = TrCreateLeafNode (PARSEOP_TOPLD);} +    : PARSEOP_TOPLD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TOPLD);}          PldKeywordList -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_TOPLD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_TOPLD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  PldKeywordList @@ -1099,62 +1287,77 @@ PldKeywordList  ToStringTerm -    : PARSEOP_TOSTRING '('          {$<n>$ = TrCreateLeafNode (PARSEOP_TOSTRING);} +    : PARSEOP_TOSTRING +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_TOSTRING);}          TermArg          OptionalCount          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_TOSTRING '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_TOSTRING +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ToUUIDTerm -    : PARSEOP_TOUUID '(' -        StringData ')'              {$$ = TrUpdateNode (PARSEOP_TOUUID, $3);} -    | PARSEOP_TOUUID '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    : PARSEOP_TOUUID +        PARSEOP_OPEN_PAREN +        StringData +        PARSEOP_CLOSE_PAREN         {$$ = TrUpdateNode (PARSEOP_TOUUID, $3);} +    | PARSEOP_TOUUID +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  UnicodeTerm -    : PARSEOP_UNICODE '('           {$<n>$ = TrCreateLeafNode (PARSEOP_UNICODE);} +    : PARSEOP_UNICODE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_UNICODE);}          StringData -        ')'                         {$$ = TrLinkChildren ($<n>3,2,0,$4);} -    | PARSEOP_UNICODE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,0,$4);} +    | PARSEOP_UNICODE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  UnloadTerm -    : PARSEOP_UNLOAD '('            {$<n>$ = TrCreateLeafNode (PARSEOP_UNLOAD);} +    : PARSEOP_UNLOAD +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_UNLOAD);}          SuperName -        ')'                         {$$ = TrLinkChildren ($<n>3,1,$4);} -    | PARSEOP_UNLOAD '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,1,$4);} +    | PARSEOP_UNLOAD +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  WaitTerm -    : PARSEOP_WAIT '('              {$<n>$ = TrCreateLeafNode (PARSEOP_WAIT);} +    : PARSEOP_WAIT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_WAIT);}          SuperName          TermArgItem -        ')'                         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} -    | PARSEOP_WAIT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,2,$4,$5);} +    | PARSEOP_WAIT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  XOrTerm -    : PARSEOP_XOR '('               {$<n>$ = TrCreateLeafNode (PARSEOP_XOR);} +    : PARSEOP_XOR +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_XOR);}          TermArg          TermArgItem          Target -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} -    | PARSEOP_XOR '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);} +    | PARSEOP_XOR +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  WhileTerm -    : PARSEOP_WHILE '('             {$<n>$ = TrCreateLeafNode (PARSEOP_WHILE);} +    : PARSEOP_WHILE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_WHILE);}          TermArg -        ')' '{' TermList '}' -                                    {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_WHILE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN +            '{' TermList '}'        {$$ = TrLinkChildren ($<n>3,2,$4,$7);} +    | PARSEOP_WHILE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ; diff --git a/source/compiler/aslresources.y b/source/compiler/aslresources.y index 92d58a9257d72..34ce47574bc82 100644 --- a/source/compiler/aslresources.y +++ b/source/compiler/aslresources.y @@ -56,7 +56,8 @@ NoEcho('   * Also, insert the EndTag at the end of the template.   */  ResourceTemplateTerm -    : PARSEOP_RESOURCETEMPLATE OptionalParentheses +    : PARSEOP_RESOURCETEMPLATE +        OptionalParentheses          '{'          ResourceMacroList '}'       {$$ = TrCreateNode (PARSEOP_RESOURCETEMPLATE,4,                                            TrCreateLeafNode (PARSEOP_DEFAULT_ARG), @@ -67,7 +68,8 @@ ResourceTemplateTerm  OptionalParentheses      :                               {$$ = NULL;} -    | '(' ')'                       {$$ = NULL;} +    | PARSEOP_OPEN_PAREN +        PARSEOP_CLOSE_PAREN         {$$ = NULL;}      ;  ResourceMacroList @@ -116,19 +118,22 @@ ResourceMacroTerm      ;  DMATerm -    : PARSEOP_DMA '('               {$<n>$ = TrCreateLeafNode (PARSEOP_DMA);} +    : PARSEOP_DMA +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DMA);}          DMATypeKeyword          OptionalBusMasterKeyword          ',' XferTypeKeyword          OptionalNameString_Last -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              ByteList '}'            {$$ = TrLinkChildren ($<n>3,5,$4,$5,$7,$8,$11);} -    | PARSEOP_DMA '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DMA +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DWordIOTerm -    : PARSEOP_DWORDIO '('           {$<n>$ = TrCreateLeafNode (PARSEOP_DWORDIO);} +    : PARSEOP_DWORDIO +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DWORDIO);}          OptionalResourceType_First          OptionalMinType          OptionalMaxType @@ -144,14 +149,16 @@ DWordIOTerm          OptionalNameString          OptionalType          OptionalTranslationType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,15, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,15,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22,$23);} -    | PARSEOP_DWORDIO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DWORDIO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DWordMemoryTerm -    : PARSEOP_DWORDMEMORY '('       {$<n>$ = TrCreateLeafNode (PARSEOP_DWORDMEMORY);} +    : PARSEOP_DWORDMEMORY +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DWORDMEMORY);}          OptionalResourceType_First          OptionalDecodeType          OptionalMinType @@ -168,14 +175,16 @@ DWordMemoryTerm          OptionalNameString          OptionalAddressRange          OptionalType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,16, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,16,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24,$25);} -    | PARSEOP_DWORDMEMORY '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DWORDMEMORY +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  DWordSpaceTerm -    : PARSEOP_DWORDSPACE '('        {$<n>$ = TrCreateLeafNode (PARSEOP_DWORDSPACE);} +    : PARSEOP_DWORDSPACE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DWORDSPACE);}          ByteConstExpr               {UtCheckIntegerRange ($4, 0xC0, 0xFF);}          OptionalResourceType          OptionalDecodeType @@ -190,21 +199,25 @@ DWordSpaceTerm          OptionalByteConstExpr          OptionalStringData          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,14, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,14,                                          $4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);} -    | PARSEOP_DWORDSPACE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_DWORDSPACE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  EndDependentFnTerm -    : PARSEOP_ENDDEPENDENTFN '(' -        ')'                         {$$ = TrCreateLeafNode (PARSEOP_ENDDEPENDENTFN);} -    | PARSEOP_ENDDEPENDENTFN '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    : PARSEOP_ENDDEPENDENTFN +        PARSEOP_OPEN_PAREN +        PARSEOP_CLOSE_PAREN         {$$ = TrCreateLeafNode (PARSEOP_ENDDEPENDENTFN);} +    | PARSEOP_ENDDEPENDENTFN +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ExtendedIOTerm -    : PARSEOP_EXTENDEDIO '('        {$<n>$ = TrCreateLeafNode (PARSEOP_EXTENDEDIO);} +    : PARSEOP_EXTENDEDIO +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_EXTENDEDIO);}          OptionalResourceType_First          OptionalMinType          OptionalMaxType @@ -219,14 +232,16 @@ ExtendedIOTerm          OptionalNameString          OptionalType          OptionalTranslationType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,14, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,14,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22);} -    | PARSEOP_EXTENDEDIO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_EXTENDEDIO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ExtendedMemoryTerm -    : PARSEOP_EXTENDEDMEMORY '('    {$<n>$ = TrCreateLeafNode (PARSEOP_EXTENDEDMEMORY);} +    : PARSEOP_EXTENDEDMEMORY +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_EXTENDEDMEMORY);}          OptionalResourceType_First          OptionalDecodeType          OptionalMinType @@ -242,14 +257,15 @@ ExtendedMemoryTerm          OptionalNameString          OptionalAddressRange          OptionalType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,15, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,15,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24);} -    | PARSEOP_EXTENDEDMEMORY '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_EXTENDEDMEMORY +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  ExtendedSpaceTerm -    : PARSEOP_EXTENDEDSPACE '('     {$<n>$ = TrCreateLeafNode (PARSEOP_EXTENDEDSPACE);} +    : PARSEOP_EXTENDEDSPACE PARSEOP_OPEN_PAREN     {$<n>$ = TrCreateLeafNode (PARSEOP_EXTENDEDSPACE);}          ByteConstExpr               {UtCheckIntegerRange ($4, 0xC0, 0xFF);}          OptionalResourceType          OptionalDecodeType @@ -263,35 +279,41 @@ ExtendedSpaceTerm          ',' QWordConstExpr          OptionalQWordConstExpr          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,13, +        PARSEOP_CLOSE_PAREN                         {$$ = TrLinkChildren ($<n>3,13,                                          $4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23);} -    | PARSEOP_EXTENDEDSPACE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_EXTENDEDSPACE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN                   {$$ = AslDoError(); yyclearin;}      ;  FixedDmaTerm -    : PARSEOP_FIXEDDMA '('          {$<n>$ = TrCreateLeafNode (PARSEOP_FIXEDDMA);} +    : PARSEOP_FIXEDDMA +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_FIXEDDMA);}          WordConstExpr               /* 04: DMA RequestLines */          ',' WordConstExpr           /* 06: DMA Channels */          OptionalXferSize            /* 07: DMA TransferSize */          OptionalNameString          /* 08: DescriptorName */ -        ')'                         {$$ = TrLinkChildren ($<n>3,4,$4,$6,$7,$8);} -    | PARSEOP_FIXEDDMA '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN                         {$$ = TrLinkChildren ($<n>3,4,$4,$6,$7,$8);} +    | PARSEOP_FIXEDDMA +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN                   {$$ = AslDoError(); yyclearin;}      ;  FixedIOTerm -    : PARSEOP_FIXEDIO '('           {$<n>$ = TrCreateLeafNode (PARSEOP_FIXEDIO);} +    : PARSEOP_FIXEDIO +        PARSEOP_OPEN_PAREN           {$<n>$ = TrCreateLeafNode (PARSEOP_FIXEDIO);}          WordConstExpr          ',' ByteConstExpr          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);} -    | PARSEOP_FIXEDIO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN                         {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);} +    | PARSEOP_FIXEDIO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN                   {$$ = AslDoError(); yyclearin;}      ;  GpioIntTerm -    : PARSEOP_GPIO_INT '('          {$<n>$ = TrCreateLeafNode (PARSEOP_GPIO_INT);} +    : PARSEOP_GPIO_INT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_GPIO_INT);}          InterruptTypeKeyword        /* 04: InterruptType */          ',' InterruptLevel          /* 06: InterruptLevel */          OptionalShareType           /* 07: SharedType */ @@ -302,15 +324,17 @@ GpioIntTerm          OptionalResourceType        /* 14: ResourceType */          OptionalNameString          /* 15: DescriptorName */          OptionalBuffer_Last         /* 16: VendorData */ -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              DWordConstExpr '}'      {$$ = TrLinkChildren ($<n>3,11,                                          $4,$6,$7,$9,$10,$12,$13,$14,$15,$16,$19);} -    | PARSEOP_GPIO_INT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_GPIO_INT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  GpioIoTerm -    : PARSEOP_GPIO_IO '('           {$<n>$ = TrCreateLeafNode (PARSEOP_GPIO_IO);} +    : PARSEOP_GPIO_IO +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_GPIO_IO);}          OptionalShareType_First     /* 04: SharedType */          ',' PinConfigByte           /* 06: PinConfig */          OptionalWordConstExpr       /* 07: DebounceTimeout */ @@ -321,15 +345,17 @@ GpioIoTerm          OptionalResourceType        /* 13: ResourceType */          OptionalNameString          /* 14: DescriptorName */          OptionalBuffer_Last         /* 15: VendorData */ -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              DWordList '}'           {$$ = TrLinkChildren ($<n>3,11,                                          $4,$6,$7,$8,$9,$11,$12,$13,$14,$15,$18);} -    | PARSEOP_GPIO_IO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_GPIO_IO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN                   {$$ = AslDoError(); yyclearin;}      ;  I2cSerialBusTerm -    : PARSEOP_I2C_SERIALBUS '('     {$<n>$ = TrCreateLeafNode (PARSEOP_I2C_SERIALBUS);} +    : PARSEOP_I2C_SERIALBUS +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_I2C_SERIALBUS);}          WordConstExpr               /* 04: SlaveAddress */          OptionalSlaveMode           /* 05: SlaveMode */          ',' DWordConstExpr          /* 07: ConnectionSpeed */ @@ -339,15 +365,17 @@ I2cSerialBusTerm          OptionalResourceType        /* 12: ResourceType */          OptionalNameString          /* 13: DescriptorName */          OptionalBuffer_Last         /* 14: VendorData */ -        ')'                         {$$ = TrLinkChildren ($<n>3,10, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,10,                                          $4,$5,$7,$8,$10,$11,$12,$13,                                          TrCreateLeafNode (PARSEOP_DEFAULT_ARG),$14);} -    | PARSEOP_I2C_SERIALBUS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_I2C_SERIALBUS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  I2cSerialBusTermV2 -    : PARSEOP_I2C_SERIALBUS_V2 '('  {$<n>$ = TrCreateLeafNode (PARSEOP_I2C_SERIALBUS_V2);} +    : PARSEOP_I2C_SERIALBUS_V2 +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_I2C_SERIALBUS_V2);}          WordConstExpr               /* 04: SlaveAddress */          OptionalSlaveMode           /* 05: SlaveMode */          ',' DWordConstExpr          /* 07: ConnectionSpeed */ @@ -358,14 +386,16 @@ I2cSerialBusTermV2          OptionalNameString          /* 13: DescriptorName */          OptionalShareType           /* 14: Share */          OptionalBuffer_Last         /* 15: VendorData */ -        ')'                         {$$ = TrLinkChildren ($<n>3,10, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,10,                                          $4,$5,$7,$8,$10,$11,$12,$13,$14,$15);} -    | PARSEOP_I2C_SERIALBUS_V2 '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_I2C_SERIALBUS_V2 +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  InterruptTerm -    : PARSEOP_INTERRUPT '('         {$<n>$ = TrCreateLeafNode (PARSEOP_INTERRUPT);} +    : PARSEOP_INTERRUPT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_INTERRUPT);}          OptionalResourceType_First          ',' InterruptTypeKeyword          ',' InterruptLevel @@ -373,86 +403,100 @@ InterruptTerm          OptionalByteConstExpr          OptionalStringData          OptionalNameString_Last -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              DWordList '}'           {$$ = TrLinkChildren ($<n>3,8,                                          $4,$6,$8,$9,$10,$11,$12,$15);} -    | PARSEOP_INTERRUPT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_INTERRUPT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  IOTerm -    : PARSEOP_IO '('                {$<n>$ = TrCreateLeafNode (PARSEOP_IO);} +    : PARSEOP_IO +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_IO);}          IODecodeKeyword          ',' WordConstExpr          ',' WordConstExpr          ',' ByteConstExpr          ',' ByteConstExpr          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);} -    | PARSEOP_IO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);} +    | PARSEOP_IO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  IRQNoFlagsTerm -    : PARSEOP_IRQNOFLAGS '('        {$<n>$ = TrCreateLeafNode (PARSEOP_IRQNOFLAGS);} +    : PARSEOP_IRQNOFLAGS +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_IRQNOFLAGS);}          OptionalNameString_First -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              ByteList '}'            {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_IRQNOFLAGS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_IRQNOFLAGS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  IRQTerm -    : PARSEOP_IRQ '('               {$<n>$ = TrCreateLeafNode (PARSEOP_IRQ);} +    : PARSEOP_IRQ +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_IRQ);}          InterruptTypeKeyword          ',' InterruptLevel          OptionalShareType          OptionalNameString_Last -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              ByteList '}'            {$$ = TrLinkChildren ($<n>3,5,$4,$6,$7,$8,$11);} -    | PARSEOP_IRQ '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_IRQ +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  Memory24Term -    : PARSEOP_MEMORY24 '('          {$<n>$ = TrCreateLeafNode (PARSEOP_MEMORY24);} +    : PARSEOP_MEMORY24 +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MEMORY24);}          OptionalReadWriteKeyword          ',' WordConstExpr          ',' WordConstExpr          ',' WordConstExpr          ',' WordConstExpr          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);} -    | PARSEOP_MEMORY24 '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);} +    | PARSEOP_MEMORY24 +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  Memory32FixedTerm -    : PARSEOP_MEMORY32FIXED '('     {$<n>$ = TrCreateLeafNode (PARSEOP_MEMORY32FIXED);} +    : PARSEOP_MEMORY32FIXED +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MEMORY32FIXED);}          OptionalReadWriteKeyword          ',' DWordConstExpr          ',' DWordConstExpr          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,4,$4,$6,$8,$9);} -    | PARSEOP_MEMORY32FIXED '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,4,$4,$6,$8,$9);} +    | PARSEOP_MEMORY32FIXED +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  Memory32Term -    : PARSEOP_MEMORY32 '('          {$<n>$ = TrCreateLeafNode (PARSEOP_MEMORY32);} +    : PARSEOP_MEMORY32 +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_MEMORY32);}          OptionalReadWriteKeyword          ',' DWordConstExpr          ',' DWordConstExpr          ',' DWordConstExpr          ',' DWordConstExpr          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);} -    | PARSEOP_MEMORY32 '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);} +    | PARSEOP_MEMORY32 +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  QWordIOTerm -    : PARSEOP_QWORDIO '('           {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDIO);} +    : PARSEOP_QWORDIO +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDIO);}          OptionalResourceType_First          OptionalMinType          OptionalMaxType @@ -468,14 +512,16 @@ QWordIOTerm          OptionalNameString          OptionalType          OptionalTranslationType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,15, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,15,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22,$23);} -    | PARSEOP_QWORDIO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_QWORDIO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  QWordMemoryTerm -    : PARSEOP_QWORDMEMORY '('       {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDMEMORY);} +    : PARSEOP_QWORDMEMORY +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDMEMORY);}          OptionalResourceType_First          OptionalDecodeType          OptionalMinType @@ -492,14 +538,16 @@ QWordMemoryTerm          OptionalNameString          OptionalAddressRange          OptionalType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,16, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,16,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24,$25);} -    | PARSEOP_QWORDMEMORY '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_QWORDMEMORY +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  QWordSpaceTerm -    : PARSEOP_QWORDSPACE '('        {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDSPACE);} +    : PARSEOP_QWORDSPACE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_QWORDSPACE);}          ByteConstExpr               {UtCheckIntegerRange ($4, 0xC0, 0xFF);}          OptionalResourceType          OptionalDecodeType @@ -514,27 +562,31 @@ QWordSpaceTerm          OptionalByteConstExpr          OptionalStringData          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,14, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,14,                                          $4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);} -    | PARSEOP_QWORDSPACE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_QWORDSPACE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  RegisterTerm -    : PARSEOP_REGISTER '('          {$<n>$ = TrCreateLeafNode (PARSEOP_REGISTER);} +    : PARSEOP_REGISTER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_REGISTER);}          AddressSpaceKeyword          ',' ByteConstExpr          ',' ByteConstExpr          ',' QWordConstExpr          OptionalAccessSize          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$11,$12);} -    | PARSEOP_REGISTER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$11,$12);} +    | PARSEOP_REGISTER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SpiSerialBusTerm -    : PARSEOP_SPI_SERIALBUS '('     {$<n>$ = TrCreateLeafNode (PARSEOP_SPI_SERIALBUS);} +    : PARSEOP_SPI_SERIALBUS +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SPI_SERIALBUS);}          WordConstExpr               /* 04: DeviceSelection */          OptionalDevicePolarity      /* 05: DevicePolarity */          OptionalWireMode            /* 06: WireMode */ @@ -548,15 +600,17 @@ SpiSerialBusTerm          OptionalResourceType        /* 19: ResourceType */          OptionalNameString          /* 20: DescriptorName */          OptionalBuffer_Last         /* 21: VendorData */ -        ')'                         {$$ = TrLinkChildren ($<n>3,14, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,14,                                          $4,$5,$6,$8,$9,$11,$13,$15,$17,$18,$19,$20,                                          TrCreateLeafNode (PARSEOP_DEFAULT_ARG),$21);} -    | PARSEOP_SPI_SERIALBUS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_SPI_SERIALBUS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  SpiSerialBusTermV2 -    : PARSEOP_SPI_SERIALBUS_V2 '('  {$<n>$ = TrCreateLeafNode (PARSEOP_SPI_SERIALBUS_V2);} +    : PARSEOP_SPI_SERIALBUS_V2 +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_SPI_SERIALBUS_V2);}          WordConstExpr               /* 04: DeviceSelection */          OptionalDevicePolarity      /* 05: DevicePolarity */          OptionalWireMode            /* 06: WireMode */ @@ -571,32 +625,38 @@ SpiSerialBusTermV2          OptionalNameString          /* 20: DescriptorName */          OptionalShareType           /* 21: Share */          OptionalBuffer_Last         /* 22: VendorData */ -        ')'                         {$$ = TrLinkChildren ($<n>3,14, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,14,                                          $4,$5,$6,$8,$9,$11,$13,$15,$17,$18,$19,$20,$21,$22);} -    | PARSEOP_SPI_SERIALBUS_V2 '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_SPI_SERIALBUS_V2 +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  StartDependentFnNoPriTerm -    : PARSEOP_STARTDEPENDENTFN_NOPRI '('    {$<n>$ = TrCreateLeafNode (PARSEOP_STARTDEPENDENTFN_NOPRI);} -        ')' '{' +    : PARSEOP_STARTDEPENDENTFN_NOPRI +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_STARTDEPENDENTFN_NOPRI);} +        PARSEOP_CLOSE_PAREN '{'          ResourceMacroList '}'       {$$ = TrLinkChildren ($<n>3,1,$6);} -    | PARSEOP_STARTDEPENDENTFN_NOPRI '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_STARTDEPENDENTFN_NOPRI +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  StartDependentFnTerm -    : PARSEOP_STARTDEPENDENTFN '('  {$<n>$ = TrCreateLeafNode (PARSEOP_STARTDEPENDENTFN);} +    : PARSEOP_STARTDEPENDENTFN +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_STARTDEPENDENTFN);}          ByteConstExpr          ',' ByteConstExpr -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'          ResourceMacroList '}'       {$$ = TrLinkChildren ($<n>3,3,$4,$6,$9);} -    | PARSEOP_STARTDEPENDENTFN '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_STARTDEPENDENTFN +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  UartSerialBusTerm -    : PARSEOP_UART_SERIALBUS '('    {$<n>$ = TrCreateLeafNode (PARSEOP_UART_SERIALBUS);} +    : PARSEOP_UART_SERIALBUS +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_UART_SERIALBUS);}          DWordConstExpr              /* 04: ConnectionSpeed */          OptionalBitsPerByte         /* 05: BitsPerByte */          OptionalStopBits            /* 06: StopBits */ @@ -611,15 +671,17 @@ UartSerialBusTerm          OptionalResourceType        /* 19: ResourceType */          OptionalNameString          /* 20: DescriptorName */          OptionalBuffer_Last         /* 21: VendorData */ -        ')'                         {$$ = TrLinkChildren ($<n>3,15, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,15,                                          $4,$5,$6,$8,$9,$10,$11,$13,$15,$17,$18,$19,$20,                                          TrCreateLeafNode (PARSEOP_DEFAULT_ARG),$21);} -    | PARSEOP_UART_SERIALBUS '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_UART_SERIALBUS +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  UartSerialBusTermV2 -    : PARSEOP_UART_SERIALBUS_V2 '(' {$<n>$ = TrCreateLeafNode (PARSEOP_UART_SERIALBUS_V2);} +    : PARSEOP_UART_SERIALBUS_V2 +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_UART_SERIALBUS_V2);}          DWordConstExpr              /* 04: ConnectionSpeed */          OptionalBitsPerByte         /* 05: BitsPerByte */          OptionalStopBits            /* 06: StopBits */ @@ -635,32 +697,38 @@ UartSerialBusTermV2          OptionalNameString          /* 20: DescriptorName */          OptionalShareType           /* 21: Share */          OptionalBuffer_Last         /* 22: VendorData */ -        ')'                         {$$ = TrLinkChildren ($<n>3,15, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,15,                                          $4,$5,$6,$8,$9,$10,$11,$13,$15,$17,$18,$19,$20,$21,$22);} -    | PARSEOP_UART_SERIALBUS_V2 '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_UART_SERIALBUS_V2 +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  VendorLongTerm -    : PARSEOP_VENDORLONG '('        {$<n>$ = TrCreateLeafNode (PARSEOP_VENDORLONG);} +    : PARSEOP_VENDORLONG +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_VENDORLONG);}          OptionalNameString_First -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              ByteList '}'            {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_VENDORLONG '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_VENDORLONG +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  VendorShortTerm -    : PARSEOP_VENDORSHORT '('       {$<n>$ = TrCreateLeafNode (PARSEOP_VENDORSHORT);} +    : PARSEOP_VENDORSHORT +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_VENDORSHORT);}          OptionalNameString_First -        ')' '{' +        PARSEOP_CLOSE_PAREN '{'              ByteList '}'            {$$ = TrLinkChildren ($<n>3,2,$4,$7);} -    | PARSEOP_VENDORSHORT '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_VENDORSHORT +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  WordBusNumberTerm -    : PARSEOP_WORDBUSNUMBER '('     {$<n>$ = TrCreateLeafNode (PARSEOP_WORDBUSNUMBER);} +    : PARSEOP_WORDBUSNUMBER +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_WORDBUSNUMBER);}          OptionalResourceType_First          OptionalMinType          OptionalMaxType @@ -673,14 +741,16 @@ WordBusNumberTerm          OptionalByteConstExpr          OptionalStringData          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,12, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,12,                                          $4,$5,$6,$7,$9,$11,$13,$15,$17,$18,$19,$20);} -    | PARSEOP_WORDBUSNUMBER '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_WORDBUSNUMBER +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  WordIOTerm -    : PARSEOP_WORDIO '('            {$<n>$ = TrCreateLeafNode (PARSEOP_WORDIO);} +    : PARSEOP_WORDIO +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_WORDIO);}          OptionalResourceType_First          OptionalMinType          OptionalMaxType @@ -696,14 +766,16 @@ WordIOTerm          OptionalNameString          OptionalType          OptionalTranslationType_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,15, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,15,                                          $4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22,$23);} -    | PARSEOP_WORDIO '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_WORDIO +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ;  WordSpaceTerm -    : PARSEOP_WORDSPACE '('         {$<n>$ = TrCreateLeafNode (PARSEOP_WORDSPACE);} +    : PARSEOP_WORDSPACE +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_WORDSPACE);}          ByteConstExpr               {UtCheckIntegerRange ($4, 0xC0, 0xFF);}          OptionalResourceType          OptionalDecodeType @@ -718,8 +790,9 @@ WordSpaceTerm          OptionalByteConstExpr          OptionalStringData          OptionalNameString_Last -        ')'                         {$$ = TrLinkChildren ($<n>3,14, +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildren ($<n>3,14,                                          $4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);} -    | PARSEOP_WORDSPACE '(' -        error ')'                   {$$ = AslDoError(); yyclearin;} +    | PARSEOP_WORDSPACE +        PARSEOP_OPEN_PAREN +        error PARSEOP_CLOSE_PAREN   {$$ = AslDoError(); yyclearin;}      ; diff --git a/source/compiler/aslrestype2.c b/source/compiler/aslrestype2.c index b75c1184eb19b..bc130e530be86 100644 --- a/source/compiler/aslrestype2.c +++ b/source/compiler/aslrestype2.c @@ -127,6 +127,11 @@ RsDoGeneralRegisterDescriptor (              RsCreateByteField (InitializerOp, ACPI_RESTAG_ACCESSSIZE,                  CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AccessSize)); +            if (Descriptor->GenericReg.AddressSpaceId == ACPI_ADR_SPACE_PLATFORM_COMM) +            { +                break; +            } +              if (Descriptor->GenericReg.AccessSize > AML_FIELD_ACCESS_QWORD)              {                  AslError (ASL_ERROR, ASL_MSG_INVALID_ACCESS_SIZE, diff --git a/source/compiler/aslrules.y b/source/compiler/aslrules.y index 2cb972f8056db..112f041878b0a 100644 --- a/source/compiler/aslrules.y +++ b/source/compiler/aslrules.y @@ -81,14 +81,15 @@ AslCode   * The ObjectList term is obsolete and has been removed.   */  DefinitionBlockTerm -    : PARSEOP_DEFINITION_BLOCK '('  {$<n>$ = TrCreateLeafNode (PARSEOP_DEFINITION_BLOCK);} +    : PARSEOP_DEFINITION_BLOCK +        PARSEOP_OPEN_PAREN          {$<n>$ = TrCreateLeafNode (PARSEOP_DEFINITION_BLOCK);}          String ','          String ','          ByteConst ','          String ','          String ','          DWordConst -        ')'                         {TrSetEndLineNumber ($<n>3);} +        PARSEOP_CLOSE_PAREN         {TrSetEndLineNumber ($<n>3);}              '{' TermList '}'        {$$ = TrLinkChildren ($<n>3,7,                                          $4,$6,$8,$10,$12,$14,$18);}      ; @@ -99,6 +100,9 @@ DefinitionBlockList          DefinitionBlockList         {$$ = TrLinkPeerNodes (2, $1,$2);}      ; + +/******* Basic ASCII identifiers **************************************************/ +  /* Allow IO, DMA, IRQ Resource macro and FOR macro names to also be used as identifiers */  NameString @@ -112,20 +116,31 @@ NameString  /*  NameSeg      : PARSEOP_NAMESEG               {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESEG, (ACPI_NATIVE_INT) -                                            TrNormalizeNameSeg ($1));} +                                        TrNormalizeNameSeg ($1));}      ;  */  NameSeg      : PARSEOP_NAMESEG               {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESEG, -                                            (ACPI_NATIVE_INT) AslCompilerlval.s);} +                                        (ACPI_NATIVE_INT) AslCompilerlval.s);}      ; +/******* Fundamental argument/statement types ***********************************/ + +Term +    : Object                        {} +    | Type1Opcode                   {} +    | Type2Opcode                   {} +    | Type2IntegerOpcode            {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);} +    | Type2StringOpcode             {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);} +    | Type2BufferOpcode             {} +    | Type2BufferOrStringOpcode     {} +    | error                         {$$ = AslDoError(); yyclearin;} +    ; +  SuperName -    : NameString                    {} -    | ArgTerm                       {} -    | LocalTerm                     {} +    : SimpleName                    {}      | DebugTerm                     {}      | Type6Opcode                   {}      ; @@ -136,14 +151,19 @@ Target      | ',' SuperName                 {$$ = TrSetNodeFlags ($2, NODE_IS_TARGET);}      ; +RequiredTarget +    : ',' SuperName                 {$$ = TrSetNodeFlags ($2, NODE_IS_TARGET);} +    ; +  TermArg -    : Type2Opcode                   {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);} +    : SimpleName                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);} +    | Type2Opcode                   {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}      | DataObject                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);} -    | NameString                    {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);} -    | ArgTerm                       {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);} -    | LocalTerm                     {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);} - - +/* +    | PARSEOP_OPEN_PAREN +        TermArg +        PARSEOP_CLOSE_PAREN         {} +*/      ;  /* @@ -156,8 +176,10 @@ TermArg  */  MethodInvocationTerm -    : NameString '('                {TrUpdateNode (PARSEOP_METHODCALL, $1);} -        ArgList ')'                 {$$ = TrLinkChildNode ($1,$4);} +    : NameString +        PARSEOP_OPEN_PAREN          {TrUpdateNode (PARSEOP_METHODCALL, $1);} +        ArgList +        PARSEOP_CLOSE_PAREN         {$$ = TrLinkChildNode ($1,$4);}      ;  /* OptionalCount must appear before ByteList or an incorrect reduction will result */ @@ -176,23 +198,44 @@ OptionalDataCount          /* Legacy ASL */      :                               {$$ = NULL;} -    | '(' TermArg ')'               {$$ = $2;} -    | '('  ')'                      {$$ = NULL;} +    | PARSEOP_OPEN_PAREN +        TermArg +        PARSEOP_CLOSE_PAREN         {$$ = $2;} +    | PARSEOP_OPEN_PAREN +        PARSEOP_CLOSE_PAREN         {$$ = NULL;}          /* C-style (ASL+) -- adds equals term */      |  PARSEOP_EXP_EQUALS           {$$ = NULL;} -    | '(' TermArg ')' +    | PARSEOP_OPEN_PAREN +        TermArg +        PARSEOP_CLOSE_PAREN          PARSEOP_EXP_EQUALS          {$$ = $2;} -    | '('  ')' String +    | PARSEOP_OPEN_PAREN +        PARSEOP_CLOSE_PAREN +        String          PARSEOP_EXP_EQUALS          {$$ = NULL;}      ;  /******* List Terms **************************************************/ +    /* ACPI 3.0 -- allow semicolons between terms */ + +TermList +    :                               {$$ = NULL;} +    | TermList Term                 {$$ = TrLinkPeerNode ( +                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);} +    | TermList Term ';'             {$$ = TrLinkPeerNode ( +                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);} +    | TermList ';' Term             {$$ = TrLinkPeerNode ( +                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);} +    | TermList ';' Term ';'         {$$ = TrLinkPeerNode ( +                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);} +    ; +  ArgList      :                               {$$ = NULL;}      | TermArg @@ -299,38 +342,13 @@ OptionalParameterTypesPackage                                          TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);}      ; -    /* ACPI 3.0 -- allow semicolons between terms */ - -TermList -    :                               {$$ = NULL;} -    | TermList Term                 {$$ = TrLinkPeerNode ( -                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);} -    | TermList Term ';'             {$$ = TrLinkPeerNode ( -                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);} -    | TermList ';' Term             {$$ = TrLinkPeerNode ( -                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);} -    | TermList ';' Term ';'         {$$ = TrLinkPeerNode ( -                                        TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);} -    ; - -Term -    : Object                        {} -    | Type1Opcode                   {} -    | Type2Opcode                   {} -    | Type2IntegerOpcode            {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);} -    | Type2StringOpcode             {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);} -    | Type2BufferOpcode             {} -    | Type2BufferOrStringOpcode     {} -    | error                         {$$ = AslDoError(); yyclearin;} -    ; -  /*   * Case-Default list; allow only one Default term and unlimited Case terms   */  CaseDefaultTermList      :                               {$$ = NULL;} -    | CaseTerm  {} -    | DefaultTerm   {} +    | CaseTerm                      {} +    | DefaultTerm                   {}      | CaseDefaultTermList          CaseTerm                    {$$ = TrLinkPeerNode ($1,$2);}      | CaseDefaultTermList @@ -520,32 +538,59 @@ NameSpaceModifier      | ScopeTerm                     {}      ; -/* For ObjectType: SuperName except for MethodInvocationTerm */ - -ObjectTypeName +SimpleName      : NameString                    {} -    | ArgTerm                       {}      | LocalTerm                     {} +    | ArgTerm                       {} +    ; + +/* For ObjectType(), SuperName except for MethodInvocationTerm */ + +ObjectTypeSource +    : SimpleName                    {}      | DebugTerm                     {}      | RefOfTerm                     {}      | DerefOfTerm                   {}      | IndexTerm                     {}      | IndexExpTerm                  {} -/*    | MethodInvocationTerm          {} */  /* Caused reduce/reduce with Type6Opcode->MethodInvocationTerm */      ; -RequiredTarget -    : ',' SuperName                 {$$ = TrSetNodeFlags ($2, NODE_IS_TARGET);} +/* For DeRefOf(), SuperName except for DerefOf and Debug */ + +DerefOfSource +    : SimpleName                    {} +    | RefOfTerm                     {} +    | DerefOfTerm                   {} +    | IndexTerm                     {} +    | IndexExpTerm                  {} +    | StoreTerm                     {} +    | EqualsTerm                    {} +    | MethodInvocationTerm          {}      ; -SimpleTarget -    : NameString                    {} -    | LocalTerm                     {} -    | ArgTerm                       {} +/* For RefOf(), SuperName except for RefOf and MethodInvocationTerm */ + +RefOfSource +    : SimpleName                    {} +    | DebugTerm                     {} +    | DerefOfTerm                   {} +    | IndexTerm                     {} +    | IndexExpTerm                  {}      ; -/* Opcode types */ +/* For CondRefOf(), SuperName except for RefOf and MethodInvocationTerm */ + +CondRefOfSource +    : SimpleName                    {} +    | DebugTerm                     {} +    | DerefOfTerm                   {} +    | IndexTerm                     {} +    | IndexExpTerm                  {} +    ; +/* + * Opcode types, as defined in the ACPI specification + */  Type1Opcode      : BreakTerm                     {}      | BreakPointTerm                {} diff --git a/source/compiler/aslstubs.c b/source/compiler/aslstubs.c index b88513ffb5241..c472e07396826 100644 --- a/source/compiler/aslstubs.c +++ b/source/compiler/aslstubs.c @@ -188,8 +188,7 @@ AcpiEvReleaseGlobalLock (  ACPI_STATUS  AcpiEvInitializeRegion ( -    ACPI_OPERAND_OBJECT     *RegionObj, -    BOOLEAN                 AcpiNsLocked) +    ACPI_OPERAND_OBJECT     *RegionObj)  {      return (AE_OK);  } diff --git a/source/compiler/asltokens.y b/source/compiler/asltokens.y index ff1dd42535c8c..61213db0b66ba 100644 --- a/source/compiler/asltokens.y +++ b/source/compiler/asltokens.y @@ -465,6 +465,9 @@ NoEcho('  %left <i>  PARSEOP_EXP_INCREMENT             PARSEOP_EXP_DECREMENT +%left <i>  PARSEOP_OPEN_PAREN +           PARSEOP_CLOSE_PAREN +  /* Brackets for Index() support */  %left <i>  PARSEOP_EXP_INDEX_LEFT diff --git a/source/compiler/asltypes.y b/source/compiler/asltypes.y index 1152a422d79f9..d463997bf6b4f 100644 --- a/source/compiler/asltypes.y +++ b/source/compiler/asltypes.y @@ -68,7 +68,7 @@ NoEcho('  %type <n> ParameterTypesPackage  %type <n> ParameterTypesPackageList  %type <n> RequiredTarget -%type <n> SimpleTarget +%type <n> SimpleName  %type <n> StringData  %type <n> Target  %type <n> Term @@ -252,7 +252,10 @@ NoEcho('  /* Types */  %type <n> SuperName -%type <n> ObjectTypeName +%type <n> ObjectTypeSource +%type <n> DerefOfSource +%type <n> RefOfSource +%type <n> CondRefOfSource  %type <n> ArgTerm  %type <n> LocalTerm  %type <n> DebugTerm diff --git a/source/compiler/aslwalks.c b/source/compiler/aslwalks.c index 357b92d0b38da..9fbc582b6ab2c 100644 --- a/source/compiler/aslwalks.c +++ b/source/compiler/aslwalks.c @@ -862,21 +862,10 @@ AnAnalyzeStoreOperator (      case PARSEOP_DEREFOF:      case PARSEOP_REFOF:      case PARSEOP_INDEX: +    case PARSEOP_STORE:          return; -    case PARSEOP_METHODCALL: -        /* -         * A target is not allowed to be a method call. -         * It is not supported by the ACPICA interpreter, nor is it -         * supported by the MS ASL compiler or the MS interpreter. -         * Although legal syntax up until ACPI 6.1, support for this -         * will be removed for ACPI 6.2 (02/2016) -         */ -        AslError (ASL_ERROR, ASL_MSG_SYNTAX, -            TargetOperandOp, "Illegal method invocation as a target operand"); -        return; -      default:          break;      } diff --git a/source/compiler/dttable.c b/source/compiler/dttable.c index c1011f8231354..7b33e4d2302e3 100644 --- a/source/compiler/dttable.c +++ b/source/compiler/dttable.c @@ -129,12 +129,9 @@ DtCompileFadt (      DT_SUBTABLE             *ParentTable;      DT_FIELD                **PFieldList = (DT_FIELD **) List;      ACPI_TABLE_HEADER       *Table; -    UINT8                   FadtRevision; -    UINT32                  i; +    UINT8                   Revision; -    /* Minimum table is the FADT version 1 (ACPI 1.0) */ -      Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,          &Subtable, TRUE);      if (ACPI_FAILURE (Status)) @@ -146,41 +143,22 @@ DtCompileFadt (      DtInsertSubtable (ParentTable, Subtable);      Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); -    FadtRevision = Table->Revision; - -    /* Revision 0 and 2 are illegal */ - -    if ((FadtRevision == 0) || -        (FadtRevision == 2)) -    { -        DtError (ASL_ERROR, 0, NULL, -            "Invalid value for FADT revision"); - -        return (AE_BAD_VALUE); -    } - -    /* Revision out of supported range? */ +    Revision = Table->Revision; -    if (FadtRevision > ACPI_FADT_MAX_VERSION) +    if (Revision == 2)      { -        DtError (ASL_ERROR, 0, NULL, -            "Unknown or unsupported value for FADT revision"); - -        return (AE_BAD_VALUE); -    } - -    /* Compile individual sub-parts of the FADT, per-revision */ - -    for (i = 3; i <= ACPI_FADT_MAX_VERSION; i++) -    { -        if (i > FadtRevision) +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2, +            &Subtable, TRUE); +        if (ACPI_FAILURE (Status))          { -            break; +            return (Status);          } -        /* Compile the fields specific to this FADT revision */ - -        Status = DtCompileTable (PFieldList, FadtRevisionInfo[i], +        DtInsertSubtable (ParentTable, Subtable); +    } +    else if (Revision >= 2) +    { +        Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,              &Subtable, TRUE);          if (ACPI_FAILURE (Status))          { @@ -188,6 +166,30 @@ DtCompileFadt (          }          DtInsertSubtable (ParentTable, Subtable); + +        if (Revision >= 5) +        { +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, +                &Subtable, TRUE); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } + +            DtInsertSubtable (ParentTable, Subtable); +        } + +        if (Revision >= 6) +        { +            Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6, +                &Subtable, TRUE); +            if (ACPI_FAILURE (Status)) +            { +                return (Status); +            } + +            DtInsertSubtable (ParentTable, Subtable); +        }      }      return (AE_OK); diff --git a/source/components/disassembler/dmbuffer.c b/source/components/disassembler/dmbuffer.c index 42920500ba2d7..7e2b6f90a71b8 100644 --- a/source/components/disassembler/dmbuffer.c +++ b/source/components/disassembler/dmbuffer.c @@ -439,12 +439,16 @@ AcpiDmIsUnicodeBuffer (          return (FALSE);      } -    /* For each word, 1st byte must be ascii (1-0x7F), 2nd byte must be zero */ - +    /* +     * For each word, 1st byte must be printable ascii, and the +     * 2nd byte must be zero. This does not allow for escape +     * sequences, but it is the most secure way to detect a +     * unicode string. +     */      for (i = 0; i < (ByteCount - 2); i += 2)      {          if ((ByteData[i] == 0) || -            (ByteData[i] > 0x7F) || +            !(isprint (ByteData[i])) ||              (ByteData[(ACPI_SIZE) i + 1] != 0))          {              return (FALSE); @@ -507,12 +511,27 @@ AcpiDmIsStringBuffer (          return (FALSE);      } +    /* +     * Check for a possible standalone resource EndTag, ignore it +     * here. However, this sequence is also the string "Y", but +     * this seems rare enough to be acceptable. +     */ +    if ((ByteCount == 2) && (ByteData[0] == 0x79)) +    { +        return (FALSE); +    } + +    /* Check all bytes for ASCII */ +      for (i = 0; i < (ByteCount - 1); i++)      { -        /* TBD: allow some escapes (non-ascii chars). +        /* +         * TBD: allow some escapes (non-ascii chars).           * they will be handled in the string output routine           */ +        /* Not a string if not printable ascii */ +          if (!isprint (ByteData[i]))          {              return (FALSE); diff --git a/source/components/disassembler/dmcstyle.c b/source/components/disassembler/dmcstyle.c index 939168f242572..f5e9560a90712 100644 --- a/source/components/disassembler/dmcstyle.c +++ b/source/components/disassembler/dmcstyle.c @@ -73,6 +73,11 @@ AcpiDmIsTargetAnOperand (      ACPI_PARSE_OBJECT       *Operand,      BOOLEAN                 TopLevel); +static BOOLEAN +AcpiDmIsOptimizationIgnored ( +    ACPI_PARSE_OBJECT       *StoreOp, +    ACPI_PARSE_OBJECT       *StoreArgument); +  /*******************************************************************************   * @@ -95,12 +100,10 @@ AcpiDmCheckForSymbolicOpcode (      ACPI_OP_WALK_INFO       *Info)  {      char                    *OperatorSymbol = NULL; -    ACPI_PARSE_OBJECT       *Child1; -    ACPI_PARSE_OBJECT       *Child2; +    ACPI_PARSE_OBJECT       *Argument1; +    ACPI_PARSE_OBJECT       *Argument2;      ACPI_PARSE_OBJECT       *Target; -    ACPI_PARSE_OBJECT       *GrandChild1; -    ACPI_PARSE_OBJECT       *GrandChild2; -    ACPI_PARSE_OBJECT       *GrandTarget = NULL; +    ACPI_PARSE_OBJECT       *Target2;      /* Exit immediately if ASL+ not enabled */ @@ -110,25 +113,17 @@ AcpiDmCheckForSymbolicOpcode (          return (FALSE);      } -    /* Check for a non-ASL+ statement, propagate the flag */ - -    if (Op->Common.Parent->Common.DisasmFlags & ACPI_PARSEOP_LEGACY_ASL_ONLY) -    { -        Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; -        return (FALSE); -    } -      /* Get the first operand */ -    Child1 = AcpiPsGetArg (Op, 0); -    if (!Child1) +    Argument1 = AcpiPsGetArg (Op, 0); +    if (!Argument1)      {          return (FALSE);      }      /* Get the second operand */ -    Child2 = Child1->Common.Next; +    Argument2 = Argument1->Common.Next;      /* Setup the operator string for this opcode */ @@ -202,7 +197,7 @@ AcpiDmCheckForSymbolicOpcode (           * LNotEqual, LLessEqual, and LGreaterEqual. There are           * no actual AML opcodes for these operators.           */ -        switch (Child1->Common.AmlOpcode) +        switch (Argument1->Common.AmlOpcode)          {          case AML_LEQUAL_OP:              OperatorSymbol = " != "; @@ -224,19 +219,18 @@ AcpiDmCheckForSymbolicOpcode (              return (TRUE);          } -        Child1->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX; +        Argument1->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;          Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; -        Op->Common.DisasmFlags |= ACPI_PARSEOP_COMPOUND_ASSIGNMENT;          /* Save symbol string in the next child (not peer) */ -        Child2 = AcpiPsGetArg (Child1, 0); -        if (!Child2) +        Argument2 = AcpiPsGetArg (Argument1, 0); +        if (!Argument2)          {              return (FALSE);          } -        Child2->Common.OperatorSymbol = OperatorSymbol; +        Argument2->Common.OperatorSymbol = OperatorSymbol;          return (TRUE);      case AML_INDEX_OP: @@ -246,10 +240,10 @@ AcpiDmCheckForSymbolicOpcode (           * the symbolic operators for Index(). It doesn't make sense to           * use Index() with a constant anyway.           */ -        if ((Child1->Common.AmlOpcode == AML_STRING_OP)  || -            (Child1->Common.AmlOpcode == AML_BUFFER_OP)  || -            (Child1->Common.AmlOpcode == AML_PACKAGE_OP) || -            (Child1->Common.AmlOpcode == AML_VAR_PACKAGE_OP)) +        if ((Argument1->Common.AmlOpcode == AML_STRING_OP)  || +            (Argument1->Common.AmlOpcode == AML_BUFFER_OP)  || +            (Argument1->Common.AmlOpcode == AML_PACKAGE_OP) || +            (Argument1->Common.AmlOpcode == AML_VAR_PACKAGE_OP))          {              Op->Common.DisasmFlags |= ACPI_PARSEOP_CLOSING_PAREN;              return (FALSE); @@ -257,8 +251,8 @@ AcpiDmCheckForSymbolicOpcode (          /* Index operator is [] */ -        Child1->Common.OperatorSymbol = " ["; -        Child2->Common.OperatorSymbol = "]"; +        Argument1->Common.OperatorSymbol = " ["; +        Argument2->Common.OperatorSymbol = "]";          break;      /* Unary operators */ @@ -280,7 +274,7 @@ AcpiDmCheckForSymbolicOpcode (          return (FALSE);      } -    if (Child1->Common.DisasmOpcode == ACPI_DASM_LNOT_SUFFIX) +    if (Argument1->Common.DisasmOpcode == ACPI_DASM_LNOT_SUFFIX)      {          return (TRUE);      } @@ -291,9 +285,9 @@ AcpiDmCheckForSymbolicOpcode (       * deferring symbol output until after the first operand has been       * emitted.       */ -    if (!Child1->Common.OperatorSymbol) +    if (!Argument1->Common.OperatorSymbol)      { -        Child1->Common.OperatorSymbol = OperatorSymbol; +        Argument1->Common.OperatorSymbol = OperatorSymbol;      }      /* @@ -323,23 +317,58 @@ AcpiDmCheckForSymbolicOpcode (          /* Target is 3rd operand */ -        Target = Child2->Common.Next; +        Target = Argument2->Common.Next;          if (Op->Common.AmlOpcode == AML_DIVIDE_OP)          { +            Target2 = Target->Common.Next; +              /*               * Divide has an extra target operand (Remainder). -             * If this extra target is specified, it cannot be converted -             * to a C-style operator +             * Default behavior is to simply ignore ASL+ conversion +             * if the remainder target (modulo) is specified.               */ -            if (AcpiDmIsValidTarget (Target)) +            if (!AcpiGbl_DoDisassemblerOptimizations)              { -                Child1->Common.OperatorSymbol = NULL; -                Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; -                return (FALSE); +                if (AcpiDmIsValidTarget (Target)) +                { +                    Argument1->Common.OperatorSymbol = NULL; +                    Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; +                    return (FALSE); +                } + +                Target->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; +                Target = Target2;              } +            else +            { +                /* +                 * Divide has an extra target operand (Remainder). +                 * If both targets are specified, it cannot be converted +                 * to a C-style operator. +                 */ +                if (AcpiDmIsValidTarget (Target) && +                    AcpiDmIsValidTarget (Target2)) +                { +                    Argument1->Common.OperatorSymbol = NULL; +                    Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; +                    return (FALSE); +                } + +                if (AcpiDmIsValidTarget (Target)) /* Only first Target is valid (remainder) */ +                { +                    /* Convert the Divide to Modulo */ + +                    Op->Common.AmlOpcode = AML_MOD_OP; -            Target->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; -            Target = Target->Common.Next; +                    Argument1->Common.OperatorSymbol = " % "; +                    Target2->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; +                } +                else /* Only second Target (quotient) is valid */ +                { +                    Target->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; +                    Target = Target2; +                } +            }          }          /* Parser should ensure there is at least a placeholder target */ @@ -351,13 +380,6 @@ AcpiDmCheckForSymbolicOpcode (          if (!AcpiDmIsValidTarget (Target))          { -            if (Op->Common.Parent->Common.AmlOpcode == AML_STORE_OP) -            { -                Op->Common.DisasmFlags = 0; -                Child1->Common.OperatorSymbol = NULL; -                return (FALSE); -            } -              /* Not a valid target (placeholder only, from parser) */              break;          } @@ -390,8 +412,8 @@ AcpiDmCheckForSymbolicOpcode (               *      Add (B, A, A) --> A += B               *      Add (B, C, A) --> A = (B + C)               */ -            if ((AcpiDmIsTargetAnOperand (Target, Child1, TRUE)) || -                (AcpiDmIsTargetAnOperand (Target, Child2, TRUE))) +            if ((AcpiDmIsTargetAnOperand (Target, Argument1, TRUE)) || +                (AcpiDmIsTargetAnOperand (Target, Argument2, TRUE)))              {                  Target->Common.OperatorSymbol =                      AcpiDmGetCompoundSymbol (Op->Common.AmlOpcode); @@ -399,7 +421,7 @@ AcpiDmCheckForSymbolicOpcode (                  /* Convert operator to compound assignment */                  Op->Common.DisasmFlags |= ACPI_PARSEOP_COMPOUND_ASSIGNMENT; -                Child1->Common.OperatorSymbol = NULL; +                Argument1->Common.OperatorSymbol = NULL;                  return (TRUE);              }              break; @@ -419,7 +441,7 @@ AcpiDmCheckForSymbolicOpcode (               *      Subtract (A, B, A) --> A -= B               *      Subtract (B, A, A) --> A = (B - A)               */ -            if ((AcpiDmIsTargetAnOperand (Target, Child1, TRUE))) +            if ((AcpiDmIsTargetAnOperand (Target, Argument1, TRUE)))              {                  Target->Common.OperatorSymbol =                      AcpiDmGetCompoundSymbol (Op->Common.AmlOpcode); @@ -427,7 +449,7 @@ AcpiDmCheckForSymbolicOpcode (                  /* Convert operator to compound assignment */                  Op->Common.DisasmFlags |= ACPI_PARSEOP_COMPOUND_ASSIGNMENT; -                Child1->Common.OperatorSymbol = NULL; +                Argument1->Common.OperatorSymbol = NULL;                  return (TRUE);              }              break; @@ -481,7 +503,7 @@ AcpiDmCheckForSymbolicOpcode (          /* Target is optional, 3rd operand */ -        Target = Child2->Common.Next; +        Target = Argument2->Common.Next;          if (AcpiDmIsValidTarget (Target))          {              AcpiDmPromoteTarget (Op, Target); @@ -495,75 +517,23 @@ AcpiDmCheckForSymbolicOpcode (      case AML_STORE_OP:          /* -         * Target is the 2nd operand. -         * We know the target is valid, it is not optional. +         * For Store, the Target is the 2nd operand. We know the target +         * is valid, because it is not optional.           * -         * The following block implements "Ignore conversion if a store -         * is followed by a math/bit operator that has no target". Used -         * only for the ASL test suite. +         * Ignore any optimizations/folding if flag is set. +         * Used for iASL/disassembler test suite only.           */ -        if (!AcpiGbl_DoDisassemblerOptimizations) +        if (AcpiDmIsOptimizationIgnored (Op, Argument1))          { -            switch (Child1->Common.AmlOpcode) -            { -            /* This operator has two operands and two targets */ - -            case AML_DIVIDE_OP: - -                GrandChild1 = Child1->Common.Value.Arg; -                GrandChild2 = GrandChild1->Common.Next; -                GrandTarget = GrandChild2->Common.Next; - -                if (GrandTarget && !AcpiDmIsValidTarget (GrandTarget)) -                { -                    Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; -                    return (FALSE); -                } -                GrandTarget = GrandTarget->Common.Next; -                break; - -            case AML_ADD_OP: -            case AML_SUBTRACT_OP: -            case AML_MULTIPLY_OP: -            case AML_MOD_OP: -            case AML_SHIFT_LEFT_OP: -            case AML_SHIFT_RIGHT_OP: -            case AML_BIT_AND_OP: -            case AML_BIT_OR_OP: -            case AML_BIT_XOR_OP: -            case AML_INDEX_OP: - -                /* These operators have two operands and a target */ - -                GrandChild1 = Child1->Common.Value.Arg; -                GrandChild2 = GrandChild1->Common.Next; -                GrandTarget = GrandChild2->Common.Next; -                break; - -            case AML_BIT_NOT_OP: - -                /* This operator has one operand and a target */ - -                GrandChild1 = Child1->Common.Value.Arg; -                GrandTarget = GrandChild1->Common.Next; -                break; - -            default: -                break; -            } - -            if (GrandTarget && !AcpiDmIsValidTarget (GrandTarget)) -            { -                Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; -                return (FALSE); -            } +            return (FALSE);          }          /* +         * Perform conversion.           * In the parse tree, simply swap the target with the           * source so that the target is processed first.           */ -        Target = Child1->Common.Next; +        Target = Argument1->Common.Next;          if (!Target)          {              return (FALSE); @@ -580,7 +550,7 @@ AcpiDmCheckForSymbolicOpcode (          /* Target is optional, 2nd operand */ -        Target = Child1->Common.Next; +        Target = Argument1->Common.Next;          if (!Target)          {              return (FALSE); @@ -605,23 +575,129 @@ AcpiDmCheckForSymbolicOpcode (          break;      } +    /* All other operators, emit an open paren */ + +    AcpiOsPrintf ("("); +    return (TRUE); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiDmIsOptimizationIgnored + * + * PARAMETERS:  StoreOp             - Store operator parse object + *              StoreArgument       - Target associate with the Op + * + * RETURN:      TRUE if this Store operator should not be converted/removed. + * + * DESCRIPTION: The following function implements "Do not optimize if a + *              store is immediately followed by a math/bit operator that + *              has no target". + * + *              Function is ignored if DoDisassemblerOptimizations is TRUE. + *              This is the default, ignore this function. + * + *              Disables these types of optimizations, and simply emits + *              legacy ASL code: + *                  Store (Add (INT1, 4), INT2) --> Add (INT1, 4, INT2) + *                                              --> INT2 = INT1 + 4 + * + *                  Store (Not (INT1), INT2)    --> Not (INT1, INT2) + *                                              --> INT2 = ~INT1 + * + *              Used only for the ASL test suite. For the test suite, we + *              don't want to perform some optimizations to ensure binary + *              compatibility with the generation of the legacy ASL->AML. + *              In other words, for all test modules we want exactly: + *                  (ASL+ -> AML) == (ASL- -> AML) + * + ******************************************************************************/ + +static BOOLEAN +AcpiDmIsOptimizationIgnored ( +    ACPI_PARSE_OBJECT       *StoreOp, +    ACPI_PARSE_OBJECT       *StoreArgument) +{ +    ACPI_PARSE_OBJECT       *Argument1; +    ACPI_PARSE_OBJECT       *Argument2; +    ACPI_PARSE_OBJECT       *Target; + + +    /* No optimizations/folding for the typical case */ + +    if (AcpiGbl_DoDisassemblerOptimizations) +    { +        return (FALSE); +    } +      /* -     * Nodes marked with ACPI_PARSEOP_PARAMLIST don't need a parens -     * output here. We also need to check the parent to see if this op -     * is part of a compound test (!=, >=, <=). +     * Only a small subset of ASL/AML operators can be optimized. +     * Can only optimize/fold if there is no target (or targets) +     * specified for the operator. And of course, the operator +     * is surrrounded by a Store() operator.       */ -    if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) || -       ((Op->Common.Parent->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) && -        (Op->Common.DisasmOpcode == ACPI_DASM_LNOT_SUFFIX))) +    switch (StoreArgument->Common.AmlOpcode)      { -        /* Do Nothing. Paren already generated */ -        return (TRUE); -    } +    case AML_ADD_OP: +    case AML_SUBTRACT_OP: +    case AML_MULTIPLY_OP: +    case AML_MOD_OP: +    case AML_SHIFT_LEFT_OP: +    case AML_SHIFT_RIGHT_OP: +    case AML_BIT_AND_OP: +    case AML_BIT_OR_OP: +    case AML_BIT_XOR_OP: +    case AML_INDEX_OP: -    /* All other operators, emit an open paren */ +        /* These operators have two arguments and one target */ -    AcpiOsPrintf ("("); -    return (TRUE); +        Argument1 = StoreArgument->Common.Value.Arg; +        Argument2 = Argument1->Common.Next; +        Target = Argument2->Common.Next; + +        if (!AcpiDmIsValidTarget (Target)) +        { +            StoreOp->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; +            return (TRUE); +        } +        break; + +    case AML_DIVIDE_OP: + +        /* This operator has two arguments and two targets */ + +        Argument1 = StoreArgument->Common.Value.Arg; +        Argument2 = Argument1->Common.Next; +        Target = Argument2->Common.Next; + +        if (!AcpiDmIsValidTarget (Target) || +            !AcpiDmIsValidTarget (Target->Common.Next)) +        { +            StoreOp->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; +            return (TRUE); +        } +        break; + +    case AML_BIT_NOT_OP: + +        /* This operator has one operand and one target */ + +        Argument1 = StoreArgument->Common.Value.Arg; +        Target = Argument1->Common.Next; + +        if (!AcpiDmIsValidTarget (Target)) +        { +            StoreOp->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY; +            return (TRUE); +        } +        break; + +    default: +        break; +    } + +    return (FALSE);  } @@ -643,8 +719,6 @@ void  AcpiDmCloseOperator (      ACPI_PARSE_OBJECT       *Op)  { -    BOOLEAN                 IsCStyleOp = FALSE; -      /* Always emit paren if ASL+ disassembly disabled */ @@ -654,8 +728,6 @@ AcpiDmCloseOperator (          return;      } -    /* Check for a non-ASL+ statement */ -      if (Op->Common.DisasmFlags & ACPI_PARSEOP_LEGACY_ASL_ONLY)      {          AcpiOsPrintf (")"); @@ -695,8 +767,6 @@ AcpiDmCloseOperator (          {              AcpiOsPrintf (")");          } - -        IsCStyleOp = TRUE;          break;      case AML_INDEX_OP: @@ -724,21 +794,7 @@ AcpiDmCloseOperator (          break;      } -    /* -     * Nodes marked with ACPI_PARSEOP_PARAMLIST don't need a parens -     * output here. We also need to check the parent to see if this op -     * is part of a compound test (!=, >=, <=). -     */ -    if (IsCStyleOp && -       ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) || -       ((Op->Common.Parent->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) && -        (Op->Common.DisasmOpcode == ACPI_DASM_LNOT_SUFFIX)))) -    { -        return; -    } -      AcpiOsPrintf (")"); -    return;  } diff --git a/source/components/disassembler/dmresrc.c b/source/components/disassembler/dmresrc.c index a486f1d892087..ee4a55fcfaa41 100644 --- a/source/components/disassembler/dmresrc.c +++ b/source/components/disassembler/dmresrc.c @@ -392,7 +392,8 @@ AcpiDmIsResourceTemplate (      ACPI_PARSE_OBJECT       *NextOp;      UINT8                   *Aml;      UINT8                   *EndAml; -    ACPI_SIZE               Length; +    UINT32                  BufferLength; +    UINT32                  DeclaredBufferLength;      /* This op must be a buffer */ @@ -402,8 +403,10 @@ AcpiDmIsResourceTemplate (          return (AE_TYPE);      } -    /* Get the ByteData list and length */ - +    /* +     * Get the declared length of the buffer. +     * This is the nn in "Buffer (nn)" +     */      NextOp = Op->Common.Value.Arg;      if (!NextOp)      { @@ -411,6 +414,10 @@ AcpiDmIsResourceTemplate (          return (AE_TYPE);      } +    DeclaredBufferLength = NextOp->Common.Value.Size; + +    /* Get the length of the raw initialization byte list */ +      NextOp = NextOp->Common.Next;      if (!NextOp)      { @@ -418,11 +425,22 @@ AcpiDmIsResourceTemplate (      }      Aml = NextOp->Named.Data; -    Length = (ACPI_SIZE) NextOp->Common.Value.Integer; +    BufferLength = NextOp->Common.Value.Size; + +    /* +     * Not a template if declared buffer length != actual length of the +     * intialization byte list. Because the resource macros will create +     * a buffer of the exact required length (buffer length will be equal +     * to the actual length). +     */ +    if (DeclaredBufferLength != BufferLength) +    { +        return (AE_TYPE); +    }      /* Walk the byte list, abort on any invalid descriptor type or length */ -    Status = AcpiUtWalkAmlResources (WalkState, Aml, Length, +    Status = AcpiUtWalkAmlResources (WalkState, Aml, BufferLength,          NULL, ACPI_CAST_INDIRECT_PTR (void, &EndAml));      if (ACPI_FAILURE (Status))      { @@ -435,7 +453,7 @@ AcpiDmIsResourceTemplate (       * of a ResourceTemplate, the buffer must not have any extra data after       * the EndTag.)       */ -    if ((Aml + Length - sizeof (AML_RESOURCE_END_TAG)) != EndAml) +    if ((Aml + BufferLength - sizeof (AML_RESOURCE_END_TAG)) != EndAml)      {          return (AE_AML_NO_RESOURCE_END_TAG);      } diff --git a/source/components/dispatcher/dsinit.c b/source/components/dispatcher/dsinit.c index 74e974da0315e..67c8d61c028a2 100644 --- a/source/components/dispatcher/dsinit.c +++ b/source/components/dispatcher/dsinit.c @@ -46,6 +46,7 @@  #include "acdispat.h"  #include "acnamesp.h"  #include "actables.h" +#include "acinterp.h"  #define _COMPONENT          ACPI_DISPATCHER          ACPI_MODULE_NAME    ("dsinit") @@ -231,23 +232,16 @@ AcpiDsInitializeObjects (      /* Walk entire namespace from the supplied root */ -    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); -    if (ACPI_FAILURE (Status)) -    { -        return_ACPI_STATUS (Status); -    } -      /*       * We don't use AcpiWalkNamespace since we do not want to acquire       * the namespace reader lock.       */      Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, StartNode, ACPI_UINT32_MAX, -        ACPI_NS_WALK_UNLOCK, AcpiDsInitOneObject, NULL, &Info, NULL); +        ACPI_NS_WALK_NO_UNLOCK, AcpiDsInitOneObject, NULL, &Info, NULL);      if (ACPI_FAILURE (Status))      {          ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace"));      } -    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);      Status = AcpiGetTableByIndex (TableIndex, &Table);      if (ACPI_FAILURE (Status)) diff --git a/source/components/dispatcher/dsmethod.c b/source/components/dispatcher/dsmethod.c index 4c4ff2270127d..92bdb2fc80f46 100644 --- a/source/components/dispatcher/dsmethod.c +++ b/source/components/dispatcher/dsmethod.c @@ -107,15 +107,12 @@ AcpiDsAutoSerializeMethod (          "Method auto-serialization parse [%4.4s] %p\n",          AcpiUtGetNodeName (Node), Node)); -    AcpiExEnterInterpreter (); -      /* Create/Init a root op for the method parse tree */      Op = AcpiPsAllocOp (AML_METHOD_OP, ObjDesc->Method.AmlStart);      if (!Op)      { -        Status = AE_NO_MEMORY; -        goto Unlock; +        return_ACPI_STATUS (AE_NO_MEMORY);      }      AcpiPsSetName (Op, Node->Name.Integer); @@ -127,8 +124,7 @@ AcpiDsAutoSerializeMethod (      if (!WalkState)      {          AcpiPsFreeOp (Op); -        Status = AE_NO_MEMORY; -        goto Unlock; +        return_ACPI_STATUS (AE_NO_MEMORY);      }      Status = AcpiDsInitAmlWalk (WalkState, Op, Node, @@ -147,8 +143,6 @@ AcpiDsAutoSerializeMethod (      Status = AcpiPsParseAml (WalkState);      AcpiPsDeleteParseTree (Op); -Unlock: -    AcpiExExitInterpreter ();      return_ACPI_STATUS (Status);  } @@ -784,26 +778,6 @@ AcpiDsTerminateControlMethod (          AcpiDsMethodDataDeleteAll (WalkState);          /* -         * If method is serialized, release the mutex and restore the -         * current sync level for this thread -         */ -        if (MethodDesc->Method.Mutex) -        { -            /* Acquisition Depth handles recursive calls */ - -            MethodDesc->Method.Mutex->Mutex.AcquisitionDepth--; -            if (!MethodDesc->Method.Mutex->Mutex.AcquisitionDepth) -            { -                WalkState->Thread->CurrentSyncLevel = -                    MethodDesc->Method.Mutex->Mutex.OriginalSyncLevel; - -                AcpiOsReleaseMutex ( -                    MethodDesc->Method.Mutex->Mutex.OsMutex); -                MethodDesc->Method.Mutex->Mutex.ThreadId = 0; -            } -        } - -        /*           * Delete any namespace objects created anywhere within the           * namespace by the execution of this method. Unless:           * 1) This method is a module-level executable code method, in which @@ -836,6 +810,26 @@ AcpiDsTerminateControlMethod (                      ~ACPI_METHOD_MODIFIED_NAMESPACE;              }          } + +        /* +         * If method is serialized, release the mutex and restore the +         * current sync level for this thread +         */ +        if (MethodDesc->Method.Mutex) +        { +            /* Acquisition Depth handles recursive calls */ + +            MethodDesc->Method.Mutex->Mutex.AcquisitionDepth--; +            if (!MethodDesc->Method.Mutex->Mutex.AcquisitionDepth) +            { +                WalkState->Thread->CurrentSyncLevel = +                    MethodDesc->Method.Mutex->Mutex.OriginalSyncLevel; + +                AcpiOsReleaseMutex ( +                    MethodDesc->Method.Mutex->Mutex.OsMutex); +                MethodDesc->Method.Mutex->Mutex.ThreadId = 0; +            } +        }      }      /* Decrement the thread count on the method */ diff --git a/source/components/dispatcher/dsopcode.c b/source/components/dispatcher/dsopcode.c index 1c6b34257092c..5cd9107d8669a 100644 --- a/source/components/dispatcher/dsopcode.c +++ b/source/components/dispatcher/dsopcode.c @@ -90,7 +90,7 @@ AcpiDsInitializeRegion (      /* Namespace is NOT locked */ -    Status = AcpiEvInitializeRegion (ObjDesc, FALSE); +    Status = AcpiEvInitializeRegion (ObjDesc);      return (Status);  } diff --git a/source/components/dispatcher/dswload2.c b/source/components/dispatcher/dswload2.c index ae076e2587cab..c0e4ad47e8971 100644 --- a/source/components/dispatcher/dswload2.c +++ b/source/components/dispatcher/dswload2.c @@ -626,23 +626,8 @@ AcpiDsLoad2EndOp (                  }              } -            AcpiExExitInterpreter ();              Status = AcpiEvInitializeRegion ( -                AcpiNsGetAttachedObject (Node), FALSE); -            AcpiExEnterInterpreter (); - -            if (ACPI_FAILURE (Status)) -            { -                /* -                 *  If AE_NOT_EXIST is returned, it is not fatal -                 *  because many regions get created before a handler -                 *  is installed for said region. -                 */ -                if (AE_NOT_EXIST == Status) -                { -                    Status = AE_OK; -                } -            } +                AcpiNsGetAttachedObject (Node));              break;          case AML_NAME_OP: diff --git a/source/components/events/evrgnini.c b/source/components/events/evrgnini.c index 51e3ce99aa736..171602a59c250 100644 --- a/source/components/events/evrgnini.c +++ b/source/components/events/evrgnini.c @@ -45,6 +45,7 @@  #include "accommon.h"  #include "acevents.h"  #include "acnamesp.h" +#include "acinterp.h"  #define _COMPONENT          ACPI_EVENTS          ACPI_MODULE_NAME    ("evrgnini") @@ -537,7 +538,6 @@ AcpiEvDefaultRegionSetup (   * FUNCTION:    AcpiEvInitializeRegion   *   * PARAMETERS:  RegionObj       - Region we are initializing - *              AcpiNsLocked    - Is namespace locked?   *   * RETURN:      Status   * @@ -555,21 +555,33 @@ AcpiEvDefaultRegionSetup (   * MUTEX:       Interpreter should be unlocked, because we may run the _REG   *              method for this region.   * + * NOTE:        Possible incompliance: + *              There is a behavior conflict in automatic _REG execution: + *              1. When the interpreter is evaluating a method, we can only + *                 automatically run _REG for the following case: + *                   Method(_REG, 2) {} + *                   OperationRegion (OPR1, 0x80, 0x1000010, 0x4) + *              2. When the interpreter is loading a table, we can also + *                 automatically run _REG for the following case: + *                   OperationRegion (OPR1, 0x80, 0x1000010, 0x4) + *                   Method(_REG, 2) {} + *              Though this may not be compliant to the de-facto standard, the + *              logic is kept in order not to trigger regressions. And keeping + *              this logic should be taken care by the caller of this function. + *   ******************************************************************************/  ACPI_STATUS  AcpiEvInitializeRegion ( -    ACPI_OPERAND_OBJECT     *RegionObj, -    BOOLEAN                 AcpiNsLocked) +    ACPI_OPERAND_OBJECT     *RegionObj)  {      ACPI_OPERAND_OBJECT     *HandlerObj;      ACPI_OPERAND_OBJECT     *ObjDesc;      ACPI_ADR_SPACE_TYPE     SpaceId;      ACPI_NAMESPACE_NODE     *Node; -    ACPI_STATUS             Status; -    ACPI_FUNCTION_TRACE_U32 (EvInitializeRegion, AcpiNsLocked); +    ACPI_FUNCTION_TRACE (EvInitializeRegion);      if (!RegionObj) @@ -641,33 +653,15 @@ AcpiEvInitializeRegion (                      "Found handler %p for region %p in obj %p\n",                      HandlerObj, RegionObj, ObjDesc)); -                Status = AcpiEvAttachRegion (HandlerObj, RegionObj, -                    AcpiNsLocked); +                (void) AcpiEvAttachRegion (HandlerObj, RegionObj, FALSE);                  /*                   * Tell all users that this region is usable by                   * running the _REG method                   */ -                if (AcpiNsLocked) -                { -                    Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); -                    if (ACPI_FAILURE (Status)) -                    { -                        return_ACPI_STATUS (Status); -                    } -                } - -                Status = AcpiEvExecuteRegMethod (RegionObj, ACPI_REG_CONNECT); - -                if (AcpiNsLocked) -                { -                    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); -                    if (ACPI_FAILURE (Status)) -                    { -                        return_ACPI_STATUS (Status); -                    } -                } - +                AcpiExExitInterpreter (); +                (void) AcpiEvExecuteRegMethod (RegionObj, ACPI_REG_CONNECT); +                AcpiExEnterInterpreter ();                  return_ACPI_STATUS (AE_OK);              }          } @@ -677,11 +671,14 @@ AcpiEvInitializeRegion (          Node = Node->Parent;      } -    /* If we get here, there is no handler for this region */ - +    /* +     * If we get here, there is no handler for this region. This is not +     * fatal because many regions get created before a handler is installed +     * for said region. +     */      ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,          "No handler for RegionType %s(%X) (RegionObj %p)\n",          AcpiUtGetRegionName (SpaceId), SpaceId, RegionObj)); -    return_ACPI_STATUS (AE_NOT_EXIST); +    return_ACPI_STATUS (AE_OK);  } diff --git a/source/components/executer/exconfig.c b/source/components/executer/exconfig.c index c17beab9961c2..f49b0a9fa9bb4 100644 --- a/source/components/executer/exconfig.c +++ b/source/components/executer/exconfig.c @@ -480,7 +480,7 @@ AcpiExLoadOp (      ACPI_INFO (("Dynamic OEM Table Load:"));      AcpiExExitInterpreter (); -    Status = AcpiTbInstallAndLoadTable (Table, ACPI_PTR_TO_PHYSADDR (Table), +    Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),          ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, TRUE, &TableIndex);      AcpiExEnterInterpreter ();      if (ACPI_FAILURE (Status)) @@ -545,7 +545,6 @@ AcpiExUnloadTable (      ACPI_STATUS             Status = AE_OK;      ACPI_OPERAND_OBJECT     *TableDesc = DdbHandle;      UINT32                  TableIndex; -    ACPI_TABLE_HEADER       *Table;      ACPI_FUNCTION_TRACE (ExUnloadTable); @@ -586,42 +585,7 @@ AcpiExUnloadTable (       * strict order requirement against it.       */      AcpiExExitInterpreter (); - -    /* Ensure the table is still loaded */ - -    if (!AcpiTbIsTableLoaded (TableIndex)) -    { -        Status = AE_NOT_EXIST; -        goto LockAndExit; -    } - -    /* Invoke table handler if present */ - -    if (AcpiGbl_TableHandler) -    { -        Status = AcpiGetTableByIndex (TableIndex, &Table); -        if (ACPI_SUCCESS (Status)) -        { -            (void) AcpiGbl_TableHandler (ACPI_TABLE_EVENT_UNLOAD, Table, -                AcpiGbl_TableHandlerContext); -        } -    } - -    /* Delete the portion of the namespace owned by this table */ - -    Status = AcpiTbDeleteNamespaceByOwner (TableIndex); -    if (ACPI_FAILURE (Status)) -    { -        goto LockAndExit; -    } - -    (void) AcpiTbReleaseOwnerId (TableIndex); -    AcpiTbSetTableLoadedFlag (TableIndex, FALSE); - -LockAndExit: - -    /* Re-acquire the interpreter lock */ - +    Status = AcpiTbUnloadTable (TableIndex);      AcpiExEnterInterpreter ();      /* diff --git a/source/components/executer/exconvrt.c b/source/components/executer/exconvrt.c index 5e0f5499aa4ae..ddbcc46b5b915 100644 --- a/source/components/executer/exconvrt.c +++ b/source/components/executer/exconvrt.c @@ -645,7 +645,6 @@ AcpiExConvertToTargetType (      switch (GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs))      {      case ARGI_SIMPLE_TARGET: -    case ARGI_FIXED_TARGET:      case ARGI_INTEGER_REF:      /* Handles Increment, Decrement cases */          switch (DestinationType) diff --git a/source/components/executer/exresop.c b/source/components/executer/exresop.c index d4352e297c167..bf1edd42145e2 100644 --- a/source/components/executer/exresop.c +++ b/source/components/executer/exresop.c @@ -321,7 +321,6 @@ AcpiExResolveOperands (          case ARGI_OBJECT_REF:          case ARGI_DEVICE_REF:          case ARGI_TARGETREF:     /* Allows implicit conversion rules before store */ -        case ARGI_FIXED_TARGET:  /* No implicit conversion before store to target */          case ARGI_SIMPLE_TARGET: /* Name, Local, or Arg - no implicit conversion  */          case ARGI_STORE_TARGET: diff --git a/source/components/namespace/nsload.c b/source/components/namespace/nsload.c index 6e11d6b706243..d7dbf8955fa00 100644 --- a/source/components/namespace/nsload.c +++ b/source/components/namespace/nsload.c @@ -154,7 +154,9 @@ Unlock:      ACPI_DEBUG_PRINT ((ACPI_DB_INFO,          "**** Begin Table Object Initialization\n")); +    AcpiExEnterInterpreter ();      Status = AcpiDsInitializeObjects (TableIndex, Node); +    AcpiExExitInterpreter ();      ACPI_DEBUG_PRINT ((ACPI_DB_INFO,          "**** Completed Table Object Initialization\n")); diff --git a/source/components/namespace/nsnames.c b/source/components/namespace/nsnames.c index 95f8c8db970ca..8af12f1972794 100644 --- a/source/components/namespace/nsnames.c +++ b/source/components/namespace/nsnames.c @@ -110,6 +110,58 @@ AcpiNsGetPathnameLength (  /*******************************************************************************   * + * FUNCTION:    AcpiNsHandleToName + * + * PARAMETERS:  TargetHandle            - Handle of named object whose name is + *                                        to be found + *              Buffer                  - Where the name is returned + * + * RETURN:      Status, Buffer is filled with name if status is AE_OK + * + * DESCRIPTION: Build and return a full namespace name + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsHandleToName ( +    ACPI_HANDLE             TargetHandle, +    ACPI_BUFFER             *Buffer) +{ +    ACPI_STATUS             Status; +    ACPI_NAMESPACE_NODE     *Node; +    const char              *NodeName; + + +    ACPI_FUNCTION_TRACE_PTR (NsHandleToName, TargetHandle); + + +    Node = AcpiNsValidateHandle (TargetHandle); +    if (!Node) +    { +        return_ACPI_STATUS (AE_BAD_PARAMETER); +    } + +    /* Validate/Allocate/Clear caller buffer */ + +    Status = AcpiUtInitializeBuffer (Buffer, ACPI_PATH_SEGMENT_LENGTH); +    if (ACPI_FAILURE (Status)) +    { +        return_ACPI_STATUS (Status); +    } + +    /* Just copy the ACPI name from the Node and zero terminate it */ + +    NodeName = AcpiUtGetNodeName (Node); +    ACPI_MOVE_NAME (Buffer->Pointer, NodeName); +    ((char *) Buffer->Pointer) [ACPI_NAME_SIZE] = 0; + +    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%4.4s\n", (char *) Buffer->Pointer)); +    return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + *   * FUNCTION:    AcpiNsHandleToPathname   *   * PARAMETERS:  TargetHandle            - Handle of named object whose name is diff --git a/source/components/namespace/nsxfname.c b/source/components/namespace/nsxfname.c index cfd6937f497fb..1621ba985da90 100644 --- a/source/components/namespace/nsxfname.c +++ b/source/components/namespace/nsxfname.c @@ -176,8 +176,6 @@ AcpiGetName (      ACPI_BUFFER             *Buffer)  {      ACPI_STATUS             Status; -    ACPI_NAMESPACE_NODE     *Node; -    const char              *NodeName;      /* Parameter validation */ @@ -193,16 +191,6 @@ AcpiGetName (          return (Status);      } -    if (NameType == ACPI_FULL_PATHNAME || -        NameType == ACPI_FULL_PATHNAME_NO_TRAILING) -    { -        /* Get the full pathname (From the namespace root) */ - -        Status = AcpiNsHandleToPathname (Handle, Buffer, -            NameType == ACPI_FULL_PATHNAME ? FALSE : TRUE); -        return (Status); -    } -      /*       * Wants the single segment ACPI name.       * Validate handle and convert to a namespace Node @@ -213,30 +201,20 @@ AcpiGetName (          return (Status);      } -    Node = AcpiNsValidateHandle (Handle); -    if (!Node) +    if (NameType == ACPI_FULL_PATHNAME || +        NameType == ACPI_FULL_PATHNAME_NO_TRAILING)      { -        Status = AE_BAD_PARAMETER; -        goto UnlockAndExit; -    } - -    /* Validate/Allocate/Clear caller buffer */ +        /* Get the full pathname (From the namespace root) */ -    Status = AcpiUtInitializeBuffer (Buffer, ACPI_PATH_SEGMENT_LENGTH); -    if (ACPI_FAILURE (Status)) -    { -        goto UnlockAndExit; +        Status = AcpiNsHandleToPathname (Handle, Buffer, +            NameType == ACPI_FULL_PATHNAME ? FALSE : TRUE);      } +    else +    { +        /* Get the single name */ -    /* Just copy the ACPI name from the Node and zero terminate it */ - -    NodeName = AcpiUtGetNodeName (Node); -    ACPI_MOVE_NAME (Buffer->Pointer, NodeName); -    ((char *) Buffer->Pointer) [ACPI_NAME_SIZE] = 0; -    Status = AE_OK; - - -UnlockAndExit: +        Status = AcpiNsHandleToName (Handle, Buffer); +    }      (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);      return (Status); diff --git a/source/components/parser/psargs.c b/source/components/parser/psargs.c index a4745c3adc1df..5cc328612e118 100644 --- a/source/components/parser/psargs.c +++ b/source/components/parser/psargs.c @@ -298,23 +298,12 @@ AcpiPsGetNextNamepath (          PossibleMethodCall &&          (Node->Type == ACPI_TYPE_METHOD))      { -        if (WalkState->Opcode == AML_UNLOAD_OP) -        { -            /* -             * AcpiPsGetNextNamestring has increased the AML pointer, -             * so we need to restore the saved AML pointer for method call. -             */ -            WalkState->ParserState.Aml = Start; -            WalkState->ArgCount = 1; -            AcpiPsInitOp (Arg, AML_INT_METHODCALL_OP); -            return_ACPI_STATUS (AE_OK); -        } -          /* This name is actually a control method invocation */          MethodDesc = AcpiNsGetAttachedObject (Node);          ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, -            "Control Method - %p Desc %p Path=%p\n", Node, MethodDesc, Path)); +            "Control Method invocation %4.4s - %p Desc %p Path=%p\n", +            Node->Name.Ascii, Node, MethodDesc, Path));          NameOp = AcpiPsAllocOp (AML_INT_NAMEPATH_OP, Start);          if (!NameOp) @@ -771,6 +760,10 @@ AcpiPsGetNextArg (      ACPI_FUNCTION_TRACE_PTR (PsGetNextArg, ParserState); +    ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, +        "Expected argument type ARGP: %s (%2.2X)\n", +        AcpiUtGetArgumentTypeName (ArgType), ArgType)); +      switch (ArgType)      {      case ARGP_BYTEDATA: @@ -854,11 +847,13 @@ AcpiPsGetNextArg (          }          break; -    case ARGP_TARGET: -    case ARGP_SUPERNAME:      case ARGP_SIMPLENAME:      case ARGP_NAME_OR_REF: +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, +            "**** SimpleName/NameOrRef: %s (%2.2X)\n", +            AcpiUtGetArgumentTypeName (ArgType), ArgType)); +          Subop = AcpiPsPeekOpcode (ParserState);          if (Subop == 0                  ||              AcpiPsIsLeadingChar (Subop) || @@ -873,28 +868,37 @@ AcpiPsGetNextArg (                  return_ACPI_STATUS (AE_NO_MEMORY);              } -            /* To support SuperName arg of Unload */ +            Status = AcpiPsGetNextNamepath (WalkState, ParserState, +                Arg, ACPI_NOT_METHOD_CALL); +        } +        else +        { +            /* Single complex argument, nothing returned */ -            if (WalkState->Opcode == AML_UNLOAD_OP) -            { -                Status = AcpiPsGetNextNamepath (WalkState, ParserState, -                    Arg, ACPI_POSSIBLE_METHOD_CALL); - -                /* -                 * If the SuperName argument is a method call, we have -                 * already restored the AML pointer, just free this Arg -                 */ -                if (Arg->Common.AmlOpcode == AML_INT_METHODCALL_OP) -                { -                    AcpiPsFreeOp (Arg); -                    Arg = NULL; -                } -            } -            else +            WalkState->ArgCount = 1; +        } +        break; + +    case ARGP_TARGET: +    case ARGP_SUPERNAME: + +        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, +            "**** Target/Supername: %s (%2.2X)\n", +            AcpiUtGetArgumentTypeName (ArgType), ArgType)); + +        Subop = AcpiPsPeekOpcode (ParserState); +        if (Subop == 0) +        { +            /* NULL target (zero). Convert to a NULL namepath */ + +            Arg = AcpiPsAllocOp (AML_INT_NAMEPATH_OP, ParserState->Aml); +            if (!Arg)              { -                Status = AcpiPsGetNextNamepath (WalkState, ParserState, -                    Arg, ACPI_NOT_METHOD_CALL); +                return_ACPI_STATUS (AE_NO_MEMORY);              } + +            Status = AcpiPsGetNextNamepath (WalkState, ParserState, +                Arg, ACPI_POSSIBLE_METHOD_CALL);          }          else          { @@ -907,6 +911,11 @@ AcpiPsGetNextArg (      case ARGP_DATAOBJ:      case ARGP_TERMARG: + +    ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, +        "**** TermArg/DataObj: %s (%2.2X)\n", +        AcpiUtGetArgumentTypeName (ArgType), ArgType)); +          /* Single complex argument, nothing returned */          WalkState->ArgCount = 1; diff --git a/source/components/parser/psloop.c b/source/components/parser/psloop.c index e0839fd7d828b..5056cd1de7f0a 100644 --- a/source/components/parser/psloop.c +++ b/source/components/parser/psloop.c @@ -104,6 +104,9 @@ AcpiPsGetArguments (      ACPI_FUNCTION_TRACE_PTR (PsGetArguments, WalkState); +    ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, +        "Get arguments for opcode [%s]\n", Op->Common.AmlOpName)); +      switch (Op->Common.AmlOpcode)      {      case AML_BYTE_OP:       /* AML_BYTEDATA_ARG */ diff --git a/source/components/parser/psobject.c b/source/components/parser/psobject.c index 7edc39e2b7ad2..d027f6d9892c8 100644 --- a/source/components/parser/psobject.c +++ b/source/components/parser/psobject.c @@ -373,7 +373,13 @@ AcpiPsCreateOp (                  Op->Common.Flags |= ACPI_PARSEOP_TARGET;              }          } -        else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP) + +        /* +         * Special case for both Increment() and Decrement(), where +         * the lone argument is both a source and a target. +         */ +        else if ((ParentScope->Common.AmlOpcode == AML_INCREMENT_OP) || +                (ParentScope->Common.AmlOpcode == AML_DECREMENT_OP))          {              Op->Common.Flags |= ACPI_PARSEOP_TARGET;          } diff --git a/source/components/parser/pstree.c b/source/components/parser/pstree.c index 729856982b649..0d6ab6373b6e5 100644 --- a/source/components/parser/pstree.c +++ b/source/components/parser/pstree.c @@ -142,12 +142,12 @@ AcpiPsAppendArg (      const ACPI_OPCODE_INFO  *OpInfo; -    ACPI_FUNCTION_ENTRY (); +    ACPI_FUNCTION_TRACE ("PsAppendArg");      if (!Op)      { -        return; +        return_VOID;      }      /* Get the info structure for this opcode */ @@ -159,7 +159,7 @@ AcpiPsAppendArg (          ACPI_ERROR ((AE_INFO, "Invalid AML Opcode: 0x%2.2X",              Op->Common.AmlOpcode)); -        return; +        return_VOID;      }      /* Check if this opcode requires argument sub-objects */ @@ -168,7 +168,7 @@ AcpiPsAppendArg (      {          /* Has no linked argument objects */ -        return; +        return_VOID;      }      /* Append the argument to the linked argument list */ @@ -200,6 +200,8 @@ AcpiPsAppendArg (          Op->Common.ArgListLength++;      } + +    return_VOID;  } diff --git a/source/components/tables/tbdata.c b/source/components/tables/tbdata.c index 81b3abcfdd7bf..95b5b2672cd27 100644 --- a/source/components/tables/tbdata.c +++ b/source/components/tables/tbdata.c @@ -937,9 +937,9 @@ AcpiTbLoadTable (   *   * FUNCTION:    AcpiTbInstallAndLoadTable   * - * PARAMETERS:  Table                   - Pointer to the table - *              Address                 - Physical address of the table + * PARAMETERS:  Address                 - Physical address of the table   *              Flags                   - Allocation flags of the table + *              Override                - Whether override should be performed   *              TableIndex              - Where table index is returned   *   * RETURN:      Status @@ -950,7 +950,6 @@ AcpiTbLoadTable (  ACPI_STATUS  AcpiTbInstallAndLoadTable ( -    ACPI_TABLE_HEADER       *Table,      ACPI_PHYSICAL_ADDRESS   Address,      UINT8                   Flags,      BOOLEAN                 Override, @@ -958,10 +957,9 @@ AcpiTbInstallAndLoadTable (  {      ACPI_STATUS             Status;      UINT32                  i; -    ACPI_OWNER_ID           OwnerId; -    ACPI_FUNCTION_TRACE (AcpiLoadTable); +    ACPI_FUNCTION_TRACE (TbInstallAndLoadTable);      (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); @@ -975,48 +973,68 @@ AcpiTbInstallAndLoadTable (          goto UnlockAndExit;      } -    /* -     * Note: Now table is "INSTALLED", it must be validated before -     * using. -     */ -    Status = AcpiTbValidateTable (&AcpiGbl_RootTableList.Tables[i]); -    if (ACPI_FAILURE (Status)) -    { -        goto UnlockAndExit; -    } +    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); +    Status = AcpiTbLoadTable (i, AcpiGbl_RootNode); +    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); +UnlockAndExit: +    *TableIndex = i;      (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); -    Status = AcpiNsLoadTable (i, AcpiGbl_RootNode); +    return_ACPI_STATUS (Status); +} -    /* Execute any module-level code that was found in the table */ -    if (!AcpiGbl_ParseTableAsTermList && AcpiGbl_GroupModuleLevelCode) -    { -        AcpiNsExecModuleCodeList (); -    } +/******************************************************************************* + * + * FUNCTION:    AcpiTbUnloadTable + * + * PARAMETERS:  TableIndex              - Table index + * + * RETURN:      Status + * + * DESCRIPTION: Unload an ACPI table + * + ******************************************************************************/ -    /* -     * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is -     * responsible for discovering any new wake GPEs by running _PRW methods -     * that may have been loaded by this table. -     */ -    Status = AcpiTbGetOwnerId (i, &OwnerId); -    if (ACPI_SUCCESS (Status)) +ACPI_STATUS +AcpiTbUnloadTable ( +    UINT32                  TableIndex) +{ +    ACPI_STATUS             Status = AE_OK; +    ACPI_TABLE_HEADER       *Table; + + +    ACPI_FUNCTION_TRACE (TbUnloadTable); + + +    /* Ensure the table is still loaded */ + +    if (!AcpiTbIsTableLoaded (TableIndex))      { -        AcpiEvUpdateGpes (OwnerId); +        return_ACPI_STATUS (AE_NOT_EXIST);      }      /* Invoke table handler if present */      if (AcpiGbl_TableHandler)      { -        (void) AcpiGbl_TableHandler (ACPI_TABLE_EVENT_LOAD, Table, -            AcpiGbl_TableHandlerContext); +        Status = AcpiGetTableByIndex (TableIndex, &Table); +        if (ACPI_SUCCESS (Status)) +        { +            (void) AcpiGbl_TableHandler (ACPI_TABLE_EVENT_UNLOAD, Table, +                AcpiGbl_TableHandlerContext); +        }      } -    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); -UnlockAndExit: -    *TableIndex = i; -    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); +    /* Delete the portion of the namespace owned by this table */ + +    Status = AcpiTbDeleteNamespaceByOwner (TableIndex); +    if (ACPI_FAILURE (Status)) +    { +        return_ACPI_STATUS (Status); +    } + +    (void) AcpiTbReleaseOwnerId (TableIndex); +    AcpiTbSetTableLoadedFlag (TableIndex, FALSE);      return_ACPI_STATUS (Status);  } diff --git a/source/components/tables/tbfadt.c b/source/components/tables/tbfadt.c index b75b52d9d0b97..1d327dc3113bb 100644 --- a/source/components/tables/tbfadt.c +++ b/source/components/tables/tbfadt.c @@ -341,6 +341,8 @@ AcpiTbParseFadt (  {      UINT32                  Length;      ACPI_TABLE_HEADER       *Table; +    ACPI_TABLE_DESC         *FadtDesc; +    ACPI_STATUS             Status;      /* @@ -350,14 +352,13 @@ AcpiTbParseFadt (       * Get a local copy of the FADT and convert it to a common format       * Map entire FADT, assumed to be smaller than one page.       */ -    Length = AcpiGbl_RootTableList.Tables[AcpiGbl_FadtIndex].Length; - -    Table = AcpiOsMapMemory ( -        AcpiGbl_RootTableList.Tables[AcpiGbl_FadtIndex].Address, Length); -    if (!Table) +    FadtDesc = &AcpiGbl_RootTableList.Tables[AcpiGbl_FadtIndex]; +    Status = AcpiTbGetTable (FadtDesc, &Table); +    if (ACPI_FAILURE (Status))      {          return;      } +    Length = FadtDesc->Length;      /*       * Validate the FADT checksum before we copy the table. Ignore @@ -371,7 +372,7 @@ AcpiTbParseFadt (      /* All done with the real FADT, unmap it */ -    AcpiOsUnmapMemory (Table, Length); +    AcpiTbPutTable (FadtDesc);      /* Obtain the DSDT and FACS tables via their addresses within the FADT */ @@ -522,19 +523,17 @@ AcpiTbConvertFadt (      /* -     * For ACPI 1.0 FADTs (revision 1), ensure that reserved fields which +     * For ACPI 1.0 FADTs (revision 1 or 2), ensure that reserved fields which       * should be zero are indeed zero. This will workaround BIOSs that       * inadvertently place values in these fields.       *       * The ACPI 1.0 reserved fields that will be zeroed are the bytes located       * at offset 45, 55, 95, and the word located at offset 109, 110.       * -     * Note: The FADT revision value is unreliable because of BIOS errors. -     * The table length is instead used as the final word on the version. -     * -     * Note: FADT revision 3 is the ACPI 2.0 version of the FADT. +     * Note: The FADT revision value is unreliable. Only the length can be +     * trusted.       */ -    if (AcpiGbl_FADT.Header.Length <= ACPI_FADT_V3_SIZE) +    if (AcpiGbl_FADT.Header.Length <= ACPI_FADT_V2_SIZE)      {          AcpiGbl_FADT.PreferredProfile = 0;          AcpiGbl_FADT.PstateControl = 0; diff --git a/source/components/tables/tbutils.c b/source/components/tables/tbutils.c index 85b9c3e4c561a..6fc30a69fa388 100644 --- a/source/components/tables/tbutils.c +++ b/source/components/tables/tbutils.c @@ -411,3 +411,99 @@ NextTable:      AcpiOsUnmapMemory (Table, Length);      return_ACPI_STATUS (AE_OK);  } + + +/******************************************************************************* + * + * FUNCTION:    AcpiTbGetTable + * + * PARAMETERS:  TableDesc           - Table descriptor + *              OutTable            - Where the pointer to the table is returned + * + * RETURN:      Status and pointer to the requested table + * + * DESCRIPTION: Increase a reference to a table descriptor and return the + *              validated table pointer. + *              If the table descriptor is an entry of the root table list, + *              this API must be invoked with ACPI_MTX_TABLES acquired. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiTbGetTable ( +    ACPI_TABLE_DESC        *TableDesc, +    ACPI_TABLE_HEADER      **OutTable) +{ +    ACPI_STATUS            Status; + + +    ACPI_FUNCTION_TRACE (AcpiTbGetTable); + + +    if (TableDesc->ValidationCount == 0) +    { +        /* Table need to be "VALIDATED" */ + +        Status = AcpiTbValidateTable (TableDesc); +        if (ACPI_FAILURE (Status)) +        { +            return_ACPI_STATUS (Status); +        } +    } + +    TableDesc->ValidationCount++; +    if (TableDesc->ValidationCount == 0) +    { +        ACPI_ERROR ((AE_INFO, +            "Table %p, Validation count is zero after increment\n", +            TableDesc)); +        TableDesc->ValidationCount--; +        return_ACPI_STATUS (AE_LIMIT); +    } + +    *OutTable = TableDesc->Pointer; +    return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION:    AcpiTbPutTable + * + * PARAMETERS:  TableDesc           - Table descriptor + * + * RETURN:      None + * + * DESCRIPTION: Decrease a reference to a table descriptor and release the + *              validated table pointer if no references. + *              If the table descriptor is an entry of the root table list, + *              this API must be invoked with ACPI_MTX_TABLES acquired. + * + ******************************************************************************/ + +void +AcpiTbPutTable ( +    ACPI_TABLE_DESC        *TableDesc) +{ + +    ACPI_FUNCTION_TRACE (AcpiTbPutTable); + + +    if (TableDesc->ValidationCount == 0) +    { +        ACPI_WARNING ((AE_INFO, +            "Table %p, Validation count is zero before decrement\n", +            TableDesc)); +        return_VOID; +    } +    TableDesc->ValidationCount--; + +    if (TableDesc->ValidationCount == 0) +    { +        /* Table need to be "INVALIDATED" */ + +        AcpiTbInvalidateTable (TableDesc); +    } + +    return_VOID; +} diff --git a/source/components/tables/tbxface.c b/source/components/tables/tbxface.c index 4c8c065cf3730..9346933cf5274 100644 --- a/source/components/tables/tbxface.c +++ b/source/components/tables/tbxface.c @@ -184,6 +184,7 @@ AcpiReallocateRootTable (      void)  {      ACPI_STATUS             Status; +    UINT32                  i;      ACPI_FUNCTION_TRACE (AcpiReallocateRootTable); @@ -198,6 +199,22 @@ AcpiReallocateRootTable (          return_ACPI_STATUS (AE_SUPPORT);      } +    /* +     * Ensure OS early boot logic, which is required by some hosts. If the +     * table state is reported to be wrong, developers should fix the +     * issue by invoking AcpiPutTable() for the reported table during the +     * early stage. +     */ +    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i) +    { +        if (AcpiGbl_RootTableList.Tables[i].Pointer) +        { +            ACPI_ERROR ((AE_INFO, +                "Table [%4.4s] is not invalidated during early boot stage", +                AcpiGbl_RootTableList.Tables[i].Signature.Ascii)); +        } +    } +      AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ALLOW_RESIZE;      Status = AcpiTbResizeRootTableList (); @@ -307,6 +324,11 @@ ACPI_EXPORT_SYMBOL (AcpiGetTableHeader)   *   * DESCRIPTION: Finds and verifies an ACPI table. Table must be in the   *              RSDT/XSDT. + *              Note that an early stage AcpiGetTable() call must be paired + *              with an early stage AcpiPutTable() call. otherwise the table + *              pointer mapped by the early stage mapping implementation may be + *              erroneously unmapped by the late stage unmapping implementation + *              in an AcpiPutTable() invoked during the late stage.   *   ******************************************************************************/ @@ -318,7 +340,8 @@ AcpiGetTable (  {      UINT32                  i;      UINT32                  j; -    ACPI_STATUS             Status; +    ACPI_STATUS             Status = AE_NOT_FOUND; +    ACPI_TABLE_DESC         *TableDesc;      /* Parameter validation */ @@ -328,12 +351,22 @@ AcpiGetTable (          return (AE_BAD_PARAMETER);      } +    /* +     * Note that the following line is required by some OSPMs, they only +     * check if the returned table is NULL instead of the returned status +     * to determined if this function is succeeded. +     */ +    *OutTable = NULL; + +    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); +      /* Walk the root table list */      for (i = 0, j = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)      { -        if (!ACPI_COMPARE_NAME ( -                &(AcpiGbl_RootTableList.Tables[i].Signature), Signature)) +        TableDesc = &AcpiGbl_RootTableList.Tables[i]; + +        if (!ACPI_COMPARE_NAME (&TableDesc->Signature, Signature))          {              continue;          } @@ -343,19 +376,66 @@ AcpiGetTable (              continue;          } -        Status = AcpiTbValidateTable (&AcpiGbl_RootTableList.Tables[i]); -        if (ACPI_SUCCESS (Status)) +        Status = AcpiTbGetTable (TableDesc, OutTable); +        break; +    } + +    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); +    return (Status); +} + +ACPI_EXPORT_SYMBOL (AcpiGetTable) + + +/******************************************************************************* + * + * FUNCTION:    AcpiPutTable + * + * PARAMETERS:  Table               - The pointer to the table + * + * RETURN:      None + * + * DESCRIPTION: Release a table returned by AcpiGetTable() and its clones. + *              Note that it is not safe if this function was invoked after an + *              uninstallation happened to the original table descriptor. + *              Currently there is no OSPMs' requirement to handle such + *              situations. + * + ******************************************************************************/ + +void +AcpiPutTable ( +    ACPI_TABLE_HEADER       *Table) +{ +    UINT32                  i; +    ACPI_TABLE_DESC         *TableDesc; + + +    ACPI_FUNCTION_TRACE (AcpiPutTable); + + +    (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); + +    /* Walk the root table list */ + +    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) +    { +        TableDesc = &AcpiGbl_RootTableList.Tables[i]; + +        if (TableDesc->Pointer != Table)          { -            *OutTable = AcpiGbl_RootTableList.Tables[i].Pointer; +            continue;          } -        return (Status); +        AcpiTbPutTable (TableDesc); +        break;      } -    return (AE_NOT_FOUND); +    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); +    return_VOID;  } -ACPI_EXPORT_SYMBOL (AcpiGetTable) +ACPI_EXPORT_SYMBOL (AcpiPutTable)  /******************************************************************************* @@ -363,7 +443,7 @@ ACPI_EXPORT_SYMBOL (AcpiGetTable)   * FUNCTION:    AcpiGetTableByIndex   *   * PARAMETERS:  TableIndex          - Table index - *              Table               - Where the pointer to the table is returned + *              OutTable            - Where the pointer to the table is returned   *   * RETURN:      Status and pointer to the requested table   * @@ -375,7 +455,7 @@ ACPI_EXPORT_SYMBOL (AcpiGetTable)  ACPI_STATUS  AcpiGetTableByIndex (      UINT32                  TableIndex, -    ACPI_TABLE_HEADER       **Table) +    ACPI_TABLE_HEADER       **OutTable)  {      ACPI_STATUS             Status; @@ -385,37 +465,34 @@ AcpiGetTableByIndex (      /* Parameter validation */ -    if (!Table) +    if (!OutTable)      {          return_ACPI_STATUS (AE_BAD_PARAMETER);      } +    /* +     * Note that the following line is required by some OSPMs, they only +     * check if the returned table is NULL instead of the returned status +     * to determined if this function is succeeded. +     */ +    *OutTable = NULL; +      (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);      /* Validate index */      if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)      { -        (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); -        return_ACPI_STATUS (AE_BAD_PARAMETER); +        Status = AE_BAD_PARAMETER; +        goto UnlockAndExit;      } -    if (!AcpiGbl_RootTableList.Tables[TableIndex].Pointer) -    { -        /* Table is not mapped, map it */ - -        Status = AcpiTbValidateTable ( -            &AcpiGbl_RootTableList.Tables[TableIndex]); -        if (ACPI_FAILURE (Status)) -        { -            (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); -            return_ACPI_STATUS (Status); -        } -    } +    Status = AcpiTbGetTable ( +        &AcpiGbl_RootTableList.Tables[TableIndex], OutTable); -    *Table = AcpiGbl_RootTableList.Tables[TableIndex].Pointer; +UnlockAndExit:      (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); -    return_ACPI_STATUS (AE_OK); +    return_ACPI_STATUS (Status);  }  ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex) diff --git a/source/components/tables/tbxfload.c b/source/components/tables/tbxfload.c index 43fe397fde568..30c6534a56995 100644 --- a/source/components/tables/tbxfload.c +++ b/source/components/tables/tbxfload.c @@ -372,7 +372,7 @@ AcpiLoadTable (      /* Install the table and load it into the namespace */      ACPI_INFO (("Host-directed Dynamic ACPI Table Load:")); -    Status = AcpiTbInstallAndLoadTable (Table, ACPI_PTR_TO_PHYSADDR (Table), +    Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),          ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex);      return_ACPI_STATUS (Status);  } @@ -459,39 +459,8 @@ AcpiUnloadParentTable (              break;          } -        /* Ensure the table is actually loaded */ -          (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); -        if (!AcpiTbIsTableLoaded (i)) -        { -            Status = AE_NOT_EXIST; -            (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); -            break; -        } - -        /* Invoke table handler if present */ - -        if (AcpiGbl_TableHandler) -        { -            (void) AcpiGbl_TableHandler (ACPI_TABLE_EVENT_UNLOAD, -                AcpiGbl_RootTableList.Tables[i].Pointer, -                AcpiGbl_TableHandlerContext); -        } - -        /* -         * Delete all namespace objects owned by this table. Note that -         * these objects can appear anywhere in the namespace by virtue -         * of the AML "Scope" operator. Thus, we need to track ownership -         * by an ID, not simply a position within the hierarchy. -         */ -        Status = AcpiTbDeleteNamespaceByOwner (i); -        if (ACPI_FAILURE (Status)) -        { -            break; -        } - -        Status = AcpiTbReleaseOwnerId (i); -        AcpiTbSetTableLoadedFlag (i, FALSE); +        Status = AcpiTbUnloadTable (i);          (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);          break;      } diff --git a/source/components/utilities/utdecode.c b/source/components/utilities/utdecode.c index 5c8f2cec80552..45adf14c6d9e6 100644 --- a/source/components/utilities/utdecode.c +++ b/source/components/utilities/utdecode.c @@ -44,6 +44,7 @@  #include "acpi.h"  #include "accommon.h"  #include "acnamesp.h" +#include "amlcode.h"  #define _COMPONENT          ACPI_UTILITIES          ACPI_MODULE_NAME    ("utdecode") @@ -604,6 +605,59 @@ AcpiUtGetNotifyName (      return ("Hardware-Specific");  } + + +/******************************************************************************* + * + * FUNCTION:    AcpiUtGetArgumentTypeName + * + * PARAMETERS:  ArgType             - an ARGP_* parser argument type + * + * RETURN:      Decoded ARGP_* type + * + * DESCRIPTION: Decode an ARGP_* parser type, as defined in the amlcode.h file, + *              and used in the acopcode.h file. For example, ARGP_TERMARG. + *              Used for debug only. + * + ******************************************************************************/ + +static const char           *AcpiGbl_ArgumentType[20] = +{ +    /* 00 */ "Unknown ARGP", +    /* 01 */ "ByteData", +    /* 02 */ "ByteList", +    /* 03 */ "CharList", +    /* 04 */ "DataObject", +    /* 05 */ "DataObjectList", +    /* 06 */ "DWordData", +    /* 07 */ "FieldList", +    /* 08 */ "Name", +    /* 09 */ "NameString", +    /* 0A */ "ObjectList", +    /* 0B */ "PackageLength", +    /* 0C */ "SuperName", +    /* 0D */ "Target", +    /* 0E */ "TermArg", +    /* 0F */ "TermList", +    /* 10 */ "WordData", +    /* 11 */ "QWordData", +    /* 12 */ "SimpleName", +    /* 13 */ "NameOrRef" +}; + +const char * +AcpiUtGetArgumentTypeName ( +    UINT32                  ArgType) +{ + +    if (ArgType > ARGP_MAX) +    { +        return ("Unknown ARGP"); +    } + +    return (AcpiGbl_ArgumentType[ArgType]); +} +  #endif diff --git a/source/components/utilities/utresrc.c b/source/components/utilities/utresrc.c index 8efae429777c2..8c44a1cab8f89 100644 --- a/source/components/utilities/utresrc.c +++ b/source/components/utilities/utresrc.c @@ -468,9 +468,11 @@ AcpiUtWalkAmlResources (      ACPI_FUNCTION_TRACE (UtWalkAmlResources); -    /* The absolute minimum resource template is one EndTag descriptor */ - -    if (AmlLength < sizeof (AML_RESOURCE_END_TAG)) +    /* +     * The absolute minimum resource template is one EndTag descriptor. +     * However, we will treat a lone EndTag as just a simple buffer. +     */ +    if (AmlLength <= sizeof (AML_RESOURCE_END_TAG))      {          return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);      } @@ -503,8 +505,8 @@ AcpiUtWalkAmlResources (          if (UserFunction)          { -            Status = UserFunction ( -                Aml, Length, Offset, ResourceIndex, Context); +            Status = UserFunction (Aml, Length, Offset, +                ResourceIndex, Context);              if (ACPI_FAILURE (Status))              {                  return_ACPI_STATUS (Status); @@ -531,6 +533,13 @@ AcpiUtWalkAmlResources (                  *Context = Aml;              } +            /* Check if buffer is defined to be longer than the resource length */ + +            if (AmlLength > (Offset + Length)) +            { +                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG); +            } +              /* Normal exit */              return_ACPI_STATUS (AE_OK); diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h index d60be8fd0b4ef..719ff859bc32b 100644 --- a/source/include/acdisasm.h +++ b/source/include/acdisasm.h @@ -280,8 +280,8 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoErst[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoErst0[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFacs[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFadt1[]; +extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFadt2[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFadt3[]; -extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFadt4[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFadt5[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFadt6[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoFpdt[]; @@ -425,9 +425,6 @@ extern ACPI_DMTABLE_INFO        AcpiDmTableInfoXenv[];  extern ACPI_DMTABLE_INFO        AcpiDmTableInfoGeneric[][2]; -extern ACPI_DMTABLE_INFO        *FadtRevisionInfo [ACPI_FADT_MAX_VERSION + 1]; - -  /*   * dmtable and ahtable   */ diff --git a/source/include/acevents.h b/source/include/acevents.h index 14f2b7925b8e8..a2ea52042e4d7 100644 --- a/source/include/acevents.h +++ b/source/include/acevents.h @@ -336,8 +336,7 @@ AcpiEvDefaultRegionSetup (  ACPI_STATUS  AcpiEvInitializeRegion ( -    ACPI_OPERAND_OBJECT     *RegionObj, -    BOOLEAN                 AcpiNsLocked); +    ACPI_OPERAND_OBJECT     *RegionObj);  /* diff --git a/source/include/acnamesp.h b/source/include/acnamesp.h index 440ff5b940ebf..09b319cc87c86 100644 --- a/source/include/acnamesp.h +++ b/source/include/acnamesp.h @@ -385,6 +385,11 @@ AcpiNsNameOfCurrentScope (      ACPI_WALK_STATE         *WalkState);  ACPI_STATUS +AcpiNsHandleToName ( +    ACPI_HANDLE             TargetHandle, +    ACPI_BUFFER             *Buffer); + +ACPI_STATUS  AcpiNsHandleToPathname (      ACPI_HANDLE             TargetHandle,      ACPI_BUFFER             *Buffer, diff --git a/source/include/acopcode.h b/source/include/acopcode.h index a278d4a154a41..e5c35255ca554 100644 --- a/source/include/acopcode.h +++ b/source/include/acopcode.h @@ -93,7 +93,7 @@  #define ARGP_BYTELIST_OP                ARGP_LIST1 (ARGP_NAMESTRING)  #define ARGP_CONCAT_OP                  ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)  #define ARGP_CONCAT_RES_OP              ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET) -#define ARGP_COND_REF_OF_OP             ARGP_LIST2 (ARGP_NAME_OR_REF,ARGP_TARGET) +#define ARGP_COND_REF_OF_OP             ARGP_LIST2 (ARGP_SIMPLENAME, ARGP_TARGET)  #define ARGP_CONNECTFIELD_OP            ARGP_LIST1 (ARGP_NAMESTRING)  #define ARGP_CONTINUE_OP                ARG_NONE  #define ARGP_COPY_OP                    ARGP_LIST2 (ARGP_TERMARG,    ARGP_SIMPLENAME) @@ -106,7 +106,7 @@  #define ARGP_DATA_REGION_OP             ARGP_LIST4 (ARGP_NAME,       ARGP_TERMARG,       ARGP_TERMARG,   ARGP_TERMARG)  #define ARGP_DEBUG_OP                   ARG_NONE  #define ARGP_DECREMENT_OP               ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_DEREF_OF_OP                ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_DEREF_OF_OP                ARGP_LIST1 (ARGP_SUPERNAME)  #define ARGP_DEVICE_OP                  ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_OBJLIST)  #define ARGP_DIVIDE_OP                  ARGP_LIST4 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET,    ARGP_TARGET)  #define ARGP_DWORD_OP                   ARGP_LIST1 (ARGP_DWORDDATA) @@ -153,14 +153,14 @@  #define ARGP_NAMEPATH_OP                ARGP_LIST1 (ARGP_NAMESTRING)  #define ARGP_NOOP_OP                    ARG_NONE  #define ARGP_NOTIFY_OP                  ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_TERMARG) -#define ARGP_OBJECT_TYPE_OP             ARGP_LIST1 (ARGP_NAME_OR_REF) +#define ARGP_OBJECT_TYPE_OP             ARGP_LIST1 (ARGP_SIMPLENAME)  #define ARGP_ONE_OP                     ARG_NONE  #define ARGP_ONES_OP                    ARG_NONE  #define ARGP_PACKAGE_OP                 ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_BYTEDATA,      ARGP_DATAOBJLIST)  #define ARGP_POWER_RES_OP               ARGP_LIST5 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,  ARGP_WORDDATA,  ARGP_OBJLIST)  #define ARGP_PROCESSOR_OP               ARGP_LIST6 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,  ARGP_DWORDDATA, ARGP_BYTEDATA,  ARGP_OBJLIST)  #define ARGP_QWORD_OP                   ARGP_LIST1 (ARGP_QWORDDATA) -#define ARGP_REF_OF_OP                  ARGP_LIST1 (ARGP_NAME_OR_REF) +#define ARGP_REF_OF_OP                  ARGP_LIST1 (ARGP_SIMPLENAME)  #define ARGP_REGION_OP                  ARGP_LIST4 (ARGP_NAME,       ARGP_BYTEDATA,      ARGP_TERMARG,   ARGP_TERMARG)  #define ARGP_RELEASE_OP                 ARGP_LIST1 (ARGP_SUPERNAME)  #define ARGP_RESERVEDFIELD_OP           ARGP_LIST1 (ARGP_NAMESTRING) @@ -251,7 +251,7 @@  #define ARGI_FIELD_OP                   ARGI_INVALID_OPCODE  #define ARGI_FIND_SET_LEFT_BIT_OP       ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF)  #define ARGI_FIND_SET_RIGHT_BIT_OP      ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF) -#define ARGI_FROM_BCD_OP                ARGI_LIST2 (ARGI_INTEGER,    ARGI_FIXED_TARGET) +#define ARGI_FROM_BCD_OP                ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF)  #define ARGI_IF_OP                      ARGI_INVALID_OPCODE  #define ARGI_INCREMENT_OP               ARGI_LIST1 (ARGI_TARGETREF)  #define ARGI_INDEX_FIELD_OP             ARGI_INVALID_OPCODE @@ -315,12 +315,12 @@  #define ARGI_SUBTRACT_OP                ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)  #define ARGI_THERMAL_ZONE_OP            ARGI_INVALID_OPCODE  #define ARGI_TIMER_OP                   ARG_NONE -#define ARGI_TO_BCD_OP                  ARGI_LIST2 (ARGI_INTEGER,    ARGI_FIXED_TARGET) -#define ARGI_TO_BUFFER_OP               ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_DEC_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_HEX_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_INTEGER_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_STRING_OP               ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_FIXED_TARGET) +#define ARGI_TO_BCD_OP                  ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF) +#define ARGI_TO_BUFFER_OP               ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_TARGETREF) +#define ARGI_TO_DEC_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_TARGETREF) +#define ARGI_TO_HEX_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_TARGETREF) +#define ARGI_TO_INTEGER_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_TARGETREF) +#define ARGI_TO_STRING_OP               ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_TARGETREF)  #define ARGI_UNLOAD_OP                  ARGI_LIST1 (ARGI_DDBHANDLE)  #define ARGI_VAR_PACKAGE_OP             ARGI_LIST1 (ARGI_INTEGER)  #define ARGI_WAIT_OP                    ARGI_LIST2 (ARGI_EVENT,      ARGI_INTEGER) diff --git a/source/include/acpixf.h b/source/include/acpixf.h index b2655e96fd996..f5f86d4fb252e 100644 --- a/source/include/acpixf.h +++ b/source/include/acpixf.h @@ -46,7 +46,7 @@  /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION                 0x20160930 +#define ACPI_CA_VERSION                 0x20161117  #include "acconfig.h"  #include "actypes.h" @@ -582,6 +582,11 @@ AcpiGetTable (      UINT32                  Instance,      ACPI_TABLE_HEADER       **OutTable)) +ACPI_EXTERNAL_RETURN_VOID ( +void +AcpiPutTable ( +    ACPI_TABLE_HEADER       *Table)) +  ACPI_EXTERNAL_RETURN_STATUS (  ACPI_STATUS  AcpiGetTableByIndex ( diff --git a/source/include/actables.h b/source/include/actables.h index 3325f19e2d1d1..3269728a7fd09 100644 --- a/source/include/actables.h +++ b/source/include/actables.h @@ -185,12 +185,15 @@ AcpiTbLoadTable (  ACPI_STATUS  AcpiTbInstallAndLoadTable ( -    ACPI_TABLE_HEADER       *Table,      ACPI_PHYSICAL_ADDRESS   Address,      UINT8                   Flags,      BOOLEAN                 Override,      UINT32                  *TableIndex); +ACPI_STATUS +AcpiTbUnloadTable ( +    UINT32                  TableIndex); +  void  AcpiTbTerminate (      void); @@ -253,6 +256,15 @@ ACPI_STATUS  AcpiTbParseRootTable (      ACPI_PHYSICAL_ADDRESS   RsdpAddress); +ACPI_STATUS +AcpiTbGetTable ( +    ACPI_TABLE_DESC        *TableDesc, +    ACPI_TABLE_HEADER      **OutTable); + +void +AcpiTbPutTable ( +    ACPI_TABLE_DESC        *TableDesc); +  /*   * tbxfload diff --git a/source/include/actbl.h b/source/include/actbl.h index b5c76c9c1b0c0..93e1a51fb0f3b 100644 --- a/source/include/actbl.h +++ b/source/include/actbl.h @@ -256,72 +256,62 @@ typedef struct acpi_table_facs  typedef struct acpi_table_fadt  { -    ACPI_TABLE_HEADER       Header;             /* [V1] Common ACPI table header */ -    UINT32                  Facs;               /* [V1] 32-bit physical address of FACS */ -    UINT32                  Dsdt;               /* [V1] 32-bit physical address of DSDT */ -    UINT8                   Model;              /* [V1] System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */ -    UINT8                   PreferredProfile;   /* [V1] Conveys preferred power management profile to OSPM. */ -    UINT16                  SciInterrupt;       /* [V1] System vector of SCI interrupt */ -    UINT32                  SmiCommand;         /* [V1] 32-bit Port address of SMI command port */ -    UINT8                   AcpiEnable;         /* [V1] Value to write to SMI_CMD to enable ACPI */ -    UINT8                   AcpiDisable;        /* [V1] Value to write to SMI_CMD to disable ACPI */ -    UINT8                   S4BiosRequest;      /* [V1] Value to write to SMI_CMD to enter S4BIOS state */ -    UINT8                   PstateControl;      /* [V1] Processor performance state control*/ -    UINT32                  Pm1aEventBlock;     /* [V1] 32-bit port address of Power Mgt 1a Event Reg Blk */ -    UINT32                  Pm1bEventBlock;     /* [V1] 32-bit port address of Power Mgt 1b Event Reg Blk */ -    UINT32                  Pm1aControlBlock;   /* [V1] 32-bit port address of Power Mgt 1a Control Reg Blk */ -    UINT32                  Pm1bControlBlock;   /* [V1] 32-bit port address of Power Mgt 1b Control Reg Blk */ -    UINT32                  Pm2ControlBlock;    /* [V1] 32-bit port address of Power Mgt 2 Control Reg Blk */ -    UINT32                  PmTimerBlock;       /* [V1] 32-bit port address of Power Mgt Timer Ctrl Reg Blk */ -    UINT32                  Gpe0Block;          /* [V1] 32-bit port address of General Purpose Event 0 Reg Blk */ -    UINT32                  Gpe1Block;          /* [V1] 32-bit port address of General Purpose Event 1 Reg Blk */ -    UINT8                   Pm1EventLength;     /* [V1] Byte Length of ports at Pm1xEventBlock */ -    UINT8                   Pm1ControlLength;   /* [V1] Byte Length of ports at Pm1xControlBlock */ -    UINT8                   Pm2ControlLength;   /* [V1] Byte Length of ports at Pm2ControlBlock */ -    UINT8                   PmTimerLength;      /* [V1] Byte Length of ports at PmTimerBlock */ -    UINT8                   Gpe0BlockLength;    /* [V1] Byte Length of ports at Gpe0Block */ -    UINT8                   Gpe1BlockLength;    /* [V1] Byte Length of ports at Gpe1Block */ -    UINT8                   Gpe1Base;           /* [V1] Offset in GPE number space where GPE1 events start */ -    UINT8                   CstControl;         /* [V1] Support for the _CST object and C-States change notification */ -    UINT16                  C2Latency;          /* [V1] Worst case HW latency to enter/exit C2 state */ -    UINT16                  C3Latency;          /* [V1] Worst case HW latency to enter/exit C3 state */ -    UINT16                  FlushSize;          /* [V1] Processor memory cache line width, in bytes */ -    UINT16                  FlushStride;        /* [V1] Number of flush strides that need to be read */ -    UINT8                   DutyOffset;         /* [V1] Processor duty cycle index in processor P_CNT reg */ -    UINT8                   DutyWidth;          /* [V1] Processor duty cycle value bit width in P_CNT register */ -    UINT8                   DayAlarm;           /* [V1] Index to day-of-month alarm in RTC CMOS RAM */ -    UINT8                   MonthAlarm;         /* [V1] Index to month-of-year alarm in RTC CMOS RAM */ -    UINT8                   Century;            /* [V1] Index to century in RTC CMOS RAM */ -    UINT16                  BootFlags;          /* [V3] IA-PC Boot Architecture Flags (see below for individual flags) */ -    UINT8                   Reserved;           /* [V1] Reserved, must be zero */ -    UINT32                  Flags;              /* [V1] Miscellaneous flag bits (see below for individual flags) */ -    /* End of Version 1 FADT fields (ACPI 1.0) */ - -    ACPI_GENERIC_ADDRESS    ResetRegister;      /* [V3] 64-bit address of the Reset register */ -    UINT8                   ResetValue;         /* [V3] Value to write to the ResetRegister port to reset the system */ -    UINT16                  ArmBootFlags;       /* [V5] ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ -    UINT8                   MinorRevision;      /* [V5] FADT Minor Revision (ACPI 5.1) */ -    UINT64                  XFacs;              /* [V3] 64-bit physical address of FACS */ -    UINT64                  XDsdt;              /* [V3] 64-bit physical address of DSDT */ -    ACPI_GENERIC_ADDRESS    XPm1aEventBlock;    /* [V3] 64-bit Extended Power Mgt 1a Event Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XPm1bEventBlock;    /* [V3] 64-bit Extended Power Mgt 1b Event Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XPm1aControlBlock;  /* [V3] 64-bit Extended Power Mgt 1a Control Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XPm1bControlBlock;  /* [V3] 64-bit Extended Power Mgt 1b Control Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XPm2ControlBlock;   /* [V3] 64-bit Extended Power Mgt 2 Control Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XPmTimerBlock;      /* [V3] 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XGpe0Block;         /* [V3] 64-bit Extended General Purpose Event 0 Reg Blk address */ -    ACPI_GENERIC_ADDRESS    XGpe1Block;         /* [V3] 64-bit Extended General Purpose Event 1 Reg Blk address */ -    /* End of Version 3 FADT fields (ACPI 2.0) */ - -    ACPI_GENERIC_ADDRESS    SleepControl;       /* [V4] 64-bit Sleep Control register (ACPI 5.0) */ -    /* End of Version 4 FADT fields (ACPI 3.0 and ACPI 4.0) (Field was originally reserved in ACPI 3.0) */ - -    ACPI_GENERIC_ADDRESS    SleepStatus;        /* [V5] 64-bit Sleep Status register (ACPI 5.0) */ -    /* End of Version 5 FADT fields (ACPI 5.0) */ - -    UINT64                  HypervisorId;       /* [V6] Hypervisor Vendor ID (ACPI 6.0) */ -    /* End of Version 6 FADT fields (ACPI 6.0) */ - +    ACPI_TABLE_HEADER       Header;             /* Common ACPI table header */ +    UINT32                  Facs;               /* 32-bit physical address of FACS */ +    UINT32                  Dsdt;               /* 32-bit physical address of DSDT */ +    UINT8                   Model;              /* System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */ +    UINT8                   PreferredProfile;   /* Conveys preferred power management profile to OSPM. */ +    UINT16                  SciInterrupt;       /* System vector of SCI interrupt */ +    UINT32                  SmiCommand;         /* 32-bit Port address of SMI command port */ +    UINT8                   AcpiEnable;         /* Value to write to SMI_CMD to enable ACPI */ +    UINT8                   AcpiDisable;        /* Value to write to SMI_CMD to disable ACPI */ +    UINT8                   S4BiosRequest;      /* Value to write to SMI_CMD to enter S4BIOS state */ +    UINT8                   PstateControl;      /* Processor performance state control*/ +    UINT32                  Pm1aEventBlock;     /* 32-bit port address of Power Mgt 1a Event Reg Blk */ +    UINT32                  Pm1bEventBlock;     /* 32-bit port address of Power Mgt 1b Event Reg Blk */ +    UINT32                  Pm1aControlBlock;   /* 32-bit port address of Power Mgt 1a Control Reg Blk */ +    UINT32                  Pm1bControlBlock;   /* 32-bit port address of Power Mgt 1b Control Reg Blk */ +    UINT32                  Pm2ControlBlock;    /* 32-bit port address of Power Mgt 2 Control Reg Blk */ +    UINT32                  PmTimerBlock;       /* 32-bit port address of Power Mgt Timer Ctrl Reg Blk */ +    UINT32                  Gpe0Block;          /* 32-bit port address of General Purpose Event 0 Reg Blk */ +    UINT32                  Gpe1Block;          /* 32-bit port address of General Purpose Event 1 Reg Blk */ +    UINT8                   Pm1EventLength;     /* Byte Length of ports at Pm1xEventBlock */ +    UINT8                   Pm1ControlLength;   /* Byte Length of ports at Pm1xControlBlock */ +    UINT8                   Pm2ControlLength;   /* Byte Length of ports at Pm2ControlBlock */ +    UINT8                   PmTimerLength;      /* Byte Length of ports at PmTimerBlock */ +    UINT8                   Gpe0BlockLength;    /* Byte Length of ports at Gpe0Block */ +    UINT8                   Gpe1BlockLength;    /* Byte Length of ports at Gpe1Block */ +    UINT8                   Gpe1Base;           /* Offset in GPE number space where GPE1 events start */ +    UINT8                   CstControl;         /* Support for the _CST object and C-States change notification */ +    UINT16                  C2Latency;          /* Worst case HW latency to enter/exit C2 state */ +    UINT16                  C3Latency;          /* Worst case HW latency to enter/exit C3 state */ +    UINT16                  FlushSize;          /* Processor memory cache line width, in bytes */ +    UINT16                  FlushStride;        /* Number of flush strides that need to be read */ +    UINT8                   DutyOffset;         /* Processor duty cycle index in processor P_CNT reg */ +    UINT8                   DutyWidth;          /* Processor duty cycle value bit width in P_CNT register */ +    UINT8                   DayAlarm;           /* Index to day-of-month alarm in RTC CMOS RAM */ +    UINT8                   MonthAlarm;         /* Index to month-of-year alarm in RTC CMOS RAM */ +    UINT8                   Century;            /* Index to century in RTC CMOS RAM */ +    UINT16                  BootFlags;          /* IA-PC Boot Architecture Flags (see below for individual flags) */ +    UINT8                   Reserved;           /* Reserved, must be zero */ +    UINT32                  Flags;              /* Miscellaneous flag bits (see below for individual flags) */ +    ACPI_GENERIC_ADDRESS    ResetRegister;      /* 64-bit address of the Reset register */ +    UINT8                   ResetValue;         /* Value to write to the ResetRegister port to reset the system */ +    UINT16                  ArmBootFlags;       /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ +    UINT8                   MinorRevision;      /* FADT Minor Revision (ACPI 5.1) */ +    UINT64                  XFacs;              /* 64-bit physical address of FACS */ +    UINT64                  XDsdt;              /* 64-bit physical address of DSDT */ +    ACPI_GENERIC_ADDRESS    XPm1aEventBlock;    /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XPm1bEventBlock;    /* 64-bit Extended Power Mgt 1b Event Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XPm1aControlBlock;  /* 64-bit Extended Power Mgt 1a Control Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XPm1bControlBlock;  /* 64-bit Extended Power Mgt 1b Control Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XPm2ControlBlock;   /* 64-bit Extended Power Mgt 2 Control Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XPmTimerBlock;      /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XGpe0Block;         /* 64-bit Extended General Purpose Event 0 Reg Blk address */ +    ACPI_GENERIC_ADDRESS    XGpe1Block;         /* 64-bit Extended General Purpose Event 1 Reg Blk address */ +    ACPI_GENERIC_ADDRESS    SleepControl;       /* 64-bit Sleep Control register (ACPI 5.0) */ +    ACPI_GENERIC_ADDRESS    SleepStatus;        /* 64-bit Sleep Status register (ACPI 5.0) */ +    UINT64                  HypervisorId;       /* Hypervisor Vendor ID (ACPI 6.0) */  } ACPI_TABLE_FADT; @@ -337,8 +327,8 @@ typedef struct acpi_table_fadt  /* Masks for FADT ARM Boot Architecture Flags (arm_boot_flags) ACPI 5.1 */ -#define ACPI_FADT_PSCI_COMPLIANT    (1)         /* 00: [V5] PSCI 0.2+ is implemented */ -#define ACPI_FADT_PSCI_USE_HVC      (1<<1)      /* 01: [V5] HVC must be used instead of SMC as the PSCI conduit */ +#define ACPI_FADT_PSCI_COMPLIANT    (1)         /* 00: [V5+] PSCI 0.2+ is implemented */ +#define ACPI_FADT_PSCI_USE_HVC      (1<<1)      /* 01: [V5+] HVC must be used instead of SMC as the PSCI conduit */  /* Masks for FADT flags */ @@ -415,6 +405,7 @@ typedef struct acpi_table_desc      ACPI_NAME_UNION                 Signature;      ACPI_OWNER_ID                   OwnerId;      UINT8                           Flags; +    UINT16                          ValidationCount;  } ACPI_TABLE_DESC; @@ -445,34 +436,20 @@ typedef struct acpi_table_desc   * match the expected length. In other words, the length of the   * FADT is the bottom line as to what the version really is.   * - * NOTE: There is no officialy released V2 of the FADT. This - * version was used only for prototyping and testing during the - * 32-bit to 64-bit transition. V3 was the first official 64-bit - * version of the FADT. - * - * Update this list of defines when a new version of the FADT is - * added to the ACPI specification. Note that the FADT version is - * only incremented when new fields are appended to the existing - * version. Therefore, the FADT version is competely independent - * from the version of the ACPI specification where it is - * defined. - * - * For reference, the various FADT lengths are as follows: - *     FADT V1 size: 0x074      ACPI 1.0 - *     FADT V3 size: 0x0F4      ACPI 2.0 - *     FADT V4 size: 0x100      ACPI 3.0 and ACPI 4.0 - *     FADT V5 size: 0x10C      ACPI 5.0 - *     FADT V6 size: 0x114      ACPI 6.0 + * For reference, the values below are as follows: + *     FADT V1 size: 0x074 + *     FADT V2 size: 0x084 + *     FADT V3 size: 0x0F4 + *     FADT V4 size: 0x0F4 + *     FADT V5 size: 0x10C + *     FADT V6 size: 0x114   */ -#define ACPI_FADT_V1_SIZE       (UINT32) (ACPI_FADT_OFFSET (Flags) + 4)         /* ACPI 1.0 */ -#define ACPI_FADT_V3_SIZE       (UINT32) (ACPI_FADT_OFFSET (SleepControl))      /* ACPI 2.0 */ -#define ACPI_FADT_V4_SIZE       (UINT32) (ACPI_FADT_OFFSET (SleepStatus))       /* ACPI 3.0 and ACPI 4.0 */ -#define ACPI_FADT_V5_SIZE       (UINT32) (ACPI_FADT_OFFSET (HypervisorId))      /* ACPI 5.0 */ -#define ACPI_FADT_V6_SIZE       (UINT32) (sizeof (ACPI_TABLE_FADT))             /* ACPI 6.0 */ - -/* Update these when new FADT versions are added */ +#define ACPI_FADT_V1_SIZE       (UINT32) (ACPI_FADT_OFFSET (Flags) + 4) +#define ACPI_FADT_V2_SIZE       (UINT32) (ACPI_FADT_OFFSET (MinorRevision) + 1) +#define ACPI_FADT_V3_SIZE       (UINT32) (ACPI_FADT_OFFSET (SleepControl)) +#define ACPI_FADT_V5_SIZE       (UINT32) (ACPI_FADT_OFFSET (HypervisorId)) +#define ACPI_FADT_V6_SIZE       (UINT32) (sizeof (ACPI_TABLE_FADT)) -#define ACPI_FADT_MAX_VERSION   6  #define ACPI_FADT_CONFORMANCE   "ACPI 6.1 (FADT version 6)"  #endif /* __ACTBL_H__ */ diff --git a/source/include/acutils.h b/source/include/acutils.h index bdd6f9b55d210..ac135ebb8b137 100644 --- a/source/include/acutils.h +++ b/source/include/acutils.h @@ -283,6 +283,10 @@ const char *  AcpiUtGetEventName (      UINT32                  EventId); +const char * +AcpiUtGetArgumentTypeName ( +    UINT32                  ArgType); +  char  AcpiUtHexToAsciiChar (      UINT64                  Integer, diff --git a/source/include/amlcode.h b/source/include/amlcode.h index a432c2b7de750..640029b442801 100644 --- a/source/include/amlcode.h +++ b/source/include/amlcode.h @@ -243,6 +243,7 @@  #define ARGP_QWORDDATA              0x11  #define ARGP_SIMPLENAME             0x12 /* NameString | LocalTerm | ArgTerm */  #define ARGP_NAME_OR_REF            0x13 /* For ObjectType only */ +#define ARGP_MAX                    0x13  /*   * Resolved argument types for the AML Interpreter @@ -279,9 +280,24 @@  #define ARGI_DEVICE_REF             0x0D  #define ARGI_REFERENCE              0x0E  #define ARGI_TARGETREF              0x0F    /* Target, subject to implicit conversion */ -#define ARGI_FIXED_TARGET           0x10    /* Target, no implicit conversion */ -#define ARGI_SIMPLE_TARGET          0x11    /* Name, Local, Arg -- no implicit conversion */ -#define ARGI_STORE_TARGET           0x12    /* Target for store is TARGETREF + package objects */ +#define ARGI_SIMPLE_TARGET          0x10    /* Name, Local, Arg -- no implicit conversion */ +#define ARGI_STORE_TARGET           0x11    /* Target for store is TARGETREF + package objects */ +/* + * #define ARGI_FIXED_TARGET           0x10     Target, no implicit conversion + * + * Removed 10/2016. ARGI_FIXED_TARGET was used for these operators: + *      FromBCD + *      ToBCD + *      ToDecimalString + *      ToHexString + *      ToInteger + *      ToBuffer + * The purpose of this type was to disable "implicit result conversion", + * but this was incorrect per the ACPI spec and other ACPI implementations. + * These operators now have the target operand defined as a normal + * ARGI_TARGETREF. + */ +  /* Multiple/complex types */ diff --git a/source/tools/acpibin/abcompare.c b/source/tools/acpibin/abcompare.c index e21e29d852f4d..3d99c602ba49b 100644 --- a/source/tools/acpibin/abcompare.c +++ b/source/tools/acpibin/abcompare.c @@ -414,6 +414,7 @@ AbCompareAmlFiles (      {          /* Display header information */ +        printf ("Comparing %s to %s\n", File1Path, File2Path);          AbPrintHeadersInfo (&Header1, &Header2);      } @@ -425,6 +426,12 @@ AbCompareAmlFiles (      /* Do the byte-by-byte compare */ +    printf ("Compare offset: %u\n", AbGbl_CompareOffset); +    if (AbGbl_CompareOffset) +    { +        fseek (File2, AbGbl_CompareOffset, SEEK_CUR); +    } +      Actual1 = fread (&Char1, 1, 1, File1);      Actual2 = fread (&Char2, 1, 1, File2);      Offset = sizeof (ACPI_TABLE_HEADER); @@ -436,7 +443,7 @@ AbCompareAmlFiles (              printf ("Error - Byte mismatch at offset %8.4X: 0x%2.2X 0x%2.2X\n",                  Offset, Char1, Char2);              Mismatches++; -            if (Mismatches > 100) +            if ((Mismatches > 100) && (!AbGbl_DisplayAllMiscompares))              {                  printf ("100 Mismatches: Too many mismatches\n");                  goto Exit2; diff --git a/source/tools/acpibin/abmain.c b/source/tools/acpibin/abmain.c index 5334bc002a3ae..ccc355c56c56c 100644 --- a/source/tools/acpibin/abmain.c +++ b/source/tools/acpibin/abmain.c @@ -52,7 +52,7 @@ AbDisplayUsage (  #define AB_UTILITY_NAME             "ACPI Binary Table Dump Utility" -#define AB_SUPPORTED_OPTIONS        "c:d:h:s:tv" +#define AB_SUPPORTED_OPTIONS        "a:c:d:h:o:s:tv"  /****************************************************************************** @@ -75,9 +75,11 @@ AbDisplayUsage (      ACPI_USAGE_HEADER ("acpibin [options]"); -    ACPI_OPTION ("-c <File1> <File2>",      "Compare two binary AML files"); +    ACPI_OPTION ("-a <File1> <File2>",      "Compare two binary AML files, dump all mismatches"); +    ACPI_OPTION ("-c <File1> <File2>",      "Compare two binary AML files, dump first 100 mismatches");      ACPI_OPTION ("-d <In> <Out>",           "Dump AML binary to text file");      ACPI_OPTION ("-e <Sig> <In> <Out>",     "Extract binary AML table from acpidump file"); +    ACPI_OPTION ("-o <Value>",              "Start comparison at this offset into second file");      ACPI_OPTION ("-h <File>",               "Display table header for binary AML file");      ACPI_OPTION ("-s <File>",               "Update checksum for binary AML file");      ACPI_OPTION ("-t",                      "Terse mode"); @@ -120,6 +122,12 @@ main (      while ((j = AcpiGetopt (argc, argv, AB_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch(j)      { +    case 'a':   /* Compare Files, display all differences */ + +        AbGbl_DisplayAllMiscompares = TRUE; + +        /* Fallthrough */ +      case 'c':   /* Compare Files */          if (argc < 4) @@ -153,6 +161,11 @@ main (          AbDisplayHeader (AcpiGbl_Optarg);          return (0); +    case 'o': + +        AbGbl_CompareOffset = atoi (AcpiGbl_Optarg); +        continue; +      case 's':   /* Compute/update checksum */          if (argc < 3) diff --git a/source/tools/acpibin/acpibin.h b/source/tools/acpibin/acpibin.h index 679f1a5538bc0..dd5940f8c1fd3 100644 --- a/source/tools/acpibin/acpibin.h +++ b/source/tools/acpibin/acpibin.h @@ -63,6 +63,8 @@  /* Globals */  EXTERN BOOLEAN              INIT_GLOBAL (Gbl_TerseMode, FALSE); +EXTERN BOOLEAN              INIT_GLOBAL (AbGbl_DisplayAllMiscompares, FALSE); +EXTERN UINT32               INIT_GLOBAL (AbGbl_CompareOffset, 0);  /* Prototypes */ diff --git a/source/tools/acpinames/anstubs.c b/source/tools/acpinames/anstubs.c index 78984ce011576..ab4df3cc77f38 100644 --- a/source/tools/acpinames/anstubs.c +++ b/source/tools/acpinames/anstubs.c @@ -112,8 +112,7 @@ AcpiEvInitializeOpRegions (  ACPI_STATUS  AcpiEvInitializeRegion ( -    ACPI_OPERAND_OBJECT     *RegionObj, -    BOOLEAN                 AcpiNsLocked) +    ACPI_OPERAND_OBJECT     *RegionObj)  {      return (AE_OK);  } diff --git a/source/tools/acpixtract/acpixtract.c b/source/tools/acpixtract/acpixtract.c index 1573ceeff065f..01c748cdb7b5d 100644 --- a/source/tools/acpixtract/acpixtract.c +++ b/source/tools/acpixtract/acpixtract.c @@ -87,7 +87,7 @@ AxExtractTables (      /* Open input in text mode, output is in binary mode */ -    InputFile = fopen (InputPathname, "rt"); +    InputFile = fopen (InputPathname, "r");      if (!InputFile)      {          printf ("Could not open input file %s\n", InputPathname); @@ -286,7 +286,7 @@ AxExtractToMultiAmlFile (      /* Open the input file in text mode */ -    InputFile = fopen (InputPathname, "rt"); +    InputFile = fopen (InputPathname, "r");      if (!InputFile)      {          printf ("Could not open input file %s\n", InputPathname); @@ -417,7 +417,7 @@ AxListTables (      /* Open input in text mode, output is in binary mode */ -    InputFile = fopen (InputPathname, "rt"); +    InputFile = fopen (InputPathname, "r");      if (!InputFile)      {          printf ("Could not open input file %s\n", InputPathname); diff --git a/source/tools/acpixtract/axutils.c b/source/tools/acpixtract/axutils.c index 6af8cdc29a3c9..68e51daa2dda2 100644 --- a/source/tools/acpixtract/axutils.c +++ b/source/tools/acpixtract/axutils.c @@ -100,9 +100,9 @@ AxIsEmptyLine (          Buffer++;      } -    /* If end-of-line, this line is empty */ +    /* Line is empty when a Unix or DOS-style line terminator is found. */ -    if (*Buffer == '\n') +    if ((*Buffer == '\r') || (*Buffer == '\n'))      {          return (1);      } @@ -262,7 +262,7 @@ AxCountTableInstances (      unsigned int            Instances = 0; -    InputFile = fopen (InputPathname, "rt"); +    InputFile = fopen (InputPathname, "r");      if (!InputFile)      {          printf ("Could not open input file %s\n", InputPathname); | 
