ACK: [PATCH 1/3] ACPICA: Update to version 20160930

Alex Hung alex.hung at canonical.com
Mon Oct 3 18:05:05 UTC 2016


On 2016-10-03 02:39 AM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Changes in this release of ACPICA are detailed at the following
> link on the ACPICA developer mailing list:
>
> https://lists.acpica.org/pipermail/devel/2016-September/000972.html
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/acpica/source/common/acfileio.c                | 10 ++-
>  src/acpica/source/compiler/aslmaputils.c           |  6 ++
>  src/acpica/source/compiler/asloperands.c           | 14 ++++
>  src/acpica/source/compiler/aslrules.y              |  2 +-
>  src/acpica/source/compiler/aslxref.c               |  6 +-
>  .../source/components/disassembler/dmbuffer.c      | 68 ++++++++++++++--
>  .../source/components/disassembler/dmcstyle.c      | 91 ++++++++++++++++++++++
>  .../source/components/disassembler/dmopcode.c      | 66 +++++++++++++++-
>  .../source/components/disassembler/dmresrcl.c      | 15 ++--
>  src/acpica/source/components/executer/exconfig.c   | 24 +++++-
>  src/acpica/source/components/parser/psxface.c      | 12 +++
>  src/acpica/source/components/tables/tbdata.c       |  7 +-
>  src/acpica/source/components/tables/tbfind.c       |  2 +-
>  src/acpica/source/components/tables/tbxfload.c     | 16 +++-
>  .../source/components/utilities/utstrtoul64.c      |  2 +-
>  src/acpica/source/include/acconfig.h               |  2 +-
>  src/acpica/source/include/acglobal.h               |  5 +-
>  src/acpica/source/include/aclocal.h                | 19 ++---
>  src/acpica/source/include/acpixf.h                 |  9 ++-
>  .../source/os_specific/service_layers/osunixxf.c   | 13 +++-
>  20 files changed, 336 insertions(+), 53 deletions(-)
>
> diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c
> index b7d5039..6cb9536 100644
> --- a/src/acpica/source/common/acfileio.c
> +++ b/src/acpica/source/common/acfileio.c
> @@ -334,12 +334,14 @@ AcGetOneTableFromFile (
>          return (Status);
>      }
>
> +
>      if (GetOnlyAmlTables)
>      {
> -        /* Table must be an AML table (DSDT/SSDT) or FADT */
> -
> -        if (!ACPI_COMPARE_NAME (TableHeader.Signature, ACPI_SIG_FADT) &&
> -            !AcpiUtIsAmlTable (&TableHeader))
> +        /*
> +         * Table must be an AML table (DSDT/SSDT).
> +         * Used for iASL -e option only.
> +         */
> +        if (!AcpiUtIsAmlTable (&TableHeader))
>          {
>              fprintf (stderr,
>                  "    %s: Table [%4.4s] is not an AML table - ignoring\n",
> diff --git a/src/acpica/source/compiler/aslmaputils.c b/src/acpica/source/compiler/aslmaputils.c
> index ee947e8..cb282e2 100644
> --- a/src/acpica/source/compiler/aslmaputils.c
> +++ b/src/acpica/source/compiler/aslmaputils.c
> @@ -152,6 +152,12 @@ MpGetHidFromParseTree (
>
>
>      Op = HidNode->Op;
> +    if (!Op)
> +    {
> +        /* Object is not resolved, probably an External */
> +
> +        return ("Unresolved Symbol - referenced but not defined in this table");
> +    }
>
>      switch (Op->Asl.ParseOpcode)
>      {
> diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
> index 2e2f2d1..db4d013 100644
> --- a/src/acpica/source/compiler/asloperands.c
> +++ b/src/acpica/source/compiler/asloperands.c
> @@ -423,6 +423,20 @@ OpnDoFieldCommon (
>              NewBitOffset = (UINT32) PkgLengthNode->Asl.Value.Integer;
>              CurrentBitOffset += NewBitOffset;
>
> +            if ((NewBitOffset == 0) &&
> +                (Next->Asl.ParseOpcode == PARSEOP_RESERVED_BYTES))
> +            {
> +                /*
> +                 * Unnamed field with a bit length of zero. We can
> +                 * safely just ignore this. However, we will not ignore
> +                 * a named field of zero length, we don't want to just
> +                 * toss out a name.
> +                 */
> +                Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> +                PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
> +                break;
> +            }
> +
>              /* Save the current AccessAs value for error checking later */
>
>              switch (AccessType)
> diff --git a/src/acpica/source/compiler/aslrules.y b/src/acpica/source/compiler/aslrules.y
> index 73c8062..4bcbbf2 100644
> --- a/src/acpica/source/compiler/aslrules.y
> +++ b/src/acpica/source/compiler/aslrules.y
> @@ -602,7 +602,7 @@ ObjectTypeName
>      | RefOfTerm                     {}
>      | DerefOfTerm                   {}
>      | IndexTerm                     {}
> -
> +    | IndexExpTerm                  {}
>  /*    | MethodInvocationTerm          {} */  /* Caused reduce/reduce with Type6Opcode->MethodInvocationTerm */
>      ;
>
> diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
> index a3eab4a..a12bcc7 100644
> --- a/src/acpica/source/compiler/aslxref.c
> +++ b/src/acpica/source/compiler/aslxref.c
> @@ -898,16 +898,18 @@ XfNamespaceLocateBegin (
>          /*
>           * A reference to a method within one of these opcodes is not an
>           * invocation of the method, it is simply a reference to the method.
> +         *
> +         * September 2016: Removed DeRefOf from this list
>           */
>          if ((Op->Asl.Parent) &&
> -           ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF)      ||
> -            (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEREFOF)    ||
> +            ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF)     ||
>              (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_PACKAGE)    ||
>              (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_VAR_PACKAGE)||
>              (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE)))
>          {
>              return_ACPI_STATUS (AE_OK);
>          }
> +
>          /*
>           * There are two types of method invocation:
>           * 1) Invocation with arguments -- the parser recognizes this
> diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c
> index 72d2ada..7b2fcc4 100644
> --- a/src/acpica/source/components/disassembler/dmbuffer.c
> +++ b/src/acpica/source/components/disassembler/dmbuffer.c
> @@ -601,7 +601,8 @@ AcpiDmIsStringBuffer (
>   *
>   * PARAMETERS:  Op                  - Buffer Object to be examined
>   *
> - * RETURN:      TRUE if buffer contains a ASCII string, FALSE otherwise
> + * RETURN:      TRUE if buffer appears to contain data produced via the
> + *              ToPLD macro, FALSE otherwise
>   *
>   * DESCRIPTION: Determine if a buffer Op contains a _PLD structure
>   *
> @@ -613,12 +614,60 @@ AcpiDmIsPldBuffer (
>  {
>      ACPI_NAMESPACE_NODE     *Node;
>      ACPI_PARSE_OBJECT       *SizeOp;
> +    ACPI_PARSE_OBJECT       *ByteListOp;
>      ACPI_PARSE_OBJECT       *ParentOp;
> +    UINT64                  BufferSize;
> +    UINT64                  InitializerSize;
>
>
> -    /* Buffer size is the buffer argument */
> -
> +    /*
> +     * Get the BufferSize argument - Buffer(BufferSize)
> +     * If the buffer was generated by the ToPld macro, it must
> +     * be a BYTE constant.
> +     */
>      SizeOp = Op->Common.Value.Arg;
> +    if (SizeOp->Common.AmlOpcode != AML_BYTE_OP)
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Check the declared BufferSize, two possibilities */
> +
> +    BufferSize = SizeOp->Common.Value.Integer;
> +    if ((BufferSize != ACPI_PLD_REV1_BUFFER_SIZE) &&
> +        (BufferSize != ACPI_PLD_REV2_BUFFER_SIZE))
> +    {
> +        return (FALSE);
> +    }
> +
> +    /*
> +     * Check the initializer list length. This is the actual
> +     * number of bytes in the buffer as counted by the AML parser.
> +     * The declared BufferSize can be larger than the actual length.
> +     * However, for the ToPLD macro, the BufferSize will be the same
> +     * as the initializer list length.
> +     */
> +    ByteListOp = SizeOp->Common.Next;
> +    if (!ByteListOp)
> +    {
> +        return (FALSE); /* Zero-length buffer case */
> +    }
> +
> +    InitializerSize = ByteListOp->Common.Value.Integer;
> +    if ((InitializerSize != ACPI_PLD_REV1_BUFFER_SIZE) &&
> +        (InitializerSize != ACPI_PLD_REV2_BUFFER_SIZE))
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Final size check */
> +
> +    if (BufferSize != InitializerSize)
> +    {
> +        return (FALSE);
> +    }
> +
> +    /* Now examine the buffer parent */
>
>      ParentOp = Op->Common.Parent;
>      if (!ParentOp)
> @@ -643,8 +692,17 @@ AcpiDmIsPldBuffer (
>          return (FALSE);
>      }
>
> -    /* Check for proper form: Name(_PLD, Package() {Buffer() {}}) */
> -
> +    /*
> +     * Check for proper form: Name(_PLD, Package() {ToPLD()})
> +     *
> +     * Note: All other forms such as
> +     *      Return (Package() {ToPLD()})
> +     *      Local0 = ToPLD()
> +     * etc. are not converted back to the ToPLD macro, because
> +     * there is really no deterministic way to disassemble the buffer
> +     * back to the ToPLD macro, other than trying to find the "_PLD"
> +     * name
> +     */
>      if (ParentOp->Common.AmlOpcode == AML_PACKAGE_OP)
>      {
>          ParentOp = ParentOp->Common.Parent;
> diff --git a/src/acpica/source/components/disassembler/dmcstyle.c b/src/acpica/source/components/disassembler/dmcstyle.c
> index 7ff388f..dcfc044 100644
> --- a/src/acpica/source/components/disassembler/dmcstyle.c
> +++ b/src/acpica/source/components/disassembler/dmcstyle.c
> @@ -170,6 +170,9 @@ AcpiDmCheckForSymbolicOpcode (
>      ACPI_PARSE_OBJECT       *Child1;
>      ACPI_PARSE_OBJECT       *Child2;
>      ACPI_PARSE_OBJECT       *Target;
> +    ACPI_PARSE_OBJECT       *GrandChild1;
> +    ACPI_PARSE_OBJECT       *GrandChild2;
> +    ACPI_PARSE_OBJECT       *GrandTarget = NULL;
>
>
>      /* Exit immediately if ASL+ not enabled */
> @@ -179,6 +182,14 @@ 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);
> @@ -395,6 +406,7 @@ AcpiDmCheckForSymbolicOpcode (
>              if (AcpiDmIsValidTarget (Target))
>              {
>                  Child1->Common.OperatorSymbol = NULL;
> +                Op->Common.DisasmFlags |= ACPI_PARSEOP_LEGACY_ASL_ONLY;
>                  return (FALSE);
>              }
>
> @@ -411,6 +423,13 @@ 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;
>          }
> @@ -550,6 +569,69 @@ AcpiDmCheckForSymbolicOpcode (
>          /*
>           * Target is the 2nd operand.
>           * We know the target is valid, 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.
> +         */
> +        if (!AcpiGbl_DoDisassemblerOptimizations)
> +        {
> +            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);
> +            }
> +        }
> +
> +        /*
>           * In the parse tree, simply swap the target with the
>           * source so that the target is processed first.
>           */
> @@ -635,6 +717,7 @@ AcpiDmCloseOperator (
>  {
>      BOOLEAN                 IsCStyleOp = FALSE;
>
> +
>      /* Always emit paren if ASL+ disassembly disabled */
>
>      if (!AcpiGbl_CstyleDisassembly)
> @@ -643,6 +726,14 @@ AcpiDmCloseOperator (
>          return;
>      }
>
> +    /* Check for a non-ASL+ statement */
> +
> +    if (Op->Common.DisasmFlags & ACPI_PARSEOP_LEGACY_ASL_ONLY)
> +    {
> +        AcpiOsPrintf (")");
> +        return;
> +    }
> +
>      /* Check if we need to add an additional closing paren */
>
>      switch (Op->Common.AmlOpcode)
> diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
> index 683fd0a..1ea92fa 100644
> --- a/src/acpica/source/components/disassembler/dmopcode.c
> +++ b/src/acpica/source/components/disassembler/dmopcode.c
> @@ -136,6 +136,10 @@ static void
>  AcpiDmConvertToElseIf (
>      ACPI_PARSE_OBJECT       *Op);
>
> +static void
> +AcpiDmPromoteSubtree (
> +    ACPI_PARSE_OBJECT       *StartOp);
> +
>
>  /*******************************************************************************
>   *
> @@ -1139,12 +1143,22 @@ AcpiDmConvertToElseIf (
>       *    be the only blocks under the original Else.
>       */
>      IfOp = OriginalElseOp->Common.Value.Arg;
> +
>      if (!IfOp ||
>          (IfOp->Common.AmlOpcode != AML_IF_OP) ||
>          (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
>      {
> -        /* Not an Else..If sequence, cannot convert to ElseIf */
> +        /* Not a proper Else..If sequence, cannot convert to ElseIf */
> +
> +        AcpiOsPrintf ("%s", "Else");
> +        return;
> +    }
> +
> +    /* Cannot have anything following the If...Else block */
>
> +    ElseOp = IfOp->Common.Next;
> +    if (ElseOp && ElseOp->Common.Next)
> +    {
>          AcpiOsPrintf ("%s", "Else");
>          return;
>      }
> @@ -1172,7 +1186,10 @@ AcpiDmConvertToElseIf (
>          /* If an ELSE matches the IF, promote it also */
>
>          ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
> -        ElseOp->Common.Next = OriginalElseOp->Common.Next;
> +
> +        /* Promote the entire block under the ElseIf (All Next OPs) */
> +
> +        AcpiDmPromoteSubtree (OriginalElseOp);
>      }
>      else
>      {
> @@ -1194,3 +1211,48 @@ AcpiDmConvertToElseIf (
>
>      OriginalElseOp->Common.Next = IfOp;
>  }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION:    AcpiDmPromoteSubtree
> + *
> + * PARAMETERS:  StartOpOp           - Original parent of the entire subtree
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Promote an entire parse subtree up one level.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmPromoteSubtree (
> +    ACPI_PARSE_OBJECT       *StartOp)
> +{
> +    ACPI_PARSE_OBJECT       *Op;
> +    ACPI_PARSE_OBJECT       *ParentOp;
> +
> +
> +    /* New parent for subtree elements */
> +
> +    ParentOp = StartOp->Common.Parent;
> +
> +    /* First child starts the subtree */
> +
> +    Op = StartOp->Common.Value.Arg;
> +
> +    /* Walk the top-level elements of the subtree */
> +
> +    while (Op)
> +    {
> +        Op->Common.Parent = ParentOp;
> +        if (!Op->Common.Next)
> +        {
> +            /* Last Op in list, update its next field */
> +
> +            Op->Common.Next = StartOp->Common.Next;
> +            break;
> +        }
> +        Op = Op->Common.Next;
> +    }
> +}
> diff --git a/src/acpica/source/components/disassembler/dmresrcl.c b/src/acpica/source/components/disassembler/dmresrcl.c
> index 8e71a67..e975e5e 100644
> --- a/src/acpica/source/components/disassembler/dmresrcl.c
> +++ b/src/acpica/source/components/disassembler/dmresrcl.c
> @@ -515,16 +515,17 @@ AcpiDmIoFlags2 (
>          UINT8               SpecificFlags)
>  {
>
> +    /* _TTP */
> +
>      AcpiOsPrintf (", %s",
>          AcpiGbl_TtpDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 4)]);
>
> -    /* TRS is only used if TTP is TypeTranslation */
> -
> -    if (SpecificFlags & 0x10)
> -    {
> -        AcpiOsPrintf (", %s",
> -            AcpiGbl_TrsDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 5)]);
> -    }
> +    /*
> +     * TRS is only used if TTP is TypeTranslation. However, the disassembler
> +     * always emits exactly what is in the AML.
> +     */
> +    AcpiOsPrintf (", %s",
> +        AcpiGbl_TrsDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 5)]);
>  }
>
>
> diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c
> index 5223434..fb55b67 100644
> --- a/src/acpica/source/components/executer/exconfig.c
> +++ b/src/acpica/source/components/executer/exconfig.c
> @@ -654,11 +654,18 @@ AcpiExUnloadTable (
>
>      TableIndex = TableDesc->Reference.Value;
>
> +    /*
> +     * Release the interpreter lock so that the table lock won't have
> +     * strict order requirement against it.
> +     */
> +    AcpiExExitInterpreter ();
> +
>      /* Ensure the table is still loaded */
>
>      if (!AcpiTbIsTableLoaded (TableIndex))
>      {
> -        return_ACPI_STATUS (AE_NOT_EXIST);
> +        Status = AE_NOT_EXIST;
> +        goto LockAndExit;
>      }
>
>      /* Invoke table handler if present */
> @@ -678,16 +685,25 @@ AcpiExUnloadTable (
>      Status = AcpiTbDeleteNamespaceByOwner (TableIndex);
>      if (ACPI_FAILURE (Status))
>      {
> -        return_ACPI_STATUS (Status);
> +        goto LockAndExit;
>      }
>
>      (void) AcpiTbReleaseOwnerId (TableIndex);
>      AcpiTbSetTableLoadedFlag (TableIndex, FALSE);
>
> +LockAndExit:
> +
> +    /* Re-acquire the interpreter lock */
> +
> +    AcpiExEnterInterpreter ();
> +
>      /*
>       * Invalidate the handle. We do this because the handle may be stored
>       * in a named object and may not be actually deleted until much later.
>       */
> -    DdbHandle->Common.Flags &= ~AOPOBJ_DATA_VALID;
> -    return_ACPI_STATUS (AE_OK);
> +    if (ACPI_SUCCESS (Status))
> +    {
> +        DdbHandle->Common.Flags &= ~AOPOBJ_DATA_VALID;
> +    }
> +    return_ACPI_STATUS (Status);
>  }
> diff --git a/src/acpica/source/components/parser/psxface.c b/src/acpica/source/components/parser/psxface.c
> index 71b880d..a89b93c 100644
> --- a/src/acpica/source/components/parser/psxface.c
> +++ b/src/acpica/source/components/parser/psxface.c
> @@ -406,6 +406,18 @@ AcpiPsExecuteTable (
>          WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL;
>      }
>
> +    /* Info->Node is the default location to load the table  */
> +
> +    if (Info->Node && Info->Node != AcpiGbl_RootNode)
> +    {
> +        Status = AcpiDsScopeStackPush (
> +            Info->Node, ACPI_TYPE_METHOD, WalkState);
> +        if (ACPI_FAILURE (Status))
> +        {
> +            goto Cleanup;
> +        }
> +    }
> +
>      /*
>       * Parse the AML, WalkState will be deleted by ParseAml
>       */
> diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c
> index 0bddeef..4136047 100644
> --- a/src/acpica/source/components/tables/tbdata.c
> +++ b/src/acpica/source/components/tables/tbdata.c
> @@ -753,18 +753,13 @@ AcpiTbDeleteNamespaceByOwner (
>       * lock may block, and also since the execution of a namespace walk
>       * must be allowed to use the interpreter.
>       */
> -    (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
>      Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
> -
> -    AcpiNsDeleteNamespaceByOwner (OwnerId);
>      if (ACPI_FAILURE (Status))
>      {
>          return_ACPI_STATUS (Status);
>      }
> -
> +    AcpiNsDeleteNamespaceByOwner (OwnerId);
>      AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
> -
> -    Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
>      return_ACPI_STATUS (Status);
>  }
>
> diff --git a/src/acpica/source/components/tables/tbfind.c b/src/acpica/source/components/tables/tbfind.c
> index d688c42..4fc98fc 100644
> --- a/src/acpica/source/components/tables/tbfind.c
> +++ b/src/acpica/source/components/tables/tbfind.c
> @@ -228,5 +228,5 @@ AcpiTbFindTable (
>
>  UnlockAndExit:
>      (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
> -    return_ACPI_STATUS (AE_NOT_FOUND);
> +    return_ACPI_STATUS (Status);
>  }
> diff --git a/src/acpica/source/components/tables/tbxfload.c b/src/acpica/source/components/tables/tbxfload.c
> index 6a937b1..aa826fe 100644
> --- a/src/acpica/source/components/tables/tbxfload.c
> +++ b/src/acpica/source/components/tables/tbxfload.c
> @@ -334,7 +334,7 @@ AcpiTbLoadNamespace (
>      if (!TablesFailed)
>      {
>          ACPI_INFO ((
> -            "%u ACPI AML tables successfully acquired and loaded\n",
> +            "%u ACPI AML tables successfully acquired and loaded",
>              TablesLoaded));
>      }
>      else
> @@ -348,6 +348,11 @@ AcpiTbLoadNamespace (
>          Status = AE_CTRL_TERMINATE;
>      }
>
> +#ifdef ACPI_APPLICATION
> +    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "\n"));
> +#endif
> +
> +
>  UnlockAndExit:
>      (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
>      return_ACPI_STATUS (Status);
> @@ -495,9 +500,9 @@ AcpiUnloadParentTable (
>          return_ACPI_STATUS (AE_TYPE);
>      }
>
> -    /* Must acquire the interpreter lock during this operation */
> +    /* Must acquire the table lock during this operation */
>
> -    Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
> +    Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
>      if (ACPI_FAILURE (Status))
>      {
>          return_ACPI_STATUS (Status);
> @@ -528,9 +533,11 @@ AcpiUnloadParentTable (
>
>          /* Ensure the table is actually loaded */
>
> +        (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
>          if (!AcpiTbIsTableLoaded (i))
>          {
>              Status = AE_NOT_EXIST;
> +            (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
>              break;
>          }
>
> @@ -557,10 +564,11 @@ AcpiUnloadParentTable (
>
>          Status = AcpiTbReleaseOwnerId (i);
>          AcpiTbSetTableLoadedFlag (i, FALSE);
> +        (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
>          break;
>      }
>
> -    (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
> +    (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
>      return_ACPI_STATUS (Status);
>  }
>
> diff --git a/src/acpica/source/components/utilities/utstrtoul64.c b/src/acpica/source/components/utilities/utstrtoul64.c
> index bdc424b..ff84ed4 100644
> --- a/src/acpica/source/components/utilities/utstrtoul64.c
> +++ b/src/acpica/source/components/utilities/utstrtoul64.c
> @@ -157,7 +157,7 @@ AcpiUtStrtoulBase16 (
>   * The integer is initialized to the value zero.
>   * The ASCII string is interpreted as a hexadecimal constant.
>   *
> - *  1)  A �0x� prefix is not allowed. However, ACPICA allows this for
> + *  1)  A "0x" prefix is not allowed. However, ACPICA allows this for
>   *      compatibility with previous ACPICA. (NO ERROR)
>   *
>   *  2)  Terminates when the size of an integer is reached (32 or 64 bits).
> diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h
> index 23cf1c2..bf7421f 100644
> --- a/src/acpica/source/include/acconfig.h
> +++ b/src/acpica/source/include/acconfig.h
> @@ -220,7 +220,7 @@
>
>  /* Maximum number of While() loops before abort */
>
> -#define ACPI_MAX_LOOP_COUNT             0xFFFF
> +#define ACPI_MAX_LOOP_COUNT             0x000FFFFF
>
>
>  /******************************************************************************
> diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
> index 001519f..eb48d40 100644
> --- a/src/acpica/source/include/acglobal.h
> +++ b/src/acpica/source/include/acglobal.h
> @@ -317,10 +317,6 @@ ACPI_INIT_GLOBAL (UINT32,               AcpiGbl_NestingLevel, 0);
>
>  ACPI_GLOBAL (ACPI_THREAD_STATE *,       AcpiGbl_CurrentWalkList);
>
> -/* Maximum number of While() loop iterations before forced abort */
> -
> -ACPI_GLOBAL (UINT16,                    AcpiGbl_MaxLoopIterations);
> -
>  /* Control method single step flag */
>
>  ACPI_GLOBAL (UINT8,                     AcpiGbl_CmSingleStep);
> @@ -394,6 +390,7 @@ ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_CstyleDisassembly, TRUE);
>  ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_ForceAmlDisassembly, FALSE);
>  ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DmOpt_Verbose, TRUE);
>  ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DmEmitExternalOpcodes, FALSE);
> +ACPI_INIT_GLOBAL (BOOLEAN,              AcpiGbl_DoDisassemblerOptimizations, TRUE);
>
>  ACPI_GLOBAL (BOOLEAN,                   AcpiGbl_DmOpt_Disasm);
>  ACPI_GLOBAL (BOOLEAN,                   AcpiGbl_DmOpt_Listing);
> diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
> index c5dc19a..4d28120 100644
> --- a/src/acpica/source/include/aclocal.h
> +++ b/src/acpica/source/include/aclocal.h
> @@ -989,7 +989,7 @@ typedef union acpi_parse_value
>      ACPI_PARSE_VALUE                Value;          /* Value or args associated with the opcode */\
>      UINT8                           ArgListLength;  /* Number of elements in the arg list */\
>      ACPI_DISASM_ONLY_MEMBERS (\
> -    UINT8                           DisasmFlags;    /* Used during AML disassembly */\
> +    UINT16                          DisasmFlags;    /* Used during AML disassembly */\
>      UINT8                           DisasmOpcode;   /* Subtype used for disassembly */\
>      char                            *OperatorSymbol;/* Used for C-style operator name strings */\
>      char                            AmlOpName[16])  /* Op name (debug only) */
> @@ -1109,14 +1109,15 @@ typedef struct acpi_parse_state
>
>  /* Parse object DisasmFlags */
>
> -#define ACPI_PARSEOP_IGNORE                 0x01
> -#define ACPI_PARSEOP_PARAMETER_LIST         0x02
> -#define ACPI_PARSEOP_EMPTY_TERMLIST         0x04
> -#define ACPI_PARSEOP_PREDEFINED_CHECKED     0x08
> -#define ACPI_PARSEOP_CLOSING_PAREN          0x10
> -#define ACPI_PARSEOP_COMPOUND_ASSIGNMENT    0x20
> -#define ACPI_PARSEOP_ASSIGNMENT             0x40
> -#define ACPI_PARSEOP_ELSEIF                 0x80
> +#define ACPI_PARSEOP_IGNORE                 0x0001
> +#define ACPI_PARSEOP_PARAMETER_LIST         0x0002
> +#define ACPI_PARSEOP_EMPTY_TERMLIST         0x0004
> +#define ACPI_PARSEOP_PREDEFINED_CHECKED     0x0008
> +#define ACPI_PARSEOP_CLOSING_PAREN          0x0010
> +#define ACPI_PARSEOP_COMPOUND_ASSIGNMENT    0x0020
> +#define ACPI_PARSEOP_ASSIGNMENT             0x0040
> +#define ACPI_PARSEOP_ELSEIF                 0x0080
> +#define ACPI_PARSEOP_LEGACY_ASL_ONLY        0x0100
>
>
>  /*****************************************************************************
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 7d4b67c..8efd759 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -118,7 +118,7 @@
>
>  /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION                 0x20160831
> +#define ACPI_CA_VERSION                 0x20160930
>
>  #include "acconfig.h"
>  #include "actypes.h"
> @@ -333,6 +333,13 @@ ACPI_INIT_GLOBAL (UINT8,            AcpiGbl_OsiData, 0);
>  ACPI_INIT_GLOBAL (BOOLEAN,          AcpiGbl_ReducedHardware, FALSE);
>
>  /*
> + * Maximum number of While() loop iterations before forced method abort.
> + * This mechanism is intended to prevent infinite loops during interpreter
> + * execution within a host kernel.
> + */
> +ACPI_INIT_GLOBAL (UINT32,           AcpiGbl_MaxLoopIterations, ACPI_MAX_LOOP_COUNT);
> +
> +/*
>   * This mechanism is used to trace a specified AML method. The method is
>   * traced each time it is executed.
>   */
> diff --git a/src/acpica/source/os_specific/service_layers/osunixxf.c b/src/acpica/source/os_specific/service_layers/osunixxf.c
> index f04b59e..413a708 100644
> --- a/src/acpica/source/os_specific/service_layers/osunixxf.c
> +++ b/src/acpica/source/os_specific/service_layers/osunixxf.c
> @@ -826,8 +826,12 @@ AcpiOsCreateSemaphore (
>
>  #ifdef __APPLE__
>      {
> -        char            *SemaphoreName = tmpnam (NULL);
> +        static int      SemaphoreCount = 0;
> +        char            SemaphoreName[32];
>
> +        snprintf (SemaphoreName, sizeof (SemaphoreName), "acpi_sem_%d",
> +            SemaphoreCount++);
> +        printf ("%s\n", SemaphoreName);
>          Sem = sem_open (SemaphoreName, O_EXCL|O_CREAT, 0755, InitialUnits);
>          if (!Sem)
>          {
> @@ -879,10 +883,17 @@ AcpiOsDeleteSemaphore (
>          return (AE_BAD_PARAMETER);
>      }
>
> +#ifdef __APPLE__
> +    if (sem_close (Sem) == -1)
> +    {
> +        return (AE_BAD_PARAMETER);
> +    }
> +#else
>      if (sem_destroy (Sem) == -1)
>      {
>          return (AE_BAD_PARAMETER);
>      }
> +#endif
>
>      return (AE_OK);
>  }
>
>
>


Acked-by: Alex Hung <alex.hung at canonical.com>



More information about the fwts-devel mailing list