1 /****************************************************************************** 2 * 3 * Module Name: nsrepair - Repair for objects returned by predefined methods 4 * 5 *****************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 12 * All rights reserved. 13 * 14 * 2. License 15 * 16 * 2.1. This is your license from Intel Corp. under its intellectual property 17 * rights. You may have additional license terms from the party that provided 18 * you this software, covering your right to use that party's intellectual 19 * property rights. 20 * 21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 * copy of the source code appearing in this file ("Covered Code") an 23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 * base code distributed originally by Intel ("Original Intel Code") to copy, 25 * make derivatives, distribute, use and display any portion of the Covered 26 * Code in any form, with the right to sublicense such rights; and 27 * 28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 * license (with the right to sublicense), under only those claims of Intel 30 * patents that are infringed by the Original Intel Code, to make, use, sell, 31 * offer to sell, and import the Covered Code and derivative works thereof 32 * solely to the minimum extent necessary to exercise the above copyright 33 * license, and in no event shall the patent license extend to any additions 34 * to or modifications of the Original Intel Code. No other license or right 35 * is granted directly or by implication, estoppel or otherwise; 36 * 37 * The above copyright and patent license is granted only if the following 38 * conditions are met: 39 * 40 * 3. Conditions 41 * 42 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 * Redistribution of source code of any substantial portion of the Covered 44 * Code or modification with rights to further distribute source must include 45 * the above Copyright Notice, the above License, this list of Conditions, 46 * and the following Disclaimer and Export Compliance provision. In addition, 47 * Licensee must cause all Covered Code to which Licensee contributes to 48 * contain a file documenting the changes Licensee made to create that Covered 49 * Code and the date of any change. Licensee must include in that file the 50 * documentation of any changes made by any predecessor Licensee. Licensee 51 * must include a prominent statement that the modification is derived, 52 * directly or indirectly, from Original Intel Code. 53 * 54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 * Redistribution of source code of any substantial portion of the Covered 56 * Code or modification without rights to further distribute source must 57 * include the following Disclaimer and Export Compliance provision in the 58 * documentation and/or other materials provided with distribution. In 59 * addition, Licensee may not authorize further sublicense of source of any 60 * portion of the Covered Code, and must include terms to the effect that the 61 * license from Licensee to its licensee is limited to the intellectual 62 * property embodied in the software Licensee provides to its licensee, and 63 * not to intellectual property embodied in modifications its licensee may 64 * make. 65 * 66 * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 * substantial portion of the Covered Code or modification must reproduce the 68 * above Copyright Notice, and the following Disclaimer and Export Compliance 69 * provision in the documentation and/or other materials provided with the 70 * distribution. 71 * 72 * 3.4. Intel retains all right, title, and interest in and to the Original 73 * Intel Code. 74 * 75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 * Intel shall be used in advertising or otherwise to promote the sale, use or 77 * other dealings in products derived from or relating to the Covered Code 78 * without prior written authorization from Intel. 79 * 80 * 4. Disclaimer and Export Compliance 81 * 82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 * PARTICULAR PURPOSE. 89 * 90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 * LIMITED REMEDY. 98 * 99 * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 * software or system incorporating such software without first obtaining any 101 * required license or other approval from the U. S. Department of Commerce or 102 * any other agency or department of the United States Government. In the 103 * event Licensee exports any such software from the United States or 104 * re-exports any such software from a foreign destination, Licensee shall 105 * ensure that the distribution and export/re-export of the software is in 106 * compliance with all laws, regulations, orders, or other restrictions of the 107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 * any of its subsidiaries will export/re-export any technical data, process, 109 * software, or service, directly or indirectly, to any country for which the 110 * United States government or any agency thereof requires an export license, 111 * other governmental approval, or letter of assurance, without first obtaining 112 * such license, approval or letter. 113 * 114 *****************************************************************************/ 115 116 #define __NSREPAIR_C__ 117 118 #include "acpi.h" 119 #include "accommon.h" 120 #include "acnamesp.h" 121 #include "acinterp.h" 122 #include "acpredef.h" 123 124 #define _COMPONENT ACPI_NAMESPACE 125 ACPI_MODULE_NAME ("nsrepair") 126 127 128 /******************************************************************************* 129 * 130 * FUNCTION: AcpiNsRepairObject 131 * 132 * PARAMETERS: Data - Pointer to validation data structure 133 * ExpectedBtypes - Object types expected 134 * PackageIndex - Index of object within parent package (if 135 * applicable - ACPI_NOT_PACKAGE_ELEMENT 136 * otherwise) 137 * ReturnObjectPtr - Pointer to the object returned from the 138 * evaluation of a method or object 139 * 140 * RETURN: Status. AE_OK if repair was successful. 141 * 142 * DESCRIPTION: Attempt to repair/convert a return object of a type that was 143 * not expected. 144 * 145 ******************************************************************************/ 146 147 ACPI_STATUS 148 AcpiNsRepairObject ( 149 ACPI_PREDEFINED_DATA *Data, 150 UINT32 ExpectedBtypes, 151 UINT32 PackageIndex, 152 ACPI_OPERAND_OBJECT **ReturnObjectPtr) 153 { 154 ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; 155 ACPI_OPERAND_OBJECT *NewObject; 156 ACPI_SIZE Length; 157 ACPI_STATUS Status; 158 159 160 /* 161 * At this point, we know that the type of the returned object was not 162 * one of the expected types for this predefined name. Attempt to 163 * repair the object. Only a limited number of repairs are possible. 164 */ 165 switch (ReturnObject->Common.Type) 166 { 167 case ACPI_TYPE_BUFFER: 168 169 /* Does the method/object legally return a string? */ 170 171 if (!(ExpectedBtypes & ACPI_RTYPE_STRING)) 172 { 173 return (AE_AML_OPERAND_TYPE); 174 } 175 176 /* 177 * Have a Buffer, expected a String, convert. Use a ToString 178 * conversion, no transform performed on the buffer data. The best 179 * example of this is the _BIF method, where the string data from 180 * the battery is often (incorrectly) returned as buffer object(s). 181 */ 182 Length = 0; 183 while ((Length < ReturnObject->Buffer.Length) && 184 (ReturnObject->Buffer.Pointer[Length])) 185 { 186 Length++; 187 } 188 189 /* Allocate a new string object */ 190 191 NewObject = AcpiUtCreateStringObject (Length); 192 if (!NewObject) 193 { 194 return (AE_NO_MEMORY); 195 } 196 197 /* 198 * Copy the raw buffer data with no transform. String is already NULL 199 * terminated at Length+1. 200 */ 201 ACPI_MEMCPY (NewObject->String.Pointer, 202 ReturnObject->Buffer.Pointer, Length); 203 break; 204 205 206 case ACPI_TYPE_INTEGER: 207 208 /* 1) Does the method/object legally return a buffer? */ 209 210 if (ExpectedBtypes & ACPI_RTYPE_BUFFER) 211 { 212 /* 213 * Convert the Integer to a packed-byte buffer. _MAT needs 214 * this sometimes, if a read has been performed on a Field 215 * object that is less than or equal to the global integer 216 * size (32 or 64 bits). 217 */ 218 Status = AcpiExConvertToBuffer (ReturnObject, &NewObject); 219 if (ACPI_FAILURE (Status)) 220 { 221 return (Status); 222 } 223 } 224 225 /* 2) Does the method/object legally return a string? */ 226 227 else if (ExpectedBtypes & ACPI_RTYPE_STRING) 228 { 229 /* 230 * The only supported Integer-to-String conversion is to convert 231 * an integer of value 0 to a NULL string. The last element of 232 * _BIF and _BIX packages occasionally need this fix. 233 */ 234 if (ReturnObject->Integer.Value != 0) 235 { 236 return (AE_AML_OPERAND_TYPE); 237 } 238 239 /* Allocate a new NULL string object */ 240 241 NewObject = AcpiUtCreateStringObject (0); 242 if (!NewObject) 243 { 244 return (AE_NO_MEMORY); 245 } 246 } 247 else 248 { 249 return (AE_AML_OPERAND_TYPE); 250 } 251 break; 252 253 254 default: 255 256 /* We cannot repair this object */ 257 258 return (AE_AML_OPERAND_TYPE); 259 } 260 261 /* Object was successfully repaired */ 262 263 /* 264 * If the original object is a package element, we need to: 265 * 1. Set the reference count of the new object to match the 266 * reference count of the old object. 267 * 2. Decrement the reference count of the original object. 268 */ 269 if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT) 270 { 271 NewObject->Common.ReferenceCount = 272 ReturnObject->Common.ReferenceCount; 273 274 if (ReturnObject->Common.ReferenceCount > 1) 275 { 276 ReturnObject->Common.ReferenceCount--; 277 } 278 279 ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 280 "Converted %s to expected %s at index %u", 281 AcpiUtGetObjectTypeName (ReturnObject), 282 AcpiUtGetObjectTypeName (NewObject), PackageIndex)); 283 } 284 else 285 { 286 ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 287 "Converted %s to expected %s", 288 AcpiUtGetObjectTypeName (ReturnObject), 289 AcpiUtGetObjectTypeName (NewObject))); 290 } 291 292 /* Delete old object, install the new return object */ 293 294 AcpiUtRemoveReference (ReturnObject); 295 *ReturnObjectPtr = NewObject; 296 Data->Flags |= ACPI_OBJECT_REPAIRED; 297 return (AE_OK); 298 } 299 300 301 /******************************************************************************* 302 * 303 * FUNCTION: AcpiNsRepairPackageList 304 * 305 * PARAMETERS: Data - Pointer to validation data structure 306 * ObjDescPtr - Pointer to the object to repair. The new 307 * package object is returned here, 308 * overwriting the old object. 309 * 310 * RETURN: Status, new object in *ObjDescPtr 311 * 312 * DESCRIPTION: Repair a common problem with objects that are defined to return 313 * a variable-length Package of Packages. If the variable-length 314 * is one, some BIOS code mistakenly simply declares a single 315 * Package instead of a Package with one sub-Package. This 316 * function attempts to repair this error by wrapping a Package 317 * object around the original Package, creating the correct 318 * Package with one sub-Package. 319 * 320 * Names that can be repaired in this manner include: 321 * _ALR, _CSD, _HPX, _MLS, _PRT, _PSS, _TRT, TSS 322 * 323 ******************************************************************************/ 324 325 ACPI_STATUS 326 AcpiNsRepairPackageList ( 327 ACPI_PREDEFINED_DATA *Data, 328 ACPI_OPERAND_OBJECT **ObjDescPtr) 329 { 330 ACPI_OPERAND_OBJECT *PkgObjDesc; 331 332 333 /* 334 * Create the new outer package and populate it. The new package will 335 * have a single element, the lone subpackage. 336 */ 337 PkgObjDesc = AcpiUtCreatePackageObject (1); 338 if (!PkgObjDesc) 339 { 340 return (AE_NO_MEMORY); 341 } 342 343 PkgObjDesc->Package.Elements[0] = *ObjDescPtr; 344 345 /* Return the new object in the object pointer */ 346 347 *ObjDescPtr = PkgObjDesc; 348 Data->Flags |= ACPI_OBJECT_REPAIRED; 349 350 ACPI_INFO_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 351 "Repaired Incorrectly formed Package")); 352 353 return (AE_OK); 354 } 355