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