summaryrefslogtreecommitdiff
path: root/source/compiler/aslprepkg.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler/aslprepkg.c')
-rw-r--r--source/compiler/aslprepkg.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/source/compiler/aslprepkg.c b/source/compiler/aslprepkg.c
index 037329a0d432..eb621274f620 100644
--- a/source/compiler/aslprepkg.c
+++ b/source/compiler/aslprepkg.c
@@ -151,6 +151,7 @@ ApCheckPackage (
case ACPI_PTYPE2_FIXED:
case ACPI_PTYPE2_MIN:
case ACPI_PTYPE2_FIX_VAR:
+ case ACPI_PTYPE2_VAR_VAR:
default:
break;
@@ -324,6 +325,32 @@ ApCheckPackage (
break;
+ case ACPI_PTYPE2_VAR_VAR:
+
+ /* Check for minimum size (ints at beginning + 1 subpackage) */
+
+ ExpectedCount = Package->RetInfo4.Count1 + 1;
+ if (Count < ExpectedCount)
+ {
+ goto PackageTooSmall;
+ }
+
+ /* Check the non-package elements at beginning of main package */
+
+ for (i = 0; i < Package->RetInfo4.Count1; ++i)
+ {
+ Status = ApCheckObjectType (Predefined->Info.Name, Op,
+ Package->RetInfo4.ObjectType1, i);
+ Op = Op->Asl.Next;
+ }
+
+ /* Examine the variable-length list of subpackages */
+
+ ApCheckPackageList (Predefined->Info.Name, Op,
+ Package, Package->RetInfo4.Count1, Count);
+
+ break;
+
case ACPI_PTYPE2:
case ACPI_PTYPE2_FIXED:
case ACPI_PTYPE2_MIN:
@@ -427,6 +454,7 @@ ApCheckPackageElements (
* ACPI_PTYPE2_MIN
* ACPI_PTYPE2_COUNT
* ACPI_PTYPE2_FIX_VAR
+ * ACPI_PTYPE2_VAR_VAR
*
******************************************************************************/
@@ -473,9 +501,12 @@ ApCheckPackageList (
Count = (UINT32) Op->Asl.Value.Integer;
Op = Op->Asl.Next;
- /* The subpackage must have at least one element */
-
- if (!Count)
+ /*
+ * Most subpackage must have at least one element, with
+ * only rare exceptions. (_RDI)
+ */
+ if (!Count &&
+ (Package->RetInfo.Type != ACPI_PTYPE2_VAR_VAR))
{
ApZeroLengthPackage (PredefinedName, SubPackageOp);
goto NextSubpackage;
@@ -533,6 +564,25 @@ ApCheckPackageList (
Count - Package->RetInfo.Count1);
break;
+ case ACPI_PTYPE2_VAR_VAR:
+ /*
+ * Must have at least the minimum number elements.
+ * A zero PkgCount means the number of elements is variable.
+ */
+ ExpectedCount = Package->RetInfo4.PkgCount;
+ if (ExpectedCount && (Count < ExpectedCount))
+ {
+ ApPackageTooSmall (PredefinedName, SubPackageOp,
+ Count, 1);
+ break;
+ }
+
+ ApCheckPackageElements (PredefinedName, Op,
+ Package->RetInfo4.SubObjectTypes,
+ Package->RetInfo4.PkgCount,
+ 0, 0);
+ break;
+
case ACPI_PTYPE2_FIXED:
/* Each subpackage has a fixed length */