MFV: r367652

Merge ACPICA 20201113.
This commit is contained in:
Jung-uk Kim 2020-11-13 22:45:26 +00:00
commit fbde34778b
19 changed files with 311 additions and 99 deletions

View File

@ -1,6 +1,94 @@
---------------------------------------- ----------------------------------------
13 November 2020. Summary of changes for version 20201113:
This release is available at https://acpica.org/downloads
1) ACPICA kernel-resident subsystem:
Interpreter: fixed a memory leak by using use existing buffer in _HID
repair. There was a memory leak that occurred when a _CID object is
defined as a package containing string objects. When _CID is checked for
any possible repairs, it calls a helper function to repair _HID (because
_CID basically contains multiple _HID entries). The _HID repair function
assumes that string objects are standalone objects that are not contained
inside of any packages. The _HID repair function replaced the string
object with a brand new object and attempted to delete the old object by
decrementing the reference count of the old object. Strings inside of
packages have a reference count of 2 so the _HID repair function leaves
this object in a dangling state and causes a memory leak. Instead of
allocating a brand new object and removing the old object, use the
existing object when repairing the _HID object.
Added function trace macros to improve namespace debugging. The namespace
repair mechanism does not have function tracing macros. Add several trace
macros to improve debuggability.
Handle "orphan" _REG methods for GPIO OpRegions. Before this change
AcpiEvExecuteRegMethods() had special handling to handle "orphan" (no
matching OpRegion declared) _REG methods for EC nodes. On Intel Cherry
Trail devices there are 2 possible ACPI OpRegions for accessing GPIOs.
The standard GeneralPurposeIo OpRegion and the Cherry Trail - specific
UserDefined 0x9X OpRegions. Having 2 different types of OpRegions leads
to potential issues with checks for OpRegion availability, or in other
words checks if _REG has been called for the OpRegion which the ACPI code
wants to use. Except for the "orphan" EC handling, ACPICA core does not
call _REG on an ACPI node which does not define an OpRegion matching the
type being registered; and the reference design DSDT, from which most
Cherry Trail DSDTs are derived, does not define GeneralPurposeIo, nor
UserDefined(0x93) OpRegions for the GPO2 (UID 3) device, because no pins
were assigned ACPI controlled functions in the reference design. Together
this leads to the perfect storm, at least on the Cherry Trail based
Medion Akayo E1239T. This design does use a GPO2 pin from its ACPI code
and has added the Cherry Trail specific UserDefined(0x93) opregion to its
GPO2 ACPI node to access this pin. But it uses a "has _REG been called"
availability check for the standard GeneralPurposeIo OpRegion. This
clearly is a bug in the DSDT, but this does work under Windows. This
issue leads to the intel vbtn driver reporting the device always being in
tablet-mode at boot, even if it is in laptop mode. Which in turn causes
userspace to ignore touchpad events. So in other words, this issue causes
the touchpad to not work at boot. This change fixes this by extending the
"orphan" _REG method handling to also apply to GPIO address-space
handlers.
2) iASL Compiler/Disassembler and ACPICA tools:
iASL: Added more info to namespace dump file (-ln option). In a separate
section of the dump file (after the main namespace dump), emit the full
pathname for each namespace node, its type, and the ASL filename and line
number where it is declared.
AcpiHelp: Added an option to display/decode iASL exceptions. Option is: -
x [Hex Value] where "Hex Value" is the iASL exception code. If Hex Value
is omitted, all iASL exceptions are displayed.
iASL: Use StringLiteral instead of StringData for some ASL macros. The
use of the stringData rule allows for some "string" oriented opcodes
(Such as ToString, ToHexString, etc.) None of which make sense with the
macros in question. This change modifies the StringData part of the rule
for these macros to a simple string literal - thus disallowing the use
of ToString, ToHexString, etc.
The following ASL operators (macros) are affected:
EisaId
Fprintf
Printf
ToUuid
Unicode
Note: The MS compiler requires the use of string literals for these
operators also.
iASL: Added a remark for an unknown UUID: ASL_MSG_UUID_NOT_FOUND. Search
the list of "known" UUIDs for the input to the ToUUID macro.
Added 5 new UUIDs to the known UUID table. All related to NVDIMM and the
NFIT table.
----------------------------------------
25 September 2020. Summary of changes for version 20200925: 25 September 2020. Summary of changes for version 20200925:
This release is available at https://acpica.org/downloads This release is available at https://acpica.org/downloads
@ -41,7 +129,7 @@ names:
_SBT _SBT
_SBW _SBW
AML Disassembler: Added a new command, "All <NameSeg". This command will AML Disassembler: Added a new command, "All <NameSeg>". This command will
evaluate all objects in the current namespace whose NameString contains evaluate all objects in the current namespace whose NameString contains
the input NameSeg as the last element of the NameString. Useful for the input NameSeg as the last element of the NameString. Useful for
debugging. debugging.
@ -55,6 +143,11 @@ with lengths that exceed the initializer list.
iASL: added more detail to external resolution error message when iASL: added more detail to external resolution error message when
compiling multiple definition blocks. compiling multiple definition blocks.
iASL: added a remark for an attempt to create a nameseg or namestring
containing lower-case letters. This should prevent declaring multiple
namesegs or namestrings in an attempt to refer to different objects (with
different cases), but actually refer to the same object(s).
iASL: improve alias analysis by saving object type. If the alias is a iASL: improve alias analysis by saving object type. If the alias is a
method type, the parameter count is also recorded. method type, the parameter count is also recorded.
@ -3702,7 +3795,7 @@ iASL compiler, all ACPICA utilities, and the test suites.
Events: Introduce ACPI_GPE_DISPATCH_RAW_HANDLER to fix GPE storm issues. Events: Introduce ACPI_GPE_DISPATCH_RAW_HANDLER to fix GPE storm issues.
A raw gpe handling mechanism was created to allow better handling of GPE A raw gpe handling mechanism was created to allow better handling of GPE
storms that aren't easily managed by the normal handler. The raw handler storms that aren't easily managed by the normal handler. The raw handler
allows disabling/renabling of the the GPE so that interrupt storms can be allows disabling/renabling of the GPE so that interrupt storms can be
avoided in cases where events cannot be timely serviced. In this avoided in cases where events cannot be timely serviced. In this
scenario, handlers should use the AcpiSetGpe() API to disable/enable the scenario, handlers should use the AcpiSetGpe() API to disable/enable the
GPE. This API will leave the reference counts undisturbed, thereby GPE. This API will leave the reference counts undisturbed, thereby

