![]() |
|
|||
File indexing completed on 2025-05-11 08:24:03
0001 /****************************************************************************** 0002 * 0003 * Module Name: nspredef - Validation of ACPI predefined methods and objects 0004 * 0005 *****************************************************************************/ 0006 0007 /****************************************************************************** 0008 * 0009 * 1. Copyright Notice 0010 * 0011 * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 0012 * All rights reserved. 0013 * 0014 * 2. License 0015 * 0016 * 2.1. This is your license from Intel Corp. under its intellectual property 0017 * rights. You may have additional license terms from the party that provided 0018 * you this software, covering your right to use that party's intellectual 0019 * property rights. 0020 * 0021 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 0022 * copy of the source code appearing in this file ("Covered Code") an 0023 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 0024 * base code distributed originally by Intel ("Original Intel Code") to copy, 0025 * make derivatives, distribute, use and display any portion of the Covered 0026 * Code in any form, with the right to sublicense such rights; and 0027 * 0028 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 0029 * license (with the right to sublicense), under only those claims of Intel 0030 * patents that are infringed by the Original Intel Code, to make, use, sell, 0031 * offer to sell, and import the Covered Code and derivative works thereof 0032 * solely to the minimum extent necessary to exercise the above copyright 0033 * license, and in no event shall the patent license extend to any additions 0034 * to or modifications of the Original Intel Code. No other license or right 0035 * is granted directly or by implication, estoppel or otherwise; 0036 * 0037 * The above copyright and patent license is granted only if the following 0038 * conditions are met: 0039 * 0040 * 3. Conditions 0041 * 0042 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 0043 * Redistribution of source code of any substantial portion of the Covered 0044 * Code or modification with rights to further distribute source must include 0045 * the above Copyright Notice, the above License, this list of Conditions, 0046 * and the following Disclaimer and Export Compliance provision. In addition, 0047 * Licensee must cause all Covered Code to which Licensee contributes to 0048 * contain a file documenting the changes Licensee made to create that Covered 0049 * Code and the date of any change. Licensee must include in that file the 0050 * documentation of any changes made by any predecessor Licensee. Licensee 0051 * must include a prominent statement that the modification is derived, 0052 * directly or indirectly, from Original Intel Code. 0053 * 0054 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 0055 * Redistribution of source code of any substantial portion of the Covered 0056 * Code or modification without rights to further distribute source must 0057 * include the following Disclaimer and Export Compliance provision in the 0058 * documentation and/or other materials provided with distribution. In 0059 * addition, Licensee may not authorize further sublicense of source of any 0060 * portion of the Covered Code, and must include terms to the effect that the 0061 * license from Licensee to its licensee is limited to the intellectual 0062 * property embodied in the software Licensee provides to its licensee, and 0063 * not to intellectual property embodied in modifications its licensee may 0064 * make. 0065 * 0066 * 3.3. Redistribution of Executable. Redistribution in executable form of any 0067 * substantial portion of the Covered Code or modification must reproduce the 0068 * above Copyright Notice, and the following Disclaimer and Export Compliance 0069 * provision in the documentation and/or other materials provided with the 0070 * distribution. 0071 * 0072 * 3.4. Intel retains all right, title, and interest in and to the Original 0073 * Intel Code. 0074 * 0075 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 0076 * Intel shall be used in advertising or otherwise to promote the sale, use or 0077 * other dealings in products derived from or relating to the Covered Code 0078 * without prior written authorization from Intel. 0079 * 0080 * 4. Disclaimer and Export Compliance 0081 * 0082 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 0083 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 0084 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 0085 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 0086 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 0087 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 0088 * PARTICULAR PURPOSE. 0089 * 0090 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 0091 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 0092 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 0093 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 0094 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 0095 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 0096 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 0097 * LIMITED REMEDY. 0098 * 0099 * 4.3. Licensee shall not export, either directly or indirectly, any of this 0100 * software or system incorporating such software without first obtaining any 0101 * required license or other approval from the U. S. Department of Commerce or 0102 * any other agency or department of the United States Government. In the 0103 * event Licensee exports any such software from the United States or 0104 * re-exports any such software from a foreign destination, Licensee shall 0105 * ensure that the distribution and export/re-export of the software is in 0106 * compliance with all laws, regulations, orders, or other restrictions of the 0107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 0108 * any of its subsidiaries will export/re-export any technical data, process, 0109 * software, or service, directly or indirectly, to any country for which the 0110 * United States government or any agency thereof requires an export license, 0111 * other governmental approval, or letter of assurance, without first obtaining 0112 * such license, approval or letter. 0113 * 0114 ***************************************************************************** 0115 * 0116 * Alternatively, you may choose to be licensed under the terms of the 0117 * following license: 0118 * 0119 * Redistribution and use in source and binary forms, with or without 0120 * modification, are permitted provided that the following conditions 0121 * are met: 0122 * 1. Redistributions of source code must retain the above copyright 0123 * notice, this list of conditions, and the following disclaimer, 0124 * without modification. 0125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 0126 * substantially similar to the "NO WARRANTY" disclaimer below 0127 * ("Disclaimer") and any redistribution must be conditioned upon 0128 * including a substantially similar Disclaimer requirement for further 0129 * binary redistribution. 0130 * 3. Neither the names of the above-listed copyright holders nor the names 0131 * of any contributors may be used to endorse or promote products derived 0132 * from this software without specific prior written permission. 0133 * 0134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 0135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 0136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 0137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 0138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 0139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 0140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 0141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 0142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 0143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 0144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 0145 * 0146 * Alternatively, you may choose to be licensed under the terms of the 0147 * GNU General Public License ("GPL") version 2 as published by the Free 0148 * Software Foundation. 0149 * 0150 *****************************************************************************/ 0151 0152 #define ACPI_CREATE_PREDEFINED_TABLE 0153 0154 #include "acpi.h" 0155 #include "accommon.h" 0156 #include "acnamesp.h" 0157 #include "acpredef.h" 0158 0159 0160 #define _COMPONENT ACPI_NAMESPACE 0161 ACPI_MODULE_NAME ("nspredef") 0162 0163 0164 /******************************************************************************* 0165 * 0166 * This module validates predefined ACPI objects that appear in the namespace, 0167 * at the time they are evaluated (via AcpiEvaluateObject). The purpose of this 0168 * validation is to detect problems with BIOS-exposed predefined ACPI objects 0169 * before the results are returned to the ACPI-related drivers. 0170 * 0171 * There are several areas that are validated: 0172 * 0173 * 1) The number of input arguments as defined by the method/object in the 0174 * ASL is validated against the ACPI specification. 0175 * 2) The type of the return object (if any) is validated against the ACPI 0176 * specification. 0177 * 3) For returned package objects, the count of package elements is 0178 * validated, as well as the type of each package element. Nested 0179 * packages are supported. 0180 * 0181 * For any problems found, a warning message is issued. 0182 * 0183 ******************************************************************************/ 0184 0185 0186 /* Local prototypes */ 0187 0188 static ACPI_STATUS 0189 AcpiNsCheckReference ( 0190 ACPI_EVALUATE_INFO *Info, 0191 ACPI_OPERAND_OBJECT *ReturnObject); 0192 0193 static UINT32 0194 AcpiNsGetBitmappedType ( 0195 ACPI_OPERAND_OBJECT *ReturnObject); 0196 0197 0198 /******************************************************************************* 0199 * 0200 * FUNCTION: AcpiNsCheckReturnValue 0201 * 0202 * PARAMETERS: Node - Namespace node for the method/object 0203 * Info - Method execution information block 0204 * UserParamCount - Number of parameters actually passed 0205 * ReturnStatus - Status from the object evaluation 0206 * ReturnObjectPtr - Pointer to the object returned from the 0207 * evaluation of a method or object 0208 * 0209 * RETURN: Status 0210 * 0211 * DESCRIPTION: Check the value returned from a predefined name. 0212 * 0213 ******************************************************************************/ 0214 0215 ACPI_STATUS 0216 AcpiNsCheckReturnValue ( 0217 ACPI_NAMESPACE_NODE *Node, 0218 ACPI_EVALUATE_INFO *Info, 0219 UINT32 UserParamCount, 0220 ACPI_STATUS ReturnStatus, 0221 ACPI_OPERAND_OBJECT **ReturnObjectPtr) 0222 { 0223 ACPI_STATUS Status; 0224 const ACPI_PREDEFINED_INFO *Predefined; 0225 0226 ACPI_FUNCTION_TRACE (NsCheckReturnValue); 0227 0228 /* If not a predefined name, we cannot validate the return object */ 0229 0230 Predefined = Info->Predefined; 0231 if (!Predefined) 0232 { 0233 return_ACPI_STATUS (AE_OK); 0234 } 0235 0236 /* 0237 * If the method failed or did not actually return an object, we cannot 0238 * validate the return object 0239 */ 0240 if ((ReturnStatus != AE_OK) && 0241 (ReturnStatus != AE_CTRL_RETURN_VALUE)) 0242 { 0243 return_ACPI_STATUS (AE_OK); 0244 } 0245 0246 /* 0247 * Return value validation and possible repair. 0248 * 0249 * 1) Don't perform return value validation/repair if this feature 0250 * has been disabled via a global option. 0251 * 0252 * 2) We have a return value, but if one wasn't expected, just exit, 0253 * this is not a problem. For example, if the "Implicit Return" 0254 * feature is enabled, methods will always return a value. 0255 * 0256 * 3) If the return value can be of any type, then we cannot perform 0257 * any validation, just exit. 0258 */ 0259 if (AcpiGbl_DisableAutoRepair || 0260 (!Predefined->Info.ExpectedBtypes) || 0261 (Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL)) 0262 { 0263 return_ACPI_STATUS (AE_OK); 0264 } 0265 0266 /* 0267 * Check that the type of the main return object is what is expected 0268 * for this predefined name 0269 */ 0270 Status = AcpiNsCheckObjectType (Info, ReturnObjectPtr, 0271 Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); 0272 if (ACPI_FAILURE (Status)) 0273 { 0274 goto Exit; 0275 } 0276 0277 /* 0278 * 0279 * 4) If there is no return value and it is optional, just return 0280 * AE_OK (_WAK). 0281 */ 0282 if (!(*ReturnObjectPtr)) 0283 { 0284 goto Exit; 0285 } 0286 0287 /* 0288 * For returned Package objects, check the type of all sub-objects. 0289 * Note: Package may have been newly created by call above. 0290 */ 0291 if ((*ReturnObjectPtr)->Common.Type == ACPI_TYPE_PACKAGE) 0292 { 0293 Info->ParentPackage = *ReturnObjectPtr; 0294 Status = AcpiNsCheckPackage (Info, ReturnObjectPtr); 0295 if (ACPI_FAILURE (Status)) 0296 { 0297 /* We might be able to fix some errors */ 0298 0299 if ((Status != AE_AML_OPERAND_TYPE) && 0300 (Status != AE_AML_OPERAND_VALUE)) 0301 { 0302 goto Exit; 0303 } 0304 } 0305 } 0306 0307 /* 0308 * The return object was OK, or it was successfully repaired above. 0309 * Now make some additional checks such as verifying that package 0310 * objects are sorted correctly (if required) or buffer objects have 0311 * the correct data width (bytes vs. dwords). These repairs are 0312 * performed on a per-name basis, i.e., the code is specific to 0313 * particular predefined names. 0314 */ 0315 Status = AcpiNsComplexRepairs (Info, Node, Status, ReturnObjectPtr); 0316 0317 Exit: 0318 /* 0319 * If the object validation failed or if we successfully repaired one 0320 * or more objects, mark the parent node to suppress further warning 0321 * messages during the next evaluation of the same method/object. 0322 */ 0323 if (ACPI_FAILURE (Status) || 0324 (Info->ReturnFlags & ACPI_OBJECT_REPAIRED)) 0325 { 0326 Node->Flags |= ANOBJ_EVALUATED; 0327 } 0328 0329 return_ACPI_STATUS (Status); 0330 } 0331 0332 0333 /******************************************************************************* 0334 * 0335 * FUNCTION: AcpiNsCheckObjectType 0336 * 0337 * PARAMETERS: Info - Method execution information block 0338 * ReturnObjectPtr - Pointer to the object returned from the 0339 * evaluation of a method or object 0340 * ExpectedBtypes - Bitmap of expected return type(s) 0341 * PackageIndex - Index of object within parent package (if 0342 * applicable - ACPI_NOT_PACKAGE_ELEMENT 0343 * otherwise) 0344 * 0345 * RETURN: Status 0346 * 0347 * DESCRIPTION: Check the type of the return object against the expected object 0348 * type(s). Use of Btype allows multiple expected object types. 0349 * 0350 ******************************************************************************/ 0351 0352 ACPI_STATUS 0353 AcpiNsCheckObjectType ( 0354 ACPI_EVALUATE_INFO *Info, 0355 ACPI_OPERAND_OBJECT **ReturnObjectPtr, 0356 UINT32 ExpectedBtypes, 0357 UINT32 PackageIndex) 0358 { 0359 ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; 0360 ACPI_STATUS Status = AE_OK; 0361 char TypeBuffer[96]; /* Room for 10 types */ 0362 0363 0364 /* A Namespace node should not get here, but make sure */ 0365 0366 if (ReturnObject && 0367 ACPI_GET_DESCRIPTOR_TYPE (ReturnObject) == ACPI_DESC_TYPE_NAMED) 0368 { 0369 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, 0370 "Invalid return type - Found a Namespace node [%4.4s] type %s", 0371 ReturnObject->Node.Name.Ascii, 0372 AcpiUtGetTypeName (ReturnObject->Node.Type))); 0373 return (AE_AML_OPERAND_TYPE); 0374 } 0375 0376 /* 0377 * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type. 0378 * The bitmapped type allows multiple possible return types. 0379 * 0380 * Note, the cases below must handle all of the possible types returned 0381 * from all of the predefined names (including elements of returned 0382 * packages) 0383 */ 0384 Info->ReturnBtype = AcpiNsGetBitmappedType (ReturnObject); 0385 if (Info->ReturnBtype == ACPI_RTYPE_ANY) 0386 { 0387 /* Not one of the supported objects, must be incorrect */ 0388 goto TypeErrorExit; 0389 } 0390 0391 /* For reference objects, check that the reference type is correct */ 0392 0393 if ((Info->ReturnBtype & ExpectedBtypes) == ACPI_RTYPE_REFERENCE) 0394 { 0395 Status = AcpiNsCheckReference (Info, ReturnObject); 0396 return (Status); 0397 } 0398 0399 /* Attempt simple repair of the returned object if necessary */ 0400 0401 Status = AcpiNsSimpleRepair (Info, ExpectedBtypes, 0402 PackageIndex, ReturnObjectPtr); 0403 if (ACPI_SUCCESS (Status)) 0404 { 0405 return (AE_OK); /* Successful repair */ 0406 } 0407 0408 0409 TypeErrorExit: 0410 0411 /* Create a string with all expected types for this predefined object */ 0412 0413 AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes); 0414 0415 if (!ReturnObject) 0416 { 0417 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, 0418 "Expected return object of type %s", 0419 TypeBuffer)); 0420 } 0421 else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT) 0422 { 0423 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, 0424 "Return type mismatch - found %s, expected %s", 0425 AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer)); 0426 } 0427 else 0428 { 0429 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, 0430 "Return Package type mismatch at index %u - " 0431 "found %s, expected %s", PackageIndex, 0432 AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer)); 0433 } 0434 0435 return (AE_AML_OPERAND_TYPE); 0436 } 0437 0438 0439 /******************************************************************************* 0440 * 0441 * FUNCTION: AcpiNsCheckReference 0442 * 0443 * PARAMETERS: Info - Method execution information block 0444 * ReturnObject - Object returned from the evaluation of a 0445 * method or object 0446 * 0447 * RETURN: Status 0448 * 0449 * DESCRIPTION: Check a returned reference object for the correct reference 0450 * type. The only reference type that can be returned from a 0451 * predefined method is a named reference. All others are invalid. 0452 * 0453 ******************************************************************************/ 0454 0455 static ACPI_STATUS 0456 AcpiNsCheckReference ( 0457 ACPI_EVALUATE_INFO *Info, 0458 ACPI_OPERAND_OBJECT *ReturnObject) 0459 { 0460 0461 /* 0462 * Check the reference object for the correct reference type (opcode). 0463 * The only type of reference that can be converted to an ACPI_OBJECT is 0464 * a reference to a named object (reference class: NAME) 0465 */ 0466 if (ReturnObject->Reference.Class == ACPI_REFCLASS_NAME) 0467 { 0468 return (AE_OK); 0469 } 0470 0471 ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, 0472 "Return type mismatch - unexpected reference object type [%s] %2.2X", 0473 AcpiUtGetReferenceName (ReturnObject), 0474 ReturnObject->Reference.Class)); 0475 0476 return (AE_AML_OPERAND_TYPE); 0477 } 0478 0479 0480 /******************************************************************************* 0481 * 0482 * FUNCTION: AcpiNsGetBitmappedType 0483 * 0484 * PARAMETERS: ReturnObject - Object returned from method/obj evaluation 0485 * 0486 * RETURN: Object return type. ACPI_RTYPE_ANY indicates that the object 0487 * type is not supported. ACPI_RTYPE_NONE indicates that no 0488 * object was returned (ReturnObject is NULL). 0489 * 0490 * DESCRIPTION: Convert object type into a bitmapped object return type. 0491 * 0492 ******************************************************************************/ 0493 0494 static UINT32 0495 AcpiNsGetBitmappedType ( 0496 ACPI_OPERAND_OBJECT *ReturnObject) 0497 { 0498 UINT32 ReturnBtype; 0499 0500 0501 if (!ReturnObject) 0502 { 0503 return (ACPI_RTYPE_NONE); 0504 } 0505 0506 /* Map ACPI_OBJECT_TYPE to internal bitmapped type */ 0507 0508 switch (ReturnObject->Common.Type) 0509 { 0510 case ACPI_TYPE_INTEGER: 0511 0512 ReturnBtype = ACPI_RTYPE_INTEGER; 0513 break; 0514 0515 case ACPI_TYPE_BUFFER: 0516 0517 ReturnBtype = ACPI_RTYPE_BUFFER; 0518 break; 0519 0520 case ACPI_TYPE_STRING: 0521 0522 ReturnBtype = ACPI_RTYPE_STRING; 0523 break; 0524 0525 case ACPI_TYPE_PACKAGE: 0526 0527 ReturnBtype = ACPI_RTYPE_PACKAGE; 0528 break; 0529 0530 case ACPI_TYPE_LOCAL_REFERENCE: 0531 0532 ReturnBtype = ACPI_RTYPE_REFERENCE; 0533 break; 0534 0535 default: 0536 0537 /* Not one of the supported objects, must be incorrect */ 0538 0539 ReturnBtype = ACPI_RTYPE_ANY; 0540 break; 0541 } 0542 0543 return (ReturnBtype); 0544 }
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |