19c48c75eSJung-uk Kim /****************************************************************************** 29c48c75eSJung-uk Kim * 39c48c75eSJung-uk Kim * Module Name: aslprepkg - support for ACPI predefined name package objects 49c48c75eSJung-uk Kim * 59c48c75eSJung-uk Kim *****************************************************************************/ 69c48c75eSJung-uk Kim 79c48c75eSJung-uk Kim /* 8*313a0c13SJung-uk Kim * Copyright (C) 2000 - 2014, Intel Corp. 99c48c75eSJung-uk Kim * All rights reserved. 109c48c75eSJung-uk Kim * 119c48c75eSJung-uk Kim * Redistribution and use in source and binary forms, with or without 129c48c75eSJung-uk Kim * modification, are permitted provided that the following conditions 139c48c75eSJung-uk Kim * are met: 149c48c75eSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 159c48c75eSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 169c48c75eSJung-uk Kim * without modification. 179c48c75eSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 189c48c75eSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 199c48c75eSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 209c48c75eSJung-uk Kim * including a substantially similar Disclaimer requirement for further 219c48c75eSJung-uk Kim * binary redistribution. 229c48c75eSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 239c48c75eSJung-uk Kim * of any contributors may be used to endorse or promote products derived 249c48c75eSJung-uk Kim * from this software without specific prior written permission. 259c48c75eSJung-uk Kim * 269c48c75eSJung-uk Kim * Alternatively, this software may be distributed under the terms of the 279c48c75eSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 289c48c75eSJung-uk Kim * Software Foundation. 299c48c75eSJung-uk Kim * 309c48c75eSJung-uk Kim * NO WARRANTY 319c48c75eSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 329c48c75eSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 339c48c75eSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 349c48c75eSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 359c48c75eSJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 369c48c75eSJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 379c48c75eSJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 389c48c75eSJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 399c48c75eSJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 409c48c75eSJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 419c48c75eSJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 429c48c75eSJung-uk Kim */ 439c48c75eSJung-uk Kim 449c48c75eSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 459c48c75eSJung-uk Kim #include "aslcompiler.y.h" 469c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h> 479c48c75eSJung-uk Kim 489c48c75eSJung-uk Kim 499c48c75eSJung-uk Kim #define _COMPONENT ACPI_COMPILER 509c48c75eSJung-uk Kim ACPI_MODULE_NAME ("aslprepkg") 519c48c75eSJung-uk Kim 529c48c75eSJung-uk Kim 539c48c75eSJung-uk Kim /* Local prototypes */ 549c48c75eSJung-uk Kim 559c48c75eSJung-uk Kim static void 569c48c75eSJung-uk Kim ApCheckPackageElements ( 579c48c75eSJung-uk Kim const char *PredefinedName, 589c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 599c48c75eSJung-uk Kim UINT8 Type1, 609c48c75eSJung-uk Kim UINT32 Count1, 619c48c75eSJung-uk Kim UINT8 Type2, 629c48c75eSJung-uk Kim UINT32 Count2); 639c48c75eSJung-uk Kim 649c48c75eSJung-uk Kim static void 659c48c75eSJung-uk Kim ApCheckPackageList ( 669c48c75eSJung-uk Kim const char *PredefinedName, 679c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 689c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package, 699c48c75eSJung-uk Kim UINT32 StartIndex, 709c48c75eSJung-uk Kim UINT32 Count); 719c48c75eSJung-uk Kim 729c48c75eSJung-uk Kim static void 739c48c75eSJung-uk Kim ApPackageTooSmall ( 749c48c75eSJung-uk Kim const char *PredefinedName, 759c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 769c48c75eSJung-uk Kim UINT32 Count, 779c48c75eSJung-uk Kim UINT32 ExpectedCount); 789c48c75eSJung-uk Kim 799c48c75eSJung-uk Kim static void 809c48c75eSJung-uk Kim ApZeroLengthPackage ( 819c48c75eSJung-uk Kim const char *PredefinedName, 829c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op); 839c48c75eSJung-uk Kim 849c48c75eSJung-uk Kim static void 859c48c75eSJung-uk Kim ApPackageTooLarge ( 869c48c75eSJung-uk Kim const char *PredefinedName, 879c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 889c48c75eSJung-uk Kim UINT32 Count, 899c48c75eSJung-uk Kim UINT32 ExpectedCount); 909c48c75eSJung-uk Kim 919c48c75eSJung-uk Kim 929c48c75eSJung-uk Kim /******************************************************************************* 939c48c75eSJung-uk Kim * 949c48c75eSJung-uk Kim * FUNCTION: ApCheckPackage 959c48c75eSJung-uk Kim * 969c48c75eSJung-uk Kim * PARAMETERS: ParentOp - Parser op for the package 97895f26a9SJung-uk Kim * Predefined - Pointer to package-specific info for 98895f26a9SJung-uk Kim * the method 999c48c75eSJung-uk Kim * 1009c48c75eSJung-uk Kim * RETURN: None 1019c48c75eSJung-uk Kim * 1029c48c75eSJung-uk Kim * DESCRIPTION: Top-level validation for predefined name return package 1039c48c75eSJung-uk Kim * objects. 1049c48c75eSJung-uk Kim * 1059c48c75eSJung-uk Kim ******************************************************************************/ 1069c48c75eSJung-uk Kim 1079c48c75eSJung-uk Kim void 1089c48c75eSJung-uk Kim ApCheckPackage ( 1099c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 1109c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined) 1119c48c75eSJung-uk Kim { 1129c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op; 1139c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package; 1149c48c75eSJung-uk Kim ACPI_STATUS Status; 1159c48c75eSJung-uk Kim UINT32 ExpectedCount; 1169c48c75eSJung-uk Kim UINT32 Count; 1179c48c75eSJung-uk Kim UINT32 i; 1189c48c75eSJung-uk Kim 1199c48c75eSJung-uk Kim 1209c48c75eSJung-uk Kim /* The package info for this name is in the next table entry */ 1219c48c75eSJung-uk Kim 1229c48c75eSJung-uk Kim Package = Predefined + 1; 1239c48c75eSJung-uk Kim 1249c48c75eSJung-uk Kim /* First child is the package length */ 1259c48c75eSJung-uk Kim 1269c48c75eSJung-uk Kim Op = ParentOp->Asl.Child; 1279c48c75eSJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer; 1289c48c75eSJung-uk Kim 1299c48c75eSJung-uk Kim /* 1309c7c683cSJung-uk Kim * Many of the variable-length top-level packages are allowed to simply 1319c7c683cSJung-uk Kim * have zero elements. This allows the BIOS to tell the host that even 1329c7c683cSJung-uk Kim * though the predefined name/method exists, the feature is not supported. 1339c7c683cSJung-uk Kim * Other package types require one or more elements. In any case, there 1349c7c683cSJung-uk Kim * is no need to continue validation. 1359c48c75eSJung-uk Kim */ 1369c48c75eSJung-uk Kim if (!Count) 1379c48c75eSJung-uk Kim { 1389c7c683cSJung-uk Kim switch (Package->RetInfo.Type) 1399c48c75eSJung-uk Kim { 1409c7c683cSJung-uk Kim case ACPI_PTYPE1_FIXED: 1419c7c683cSJung-uk Kim case ACPI_PTYPE1_OPTION: 1429c7c683cSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT: 1439c7c683cSJung-uk Kim case ACPI_PTYPE2_REV_FIXED: 1449c7c683cSJung-uk Kim 1459c48c75eSJung-uk Kim ApZeroLengthPackage (Predefined->Info.Name, ParentOp); 1469c7c683cSJung-uk Kim break; 1479c7c683cSJung-uk Kim 1489c7c683cSJung-uk Kim case ACPI_PTYPE1_VAR: 1499c7c683cSJung-uk Kim case ACPI_PTYPE2: 1509c7c683cSJung-uk Kim case ACPI_PTYPE2_COUNT: 1519c7c683cSJung-uk Kim case ACPI_PTYPE2_FIXED: 1529c7c683cSJung-uk Kim case ACPI_PTYPE2_MIN: 1539c7c683cSJung-uk Kim case ACPI_PTYPE2_FIX_VAR: 1549c7c683cSJung-uk Kim default: 1559c7c683cSJung-uk Kim 1569c7c683cSJung-uk Kim break; 1579c48c75eSJung-uk Kim } 1589c7c683cSJung-uk Kim 1599c48c75eSJung-uk Kim return; 1609c48c75eSJung-uk Kim } 1619c48c75eSJung-uk Kim 1629c48c75eSJung-uk Kim /* Get the first element of the package */ 1639c48c75eSJung-uk Kim 1649c48c75eSJung-uk Kim Op = Op->Asl.Next; 1659c48c75eSJung-uk Kim 1669c48c75eSJung-uk Kim /* Decode the package type */ 1679c48c75eSJung-uk Kim 1689c48c75eSJung-uk Kim switch (Package->RetInfo.Type) 1699c48c75eSJung-uk Kim { 1709c48c75eSJung-uk Kim case ACPI_PTYPE1_FIXED: 1719c48c75eSJung-uk Kim /* 172*313a0c13SJung-uk Kim * The package count is fixed and there are no subpackages 1739c48c75eSJung-uk Kim * 1749c48c75eSJung-uk Kim * If package is too small, exit. 1759c48c75eSJung-uk Kim * If package is larger than expected, issue warning but continue 1769c48c75eSJung-uk Kim */ 1779c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 1789c48c75eSJung-uk Kim if (Count < ExpectedCount) 1799c48c75eSJung-uk Kim { 1809c48c75eSJung-uk Kim goto PackageTooSmall; 1819c48c75eSJung-uk Kim } 1829c48c75eSJung-uk Kim else if (Count > ExpectedCount) 1839c48c75eSJung-uk Kim { 1849c48c75eSJung-uk Kim ApPackageTooLarge (Predefined->Info.Name, ParentOp, 1859c48c75eSJung-uk Kim Count, ExpectedCount); 1869c48c75eSJung-uk Kim } 1879c48c75eSJung-uk Kim 1889c48c75eSJung-uk Kim /* Validate all elements of the package */ 1899c48c75eSJung-uk Kim 1909c48c75eSJung-uk Kim ApCheckPackageElements (Predefined->Info.Name, Op, 1919c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 1929c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, Package->RetInfo.Count2); 1939c48c75eSJung-uk Kim break; 1949c48c75eSJung-uk Kim 1959c48c75eSJung-uk Kim case ACPI_PTYPE1_VAR: 1969c48c75eSJung-uk Kim /* 197*313a0c13SJung-uk Kim * The package count is variable, there are no subpackages, 198895f26a9SJung-uk Kim * and all elements must be of the same type 1999c48c75eSJung-uk Kim */ 2009c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 2019c48c75eSJung-uk Kim { 2029c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2039c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, i); 2049c48c75eSJung-uk Kim Op = Op->Asl.Next; 2059c48c75eSJung-uk Kim } 2069c48c75eSJung-uk Kim break; 2079c48c75eSJung-uk Kim 2089c48c75eSJung-uk Kim case ACPI_PTYPE1_OPTION: 2099c48c75eSJung-uk Kim /* 210*313a0c13SJung-uk Kim * The package count is variable, there are no subpackages. 211895f26a9SJung-uk Kim * There are a fixed number of required elements, and a variable 212895f26a9SJung-uk Kim * number of optional elements. 2139c48c75eSJung-uk Kim * 2149c48c75eSJung-uk Kim * Check if package is at least as large as the minimum required 2159c48c75eSJung-uk Kim */ 2169c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo3.Count; 2179c48c75eSJung-uk Kim if (Count < ExpectedCount) 2189c48c75eSJung-uk Kim { 2199c48c75eSJung-uk Kim goto PackageTooSmall; 2209c48c75eSJung-uk Kim } 2219c48c75eSJung-uk Kim 2229c48c75eSJung-uk Kim /* Variable number of sub-objects */ 2239c48c75eSJung-uk Kim 2249c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 2259c48c75eSJung-uk Kim { 2269c48c75eSJung-uk Kim if (i < Package->RetInfo3.Count) 2279c48c75eSJung-uk Kim { 2289c48c75eSJung-uk Kim /* These are the required package elements (0, 1, or 2) */ 2299c48c75eSJung-uk Kim 2309c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2319c48c75eSJung-uk Kim Package->RetInfo3.ObjectType[i], i); 2329c48c75eSJung-uk Kim } 2339c48c75eSJung-uk Kim else 2349c48c75eSJung-uk Kim { 2359c48c75eSJung-uk Kim /* These are the optional package elements */ 2369c48c75eSJung-uk Kim 2379c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2389c48c75eSJung-uk Kim Package->RetInfo3.TailObjectType, i); 2399c48c75eSJung-uk Kim } 2409c48c75eSJung-uk Kim Op = Op->Asl.Next; 2419c48c75eSJung-uk Kim } 2429c48c75eSJung-uk Kim break; 2439c48c75eSJung-uk Kim 2449c48c75eSJung-uk Kim case ACPI_PTYPE2_REV_FIXED: 2459c48c75eSJung-uk Kim 2469c48c75eSJung-uk Kim /* First element is the (Integer) revision */ 2479c48c75eSJung-uk Kim 2489c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2499c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0); 2509c48c75eSJung-uk Kim 2519c48c75eSJung-uk Kim Op = Op->Asl.Next; 2529c48c75eSJung-uk Kim Count--; 2539c48c75eSJung-uk Kim 254*313a0c13SJung-uk Kim /* Examine the subpackages */ 2559c48c75eSJung-uk Kim 2569c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 2579c48c75eSJung-uk Kim Package, 1, Count); 2589c48c75eSJung-uk Kim break; 2599c48c75eSJung-uk Kim 2609c48c75eSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT: 2619c48c75eSJung-uk Kim 262*313a0c13SJung-uk Kim /* First element is the (Integer) count of subpackages to follow */ 2639c48c75eSJung-uk Kim 2649c48c75eSJung-uk Kim Status = ApCheckObjectType (Predefined->Info.Name, Op, 2659c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0); 2669c48c75eSJung-uk Kim 2679c48c75eSJung-uk Kim /* We must have an integer count from above (otherwise, use Count) */ 2689c48c75eSJung-uk Kim 2699c48c75eSJung-uk Kim if (ACPI_SUCCESS (Status)) 2709c48c75eSJung-uk Kim { 2719c48c75eSJung-uk Kim /* 272895f26a9SJung-uk Kim * Count cannot be larger than the parent package length, but 273895f26a9SJung-uk Kim * allow it to be smaller. The >= accounts for the Integer above. 2749c48c75eSJung-uk Kim */ 2759c48c75eSJung-uk Kim ExpectedCount = (UINT32) Op->Asl.Value.Integer; 2769c48c75eSJung-uk Kim if (ExpectedCount >= Count) 2779c48c75eSJung-uk Kim { 2789c48c75eSJung-uk Kim goto PackageTooSmall; 2799c48c75eSJung-uk Kim } 2809c48c75eSJung-uk Kim 2819c48c75eSJung-uk Kim Count = ExpectedCount; 2829c48c75eSJung-uk Kim } 2839c48c75eSJung-uk Kim 2849c48c75eSJung-uk Kim Op = Op->Asl.Next; 2859c48c75eSJung-uk Kim 286*313a0c13SJung-uk Kim /* Examine the subpackages */ 2879c48c75eSJung-uk Kim 2889c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 2899c48c75eSJung-uk Kim Package, 1, Count); 2909c48c75eSJung-uk Kim break; 2919c48c75eSJung-uk Kim 292*313a0c13SJung-uk Kim case ACPI_PTYPE2_UUID_PAIR: 293*313a0c13SJung-uk Kim 294*313a0c13SJung-uk Kim /* The package contains a variable list of UUID Buffer/Package pairs */ 295*313a0c13SJung-uk Kim 296*313a0c13SJung-uk Kim /* The length of the package must be even */ 297*313a0c13SJung-uk Kim 298*313a0c13SJung-uk Kim if (Count & 1) 299*313a0c13SJung-uk Kim { 300*313a0c13SJung-uk Kim sprintf (MsgBuffer, "%4.4s: Package length, %d, must be even.", 301*313a0c13SJung-uk Kim Predefined->Info.Name, Count); 302*313a0c13SJung-uk Kim 303*313a0c13SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, 304*313a0c13SJung-uk Kim ParentOp->Asl.Child, MsgBuffer); 305*313a0c13SJung-uk Kim } 306*313a0c13SJung-uk Kim 307*313a0c13SJung-uk Kim /* Validate the alternating types */ 308*313a0c13SJung-uk Kim 309*313a0c13SJung-uk Kim for (i = 0; i < Count; ++i) 310*313a0c13SJung-uk Kim { 311*313a0c13SJung-uk Kim if (i & 1) 312*313a0c13SJung-uk Kim { 313*313a0c13SJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 314*313a0c13SJung-uk Kim Package->RetInfo.ObjectType2, i); 315*313a0c13SJung-uk Kim } 316*313a0c13SJung-uk Kim else 317*313a0c13SJung-uk Kim { 318*313a0c13SJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 319*313a0c13SJung-uk Kim Package->RetInfo.ObjectType1, i); 320*313a0c13SJung-uk Kim } 321*313a0c13SJung-uk Kim 322*313a0c13SJung-uk Kim Op = Op->Asl.Next; 323*313a0c13SJung-uk Kim } 324*313a0c13SJung-uk Kim 325*313a0c13SJung-uk Kim break; 326*313a0c13SJung-uk Kim 3279c48c75eSJung-uk Kim case ACPI_PTYPE2: 3289c48c75eSJung-uk Kim case ACPI_PTYPE2_FIXED: 3299c48c75eSJung-uk Kim case ACPI_PTYPE2_MIN: 3309c48c75eSJung-uk Kim case ACPI_PTYPE2_COUNT: 3319c48c75eSJung-uk Kim case ACPI_PTYPE2_FIX_VAR: 3329c48c75eSJung-uk Kim /* 3339c48c75eSJung-uk Kim * These types all return a single Package that consists of a 334*313a0c13SJung-uk Kim * variable number of subpackages. 3359c48c75eSJung-uk Kim */ 3369c48c75eSJung-uk Kim 337*313a0c13SJung-uk Kim /* Examine the subpackages */ 3389c48c75eSJung-uk Kim 3399c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 3409c48c75eSJung-uk Kim Package, 0, Count); 3419c48c75eSJung-uk Kim break; 3429c48c75eSJung-uk Kim 3439c48c75eSJung-uk Kim default: 3449c48c75eSJung-uk Kim return; 3459c48c75eSJung-uk Kim } 3469c48c75eSJung-uk Kim 3479c48c75eSJung-uk Kim return; 3489c48c75eSJung-uk Kim 3499c48c75eSJung-uk Kim PackageTooSmall: 3509c48c75eSJung-uk Kim ApPackageTooSmall (Predefined->Info.Name, ParentOp, 3519c48c75eSJung-uk Kim Count, ExpectedCount); 3529c48c75eSJung-uk Kim } 3539c48c75eSJung-uk Kim 3549c48c75eSJung-uk Kim 3559c48c75eSJung-uk Kim /******************************************************************************* 3569c48c75eSJung-uk Kim * 3579c48c75eSJung-uk Kim * FUNCTION: ApCheckPackageElements 3589c48c75eSJung-uk Kim * 359895f26a9SJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 3609c48c75eSJung-uk Kim * Op - Parser op for the package 3619c48c75eSJung-uk Kim * Type1 - Object type for first group 3629c48c75eSJung-uk Kim * Count1 - Count for first group 3639c48c75eSJung-uk Kim * Type2 - Object type for second group 3649c48c75eSJung-uk Kim * Count2 - Count for second group 3659c48c75eSJung-uk Kim * 3669c48c75eSJung-uk Kim * RETURN: None 3679c48c75eSJung-uk Kim * 3689c48c75eSJung-uk Kim * DESCRIPTION: Validate all elements of a package. Works with packages that 3699c48c75eSJung-uk Kim * are defined to contain up to two groups of different object 3709c48c75eSJung-uk Kim * types. 3719c48c75eSJung-uk Kim * 3729c48c75eSJung-uk Kim ******************************************************************************/ 3739c48c75eSJung-uk Kim 3749c48c75eSJung-uk Kim static void 3759c48c75eSJung-uk Kim ApCheckPackageElements ( 3769c48c75eSJung-uk Kim const char *PredefinedName, 3779c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 3789c48c75eSJung-uk Kim UINT8 Type1, 3799c48c75eSJung-uk Kim UINT32 Count1, 3809c48c75eSJung-uk Kim UINT8 Type2, 3819c48c75eSJung-uk Kim UINT32 Count2) 3829c48c75eSJung-uk Kim { 3839c48c75eSJung-uk Kim UINT32 i; 3849c48c75eSJung-uk Kim 3859c48c75eSJung-uk Kim 3869c48c75eSJung-uk Kim /* 3879c48c75eSJung-uk Kim * Up to two groups of package elements are supported by the data 3889c48c75eSJung-uk Kim * structure. All elements in each group must be of the same type. 3899c48c75eSJung-uk Kim * The second group can have a count of zero. 3909c48c75eSJung-uk Kim * 3919c48c75eSJung-uk Kim * Aborts check upon a NULL package element, as this means (at compile 3929c48c75eSJung-uk Kim * time) that the remainder of the package elements are also NULL 3939c48c75eSJung-uk Kim * (This is the only way to create NULL package elements.) 3949c48c75eSJung-uk Kim */ 3959c48c75eSJung-uk Kim for (i = 0; (i < Count1) && Op; i++) 3969c48c75eSJung-uk Kim { 3979c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, Type1, i); 3989c48c75eSJung-uk Kim Op = Op->Asl.Next; 3999c48c75eSJung-uk Kim } 4009c48c75eSJung-uk Kim 4019c48c75eSJung-uk Kim for (i = 0; (i < Count2) && Op; i++) 4029c48c75eSJung-uk Kim { 4039c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, Type2, (i + Count1)); 4049c48c75eSJung-uk Kim Op = Op->Asl.Next; 4059c48c75eSJung-uk Kim } 4069c48c75eSJung-uk Kim } 4079c48c75eSJung-uk Kim 4089c48c75eSJung-uk Kim 4099c48c75eSJung-uk Kim /******************************************************************************* 4109c48c75eSJung-uk Kim * 4119c48c75eSJung-uk Kim * FUNCTION: ApCheckPackageList 4129c48c75eSJung-uk Kim * 4139c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 4149c48c75eSJung-uk Kim * ParentOp - Parser op of the parent package 4159c48c75eSJung-uk Kim * Package - Package info for this predefined name 4169c48c75eSJung-uk Kim * StartIndex - Index in parent package where list begins 4179c48c75eSJung-uk Kim * ParentCount - Element count of parent package 4189c48c75eSJung-uk Kim * 4199c48c75eSJung-uk Kim * RETURN: None 4209c48c75eSJung-uk Kim * 4219c48c75eSJung-uk Kim * DESCRIPTION: Validate the individual package elements for a predefined name. 4229c48c75eSJung-uk Kim * Handles the cases where the predefined name is defined as a 4239c48c75eSJung-uk Kim * Package of Packages (subpackages). These are the types: 4249c48c75eSJung-uk Kim * 4259c48c75eSJung-uk Kim * ACPI_PTYPE2 4269c48c75eSJung-uk Kim * ACPI_PTYPE2_FIXED 4279c48c75eSJung-uk Kim * ACPI_PTYPE2_MIN 4289c48c75eSJung-uk Kim * ACPI_PTYPE2_COUNT 4299c48c75eSJung-uk Kim * ACPI_PTYPE2_FIX_VAR 4309c48c75eSJung-uk Kim * 4319c48c75eSJung-uk Kim ******************************************************************************/ 4329c48c75eSJung-uk Kim 4339c48c75eSJung-uk Kim static void 4349c48c75eSJung-uk Kim ApCheckPackageList ( 4359c48c75eSJung-uk Kim const char *PredefinedName, 4369c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 4379c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package, 4389c48c75eSJung-uk Kim UINT32 StartIndex, 4399c48c75eSJung-uk Kim UINT32 ParentCount) 4409c48c75eSJung-uk Kim { 4419c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *SubPackageOp = ParentOp; 4429c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op; 4439c48c75eSJung-uk Kim ACPI_STATUS Status; 4449c48c75eSJung-uk Kim UINT32 Count; 4459c48c75eSJung-uk Kim UINT32 ExpectedCount; 4469c48c75eSJung-uk Kim UINT32 i; 4479c48c75eSJung-uk Kim UINT32 j; 4489c48c75eSJung-uk Kim 4499c48c75eSJung-uk Kim 4509c48c75eSJung-uk Kim /* 4519c48c75eSJung-uk Kim * Validate each subpackage in the parent Package 4529c48c75eSJung-uk Kim * 4539c48c75eSJung-uk Kim * Note: We ignore NULL package elements on the assumption that 4549c48c75eSJung-uk Kim * they will be initialized by the BIOS or other ASL code. 4559c48c75eSJung-uk Kim */ 4569c48c75eSJung-uk Kim for (i = 0; (i < ParentCount) && SubPackageOp; i++) 4579c48c75eSJung-uk Kim { 4589c48c75eSJung-uk Kim /* Each object in the list must be of type Package */ 4599c48c75eSJung-uk Kim 4609c48c75eSJung-uk Kim Status = ApCheckObjectType (PredefinedName, SubPackageOp, 4619c48c75eSJung-uk Kim ACPI_RTYPE_PACKAGE, i + StartIndex); 4629c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 4639c48c75eSJung-uk Kim { 4649c48c75eSJung-uk Kim goto NextSubpackage; 4659c48c75eSJung-uk Kim } 4669c48c75eSJung-uk Kim 4679c48c75eSJung-uk Kim /* Examine the different types of expected subpackages */ 4689c48c75eSJung-uk Kim 4699c48c75eSJung-uk Kim Op = SubPackageOp->Asl.Child; 4709c48c75eSJung-uk Kim 4719c48c75eSJung-uk Kim /* First child is the package length */ 4729c48c75eSJung-uk Kim 4739c48c75eSJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer; 4749c48c75eSJung-uk Kim Op = Op->Asl.Next; 4759c48c75eSJung-uk Kim 4769c48c75eSJung-uk Kim /* The subpackage must have at least one element */ 4779c48c75eSJung-uk Kim 4789c48c75eSJung-uk Kim if (!Count) 4799c48c75eSJung-uk Kim { 4809c48c75eSJung-uk Kim ApZeroLengthPackage (PredefinedName, SubPackageOp); 4819c48c75eSJung-uk Kim goto NextSubpackage; 4829c48c75eSJung-uk Kim } 4839c48c75eSJung-uk Kim 4849c48c75eSJung-uk Kim /* 4859c48c75eSJung-uk Kim * Decode the package type. 4869c48c75eSJung-uk Kim * PTYPE2 indicates that a "package of packages" is expected for 4879c48c75eSJung-uk Kim * this name. The various flavors of PTYPE2 indicate the number 4889c48c75eSJung-uk Kim * and format of the subpackages. 4899c48c75eSJung-uk Kim */ 4909c48c75eSJung-uk Kim switch (Package->RetInfo.Type) 4919c48c75eSJung-uk Kim { 4929c48c75eSJung-uk Kim case ACPI_PTYPE2: 4939c48c75eSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT: 4949c48c75eSJung-uk Kim case ACPI_PTYPE2_REV_FIXED: 4959c48c75eSJung-uk Kim 4969c48c75eSJung-uk Kim /* Each subpackage has a fixed number of elements */ 4979c48c75eSJung-uk Kim 4989c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 4999c48c75eSJung-uk Kim if (Count < ExpectedCount) 5009c48c75eSJung-uk Kim { 5019c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 5029c48c75eSJung-uk Kim Count, ExpectedCount); 5039c48c75eSJung-uk Kim break; 5049c48c75eSJung-uk Kim } 505*313a0c13SJung-uk Kim if (Count > ExpectedCount) 506*313a0c13SJung-uk Kim { 507*313a0c13SJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp, 508*313a0c13SJung-uk Kim Count, ExpectedCount); 509*313a0c13SJung-uk Kim break; 510*313a0c13SJung-uk Kim } 5119c48c75eSJung-uk Kim 5129c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 5139c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 5149c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, Package->RetInfo.Count2); 5159c48c75eSJung-uk Kim break; 5169c48c75eSJung-uk Kim 5179c48c75eSJung-uk Kim case ACPI_PTYPE2_FIX_VAR: 5189c48c75eSJung-uk Kim /* 5199c48c75eSJung-uk Kim * Each subpackage has a fixed number of elements and an 5209c48c75eSJung-uk Kim * optional element 5219c48c75eSJung-uk Kim */ 5229c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 5239c48c75eSJung-uk Kim if (Count < ExpectedCount) 5249c48c75eSJung-uk Kim { 5259c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 5269c48c75eSJung-uk Kim Count, ExpectedCount); 5279c48c75eSJung-uk Kim break; 5289c48c75eSJung-uk Kim } 5299c48c75eSJung-uk Kim 5309c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 5319c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 5329c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, 5339c48c75eSJung-uk Kim Count - Package->RetInfo.Count1); 5349c48c75eSJung-uk Kim break; 5359c48c75eSJung-uk Kim 5369c48c75eSJung-uk Kim case ACPI_PTYPE2_FIXED: 5379c48c75eSJung-uk Kim 538*313a0c13SJung-uk Kim /* Each subpackage has a fixed length */ 5399c48c75eSJung-uk Kim 5409c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo2.Count; 5419c48c75eSJung-uk Kim if (Count < ExpectedCount) 5429c48c75eSJung-uk Kim { 5439c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 5449c48c75eSJung-uk Kim Count, ExpectedCount); 5459c48c75eSJung-uk Kim break; 5469c48c75eSJung-uk Kim } 547*313a0c13SJung-uk Kim if (Count > ExpectedCount) 548*313a0c13SJung-uk Kim { 549*313a0c13SJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp, 550*313a0c13SJung-uk Kim Count, ExpectedCount); 551*313a0c13SJung-uk Kim break; 552*313a0c13SJung-uk Kim } 5539c48c75eSJung-uk Kim 5549c48c75eSJung-uk Kim /* Check each object/type combination */ 5559c48c75eSJung-uk Kim 5569c48c75eSJung-uk Kim for (j = 0; j < ExpectedCount; j++) 5579c48c75eSJung-uk Kim { 5589c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, 5599c48c75eSJung-uk Kim Package->RetInfo2.ObjectType[j], j); 5609c48c75eSJung-uk Kim 5619c48c75eSJung-uk Kim Op = Op->Asl.Next; 5629c48c75eSJung-uk Kim } 5639c48c75eSJung-uk Kim break; 5649c48c75eSJung-uk Kim 5659c48c75eSJung-uk Kim case ACPI_PTYPE2_MIN: 5669c48c75eSJung-uk Kim 567*313a0c13SJung-uk Kim /* Each subpackage has a variable but minimum length */ 5689c48c75eSJung-uk Kim 5699c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1; 5709c48c75eSJung-uk Kim if (Count < ExpectedCount) 5719c48c75eSJung-uk Kim { 5729c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 5739c48c75eSJung-uk Kim Count, ExpectedCount); 5749c48c75eSJung-uk Kim break; 5759c48c75eSJung-uk Kim } 5769c48c75eSJung-uk Kim 577*313a0c13SJung-uk Kim /* Check the type of each subpackage element */ 5789c48c75eSJung-uk Kim 5799c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 5809c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Count, 0, 0); 5819c48c75eSJung-uk Kim break; 5829c48c75eSJung-uk Kim 5839c48c75eSJung-uk Kim case ACPI_PTYPE2_COUNT: 5849c48c75eSJung-uk Kim /* 5859c48c75eSJung-uk Kim * First element is the (Integer) count of elements, including 5869c48c75eSJung-uk Kim * the count field (the ACPI name is NumElements) 5879c48c75eSJung-uk Kim */ 5889c48c75eSJung-uk Kim Status = ApCheckObjectType (PredefinedName, Op, 5899c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0); 5909c48c75eSJung-uk Kim 5919c48c75eSJung-uk Kim /* We must have an integer count from above (otherwise, use Count) */ 5929c48c75eSJung-uk Kim 5939c48c75eSJung-uk Kim if (ACPI_SUCCESS (Status)) 5949c48c75eSJung-uk Kim { 5959c48c75eSJung-uk Kim /* 5969c48c75eSJung-uk Kim * Make sure package is large enough for the Count and is 5979c48c75eSJung-uk Kim * is as large as the minimum size 5989c48c75eSJung-uk Kim */ 5999c48c75eSJung-uk Kim ExpectedCount = (UINT32) Op->Asl.Value.Integer; 6009c48c75eSJung-uk Kim 6019c48c75eSJung-uk Kim if (Count < ExpectedCount) 6029c48c75eSJung-uk Kim { 6039c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 6049c48c75eSJung-uk Kim Count, ExpectedCount); 6059c48c75eSJung-uk Kim break; 6069c48c75eSJung-uk Kim } 6079c48c75eSJung-uk Kim else if (Count > ExpectedCount) 6089c48c75eSJung-uk Kim { 6099c48c75eSJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp, 6109c48c75eSJung-uk Kim Count, ExpectedCount); 6119c48c75eSJung-uk Kim } 6129c48c75eSJung-uk Kim 6139c48c75eSJung-uk Kim /* Some names of this type have a minimum length */ 6149c48c75eSJung-uk Kim 6159c48c75eSJung-uk Kim if (Count < Package->RetInfo.Count1) 6169c48c75eSJung-uk Kim { 6179c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1; 6189c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 6199c48c75eSJung-uk Kim Count, ExpectedCount); 6209c48c75eSJung-uk Kim break; 6219c48c75eSJung-uk Kim } 6229c48c75eSJung-uk Kim 6239c48c75eSJung-uk Kim Count = ExpectedCount; 6249c48c75eSJung-uk Kim } 6259c48c75eSJung-uk Kim 626*313a0c13SJung-uk Kim /* Check the type of each subpackage element */ 6279c48c75eSJung-uk Kim 6289c48c75eSJung-uk Kim Op = Op->Asl.Next; 6299c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 6309c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, (Count - 1), 0, 0); 6319c48c75eSJung-uk Kim break; 6329c48c75eSJung-uk Kim 6339c48c75eSJung-uk Kim default: 6349c48c75eSJung-uk Kim break; 6359c48c75eSJung-uk Kim } 6369c48c75eSJung-uk Kim 6379c48c75eSJung-uk Kim NextSubpackage: 6389c48c75eSJung-uk Kim SubPackageOp = SubPackageOp->Asl.Next; 6399c48c75eSJung-uk Kim } 6409c48c75eSJung-uk Kim } 6419c48c75eSJung-uk Kim 6429c48c75eSJung-uk Kim 6439c48c75eSJung-uk Kim /******************************************************************************* 6449c48c75eSJung-uk Kim * 6459c48c75eSJung-uk Kim * FUNCTION: ApPackageTooSmall 6469c48c75eSJung-uk Kim * 6479c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 6489c48c75eSJung-uk Kim * Op - Current parser op 6499c48c75eSJung-uk Kim * Count - Actual package element count 6509c48c75eSJung-uk Kim * ExpectedCount - Expected package element count 6519c48c75eSJung-uk Kim * 6529c48c75eSJung-uk Kim * RETURN: None 6539c48c75eSJung-uk Kim * 6549c48c75eSJung-uk Kim * DESCRIPTION: Issue error message for a package that is smaller than 6559c48c75eSJung-uk Kim * required. 6569c48c75eSJung-uk Kim * 6579c48c75eSJung-uk Kim ******************************************************************************/ 6589c48c75eSJung-uk Kim 6599c48c75eSJung-uk Kim static void 6609c48c75eSJung-uk Kim ApPackageTooSmall ( 6619c48c75eSJung-uk Kim const char *PredefinedName, 6629c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 6639c48c75eSJung-uk Kim UINT32 Count, 6649c48c75eSJung-uk Kim UINT32 ExpectedCount) 6659c48c75eSJung-uk Kim { 6669c48c75eSJung-uk Kim 6679c48c75eSJung-uk Kim sprintf (MsgBuffer, "%s: length %u, required minimum is %u", 6689c48c75eSJung-uk Kim PredefinedName, Count, ExpectedCount); 6699c48c75eSJung-uk Kim 6709c48c75eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, MsgBuffer); 6719c48c75eSJung-uk Kim } 6729c48c75eSJung-uk Kim 6739c48c75eSJung-uk Kim 6749c48c75eSJung-uk Kim /******************************************************************************* 6759c48c75eSJung-uk Kim * 6769c48c75eSJung-uk Kim * FUNCTION: ApZeroLengthPackage 6779c48c75eSJung-uk Kim * 6789c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 6799c48c75eSJung-uk Kim * Op - Current parser op 6809c48c75eSJung-uk Kim * 6819c48c75eSJung-uk Kim * RETURN: None 6829c48c75eSJung-uk Kim * 6839c48c75eSJung-uk Kim * DESCRIPTION: Issue error message for a zero-length package (a package that 6849c48c75eSJung-uk Kim * is required to have a non-zero length). Variable length 6859c48c75eSJung-uk Kim * packages seem to be allowed to have zero length, however. 6869c48c75eSJung-uk Kim * Even if not allowed, BIOS code does it. 6879c48c75eSJung-uk Kim * 6889c48c75eSJung-uk Kim ******************************************************************************/ 6899c48c75eSJung-uk Kim 6909c48c75eSJung-uk Kim static void 6919c48c75eSJung-uk Kim ApZeroLengthPackage ( 6929c48c75eSJung-uk Kim const char *PredefinedName, 6939c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op) 6949c48c75eSJung-uk Kim { 6959c48c75eSJung-uk Kim 6969c48c75eSJung-uk Kim sprintf (MsgBuffer, "%s: length is zero", PredefinedName); 6979c48c75eSJung-uk Kim 6989c48c75eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, MsgBuffer); 6999c48c75eSJung-uk Kim } 7009c48c75eSJung-uk Kim 7019c48c75eSJung-uk Kim 7029c48c75eSJung-uk Kim /******************************************************************************* 7039c48c75eSJung-uk Kim * 7049c48c75eSJung-uk Kim * FUNCTION: ApPackageTooLarge 7059c48c75eSJung-uk Kim * 7069c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 7079c48c75eSJung-uk Kim * Op - Current parser op 7089c48c75eSJung-uk Kim * Count - Actual package element count 7099c48c75eSJung-uk Kim * ExpectedCount - Expected package element count 7109c48c75eSJung-uk Kim * 7119c48c75eSJung-uk Kim * RETURN: None 7129c48c75eSJung-uk Kim * 7139c48c75eSJung-uk Kim * DESCRIPTION: Issue a remark for a package that is larger than expected. 7149c48c75eSJung-uk Kim * 7159c48c75eSJung-uk Kim ******************************************************************************/ 7169c48c75eSJung-uk Kim 7179c48c75eSJung-uk Kim static void 7189c48c75eSJung-uk Kim ApPackageTooLarge ( 7199c48c75eSJung-uk Kim const char *PredefinedName, 7209c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 7219c48c75eSJung-uk Kim UINT32 Count, 7229c48c75eSJung-uk Kim UINT32 ExpectedCount) 7239c48c75eSJung-uk Kim { 7249c48c75eSJung-uk Kim 7259c48c75eSJung-uk Kim sprintf (MsgBuffer, "%s: length is %u, only %u required", 7269c48c75eSJung-uk Kim PredefinedName, Count, ExpectedCount); 7279c48c75eSJung-uk Kim 7289c48c75eSJung-uk Kim AslError (ASL_REMARK, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, MsgBuffer); 7299c48c75eSJung-uk Kim } 730