View File

@ -181,6 +181,7 @@ const AH_UUID Gbl_AcpiUuids[] =
{"Physical Presence Interface", UUID_PHYSICAL_PRESENCE}, {"Physical Presence Interface", UUID_PHYSICAL_PRESENCE},
{"[Non-volatile DIMM and NFIT table]", NULL}, {"[Non-volatile DIMM and NFIT table]", NULL},
{"NVDIMM Device", UUID_NFIT_DIMM},
{"Volatile Memory Region", UUID_VOLATILE_MEMORY}, {"Volatile Memory Region", UUID_VOLATILE_MEMORY},
{"Persistent Memory Region", UUID_PERSISTENT_MEMORY}, {"Persistent Memory Region", UUID_PERSISTENT_MEMORY},
{"NVDIMM Control Region", UUID_CONTROL_REGION}, {"NVDIMM Control Region", UUID_CONTROL_REGION},
@ -189,6 +190,10 @@ const AH_UUID Gbl_AcpiUuids[] =
{"Volatile Virtual CD", UUID_VOLATILE_VIRTUAL_CD}, {"Volatile Virtual CD", UUID_VOLATILE_VIRTUAL_CD},
{"Persistent Virtual Disk", UUID_PERSISTENT_VIRTUAL_DISK}, {"Persistent Virtual Disk", UUID_PERSISTENT_VIRTUAL_DISK},
{"Persistent Virtual CD", UUID_PERSISTENT_VIRTUAL_CD}, {"Persistent Virtual CD", UUID_PERSISTENT_VIRTUAL_CD},
{"Microsoft NVDIMM Command set",UUID_NFIT_DIMM_N_MSFT},
{"HP NDIMM HPE1", UUID_NFIT_DIMM_N_HPE1},
{"HP NDIMM HPE2", UUID_NFIT_DIMM_N_HPE2},
{"Virtual NVDIMM", UUID_NFIT_DIMM_N_HYPERV},
{"[Processor Properties]", NULL}, {"[Processor Properties]", NULL},
{"Cache Properties", UUID_CACHE_PROPERTIES}, {"Cache Properties", UUID_CACHE_PROPERTIES},

View File

@ -672,7 +672,7 @@ AnMapObjTypeToBtype (
* *
* PARAMETERS: Btype - Bitfield of ACPI types * PARAMETERS: Btype - Bitfield of ACPI types
* *
* RETURN: The Etype corresponding the the Btype * RETURN: The Etype corresponding the Btype
* *
* DESCRIPTION: Convert a bitfield type to an encoded type * DESCRIPTION: Convert a bitfield type to an encoded type
* *

View File

@ -700,7 +700,7 @@ CgUpdateHeader (
Checksum = (UINT8) (0 - Sum); Checksum = (UINT8) (0 - Sum);
/* Re-write the the checksum byte */ /* Re-write the checksum byte */
FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset +
ACPI_OFFSET (ACPI_TABLE_HEADER, Checksum)); ACPI_OFFSET (ACPI_TABLE_HEADER, Checksum));

View File

@ -538,7 +538,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* TYPE_TRANSLATION */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0), /* TYPE_TRANSLATION */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
/* UART_SERIALBUS */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* UART_SERIALBUS */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* UART_SERIALBUSV2 */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0), /* UART_SERIALBUSV2 */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
/* UNICODE */ OP_TABLE_ENTRY (AML_BUFFER_OP, 0, OP_AML_PACKAGE, 0), /* UNICODE */ OP_TABLE_ENTRY (AML_BUFFER_OP, 0, OP_AML_PACKAGE, ACPI_BTYPE_BUFFER),
/* UNLOAD */ OP_TABLE_ENTRY (AML_UNLOAD_OP, 0, 0, 0), /* UNLOAD */ OP_TABLE_ENTRY (AML_UNLOAD_OP, 0, 0, 0),
/* UPDATERULE_ONES */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_WRITE_AS_ONES, 0, 0), /* UPDATERULE_ONES */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_WRITE_AS_ONES, 0, 0),
/* UPDATERULE_PRESERVE */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_PRESERVE, 0, 0), /* UPDATERULE_PRESERVE */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_PRESERVE, 0, 0),

View File

