1 2 /****************************************************************************** 3 * 4 * Module Name: exstoren - AML Interpreter object store support, 5 * Store to Node (namespace object) 6 * 7 *****************************************************************************/ 8 9 /****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 14 * All rights reserved. 15 * 16 * 2. License 17 * 18 * 2.1. This is your license from Intel Corp. under its intellectual property 19 * rights. You may have additional license terms from the party that provided 20 * you this software, covering your right to use that party's intellectual 21 * property rights. 22 * 23 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 24 * copy of the source code appearing in this file ("Covered Code") an 25 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 26 * base code distributed originally by Intel ("Original Intel Code") to copy, 27 * make derivatives, distribute, use and display any portion of the Covered 28 * Code in any form, with the right to sublicense such rights; and 29 * 30 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 31 * license (with the right to sublicense), under only those claims of Intel 32 * patents that are infringed by the Original Intel Code, to make, use, sell, 33 * offer to sell, and import the Covered Code and derivative works thereof 34 * solely to the minimum extent necessary to exercise the above copyright 35 * license, and in no event shall the patent license extend to any additions 36 * to or modifications of the Original Intel Code. No other license or right 37 * is granted directly or by implication, estoppel or otherwise; 38 * 39 * The above copyright and patent license is granted only if the following 40 * conditions are met: 41 * 42 * 3. Conditions 43 * 44 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 45 * Redistribution of source code of any substantial portion of the Covered 46 * Code or modification with rights to further distribute source must include 47 * the above Copyright Notice, the above License, this list of Conditions, 48 * and the following Disclaimer and Export Compliance provision. In addition, 49 * Licensee must cause all Covered Code to which Licensee contributes to 50 * contain a file documenting the changes Licensee made to create that Covered 51 * Code and the date of any change. Licensee must include in that file the 52 * documentation of any changes made by any predecessor Licensee. Licensee 53 * must include a prominent statement that the modification is derived, 54 * directly or indirectly, from Original Intel Code. 55 * 56 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 57 * Redistribution of source code of any substantial portion of the Covered 58 * Code or modification without rights to further distribute source must 59 * include the following Disclaimer and Export Compliance provision in the 60 * documentation and/or other materials provided with distribution. In 61 * addition, Licensee may not authorize further sublicense of source of any 62 * portion of the Covered Code, and must include terms to the effect that the 63 * license from Licensee to its licensee is limited to the intellectual 64 * property embodied in the software Licensee provides to its licensee, and 65 * not to intellectual property embodied in modifications its licensee may 66 * make. 67 * 68 * 3.3. Redistribution of Executable. Redistribution in executable form of any 69 * substantial portion of the Covered Code or modification must reproduce the 70 * above Copyright Notice, and the following Disclaimer and Export Compliance 71 * provision in the documentation and/or other materials provided with the 72 * distribution. 73 * 74 * 3.4. Intel retains all right, title, and interest in and to the Original 75 * Intel Code. 76 * 77 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 78 * Intel shall be used in advertising or otherwise to promote the sale, use or 79 * other dealings in products derived from or relating to the Covered Code 80 * without prior written authorization from Intel. 81 * 82 * 4. Disclaimer and Export Compliance 83 * 84 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 85 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 86 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 87 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 88 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 89 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 90 * PARTICULAR PURPOSE. 91 * 92 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 93 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 94 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 95 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 96 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 97 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 98 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 99 * LIMITED REMEDY. 100 * 101 * 4.3. Licensee shall not export, either directly or indirectly, any of this 102 * software or system incorporating such software without first obtaining any 103 * required license or other approval from the U. S. Department of Commerce or 104 * any other agency or department of the United States Government. In the 105 * event Licensee exports any such software from the United States or 106 * re-exports any such software from a foreign destination, Licensee shall 107 * ensure that the distribution and export/re-export of the software is in 108 * compliance with all laws, regulations, orders, or other restrictions of the 109 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 110 * any of its subsidiaries will export/re-export any technical data, process, 111 * software, or service, directly or indirectly, to any country for which the 112 * United States government or any agency thereof requires an export license, 113 * other governmental approval, or letter of assurance, without first obtaining 114 * such license, approval or letter. 115 * 116 *****************************************************************************/ 117 118 #define __EXSTOREN_C__ 119 120 #include "acpi.h" 121 #include "accommon.h" 122 #include "acinterp.h" 123 #include "amlcode.h" 124 125 126 #define _COMPONENT ACPI_EXECUTER 127 ACPI_MODULE_NAME ("exstoren") 128 129 130 /******************************************************************************* 131 * 132 * FUNCTION: AcpiExResolveObject 133 * 134 * PARAMETERS: SourceDescPtr - Pointer to the source object 135 * TargetType - Current type of the target 136 * WalkState - Current walk state 137 * 138 * RETURN: Status, resolved object in SourceDescPtr. 139 * 140 * DESCRIPTION: Resolve an object. If the object is a reference, dereference 141 * it and return the actual object in the SourceDescPtr. 142 * 143 ******************************************************************************/ 144 145 ACPI_STATUS 146 AcpiExResolveObject ( 147 ACPI_OPERAND_OBJECT **SourceDescPtr, 148 ACPI_OBJECT_TYPE TargetType, 149 ACPI_WALK_STATE *WalkState) 150 { 151 ACPI_OPERAND_OBJECT *SourceDesc = *SourceDescPtr; 152 ACPI_STATUS Status = AE_OK; 153 154 155 ACPI_FUNCTION_TRACE (ExResolveObject); 156 157 158 /* Ensure we have a Target that can be stored to */ 159 160 switch (TargetType) 161 { 162 case ACPI_TYPE_BUFFER_FIELD: 163 case ACPI_TYPE_LOCAL_REGION_FIELD: 164 case ACPI_TYPE_LOCAL_BANK_FIELD: 165 case ACPI_TYPE_LOCAL_INDEX_FIELD: 166 /* 167 * These cases all require only Integers or values that 168 * can be converted to Integers (Strings or Buffers) 169 */ 170 171 case ACPI_TYPE_INTEGER: 172 case ACPI_TYPE_STRING: 173 case ACPI_TYPE_BUFFER: 174 175 /* 176 * Stores into a Field/Region or into a Integer/Buffer/String 177 * are all essentially the same. This case handles the 178 * "interchangeable" types Integer, String, and Buffer. 179 */ 180 if (SourceDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) 181 { 182 /* Resolve a reference object first */ 183 184 Status = AcpiExResolveToValue (SourceDescPtr, WalkState); 185 if (ACPI_FAILURE (Status)) 186 { 187 break; 188 } 189 } 190 191 /* For CopyObject, no further validation necessary */ 192 193 if (WalkState->Opcode == AML_COPY_OP) 194 { 195 break; 196 } 197 198 /* Must have a Integer, Buffer, or String */ 199 200 if ((SourceDesc->Common.Type != ACPI_TYPE_INTEGER) && 201 (SourceDesc->Common.Type != ACPI_TYPE_BUFFER) && 202 (SourceDesc->Common.Type != ACPI_TYPE_STRING) && 203 !((SourceDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && 204 (SourceDesc->Reference.Class== ACPI_REFCLASS_TABLE))) 205 { 206 /* Conversion successful but still not a valid type */ 207 208 ACPI_ERROR ((AE_INFO, 209 "Cannot assign type %s to %s (must be type Int/Str/Buf)", 210 AcpiUtGetObjectTypeName (SourceDesc), 211 AcpiUtGetTypeName (TargetType))); 212 Status = AE_AML_OPERAND_TYPE; 213 } 214 break; 215 216 217 case ACPI_TYPE_LOCAL_ALIAS: 218 case ACPI_TYPE_LOCAL_METHOD_ALIAS: 219 220 /* 221 * All aliases should have been resolved earlier, during the 222 * operand resolution phase. 223 */ 224 ACPI_ERROR ((AE_INFO, "Store into an unresolved Alias object")); 225 Status = AE_AML_INTERNAL; 226 break; 227 228 229 case ACPI_TYPE_PACKAGE: 230 default: 231 232 /* 233 * All other types than Alias and the various Fields come here, 234 * including the untyped case - ACPI_TYPE_ANY. 235 */ 236 break; 237 } 238 239 return_ACPI_STATUS (Status); 240 } 241 242 243 /******************************************************************************* 244 * 245 * FUNCTION: AcpiExStoreObjectToObject 246 * 247 * PARAMETERS: SourceDesc - Object to store 248 * DestDesc - Object to receive a copy of the source 249 * NewDesc - New object if DestDesc is obsoleted 250 * WalkState - Current walk state 251 * 252 * RETURN: Status 253 * 254 * DESCRIPTION: "Store" an object to another object. This may include 255 * converting the source type to the target type (implicit 256 * conversion), and a copy of the value of the source to 257 * the target. 258 * 259 * The Assignment of an object to another (not named) object 260 * is handled here. 261 * The Source passed in will replace the current value (if any) 262 * with the input value. 263 * 264 * When storing into an object the data is converted to the 265 * target object type then stored in the object. This means 266 * that the target object type (for an initialized target) will 267 * not be changed by a store operation. 268 * 269 * This module allows destination types of Number, String, 270 * Buffer, and Package. 271 * 272 * Assumes parameters are already validated. NOTE: SourceDesc 273 * resolution (from a reference object) must be performed by 274 * the caller if necessary. 275 * 276 ******************************************************************************/ 277 278 ACPI_STATUS 279 AcpiExStoreObjectToObject ( 280 ACPI_OPERAND_OBJECT *SourceDesc, 281 ACPI_OPERAND_OBJECT *DestDesc, 282 ACPI_OPERAND_OBJECT **NewDesc, 283 ACPI_WALK_STATE *WalkState) 284 { 285 ACPI_OPERAND_OBJECT *ActualSrcDesc; 286 ACPI_STATUS Status = AE_OK; 287 288 289 ACPI_FUNCTION_TRACE_PTR (ExStoreObjectToObject, SourceDesc); 290 291 292 ActualSrcDesc = SourceDesc; 293 if (!DestDesc) 294 { 295 /* 296 * There is no destination object (An uninitialized node or 297 * package element), so we can simply copy the source object 298 * creating a new destination object 299 */ 300 Status = AcpiUtCopyIobjectToIobject (ActualSrcDesc, NewDesc, WalkState); 301 return_ACPI_STATUS (Status); 302 } 303 304 if (SourceDesc->Common.Type != DestDesc->Common.Type) 305 { 306 /* 307 * The source type does not match the type of the destination. 308 * Perform the "implicit conversion" of the source to the current type 309 * of the target as per the ACPI specification. 310 * 311 * If no conversion performed, ActualSrcDesc = SourceDesc. 312 * Otherwise, ActualSrcDesc is a temporary object to hold the 313 * converted object. 314 */ 315 Status = AcpiExConvertToTargetType (DestDesc->Common.Type, 316 SourceDesc, &ActualSrcDesc, WalkState); 317 if (ACPI_FAILURE (Status)) 318 { 319 return_ACPI_STATUS (Status); 320 } 321 322 if (SourceDesc == ActualSrcDesc) 323 { 324 /* 325 * No conversion was performed. Return the SourceDesc as the 326 * new object. 327 */ 328 *NewDesc = SourceDesc; 329 return_ACPI_STATUS (AE_OK); 330 } 331 } 332 333 /* 334 * We now have two objects of identical types, and we can perform a 335 * copy of the *value* of the source object. 336 */ 337 switch (DestDesc->Common.Type) 338 { 339 case ACPI_TYPE_INTEGER: 340 341 DestDesc->Integer.Value = ActualSrcDesc->Integer.Value; 342 343 /* Truncate value if we are executing from a 32-bit ACPI table */ 344 345 AcpiExTruncateFor32bitTable (DestDesc); 346 break; 347 348 case ACPI_TYPE_STRING: 349 350 Status = AcpiExStoreStringToString (ActualSrcDesc, DestDesc); 351 break; 352 353 case ACPI_TYPE_BUFFER: 354 355 Status = AcpiExStoreBufferToBuffer (ActualSrcDesc, DestDesc); 356 break; 357 358 case ACPI_TYPE_PACKAGE: 359 360 Status = AcpiUtCopyIobjectToIobject (ActualSrcDesc, &DestDesc, 361 WalkState); 362 break; 363 364 default: 365 /* 366 * All other types come here. 367 */ 368 ACPI_WARNING ((AE_INFO, "Store into type %s not implemented", 369 AcpiUtGetObjectTypeName (DestDesc))); 370 371 Status = AE_NOT_IMPLEMENTED; 372 break; 373 } 374 375 if (ActualSrcDesc != SourceDesc) 376 { 377 /* Delete the intermediate (temporary) source object */ 378 379 AcpiUtRemoveReference (ActualSrcDesc); 380 } 381 382 *NewDesc = DestDesc; 383 return_ACPI_STATUS (Status); 384 } 385 386 387