ACK: [PATCH] ACPICA: Update to version 20191213
ivanhu
ivan.hu at canonical.com
Wed Dec 18 09:09:35 UTC 2019
On 12/14/19 4:26 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/hyperkitty/list/devel@acpica.org/thread/77GOY6VXDWVVCSS3KLPCLRFVWIKYKTI3/
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpica/source/common/dmtables.c | 3 +-
> src/acpica/source/compiler/aslcompile.c | 39 ++--
> src/acpica/source/compiler/asldefine.h | 10 +-
> src/acpica/source/compiler/aslerror.c | 45 ++--
> src/acpica/source/compiler/aslfiles.c | 18 +-
> src/acpica/source/compiler/aslload.c | 15 +-
> src/acpica/source/compiler/aslmessages.c | 4 +-
> src/acpica/source/compiler/aslmessages.h | 2 +
> src/acpica/source/compiler/asloptions.c | 2 +-
> src/acpica/source/compiler/aslstartup.c | 4 -
> src/acpica/source/compiler/asltransform.c | 204 +++++++++++++++++-
> src/acpica/source/compiler/aslutils.c | 5 -
> src/acpica/source/compiler/aslxref.c | 31 ++-
> src/acpica/source/compiler/dtcompile.c | 17 +-
> src/acpica/source/compiler/dtcompiler.h | 1 -
> .../source/components/debugger/dbconvert.c | 4 -
> .../source/components/debugger/dbnames.c | 1 -
> .../source/components/dispatcher/dsfield.c | 2 +-
> .../source/components/dispatcher/dsopcode.c | 1 +
> .../source/components/dispatcher/dswload.c | 22 ++
> .../source/components/executer/exfield.c | 10 +-
> .../source/components/hardware/hwxfsleep.c | 2 +-
> .../source/components/utilities/utids.c | 3 +-
> src/acpica/source/include/acobject.h | 1 +
> src/acpica/source/include/acpixf.h | 2 +-
> src/acpica/source/include/platform/acenv.h | 15 ++
> 26 files changed, 374 insertions(+), 89 deletions(-)
>
> diff --git a/src/acpica/source/common/dmtables.c b/src/acpica/source/common/dmtables.c
> index e5536ecf..2c779494 100644
> --- a/src/acpica/source/common/dmtables.c
> +++ b/src/acpica/source/common/dmtables.c
> @@ -508,6 +508,8 @@ AdParseTable (
> AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
> ASL_CV_INIT_FILETREE(Table, AmlStart, AmlLength);
>
> + AcpiUtSetIntegerWidth (Table->Revision);
> +
> /* Create the root object */
>
> AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp (AmlStart);
> @@ -543,7 +545,6 @@ AdParseTable (
> }
>
> WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
> - WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
>
> Status = AcpiPsParseAml (WalkState);
> if (ACPI_FAILURE (Status))
> diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
> index 9214cfdf..ce60b2da 100644
> --- a/src/acpica/source/compiler/aslcompile.c
> +++ b/src/acpica/source/compiler/aslcompile.c
> @@ -220,6 +220,7 @@ CmDoCompile (
> PrDoPreprocess ();
> AslGbl_CurrentLineNumber = 1;
> AslGbl_LogicalLineNumber = 1;
> + AslGbl_CurrentLineOffset = 0;
>
> if (AslGbl_PreprocessOnly)
> {
> @@ -282,25 +283,6 @@ CmDoCompile (
>
> LsDumpParseTree ();
>
> - OpcGetIntegerWidth (AslGbl_ParseTreeRoot->Asl.Child);
> - UtEndEvent (Event);
> -
> - /* Pre-process parse tree for any operator transforms */
> -
> - Event = UtBeginEvent ("Parse tree transforms");
> - DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");
> - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
> - TrAmlTransformWalkBegin, TrAmlTransformWalkEnd, NULL);
> - UtEndEvent (Event);
> -
> - /* Generate AML opcodes corresponding to the parse tokens */
> -
> - Event = UtBeginEvent ("Generate AML opcodes");
> - DbgPrint (ASL_DEBUG_OUTPUT, "Generating AML opcodes\n\n");
> - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
> - OpcAmlOpcodeWalk, NULL);
> - UtEndEvent (Event);
> -
> UtEndEvent (FullCompile);
> return (AE_OK);
>
> @@ -331,6 +313,25 @@ CmDoAslMiddleAndBackEnd (
> ACPI_STATUS Status;
>
>
> + OpcGetIntegerWidth (AslGbl_ParseTreeRoot->Asl.Child);
> +
> + /* Pre-process parse tree for any operator transforms */
> +
> + Event = UtBeginEvent ("Parse tree transforms");
> + DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");
> + TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
> + TrAmlTransformWalkBegin, TrAmlTransformWalkEnd, NULL);
> + UtEndEvent (Event);
> +
> + /* Generate AML opcodes corresponding to the parse tokens */
> +
> + Event = UtBeginEvent ("Generate AML opcodes");
> + DbgPrint (ASL_DEBUG_OUTPUT, "Generating AML opcodes\n\n");
> + TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
> + NULL, OpcAmlOpcodeWalk, NULL);
> + UtEndEvent (Event);
> +
> +
> /* Interpret and generate all compile-time constants */
>
> Event = UtBeginEvent ("Constant folding via AML interpreter");
> diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h
> index 0ba08962..675a5870 100644
> --- a/src/acpica/source/compiler/asldefine.h
> +++ b/src/acpica/source/compiler/asldefine.h
> @@ -222,11 +222,11 @@
>
> /* Misc */
>
> -#define ASL_EXTERNAL_METHOD 255
> -#define ASL_ABORT TRUE
> -#define ASL_NO_ABORT FALSE
> -#define ASL_EOF ACPI_UINT32_MAX
> -#define ASL_IGNORE_LINE (ACPI_UINT32_MAX -1)
> +#define ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS 255
> +#define ASL_ABORT TRUE
> +#define ASL_NO_ABORT FALSE
> +#define ASL_EOF ACPI_UINT32_MAX
> +#define ASL_IGNORE_LINE (ACPI_UINT32_MAX -1)
>
>
> /* Listings */
> diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c
> index ae1f38ac..f6eab921 100644
> --- a/src/acpica/source/compiler/aslerror.c
> +++ b/src/acpica/source/compiler/aslerror.c
> @@ -335,7 +335,7 @@ AeAddToErrorLog (
> * PARAMETERS: OutputFile - Output file
> * Enode - Error node to print
> * PrematureEOF - True = PrematureEOF has been reached
> - * Total - Total legth of line
> + * Total - Total length of line
> *
> * RETURN: None
> *
> @@ -445,7 +445,7 @@ AeDecodeErrorMessageId (
> * PARAMETERS: OutputFile - Output file
> * Enode - Error node to print
> * PrematureEOF - True = PrematureEOF has been reached
> - * Total - amount of characters printed so far
> + * Total - Number of characters printed so far
> *
> *
> * RETURN: Status
> @@ -527,6 +527,7 @@ AePrintErrorSourceLine (
> fprintf (OutputFile, "\n");
> return AE_OK;
> }
> +
> /*
> * Seek to the offset in the combined source file,
> * read the source line, and write it to the output.
> @@ -550,7 +551,8 @@ AePrintErrorSourceLine (
> AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
> return AE_IO_ERROR;
> }
> - /* Read/write the source line, up to the maximum line length */
> +
> + /* Read/write the source line, up to the maximum line length */
>
> while (RActual && SourceByte && (SourceByte != '\n'))
> {
> @@ -732,7 +734,7 @@ AePrintException (
> *
> * RETURN: None
> *
> - * DESCRIPTION: Print the contents of an error nodes. This function is tailored
> + * DESCRIPTION: Print the contents of an error node. This function is tailored
> * to print error nodes that are SubErrors within ASL_ERROR_MSG
> *
> ******************************************************************************/
> @@ -795,8 +797,8 @@ AePrintErrorLog (
> * LogicalLineNumber - Cumulative line number
> * LogicalByteOffset - Byte offset in source file
> * Column - Column in current line
> - * Filename - source filename
> - * ExtraMessage - additional error message
> + * Filename - Source filename
> + * ExtraMessage - Additional error message
> * SourceLine - Line of error source code
> * SubError - SubError of this InputEnode
> *
> @@ -863,10 +865,17 @@ static void AslInitEnode (
> Enode->FilenameLength = 6;
> }
>
> - FileNode = FlGetCurrentFileNode ();
> + /*
> + * Attempt to get the file node of the filename listed in the parse
> + * node. If the name doesn't exist in the global file node, it is
> + * because the file is included by #include or ASL include. In this
> + * case, get the current file node. The source output of the current
> + * file will contain the contents of the file listed in the parse node.
> + */
> + FileNode = FlGetFileNode (ASL_FILE_INPUT, Filename);
> if (!FileNode)
> {
> - return;
> + FileNode = FlGetCurrentFileNode ();
> }
>
> Enode->SourceFilename =
> @@ -884,8 +893,8 @@ static void AslInitEnode (
> * LineNumber - Actual file line number
> * Column - Column in current line
> * SourceLine - Actual source code line
> - * Filename - source filename
> - * ExtraMessage - additional error message
> + * Filename - Source filename
> + * ExtraMessage - Additional error message
> *
> * RETURN: None
> *
> @@ -918,8 +927,8 @@ AslCommonError2 (
> * LogicalLineNumber - Cumulative line number
> * LogicalByteOffset - Byte offset in source file
> * Column - Column in current line
> - * Filename - source filename
> - * ExtraMessage - additional error message
> + * Filename - Source filename
> + * ExtraMessage - Additional error message
> *
> * RETURN: None
> *
> @@ -961,8 +970,8 @@ AslCommonError (
> * LogicalLineNumber - Cumulative line number
> * LogicalByteOffset - Byte offset in source file
> * Column - Column in current line
> - * Filename - source filename
> - * Message - additional error message
> + * Filename - Source filename
> + * Message - Additional error message
> * SourceLine - Actual line of source code
> * SubError - Sub-error associated with this error
> *
> @@ -1025,7 +1034,7 @@ AslLogNewError (
> * PARAMETERS: Level - Seriousness (Warning/error, etc.)
> * MessageId - Index into global message buffer
> *
> - * RETURN: UINT8 - modified level
> + * RETURN: UINT8 - Modified level
> *
> * DESCRIPTION: Get the modified level of exception codes that are reported as
> * errors from the -ww option.
> @@ -1369,7 +1378,7 @@ AslIsExceptionDisabled (
> * MainMsg - Message pertaining to the MainOp
> * SubMsgId - Index into global message buffer
> * SubOp - Additional parse node for better message
> - * SubMsg - Message pertainint to SubOp
> + * SubMsg - Message pertaining to SubOp
> *
> *
> * RETURN: None
> @@ -1421,7 +1430,7 @@ AslDualParseOpError (
> * PARAMETERS: Level - Seriousness (Warning/error, etc.)
> * MessageId - Index into global message buffer
> * Op - Parse node where error happened
> - * ExtraMessage - additional error message
> + * ExtraMessage - Additional error message
> *
> * RETURN: None
> *
> @@ -1459,7 +1468,7 @@ AslError (
> *
> * PARAMETERS: Op - Parse node where error happened
> * Status - The ACPICA Exception
> - * ExtraMessage - additional error message
> + * ExtraMessage - Additional error message
> * Abort - TRUE -> Abort compilation
> *
> * RETURN: None
> diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c
> index 23acc470..dba05d35 100644
> --- a/src/acpica/source/compiler/aslfiles.c
> +++ b/src/acpica/source/compiler/aslfiles.c
> @@ -414,8 +414,22 @@ ASL_GLOBAL_FILE_NODE *
> FlGetCurrentFileNode (
> void)
> {
> - return (FlGetFileNode (
> - ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename));
> + ASL_GLOBAL_FILE_NODE *FileNode =
> + FlGetFileNode (ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename);
> +
> +
> + if (!FileNode)
> + {
> + /*
> + * If the current file node does not exist after initializing the file
> + * node structures, something went wrong and this is an unrecoverable
> + * condition.
> + */
> + FlFileError (ASL_FILE_INPUT, ASL_MSG_COMPILER_INTERNAL);
> + AslAbort ();
> + }
> +
> + return (FileNode);
> }
>
>
> diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c
> index db6c2d41..6e3d7e7d 100644
> --- a/src/acpica/source/compiler/aslload.c
> +++ b/src/acpica/source/compiler/aslload.c
> @@ -357,7 +357,7 @@ LdLoadFieldElements (
> * The name already exists in this scope
> * But continue processing the elements
> */
> - AslDualParseOpError (ASL_WARNING, ASL_MSG_NAME_EXISTS, Child,
> + AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
> Child->Asl.Value.String, ASL_MSG_FOUND_HERE, Node->Op,
> Node->Op->Asl.ExternalName);
> }
> @@ -986,12 +986,19 @@ FinishNode:
> Op->Asl.Node = Node;
> Node->Op = Op;
>
> - /* Set the actual data type if appropriate (EXTERNAL term only) */
> -
> + /*
> + * Set the actual data type if appropriate (EXTERNAL term only)
> + * As of 11/19/2019, ASL External() does not support parameter
> + * counts. When an External method is loaded, the parameter count is
> + * unknown setting Node->Value to ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS
> + * indicates that the parameter count for this method is unknown.
> + * This information is used in ASL cross reference to help determine the
> + * parameter count through method calls.
> + */
> if (ActualObjectType != ACPI_TYPE_ANY)
> {
> Node->Type = (UINT8) ActualObjectType;
> - Node->Value = ASL_EXTERNAL_METHOD;
> + Node->Value = ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS;
> }
>
> if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
> diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c
> index d1329352..ea118c0d 100644
> --- a/src/acpica/source/compiler/aslmessages.c
> +++ b/src/acpica/source/compiler/aslmessages.c
> @@ -368,7 +368,9 @@ const char *AslCompilerMsgs [] =
> /* ASL_MSG_BUFFER_FIELD_OVERFLOW */ "Buffer field extends beyond end of target buffer",
> /* ASL_MSG_INVALID_SPECIAL_NAME */ "declaration of this named object outside root scope is illegal",
> /* ASL_MSG_INVALID_PROCESSOR_UID */ "_UID inside processor declaration must be an integer",
> -/* ASL_MSG_LEGACY_PROCESSOR_OP */ "Legacy Processor() keyword detected. Use Device() keyword instead."
> +/* ASL_MSG_LEGACY_PROCESSOR_OP */ "Legacy Processor() keyword detected. Use Device() keyword instead.",
> +/* ASL_MSG_NAMESTRING_LENGTH */ "NameString contains too many NameSegs (>255)",
> +/* ASL_MSG_CASE_FOUND_HERE */ "Original Case value below:"
> };
>
> /* Table compiler */
> diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
> index 47e5bf43..385b730f 100644
> --- a/src/acpica/source/compiler/aslmessages.h
> +++ b/src/acpica/source/compiler/aslmessages.h
> @@ -371,6 +371,8 @@ typedef enum
> ASL_MSG_INVALID_SPECIAL_NAME,
> ASL_MSG_INVALID_PROCESSOR_UID,
> ASL_MSG_LEGACY_PROCESSOR_OP,
> + ASL_MSG_NAMESTRING_LENGTH,
> + ASL_MSG_CASE_FOUND_HERE,
>
> /* These messages are used by the Data Table compiler only */
>
> diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c
> index 7c178149..7758610c 100644
> --- a/src/acpica/source/compiler/asloptions.c
> +++ b/src/acpica/source/compiler/asloptions.c
> @@ -219,7 +219,7 @@ AslCommandLine (
> {
> exit (-1);
> }
> - exit (1);
> + exit (0);
> }
>
> /* Next parameter must be the input filename */
> diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c
> index c43c1a97..73c555a6 100644
> --- a/src/acpica/source/compiler/aslstartup.c
> +++ b/src/acpica/source/compiler/aslstartup.c
> @@ -457,10 +457,6 @@ AslDoOneFile (
> }
>
> FileNode = FlGetCurrentFileNode();
> - if (!FileNode)
> - {
> - return (AE_ERROR);
> - }
>
> FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT);
>
> diff --git a/src/acpica/source/compiler/asltransform.c b/src/acpica/source/compiler/asltransform.c
> index 7dc642d8..c80afe3a 100644
> --- a/src/acpica/source/compiler/asltransform.c
> +++ b/src/acpica/source/compiler/asltransform.c
> @@ -151,6 +151,7 @@
>
> #include "aslcompiler.h"
> #include "aslcompiler.y.h"
> +#include "acnamesp.h"
>
> #define _COMPONENT ACPI_COMPILER
> ACPI_MODULE_NAME ("asltransform")
> @@ -194,6 +195,16 @@ static void
> TrDoSwitch (
> ACPI_PARSE_OBJECT *StartNode);
>
> +static void
> +TrCheckForDuplicateCase (
> + ACPI_PARSE_OBJECT *CaseOp,
> + ACPI_PARSE_OBJECT *Predicate1);
> +
> +static BOOLEAN
> +TrCheckForBufferMatch (
> + ACPI_PARSE_OBJECT *Next1,
> + ACPI_PARSE_OBJECT *Next2);
> +
>
> /*******************************************************************************
> *
> @@ -431,6 +442,7 @@ TrTransformSubtree (
> ACPI_PARSE_OBJECT *Op)
> {
> ACPI_PARSE_OBJECT *MethodOp;
> + ACPI_NAMESTRING_INFO Info;
>
>
> if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
> @@ -492,6 +504,22 @@ TrTransformSubtree (
> Op->Asl.Value.String = "\\";
> break;
>
> + case PARSEOP_NAMESTRING:
> + /*
> + * A NameString can be up to 255 (0xFF) individual NameSegs maximum
> + * (with 254 dot separators) - as per the ACPI specification. Note:
> + * Cannot check for NumSegments == 0 because things like
> + * Scope(\) are legal and OK.
> + */
> + Info.ExternalName = Op->Asl.Value.String;
> + AcpiNsGetInternalNameLength (&Info);
> +
> + if (Info.NumSegments > 255)
> + {
> + AslError (ASL_ERROR, ASL_MSG_NAMESTRING_LENGTH, Op, NULL);
> + }
> + break;
> +
> case PARSEOP_UNLOAD:
>
> AslError (ASL_WARNING, ASL_MSG_UNLOAD, Op, NULL);
> @@ -510,7 +538,6 @@ TrTransformSubtree (
> case PARSEOP_PROCESSOR:
>
> AslError (ASL_WARNING, ASL_MSG_LEGACY_PROCESSOR_OP, Op, Op->Asl.ExternalName);
> -
> break;
>
> default:
> @@ -646,6 +673,8 @@ TrDoSwitch (
>
> if (Next->Asl.ParseOpcode == PARSEOP_CASE)
> {
> + TrCheckForDuplicateCase (Next, Next->Asl.Child);
> +
> if (CaseOp)
> {
> /* Add an ELSE to complete the previous CASE */
> @@ -977,3 +1006,176 @@ TrDoSwitch (
> BreakOp->Asl.Parent = StartNode;
> TrAmlInsertPeer (Conditional, BreakOp);
> }
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: TrCheckForDuplicateCase
> + *
> + * PARAMETERS: CaseOp - Parse node for first Case statement in list
> + * Predicate1 - Case value for the input CaseOp
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Check for duplicate case values. Currently, only handles
> + * Integers, Strings and Buffers. No support for Package objects.
> + *
> + ******************************************************************************/
> +
> +static void
> +TrCheckForDuplicateCase (
> + ACPI_PARSE_OBJECT *CaseOp,
> + ACPI_PARSE_OBJECT *Predicate1)
> +{
> + ACPI_PARSE_OBJECT *Next;
> + ACPI_PARSE_OBJECT *Predicate2;
> +
> +
> + /* Walk the list of CASE opcodes */
> +
> + Next = CaseOp->Asl.Next;
> + while (Next)
> + {
> + if (Next->Asl.ParseOpcode == PARSEOP_CASE)
> + {
> + /* Emit error only once */
> +
> + if (Next->Asl.CompileFlags & OP_IS_DUPLICATE)
> + {
> + goto NextCase;
> + }
> +
> + /* Check for a duplicate plain integer */
> +
> + Predicate2 = Next->Asl.Child;
> + if ((Predicate1->Asl.ParseOpcode == PARSEOP_INTEGER) &&
> + (Predicate2->Asl.ParseOpcode == PARSEOP_INTEGER))
> + {
> + if (Predicate1->Asl.Value.Integer == Predicate2->Asl.Value.Integer)
> + {
> + goto FoundDuplicate;
> + }
> + }
> +
> + /* Check for pairs of the constants ZERO, ONE, ONES */
> +
> + else if (((Predicate1->Asl.ParseOpcode == PARSEOP_ZERO) &&
> + (Predicate2->Asl.ParseOpcode == PARSEOP_ZERO)) ||
> + ((Predicate1->Asl.ParseOpcode == PARSEOP_ONE) &&
> + (Predicate2->Asl.ParseOpcode == PARSEOP_ONE)) ||
> + ((Predicate1->Asl.ParseOpcode == PARSEOP_ONES) &&
> + (Predicate2->Asl.ParseOpcode == PARSEOP_ONES)))
> + {
> + goto FoundDuplicate;
> + }
> +
> + /* Check for a duplicate string constant (literal) */
> +
> + else if ((Predicate1->Asl.ParseOpcode == PARSEOP_STRING_LITERAL) &&
> + (Predicate2->Asl.ParseOpcode == PARSEOP_STRING_LITERAL))
> + {
> + if (!strcmp (Predicate1->Asl.Value.String,
> + Predicate2->Asl.Value.String))
> + {
> + goto FoundDuplicate;
> + }
> + }
> +
> + /* Check for a duplicate buffer constant */
> +
> + else if ((Predicate1->Asl.ParseOpcode == PARSEOP_BUFFER) &&
> + (Predicate2->Asl.ParseOpcode == PARSEOP_BUFFER))
> + {
> + if (TrCheckForBufferMatch (Predicate1->Asl.Child,
> + Predicate2->Asl.Child))
> + {
> + goto FoundDuplicate;
> + }
> + }
> + }
> + goto NextCase;
> +
> +FoundDuplicate:
> + /* Emit error message only once */
> +
> + Next->Asl.CompileFlags |= OP_IS_DUPLICATE;
> +
> + AslDualParseOpError (ASL_ERROR, ASL_MSG_DUPLICATE_CASE, Next,
> + Next->Asl.Value.String, ASL_MSG_CASE_FOUND_HERE, CaseOp,
> + CaseOp->Asl.ExternalName);
> +
> +NextCase:
> + Next = Next->Asl.Next;
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: TrCheckForBufferMatch
> + *
> + * PARAMETERS: Next1 - Parse node for first opcode in first buffer list
> + * (The DEFAULT_ARG or INTEGER node)
> + * Next2 - Parse node for first opcode in second buffer list
> + * (The DEFAULT_ARG or INTEGER node)
> + *
> + * RETURN: TRUE if buffers match, FALSE otherwise
> + *
> + * DESCRIPTION: Check for duplicate Buffer case values.
> + *
> + ******************************************************************************/
> +
> +static BOOLEAN
> +TrCheckForBufferMatch (
> + ACPI_PARSE_OBJECT *NextOp1,
> + ACPI_PARSE_OBJECT *NextOp2)
> +{
> +
> + if (NextOp1->Asl.Value.Integer != NextOp2->Asl.Value.Integer)
> + {
> + return (FALSE);
> + }
> +
> + /* Start at the BYTECONST initializer node list */
> +
> + NextOp1 = NextOp1->Asl.Next;
> + NextOp2 = NextOp2->Asl.Next;
> +
> + /*
> + * Walk both lists until either a mismatch is found, or one or more
> + * end-of-lists are found
> + */
> + while (NextOp1 && NextOp2)
> + {
> + if ((NextOp1->Asl.ParseOpcode == PARSEOP_STRING_LITERAL) &&
> + (NextOp2->Asl.ParseOpcode == PARSEOP_STRING_LITERAL))
> + {
> + if (!strcmp (NextOp1->Asl.Value.String, NextOp2->Asl.Value.String))
> + {
> + return (TRUE);
> + }
> + else
> + {
> + return (FALSE);
> + }
> + }
> + if ((UINT8) NextOp1->Asl.Value.Integer != (UINT8) NextOp2->Asl.Value.Integer)
> + {
> + return (FALSE);
> + }
> +
> + NextOp1 = NextOp1->Asl.Next;
> + NextOp2 = NextOp2->Asl.Next;
> + }
> +
> + /* Not a match if one of the lists is not at end-of-list */
> +
> + if (NextOp1 || NextOp2)
> + {
> + return (FALSE);
> + }
> +
> + /* Otherwise, the buffers match */
> +
> + return (TRUE);
> +}
> diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
> index 0faaec03..0ee94d6a 100644
> --- a/src/acpica/source/compiler/aslutils.c
> +++ b/src/acpica/source/compiler/aslutils.c
> @@ -567,11 +567,6 @@ UtDisplayOneSummary (
> /* Summary of main input and output files */
>
> FileNode = FlGetCurrentFileNode ();
> - if (!FileNode)
> - {
> - fprintf (stderr, "Summary could not be generated");
> - return;
> - }
>
> if (FileNode->ParserErrorDetected)
> {
> diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c
> index d903ef1b..8a1f1a4c 100644
> --- a/src/acpica/source/compiler/aslxref.c
> +++ b/src/acpica/source/compiler/aslxref.c
> @@ -1055,7 +1055,7 @@ XfNamespaceLocateBegin (
> NextOp = NextOp->Asl.Next;
> }
>
> - if (Node->Value != ASL_EXTERNAL_METHOD &&
> + if (Node->Value != ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS &&
> Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_EXTERNAL)
> {
> /*
> @@ -1064,8 +1064,17 @@ XfNamespaceLocateBegin (
> */
> if (PassedArgs != Node->Value)
> {
> - sprintf (AslGbl_MsgBuffer, "%s requires %u", Op->Asl.ExternalName,
> - Node->Value);
> + if (Node->Flags & ANOBJ_IS_EXTERNAL)
> + {
> + sprintf (AslGbl_MsgBuffer,
> + "according to previous use, %s requires %u",
> + Op->Asl.ExternalName, Node->Value);
> + }
> + else
> + {
> + sprintf (AslGbl_MsgBuffer, "%s requires %u", Op->Asl.ExternalName,
> + Node->Value);
> + }
>
> if (PassedArgs < Node->Value)
> {
> @@ -1077,6 +1086,22 @@ XfNamespaceLocateBegin (
> }
> }
> }
> +
> + /*
> + * At this point, a method call to an external method has been
> + * detected. As of 11/19/2019, iASL does not support parameter counts
> + * for methods declared as external. Therefore, save the parameter
> + * count of the first method call and use this count check other
> + * method calls to ensure that the methods are being called with the
> + * same amount of parameters.
> + */
> + else if (Node->Type == ACPI_TYPE_METHOD &&
> + (Node->Flags & ANOBJ_IS_EXTERNAL) &&
> + Node->Value == ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS &&
> + Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_EXTERNAL)
> + {
> + Node->Value = PassedArgs;
> + }
> }
>
> /* 4) Check for an ASL Field definition */
> diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c
> index 80970822..6c52f989 100644
> --- a/src/acpica/source/compiler/dtcompile.c
> +++ b/src/acpica/source/compiler/dtcompile.c
> @@ -261,18 +261,11 @@ DtDoCompile (
> UtEndEvent (Event);
>
> FileNode = FlGetCurrentFileNode ();
> - if (!FileNode)
> - {
> - fprintf (stderr, "Summary for %s could not be generated",
> - AslGbl_Files[ASL_FILE_INPUT].Filename);
> - }
> - else
> - {
> - FileNode->TotalLineCount = AslGbl_CurrentLineNumber;
> - FileNode->OriginalInputFileSize = AslGbl_InputByteCount;
> - DbgPrint (ASL_PARSE_OUTPUT, "Line count: %u input file size: %u\n",
> - FileNode->TotalLineCount, FileNode->OriginalInputFileSize);
> - }
> +
> + FileNode->TotalLineCount = AslGbl_CurrentLineNumber;
> + FileNode->OriginalInputFileSize = AslGbl_InputByteCount;
> + DbgPrint (ASL_PARSE_OUTPUT, "Line count: %u input file size: %u\n",
> + FileNode->TotalLineCount, FileNode->OriginalInputFileSize);
>
> if (ACPI_FAILURE (Status))
> {
> diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h
> index 7c78b55b..427051c3 100644
> --- a/src/acpica/source/compiler/dtcompiler.h
> +++ b/src/acpica/source/compiler/dtcompiler.h
> @@ -459,7 +459,6 @@ DtCreateTableUnit (
> UINT32 Column);
>
>
> -
> /* dtparser - lex/yacc files */
>
> UINT64 DtCompilerParserResult; /* Expression return value */
> diff --git a/src/acpica/source/components/debugger/dbconvert.c b/src/acpica/source/components/debugger/dbconvert.c
> index a9014b8f..6b58bf5f 100644
> --- a/src/acpica/source/components/debugger/dbconvert.c
> +++ b/src/acpica/source/components/debugger/dbconvert.c
> @@ -354,10 +354,6 @@ AcpiDbConvertToPackage (
>
> Elements = ACPI_ALLOCATE_ZEROED (
> DB_DEFAULT_PKG_ELEMENTS * sizeof (ACPI_OBJECT));
> - if (!Elements)
> - {
> - return (AE_NO_MEMORY);
> - }
>
> This = String;
> for (i = 0; i < (DB_DEFAULT_PKG_ELEMENTS - 1); i++)
> diff --git a/src/acpica/source/components/debugger/dbnames.c b/src/acpica/source/components/debugger/dbnames.c
> index ac366ab0..5521562a 100644
> --- a/src/acpica/source/components/debugger/dbnames.c
> +++ b/src/acpica/source/components/debugger/dbnames.c
> @@ -807,7 +807,6 @@ AcpiDbWalkForFields (
> }
>
>
> -
> /*******************************************************************************
> *
> * FUNCTION: AcpiDbWalkForSpecificObjects
> diff --git a/src/acpica/source/components/dispatcher/dsfield.c b/src/acpica/source/components/dispatcher/dsfield.c
> index 5477686f..b81aaeb9 100644
> --- a/src/acpica/source/components/dispatcher/dsfield.c
> +++ b/src/acpica/source/components/dispatcher/dsfield.c
> @@ -413,7 +413,7 @@ Cleanup:
> * FUNCTION: AcpiDsGetFieldNames
> *
> * PARAMETERS: Info - CreateField info structure
> - * ` WalkState - Current method state
> + * WalkState - Current method state
> * Arg - First parser arg for the field name list
> *
> * RETURN: Status
> diff --git a/src/acpica/source/components/dispatcher/dsopcode.c b/src/acpica/source/components/dispatcher/dsopcode.c
> index acf1ff4e..526fc847 100644
> --- a/src/acpica/source/components/dispatcher/dsopcode.c
> +++ b/src/acpica/source/components/dispatcher/dsopcode.c
> @@ -374,6 +374,7 @@ AcpiDsInitBufferField (
> }
>
> ObjDesc->BufferField.BufferObj = BufferDesc;
> + ObjDesc->BufferField.IsCreateField = AmlOpcode == AML_CREATE_FIELD_OP;
>
> /* Reference count for BufferDesc inherits ObjDesc count */
>
> diff --git a/src/acpica/source/components/dispatcher/dswload.c b/src/acpica/source/components/dispatcher/dswload.c
> index b5579428..fa6b80e9 100644
> --- a/src/acpica/source/components/dispatcher/dswload.c
> +++ b/src/acpica/source/components/dispatcher/dswload.c
> @@ -567,6 +567,28 @@ AcpiDsLoad1EndOp (
> Op = WalkState->Op;
> ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
>
> + /*
> + * Disassembler: handle create field operators here.
> + *
> + * CreateBufferField is a deferred op that is typically processed in load
> + * pass 2. However, disassembly of control method contents walk the parse
> + * tree with ACPI_PARSE_LOAD_PASS1 and AML_CREATE operators are processed
> + * in a later walk. This is a problem when there is a control method that
> + * has the same name as the AML_CREATE object. In this case, any use of the
> + * name segment will be detected as a method call rather than a reference
> + * to a buffer field.
> + *
> + * This earlier creation during disassembly solves this issue by inserting
> + * the named object in the ACPI namespace so that references to this name
> + * would be a name string rather than a method call.
> + */
> + if ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) &&
> + (WalkState->OpInfo->Flags & AML_CREATE))
> + {
> + Status = AcpiDsCreateBufferField (Op, WalkState);
> + return_ACPI_STATUS (Status);
> + }
> +
> /* We are only interested in opcodes that have an associated name */
>
> if (!(WalkState->OpInfo->Flags & (AML_NAMED | AML_FIELD)))
> diff --git a/src/acpica/source/components/executer/exfield.c b/src/acpica/source/components/executer/exfield.c
> index b35e6a4e..dc97d404 100644
> --- a/src/acpica/source/components/executer/exfield.c
> +++ b/src/acpica/source/components/executer/exfield.c
> @@ -246,7 +246,8 @@ AcpiExGetProtocolBufferLength (
> * RETURN: Status
> *
> * DESCRIPTION: Read from a named field. Returns either an Integer or a
> - * Buffer, depending on the size of the field.
> + * Buffer, depending on the size of the field and whether if a
> + * field is created by the CreateField() operator.
> *
> ******************************************************************************/
>
> @@ -310,12 +311,17 @@ AcpiExReadDataFromField (
> * the use of arithmetic operators on the returned value if the
> * field size is equal or smaller than an Integer.
> *
> + * However, all buffer fields created by CreateField operator needs to
> + * remain as a buffer to match other AML interpreter implementations.
> + *
> * Note: Field.length is in bits.
> */
> BufferLength = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (
> ObjDesc->Field.BitLength);
>
> - if (BufferLength > AcpiGbl_IntegerByteWidth)
> + if (BufferLength > AcpiGbl_IntegerByteWidth ||
> + (ObjDesc->Common.Type == ACPI_TYPE_BUFFER_FIELD &&
> + ObjDesc->BufferField.IsCreateField))
> {
> /* Field is too large for an Integer, create a Buffer instead */
>
> diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
> index 78dc1902..6eff7f6a 100644
> --- a/src/acpica/source/components/hardware/hwxfsleep.c
> +++ b/src/acpica/source/components/hardware/hwxfsleep.c
> @@ -192,7 +192,7 @@ static ACPI_SLEEP_FUNCTIONS AcpiSleepDispatch[] =
> ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWakePrep)),
> ACPI_STRUCT_INIT (ExtendedFunction,
> AcpiHwExtendedWakePrep) },
> - {ACPI_STRUCT_INIT (Legacy_function,
> + {ACPI_STRUCT_INIT (LegacyFunction,
> ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWake)),
> ACPI_STRUCT_INIT (ExtendedFunction,
> AcpiHwExtendedWake) }
> diff --git a/src/acpica/source/components/utilities/utids.c b/src/acpica/source/components/utilities/utids.c
> index 513548c2..5fcfbf66 100644
> --- a/src/acpica/source/components/utilities/utids.c
> +++ b/src/acpica/source/components/utilities/utids.c
> @@ -466,8 +466,7 @@ AcpiUtExecute_CID (
> {
> /* Copy the String CID from the returned object */
>
> - AcpiUtSafeStrcpy (NextIdString, CidObjects[i]->String.Length + 1,
> - CidObjects[i]->String.Pointer);
> + strcpy (NextIdString, CidObjects[i]->String.Pointer);
> Length = CidObjects[i]->String.Length + 1;
> }
>
> diff --git a/src/acpica/source/include/acobject.h b/src/acpica/source/include/acobject.h
> index 74feb8d9..d04fe0c6 100644
> --- a/src/acpica/source/include/acobject.h
> +++ b/src/acpica/source/include/acobject.h
> @@ -489,6 +489,7 @@ typedef struct acpi_object_buffer_field
> {
> ACPI_OBJECT_COMMON_HEADER
> ACPI_COMMON_FIELD_INFO
> + BOOLEAN IsCreateField; /* Special case for objects created by CreateField() */
> union acpi_operand_object *BufferObj; /* Containing Buffer object */
>
> } ACPI_OBJECT_BUFFER_FIELD;
> diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
> index 62e37909..15a02a30 100644
> --- a/src/acpica/source/include/acpixf.h
> +++ b/src/acpica/source/include/acpixf.h
> @@ -154,7 +154,7 @@
>
> /* Current ACPICA subsystem version in YYYYMMDD format */
>
> -#define ACPI_CA_VERSION 0x20191018
> +#define ACPI_CA_VERSION 0x20191213
>
> #include "acconfig.h"
> #include "actypes.h"
> diff --git a/src/acpica/source/include/platform/acenv.h b/src/acpica/source/include/platform/acenv.h
> index 46eeb9df..bd6816a9 100644
> --- a/src/acpica/source/include/platform/acenv.h
> +++ b/src/acpica/source/include/platform/acenv.h
> @@ -270,6 +270,21 @@
> #define ACPI_DISASSEMBLER 1
> #endif
>
> +/*
> + * acpisrc CR\LF support
> + * Unix file line endings do not include the carriage return.
> + * If the acpisrc utility is being built using a microsoft compiler, it means
> + * that it will be running on a windows machine which means that the output is
> + * expected to have CR/LF newlines. If the acpisrc utility is built with
> + * anything else, it will likely run on a system with LF newlines. This flag
> + * tells the acpisrc utility that newlines will be in the LF format.
> + */
> +#if defined(ACPI_SRC_APP) && !defined(_MSC_VER)
> +#define ACPI_SRC_OS_LF_ONLY 1
> +#else
> +#define ACPI_SRC_OS_LF_ONLY 0
> +#endif
> +
> /*! [Begin] no source code translation */
>
> /******************************************************************************
>
Acked-by: Ivan Hu <ivan.hu at canonical.com>
More information about the fwts-devel
mailing list