@ -384,6 +384,7 @@ const char *AslCompilerMsgs [] =
/* ASL_MSG_EXTERNAL_FOUND_HERE */ "External declaration below ", /* ASL_MSG_EXTERNAL_FOUND_HERE */ "External declaration below ",
/* ASL_MSG_LOWER_CASE_NAMESEG */ "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case", /* ASL_MSG_LOWER_CASE_NAMESEG */ "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case",
/* ASL_MSG_LOWER_CASE_NAMEPATH */ "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case", /* ASL_MSG_LOWER_CASE_NAMEPATH */ "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case",
/* ASL_MSG_UUID_NOT_FOUND */ "Unknown UUID string"
}; };
/* Table compiler */ /* Table compiler */
@ -457,7 +458,7 @@ AeDecodeMessageId (
if (Index >= ACPI_ARRAY_LENGTH (AslCompilerMsgs)) if (Index >= ACPI_ARRAY_LENGTH (AslCompilerMsgs))
{ {
return ("[Unknown ASL Compiler exception ID]"); return ("[Unknown iASL Compiler exception ID]");
} }
} }
@ -470,7 +471,7 @@ AeDecodeMessageId (
if (Index >= ACPI_ARRAY_LENGTH (AslTableCompilerMsgs)) if (Index >= ACPI_ARRAY_LENGTH (AslTableCompilerMsgs))
{ {
return ("[Unknown Table Compiler exception ID]"); return ("[Unknown iASL Table Compiler exception ID]");
} }
} }
@ -483,7 +484,7 @@ AeDecodeMessageId (
if (Index >= ACPI_ARRAY_LENGTH (AslPreprocessorMsgs)) if (Index >= ACPI_ARRAY_LENGTH (AslPreprocessorMsgs))
{ {
return ("[Unknown Preprocessor exception ID]"); return ("[Unknown iASL Preprocessor exception ID]");
} }
} }
@ -491,7 +492,7 @@ AeDecodeMessageId (
else else
{ {
return ("[Unknown exception/component ID]"); return ("[Unknown iASL exception ID]");
} }
return (MessageTable[Index]); return (MessageTable[Index]);
@ -559,3 +560,79 @@ AeBuildFullExceptionCode (
*/ */
return (((Level + 1) * 1000) + MessageId); return (((Level + 1) * 1000) + MessageId);
} }
#ifdef ACPI_HELP_APP
/*******************************************************************************
*
* FUNCTION: AhDecodeAslException
*
* PARAMETERS: HexString - iASL status string from command line, in
* hex. If null, display all exceptions.
*
* RETURN: None
*
* DESCRIPTION: Decode and display an iASL exception code. Note1: a
* NULL string for HexString displays all known iASL exceptions. Note2:
* implements the -x option for AcpiHelp.
*
******************************************************************************/
#define AH_DISPLAY_ASL_EXCEPTION_TEXT(Status, Exception) \
printf ("%.4X: %s\n", Status, Exception)
#define AH_DISPLAY_EXCEPTION(Status, Name) \
printf ("%.4X: %s\n", Status, Name)
void
AhDecodeAslException (
char *HexString)
{
UINT32 i;
UINT32 MessageId;
const char *OneException;
UINT32 Index = 1;
/*
* A null input string means to decode and display all known
* exception codes.
*/
if (!HexString)
{
printf ("All defined iASL exception codes:\n\n");
printf ("Main iASL exceptions:\n\n");
AH_DISPLAY_EXCEPTION (0,
"AE_OK (No error occurred)");
/* Display codes in each block of exception types */
for (i = 1; Index < ACPI_ARRAY_LENGTH (AslCompilerMsgs); i++, Index++)
{
AH_DISPLAY_ASL_EXCEPTION_TEXT (Index, AslCompilerMsgs[i]);
}
printf ("\niASL Table Compiler exceptions:\n\n");
Index = ASL_MSG_TABLE_COMPILER;
for (i = 0; i < ACPI_ARRAY_LENGTH (AslTableCompilerMsgs); i++, Index++)
{
AH_DISPLAY_ASL_EXCEPTION_TEXT (Index, AslTableCompilerMsgs[i]);
}
printf ("\niASL Preprocessor exceptions:\n\n");
Index = ASL_MSG_PREPROCESSOR;
for (i = 0; i < ACPI_ARRAY_LENGTH (AslPreprocessorMsgs); i++, Index++)
{
AH_DISPLAY_ASL_EXCEPTION_TEXT (Index, AslPreprocessorMsgs[i]);
}
return;
}
/* HexString is valid - convert it to a MessageId and decode it */
MessageId = strtol (HexString, NULL, 16);
OneException = AeDecodeMessageId ((UINT16) MessageId);
AH_DISPLAY_ASL_EXCEPTION_TEXT (MessageId, OneException);
}
#endif

View File

@ -152,7 +152,6 @@
#ifndef __ASLMESSAGES_H #ifndef __ASLMESSAGES_H
#define __ASLMESSAGES_H #define __ASLMESSAGES_H
/* These values must match error type string tables in aslmessages.c */ /* These values must match error type string tables in aslmessages.c */
typedef enum typedef enum
@ -167,9 +166,12 @@ typedef enum
} ASL_MESSAGE_TYPES; } ASL_MESSAGE_TYPES;
#define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings for types above */ #define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings for types above */
void
AhDecodeAslException (
char *HexString);
/* /*
* Exception code blocks, 0 - 999 * Exception code blocks, 0 - 999
* Available for new exception blocks: 600 - 999 * Available for new exception blocks: 600 - 999
@ -386,6 +388,7 @@ typedef enum
ASL_MSG_EXTERNAL_FOUND_HERE, ASL_MSG_EXTERNAL_FOUND_HERE,
ASL_MSG_LOWER_CASE_NAMESEG, ASL_MSG_LOWER_CASE_NAMESEG,
ASL_MSG_LOWER_CASE_NAMEPATH, ASL_MSG_LOWER_CASE_NAMEPATH,
ASL_MSG_UUID_NOT_FOUND,
/* These messages are used by the Data Table compiler only */ /* These messages are used by the Data Table compiler only */

