From 4758d649ae1bd804db6736d6e84b9589b414834e Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Sun, 19 Jul 2020 10:08:09 +0200 Subject: [PATCH] Sync ACPICA with Intel's version 20200717. * Do not increment OperationRegion reference counts for field units. * Fix some issues in iasl(8). For detailed list, please see sys/contrib/dev/acpica/changes.txt. --- sys/contrib/dev/acpica/changes.txt | 47 +++++++++++++++++++ .../dev/acpica/source/compiler/aslerror.c | 2 +- .../dev/acpica/source/compiler/aslexternal.c | 8 ++++ .../dev/acpica/source/compiler/aslload.c | 10 ++-- .../dev/acpica/source/compiler/aslmethod.c | 12 +++++ .../dev/acpica/source/compiler/aslxref.c | 4 +- .../source/components/executer/exprep.c | 4 -- .../source/components/utilities/utdelete.c | 6 +-- .../source/components/utilities/utids.c | 2 +- .../dev/acpica/source/include/acpixf.h | 2 +- .../dev/acpica/source/include/actypes.h | 2 +- .../acpica/source/include/platform/acmsvc.h | 3 ++ 12 files changed, 83 insertions(+), 19 deletions(-) diff --git a/sys/contrib/dev/acpica/changes.txt b/sys/contrib/dev/acpica/changes.txt index 32d7d5648f..a483f7ec92 100644 --- a/sys/contrib/dev/acpica/changes.txt +++ b/sys/contrib/dev/acpica/changes.txt @@ -1,6 +1,53 @@ ---------------------------------------- +17 July 2020. Summary of changes for version 20200717: + +This release is available at https://acpica.org/downloads + + +1) ACPICA kernel-resident subsystem: + +Do not increment OperationRegion reference counts for field units. Recent +server firmware has revealed that this reference count can overflow on +large servers that declare many field units (thousands) under the same +OperationRegion. This occurs because each field unit declaration will add +a reference count to the source OperationRegion. This release solves the +reference count overflow for OperationRegion objects by preventing +fieldUnits from incrementing their parent OperationRegion's reference +count. + +Replaced one-element arrays with flexible-arrays, which were introduced +in C99. + +Restored the readme file containing the directions for generation of +ACPICA from source on MSVC 2017. Updated the file for MSVC 2017. File is +located at: generate/msvc2017/readme.txt + +2) iASL Compiler/Disassembler and ACPICA tools: + +iASL: Fixed a regression found in version 20200214. Prevent iASL from +emitting an extra byte of garbage data when control methods declared a +single parameter type without using braces. This extra byte is known to +cause a blue screen on the Windows AML interpreter. + +iASL: Made a change to allow external declarations to specify the type of +a named object even when some name segments are not defined. +This change allows the following ASL code to compile (When DEV0 is not +defined or not defined yet): + + External (\_SB.DEV0.OBJ1, IntObj) + External (\_SB.DEV0, DeviceObj) + +iASL: Fixed a problem where method names in "Alias ()" statement could be +misinterpreted. They are now interpreted correctly as method invocations. + +iASL: capture a method parameter count (Within the Method info segment, +as well as the argument node) when using parameter type lists. + +---------------------------------------- + + 28 May 2020. Summary of changes for version 20200528: diff --git a/sys/contrib/dev/acpica/source/compiler/aslerror.c b/sys/contrib/dev/acpica/source/compiler/aslerror.c index 8fae779d63..150983429b 100644 --- a/sys/contrib/dev/acpica/source/compiler/aslerror.c +++ b/sys/contrib/dev/acpica/source/compiler/aslerror.c @@ -1056,7 +1056,7 @@ GetModifiedLevel ( UINT8 Level, UINT16 MessageId) { - UINT16 i; + UINT32 i; UINT16 ExceptionCode; diff --git a/sys/contrib/dev/acpica/source/compiler/aslexternal.c b/sys/contrib/dev/acpica/source/compiler/aslexternal.c index 315247be60..a05ba118df 100644 --- a/sys/contrib/dev/acpica/source/compiler/aslexternal.c +++ b/sys/contrib/dev/acpica/source/compiler/aslexternal.c @@ -200,6 +200,14 @@ ExDoExternal ( ExternType = AnMapObjTypeToBtype (ExternTypeOp); + if (ExternType != ACPI_BTYPE_METHOD) + { + /* + * If this is not a method, it has zero parameters this local variable + * is used only for methods + */ + ParamCount = 0; + } /* * The parser allows optional parameter return types regardless of the diff --git a/sys/contrib/dev/acpica/source/compiler/aslload.c b/sys/contrib/dev/acpica/source/compiler/aslload.c index bdc0d805e6..454fa8f5f0 100644 --- a/sys/contrib/dev/acpica/source/compiler/aslload.c +++ b/sys/contrib/dev/acpica/source/compiler/aslload.c @@ -1177,13 +1177,13 @@ LdAnalyzeExternals ( * previously declared External */ Node->Flags &= ~ANOBJ_IS_EXTERNAL; - Node->Type = (UINT8) ExternalOpType; + Node->Type = (UINT8) ActualOpType; /* Just retyped a node, probably will need to open a scope */ - if (AcpiNsOpensScope (ExternalOpType)) + if (AcpiNsOpensScope (ActualOpType)) { - Status = AcpiDsScopeStackPush (Node, ExternalOpType, WalkState); + Status = AcpiDsScopeStackPush (Node, ActualOpType, WalkState); if (ACPI_FAILURE (Status)) { return (Status); @@ -1204,11 +1204,11 @@ LdAnalyzeExternals ( } else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) && - (ExternalOpType == ACPI_TYPE_ANY)) + (ActualOpType == ACPI_TYPE_ANY)) { /* Allow update of externals of unknown type. */ - Node->Type = (UINT8) ExternalOpType; + Node->Type = (UINT8) ActualExternalOpType; Status = AE_OK; } diff --git a/sys/contrib/dev/acpica/source/compiler/aslmethod.c b/sys/contrib/dev/acpica/source/compiler/aslmethod.c index ff6fd47419..32b4b123f0 100644 --- a/sys/contrib/dev/acpica/source/compiler/aslmethod.c +++ b/sys/contrib/dev/acpica/source/compiler/aslmethod.c @@ -306,6 +306,8 @@ MtMethodAnalysisWalkBegin ( { ActualArgs = MtProcessParameterTypeList (NextType, MethodInfo->ValidArgTypes); + MethodInfo->NumArguments = ActualArgs; + ArgNode->Asl.Value.Integer |= ActualArgs; } if ((MethodInfo->NumArguments) && @@ -671,6 +673,16 @@ MtProcessParameterTypeList ( UINT8 ParameterCount = 0; + if (ParamTypeOp && ParamTypeOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) + { + /* Special case for a single parameter without braces */ + + TypeList[ParameterCount] = + MtProcessTypeOp (ParamTypeOp); + + return (1); + } + while (ParamTypeOp) { TypeList[ParameterCount] = diff --git a/sys/contrib/dev/acpica/source/compiler/aslxref.c b/sys/contrib/dev/acpica/source/compiler/aslxref.c index 4bbbe2bd91..9306af200f 100644 --- a/sys/contrib/dev/acpica/source/compiler/aslxref.c +++ b/sys/contrib/dev/acpica/source/compiler/aslxref.c @@ -994,12 +994,14 @@ XfNamespaceLocateBegin ( * invocation of the method, it is simply a reference to the method. * * September 2016: Removed DeRefOf from this list + * July 2020: Added Alias to this list */ if ((Op->Asl.Parent) && ((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))) + (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE) || + (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_ALIAS))) { return_ACPI_STATUS (AE_OK); } diff --git a/sys/contrib/dev/acpica/source/components/executer/exprep.c b/sys/contrib/dev/acpica/source/components/executer/exprep.c index 6ceac68f54..3074366d9a 100644 --- a/sys/contrib/dev/acpica/source/components/executer/exprep.c +++ b/sys/contrib/dev/acpica/source/components/executer/exprep.c @@ -651,10 +651,6 @@ AcpiExPrepFieldValue ( } } - /* An additional reference for the container */ - - AcpiUtAddReference (ObjDesc->Field.RegionObj); - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n", ObjDesc->Field.StartFieldBitOffset, diff --git a/sys/contrib/dev/acpica/source/components/utilities/utdelete.c b/sys/contrib/dev/acpica/source/components/utilities/utdelete.c index 502ff41321..aafd529593 100644 --- a/sys/contrib/dev/acpica/source/components/utilities/utdelete.c +++ b/sys/contrib/dev/acpica/source/components/utilities/utdelete.c @@ -749,11 +749,6 @@ AcpiUtUpdateObjectReference ( NextObject = Object->BufferField.BufferObj; break; - case ACPI_TYPE_LOCAL_REGION_FIELD: - - NextObject = Object->Field.RegionObj; - break; - case ACPI_TYPE_LOCAL_BANK_FIELD: NextObject = Object->BankField.BankObj; @@ -789,6 +784,7 @@ AcpiUtUpdateObjectReference ( } break; + case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_REGION: default: diff --git a/sys/contrib/dev/acpica/source/components/utilities/utids.c b/sys/contrib/dev/acpica/source/components/utilities/utids.c index e296c00a0b..34ae697ab3 100644 --- a/sys/contrib/dev/acpica/source/components/utilities/utids.c +++ b/sys/contrib/dev/acpica/source/components/utilities/utids.c @@ -435,7 +435,7 @@ AcpiUtExecute_CID ( * 3) Size of the actual CID strings */ CidListSize = sizeof (ACPI_PNP_DEVICE_ID_LIST) + - ((Count - 1) * sizeof (ACPI_PNP_DEVICE_ID)) + + (Count * sizeof (ACPI_PNP_DEVICE_ID)) + StringAreaSize; CidList = ACPI_ALLOCATE_ZEROED (CidListSize); diff --git a/sys/contrib/dev/acpica/source/include/acpixf.h b/sys/contrib/dev/acpica/source/include/acpixf.h index 2eafdeac6e..c1b55401a3 100644 --- a/sys/contrib/dev/acpica/source/include/acpixf.h +++ b/sys/contrib/dev/acpica/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20200528 +#define ACPI_CA_VERSION 0x20200717 #include "acconfig.h" #include "actypes.h" diff --git a/sys/contrib/dev/acpica/source/include/actypes.h b/sys/contrib/dev/acpica/source/include/actypes.h index 2666ebfbd3..0ec14a36ad 100644 --- a/sys/contrib/dev/acpica/source/include/actypes.h +++ b/sys/contrib/dev/acpica/source/include/actypes.h @@ -1379,7 +1379,7 @@ typedef struct acpi_pnp_device_id_list { UINT32 Count; /* Number of IDs in Ids array */ UINT32 ListSize; /* Size of list, including ID strings */ - ACPI_PNP_DEVICE_ID Ids[1]; /* ID array */ + ACPI_PNP_DEVICE_ID Ids[]; /* ID array */ } ACPI_PNP_DEVICE_ID_LIST; diff --git a/sys/contrib/dev/acpica/source/include/platform/acmsvc.h b/sys/contrib/dev/acpica/source/include/platform/acmsvc.h index a003f9fe7e..e1a2b51e07 100644 --- a/sys/contrib/dev/acpica/source/include/platform/acmsvc.h +++ b/sys/contrib/dev/acpica/source/include/platform/acmsvc.h @@ -275,6 +275,9 @@ /* warn C4131: uses old-style declarator (iASL compiler only) */ #pragma warning(disable:4459) +/* warn c4200: allow flexible arrays (of zero length) */ +#pragma warning(disable:4200) + #if _MSC_VER > 1200 /* Versions above VC++ 6 */ #pragma warning( disable : 4295 ) /* needed for acpredef.h array */ #endif -- 2.41.0