View File

@ -226,8 +226,8 @@ NsDisplayNamespace (
/* File header */ /* File header */
FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n"); FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n"
FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count Depth Name - Type\n\n"); "Count Depth Name - Type\n\n");
/* Walk entire namespace from the root */ /* Walk entire namespace from the root */
@ -239,14 +239,21 @@ NsDisplayNamespace (
return (Status); return (Status);
} }
/* Print the full pathname for each namespace node */ /* Print the full pathname for each namespace node in the common namespace */
FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n"); FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
"\nNamespace pathnames and where declared:\n"
"<NamePath, Object type, Containing file, Line number within file>\n\n");
Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, FALSE, NsDoOnePathname, NULL, ACPI_UINT32_MAX, FALSE, NsDoOnePathname, NULL,
NULL, NULL); NULL, NULL);
/*
* We just dumped the entire common namespace, we don't want to do it
* again for other input files.
*/
AslGbl_NsOutputFlag = FALSE;
return (Status); return (Status);
} }
@ -512,7 +519,7 @@ NsDoOneNamespaceObject (
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Print the full pathname for a namespace node. * DESCRIPTION: Print the full pathname and addtional info for a namespace node.
* *
******************************************************************************/ ******************************************************************************/
@ -528,6 +535,13 @@ NsDoOnePathname (
ACPI_BUFFER TargetPath; ACPI_BUFFER TargetPath;
/* Ignore predefined namespace nodes and External declarations */
if (!Node->Op || (Node->Flags & ANOBJ_IS_EXTERNAL))
{
return (AE_OK);
}
TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER; TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
Status = AcpiNsHandleToPathname (Node, &TargetPath, FALSE); Status = AcpiNsHandleToPathname (Node, &TargetPath, FALSE);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
@ -535,8 +549,15 @@ NsDoOnePathname (
return (Status); return (Status);
} }
FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%s\n", /*
ACPI_CAST_PTR (char, TargetPath.Pointer)); * Print the full pathname (and other information)
* for each namespace node in the common namespace
*/
FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%-41s %-12s %s, %u\n",
ACPI_CAST_PTR (char, TargetPath.Pointer),
AcpiUtGetTypeName (Node->Type),
Node->Op->Asl.Filename, Node->Op->Asl.LogicalLineNumber);
ACPI_FREE (TargetPath.Pointer); ACPI_FREE (TargetPath.Pointer);
return (AE_OK); return (AE_OK);
} }

View File

@ -798,7 +798,13 @@ OpcDoUuId (
} }
else else
{ {
/* Convert UUID string to a buffer, check for a known UUID */
AcpiUtConvertStringToUuid (InString, Buffer); AcpiUtConvertStringToUuid (InString, Buffer);
if (!AcpiAhMatchUuid (Buffer))
{
AslError (ASL_REMARK, ASL_MSG_UUID_NOT_FOUND, Op, NULL);
}
} }
/* Change Op to a Buffer */ /* Change Op to a Buffer */

View File

@ -500,7 +500,7 @@ DivideTerm
EISAIDTerm EISAIDTerm
: PARSEOP_EISAID : PARSEOP_EISAID
PARSEOP_OPEN_PAREN PARSEOP_OPEN_PAREN
StringData StringLiteral
PARSEOP_CLOSE_PAREN {$$ = TrSetOpIntegerValue (PARSEOP_EISAID, $3);} PARSEOP_CLOSE_PAREN {$$ = TrSetOpIntegerValue (PARSEOP_EISAID, $3);}
| PARSEOP_EISAID | PARSEOP_EISAID
PARSEOP_OPEN_PAREN PARSEOP_OPEN_PAREN
@ -635,7 +635,7 @@ FprintfTerm
: PARSEOP_FPRINTF : PARSEOP_FPRINTF
PARSEOP_OPEN_PAREN {$<n>$ = TrCreateLeafOp (PARSEOP_FPRINTF);} PARSEOP_OPEN_PAREN {$<n>$ = TrCreateLeafOp (PARSEOP_FPRINTF);}
TermArg ',' TermArg ','
StringData StringLiteral
PrintfArgList PrintfArgList
PARSEOP_CLOSE_PAREN {$$ = TrLinkOpChildren ($<n>3,3,$4,$6,$7);} PARSEOP_CLOSE_PAREN {$$ = TrLinkOpChildren ($<n>3,3,$4,$6,$7);}
| PARSEOP_FPRINTF | PARSEOP_FPRINTF
@ -1091,7 +1091,7 @@ PowerResTerm
PrintfTerm PrintfTerm
: PARSEOP_PRINTF : PARSEOP_PRINTF
PARSEOP_OPEN_PAREN {$<n>$ = TrCreateLeafOp (PARSEOP_PRINTF);} PARSEOP_OPEN_PAREN {$<n>$ = TrCreateLeafOp (PARSEOP_PRINTF);}
StringData StringLiteral
PrintfArgList PrintfArgList
PARSEOP_CLOSE_PAREN {$$ = TrLinkOpChildren ($<n>3,2,$4,$5);} PARSEOP_CLOSE_PAREN {$$ = TrLinkOpChildren ($<n>3,2,$4,$5);}
| PARSEOP_PRINTF | PARSEOP_PRINTF
@ -1412,7 +1412,7 @@ ToStringTerm
ToUUIDTerm ToUUIDTerm
: PARSEOP_TOUUID : PARSEOP_TOUUID
PARSEOP_OPEN_PAREN PARSEOP_OPEN_PAREN
StringData StringLiteral
PARSEOP_CLOSE_PAREN {$$ = TrSetOpIntegerValue (PARSEOP_TOUUID, $3);} PARSEOP_CLOSE_PAREN {$$ = TrSetOpIntegerValue (PARSEOP_TOUUID, $3);}
| PARSEOP_TOUUID | PARSEOP_TOUUID
PARSEOP_OPEN_PAREN PARSEOP_OPEN_PAREN
@ -1422,7 +1422,7 @@ ToUUIDTerm
UnicodeTerm UnicodeTerm
: PARSEOP_UNICODE : PARSEOP_UNICODE
PARSEOP_OPEN_PAREN {$<n>$ = TrCreateLeafOp (PARSEOP_UNICODE);} PARSEOP_OPEN_PAREN {$<n>$ = TrCreateLeafOp (PARSEOP_UNICODE);}
StringData StringLiteral
PARSEOP_CLOSE_PAREN {$$ = TrLinkOpChildren ($<n>3,2,0,$4);} PARSEOP_CLOSE_PAREN {$$ = TrLinkOpChildren ($<n>3,2,0,$4);}
| PARSEOP_UNICODE | PARSEOP_UNICODE
PARSEOP_OPEN_PAREN PARSEOP_OPEN_PAREN

View File

@ -523,6 +523,10 @@ StringData
| String {} | String {}
; ;
StringLiteral
: String {}
;
ByteConst ByteConst
: Integer {$$ = TrSetOpIntegerValue (PARSEOP_BYTECONST, $1);} : Integer {$$ = TrSetOpIntegerValue (PARSEOP_BYTECONST, $1);}
; ;

View File

@ -178,6 +178,7 @@ NoEcho('
%type <n> RequiredTarget %type <n> RequiredTarget
%type <n> SimpleName %type <n> SimpleName
%type <n> StringData %type <n> StringData
%type <n> StringLiteral
%type <n> Target %type <n> Target
%type <n> Term %type <n> Term
%type <n> TermArg %type <n> TermArg

View File

@ -164,8 +164,10 @@ extern UINT8 AcpiGbl_DefaultAddressSpaces[];
/* Local prototypes */ /* Local prototypes */
static void static void
AcpiEvOrphanEcRegMethod ( AcpiEvExecuteOrphanRegMethod (
ACPI_NAMESPACE_NODE *EcDeviceNode); ACPI_NAMESPACE_NODE *DeviceNode,
ACPI_ADR_SPACE_TYPE SpaceId);
static ACPI_STATUS static ACPI_STATUS
AcpiEvRegRun ( AcpiEvRegRun (
@ -869,11 +871,13 @@ AcpiEvExecuteRegMethods (
(void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, NULL, &Info, NULL); ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, NULL, &Info, NULL);
/* Special case for EC: handle "orphan" _REG methods with no region */ /*
* Special case for EC and GPIO: handle "orphan" _REG methods with
if (SpaceId == ACPI_ADR_SPACE_EC) * no region.
*/
if (SpaceId == ACPI_ADR_SPACE_EC || SpaceId == ACPI_ADR_SPACE_GPIO)
{ {
AcpiEvOrphanEcRegMethod (Node); AcpiEvExecuteOrphanRegMethod (Node, SpaceId);
} }
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES,
@ -954,32 +958,29 @@ AcpiEvRegRun (
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: AcpiEvOrphanEcRegMethod * FUNCTION: AcpiEvExecuteOrphanRegMethod
* *
* PARAMETERS: EcDeviceNode - Namespace node for an EC device * PARAMETERS: DeviceNode - Namespace node for an ACPI device
* SpaceId - The address space ID
* *
* RETURN: None * RETURN: None
* *
* DESCRIPTION: Execute an "orphan" _REG method that appears under the EC * DESCRIPTION: Execute an "orphan" _REG method that appears under an ACPI
* device. This is a _REG method that has no corresponding region * device. This is a _REG method that has no corresponding region
* within the EC device scope. The orphan _REG method appears to * within the device's scope. ACPI tables depending on these
* have been enabled by the description of the ECDT in the ACPI * "orphan" _REG methods have been seen for both EC and GPIO
* specification: "The availability of the region space can be * Operation Regions. Presumably the Windows ACPI implementation
* detected by providing a _REG method object underneath the * always calls the _REG method independent of the presence of
* Embedded Controller device." * an actual Operation Region with the correct address space ID.
*
* To quickly access the EC device, we use the EcDeviceNode used
* during EC handler installation. Otherwise, we would need to
* perform a time consuming namespace walk, executing _HID
* methods to find the EC device.
* *
* MUTEX: Assumes the namespace is locked * MUTEX: Assumes the namespace is locked
* *
******************************************************************************/ ******************************************************************************/
static void static void
AcpiEvOrphanEcRegMethod ( AcpiEvExecuteOrphanRegMethod (
ACPI_NAMESPACE_NODE *EcDeviceNode) ACPI_NAMESPACE_NODE *DeviceNode,
ACPI_ADR_SPACE_TYPE SpaceId)
{ {
ACPI_HANDLE RegMethod; ACPI_HANDLE RegMethod;
ACPI_NAMESPACE_NODE *NextNode; ACPI_NAMESPACE_NODE *NextNode;
@ -988,10 +989,10 @@ AcpiEvOrphanEcRegMethod (
ACPI_OBJECT Objects[2]; ACPI_OBJECT Objects[2];
ACPI_FUNCTION_TRACE (EvOrphanEcRegMethod); ACPI_FUNCTION_TRACE (EvExecuteOrphanRegMethod);
if (!EcDeviceNode) if (!DeviceNode)
{ {
return_VOID; return_VOID;
} }
@ -1002,7 +1003,7 @@ AcpiEvOrphanEcRegMethod (
/* Get a handle to a _REG method immediately under the EC device */ /* Get a handle to a _REG method immediately under the EC device */
Status = AcpiGetHandle (EcDeviceNode, METHOD_NAME__REG, &RegMethod); Status = AcpiGetHandle (DeviceNode, METHOD_NAME__REG, &RegMethod);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
goto Exit; /* There is no _REG method present */ goto Exit; /* There is no _REG method present */
@ -1015,25 +1016,25 @@ AcpiEvOrphanEcRegMethod (
* with other space IDs to be present; but the code below will then * with other space IDs to be present; but the code below will then
* execute the _REG method with the EmbeddedControl SpaceID argument. * execute the _REG method with the EmbeddedControl SpaceID argument.
*/ */
NextNode = AcpiNsGetNextNode (EcDeviceNode, NULL); NextNode = AcpiNsGetNextNode (DeviceNode, NULL);
while (NextNode) while (NextNode)
{ {
if ((NextNode->Type == ACPI_TYPE_REGION) && if ((NextNode->Type == ACPI_TYPE_REGION) &&
(NextNode->Object) && (NextNode->Object) &&
(NextNode->Object->Region.SpaceId == ACPI_ADR_SPACE_EC)) (NextNode->Object->Region.SpaceId == SpaceId))
{ {
goto Exit; /* Do not execute the _REG */ goto Exit; /* Do not execute the _REG */
} }
NextNode = AcpiNsGetNextNode (EcDeviceNode, NextNode); NextNode = AcpiNsGetNextNode (DeviceNode, NextNode);
} }
/* Evaluate the _REG(EmbeddedControl,Connect) method */ /* Evaluate the _REG(SpaceId,Connect) method */
Args.Count = 2; Args.Count = 2;
Args.Pointer = Objects; Args.Pointer = Objects;
Objects[0].Type = ACPI_TYPE_INTEGER; Objects[0].Type = ACPI_TYPE_INTEGER;
Objects[0].Integer.Value = ACPI_ADR_SPACE_EC; Objects[0].Integer.Value = SpaceId;
Objects[1].Type = ACPI_TYPE_INTEGER; Objects[1].Type = ACPI_TYPE_INTEGER;
Objects[1].Integer.Value = ACPI_REG_CONNECT; Objects[1].Integer.Value = ACPI_REG_CONNECT;

View File

@ -223,13 +223,14 @@ AcpiNsCheckReturnValue (
ACPI_STATUS Status; ACPI_STATUS Status;
const ACPI_PREDEFINED_INFO *Predefined; const ACPI_PREDEFINED_INFO *Predefined;
ACPI_FUNCTION_TRACE (NsCheckReturnValue);
/* If not a predefined name, we cannot validate the return object */ /* If not a predefined name, we cannot validate the return object */
Predefined = Info->Predefined; Predefined = Info->Predefined;
if (!Predefined) if (!Predefined)
{ {
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* /*
@ -239,7 +240,7 @@ AcpiNsCheckReturnValue (
if ((ReturnStatus != AE_OK) && if ((ReturnStatus != AE_OK) &&
(ReturnStatus != AE_CTRL_RETURN_VALUE)) (ReturnStatus != AE_CTRL_RETURN_VALUE))
{ {
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* /*
@ -259,7 +260,7 @@ AcpiNsCheckReturnValue (
(!Predefined->Info.ExpectedBtypes) || (!Predefined->Info.ExpectedBtypes) ||
(Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL)) (Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL))
{ {
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* /*
@ -325,7 +326,7 @@ AcpiNsCheckReturnValue (
Node->Flags |= ANOBJ_EVALUATED; Node->Flags |= ANOBJ_EVALUATED;
} }
return (Status); return_ACPI_STATUS (Status);
} }

View File

@ -214,7 +214,7 @@ AcpiNsCheckPackage (
UINT32 i; UINT32 i;
ACPI_FUNCTION_NAME (NsCheckPackage); ACPI_FUNCTION_TRACE (NsCheckPackage);
/* The package info for this name is in the next table entry */ /* The package info for this name is in the next table entry */
@ -245,13 +245,13 @@ AcpiNsCheckPackage (
{ {
if (Package->RetInfo.Type == ACPI_PTYPE1_VAR) if (Package->RetInfo.Type == ACPI_PTYPE1_VAR)
{ {
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
"Return Package has no elements (empty)")); "Return Package has no elements (empty)"));
return (AE_AML_OPERAND_VALUE); return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
} }
/* /*
@ -305,7 +305,7 @@ AcpiNsCheckPackage (
Package->RetInfo.ObjectType1, i); Package->RetInfo.ObjectType1, i);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
Elements++; Elements++;
@ -338,7 +338,7 @@ AcpiNsCheckPackage (
Package->RetInfo3.ObjectType[i], i); Package->RetInfo3.ObjectType[i], i);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
} }
else else
@ -349,7 +349,7 @@ AcpiNsCheckPackage (
Package->RetInfo3.TailObjectType, i); Package->RetInfo3.TailObjectType, i);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
} }
@ -365,7 +365,7 @@ AcpiNsCheckPackage (
Info, Elements, ACPI_RTYPE_INTEGER, 0); Info, Elements, ACPI_RTYPE_INTEGER, 0);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
Elements++; Elements++;
@ -384,7 +384,7 @@ AcpiNsCheckPackage (
Info, Elements, ACPI_RTYPE_INTEGER, 0); Info, Elements, ACPI_RTYPE_INTEGER, 0);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
/* /*
@ -428,7 +428,7 @@ AcpiNsCheckPackage (
Info, ReturnObject, ReturnObjectPtr); Info, ReturnObject, ReturnObjectPtr);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
/* Update locals to point to the new package (of 1 element) */ /* Update locals to point to the new package (of 1 element) */
@ -466,7 +466,7 @@ AcpiNsCheckPackage (
Package->RetInfo.ObjectType1, 0); Package->RetInfo.ObjectType1, 0);
if (ACPI_FAILURE(Status)) if (ACPI_FAILURE(Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
/* Validate length of the UUID buffer */ /* Validate length of the UUID buffer */
@ -475,14 +475,14 @@ AcpiNsCheckPackage (
{ {
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname,
Info->NodeFlags, "Invalid length for UUID Buffer")); Info->NodeFlags, "Invalid length for UUID Buffer"));
return (AE_AML_OPERAND_VALUE); return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
} }
Status = AcpiNsCheckObjectType(Info, Elements + 1, Status = AcpiNsCheckObjectType(Info, Elements + 1,
Package->RetInfo.ObjectType2, 0); Package->RetInfo.ObjectType2, 0);
if (ACPI_FAILURE(Status)) if (ACPI_FAILURE(Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
Elements += 2; Elements += 2;
@ -498,10 +498,10 @@ AcpiNsCheckPackage (
"Invalid internal return type in table entry: %X", "Invalid internal return type in table entry: %X",
Package->RetInfo.Type)); Package->RetInfo.Type));
return (AE_AML_INTERNAL); return_ACPI_STATUS (AE_AML_INTERNAL);
} }
return (Status); return_ACPI_STATUS (Status);
PackageTooSmall: PackageTooSmall:
@ -512,7 +512,7 @@ AcpiNsCheckPackage (
"Return Package is too small - found %u elements, expected %u", "Return Package is too small - found %u elements, expected %u",
Count, ExpectedCount)); Count, ExpectedCount));
return (AE_AML_OPERAND_VALUE); return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
} }
@ -865,6 +865,8 @@ AcpiNsCheckPackageElements (
UINT32 i; UINT32 i;
ACPI_FUNCTION_TRACE (NsCheckPackageElements);
/* /*
* Up to two groups of package elements are supported by the data * Up to two groups of package elements are supported by the data
* structure. All elements in each group must be of the same type. * structure. All elements in each group must be of the same type.
@ -876,7 +878,7 @@ AcpiNsCheckPackageElements (
Type1, i + StartIndex); Type1, i + StartIndex);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
ThisElement++; ThisElement++;
@ -888,11 +890,11 @@ AcpiNsCheckPackageElements (
Type2, (i + Count1 + StartIndex)); Type2, (i + Count1 + StartIndex));
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
ThisElement++; ThisElement++;
} }
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }

View File

@ -321,16 +321,18 @@ AcpiNsComplexRepairs (
ACPI_STATUS Status; ACPI_STATUS Status;
ACPI_FUNCTION_TRACE (NsComplexRepairs);
/* Check if this name is in the list of repairable names */ /* Check if this name is in the list of repairable names */
Predefined = AcpiNsMatchComplexRepair (Node); Predefined = AcpiNsMatchComplexRepair (Node);
if (!Predefined) if (!Predefined)
{ {
return (ValidateStatus); return_ACPI_STATUS (ValidateStatus);
} }
Status = Predefined->RepairFunction (Info, ReturnObjectPtr); Status = Predefined->RepairFunction (Info, ReturnObjectPtr);
return (Status); return_ACPI_STATUS (Status);
} }
@ -526,20 +528,21 @@ AcpiNsRepair_CID (
UINT16 OriginalRefCount; UINT16 OriginalRefCount;
UINT32 i; UINT32 i;
ACPI_FUNCTION_TRACE (NsRepair_CID);
/* Check for _CID as a simple string */ /* Check for _CID as a simple string */
if (ReturnObject->Common.Type == ACPI_TYPE_STRING) if (ReturnObject->Common.Type == ACPI_TYPE_STRING)
{ {
Status = AcpiNsRepair_HID (Info, ReturnObjectPtr); Status = AcpiNsRepair_HID (Info, ReturnObjectPtr);
return (Status); return_ACPI_STATUS (Status);
} }
/* Exit if not a Package */ /* Exit if not a Package */
if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE) if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
{ {
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* Examine each element of the _CID package */ /* Examine each element of the _CID package */
@ -553,7 +556,7 @@ AcpiNsRepair_CID (
Status = AcpiNsRepair_HID (Info, ElementPtr); Status = AcpiNsRepair_HID (Info, ElementPtr);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return (Status); return_ACPI_STATUS (Status);
} }
if (OriginalElement != *ElementPtr) if (OriginalElement != *ElementPtr)
@ -567,7 +570,7 @@ AcpiNsRepair_CID (
ElementPtr++; ElementPtr++;
} }
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
@ -687,9 +690,8 @@ AcpiNsRepair_HID (
ACPI_OPERAND_OBJECT **ReturnObjectPtr) ACPI_OPERAND_OBJECT **ReturnObjectPtr)
{ {
ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
ACPI_OPERAND_OBJECT *NewString;
char *Source;
char *Dest; char *Dest;
char *Source;
ACPI_FUNCTION_NAME (NsRepair_HID); ACPI_FUNCTION_NAME (NsRepair_HID);
@ -699,7 +701,7 @@ AcpiNsRepair_HID (
if (ReturnObject->Common.Type != ACPI_TYPE_STRING) if (ReturnObject->Common.Type != ACPI_TYPE_STRING)
{ {
return (AE_OK); return_ACPI_STATUS (AE_OK);
} }
if (ReturnObject->String.Length == 0) if (ReturnObject->String.Length == 0)
@ -711,15 +713,7 @@ AcpiNsRepair_HID (
/* Return AE_OK anyway, let driver handle it */ /* Return AE_OK anyway, let driver handle it */
Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
return (AE_OK); return_ACPI_STATUS (AE_OK);
}
/* It is simplest to always create a new string object */
NewString = AcpiUtCreateStringObject (ReturnObject->String.Length);
if (!NewString)
{
return (AE_NO_MEMORY);
} }
/* /*
@ -732,7 +726,7 @@ AcpiNsRepair_HID (
if (*Source == '*') if (*Source == '*')
{ {
Source++; Source++;
NewString->String.Length--; ReturnObject->String.Length--;
ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
"%s: Removed invalid leading asterisk\n", Info->FullPathname)); "%s: Removed invalid leading asterisk\n", Info->FullPathname));
@ -746,14 +740,13 @@ AcpiNsRepair_HID (
* "NNNN####" where N is an uppercase letter or decimal digit, and * "NNNN####" where N is an uppercase letter or decimal digit, and
* # is a hex digit. * # is a hex digit.
*/ */
for (Dest = NewString->String.Pointer; *Source; Dest++, Source++) for (Dest = ReturnObject->String.Pointer; *Source; Dest++, Source++)
{ {
*Dest = (char) toupper ((int) *Source); *Dest = (char) toupper ((int) *Source);
} }
ReturnObject->String.Pointer[ReturnObject->String.Length] = 0;
AcpiUtRemoveReference (ReturnObject); return_ACPI_STATUS (AE_OK);
*ReturnObjectPtr = NewString;
return (AE_OK);
} }

View File

@ -155,7 +155,7 @@
/* /*
* Common set of includes for all ACPICA source files. * Common set of includes for all ACPICA source files.
* We put them here because we don't want to duplicate them * We put them here because we don't want to duplicate them
* in the the source code again and again. * in the source code again and again.
* *
* Note: The order of these include files is important. * Note: The order of these include files is important.
*/ */

View File

@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20200925 #define ACPI_CA_VERSION 0x20201113
#include <contrib/dev/acpica/include/acconfig.h> #include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/include/actypes.h> #include <contrib/dev/acpica/include/actypes.h>

View File

@ -181,6 +181,7 @@
/* NVDIMM - NFIT table */ /* NVDIMM - NFIT table */
#define UUID_NFIT_DIMM "4309ac30-0d11-11e4-9191-0800200c9a66"
#define UUID_VOLATILE_MEMORY "7305944f-fdda-44e3-b16c-3f22d252e5d0" #define UUID_VOLATILE_MEMORY "7305944f-fdda-44e3-b16c-3f22d252e5d0"
#define UUID_PERSISTENT_MEMORY "66f0d379-b4f3-4074-ac43-0d3318b78cdb" #define UUID_PERSISTENT_MEMORY "66f0d379-b4f3-4074-ac43-0d3318b78cdb"
#define UUID_CONTROL_REGION "92f701f6-13b4-405d-910b-299367e8234c" #define UUID_CONTROL_REGION "92f701f6-13b4-405d-910b-299367e8234c"
@ -189,6 +190,10 @@
#define UUID_VOLATILE_VIRTUAL_CD "3d5abd30-4175-87ce-6d64-d2ade523c4bb" #define UUID_VOLATILE_VIRTUAL_CD "3d5abd30-4175-87ce-6d64-d2ade523c4bb"
#define UUID_PERSISTENT_VIRTUAL_DISK "5cea02c9-4d07-69d3-269f-4496fbe096f9" #define UUID_PERSISTENT_VIRTUAL_DISK "5cea02c9-4d07-69d3-269f-4496fbe096f9"
#define UUID_PERSISTENT_VIRTUAL_CD "08018188-42cd-bb48-100f-5387d53ded3d" #define UUID_PERSISTENT_VIRTUAL_CD "08018188-42cd-bb48-100f-5387d53ded3d"
#define UUID_NFIT_DIMM_N_MSFT "1ee68b36-d4bd-4a1a-9a16-4f8e53d46e05"
#define UUID_NFIT_DIMM_N_HPE1 "9002c334-acf3-4c0e-9642-a235f0d53bc6"
#define UUID_NFIT_DIMM_N_HPE2 "5008664b-b758-41a0-a03c-27c2f2d04f7e"
#define UUID_NFIT_DIMM_N_HYPERV "5746c5f2-a9a2-4264-ad0e-e4ddc9e09e80"
/* Processor Properties (ACPI 6.2) */ /* Processor Properties (ACPI 6.2) */