1 /****************************************************************************** 2 * 3 * Module Name: aslbtypes - Support for bitfield types 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2013, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 45 #include "aslcompiler.h" 46 #include "aslcompiler.y.h" 47 #include "amlcode.h" 48 49 50 #define _COMPONENT ACPI_COMPILER 51 ACPI_MODULE_NAME ("aslbtypes") 52 53 /* Local prototypes */ 54 55 static UINT32 56 AnMapEtypeToBtype ( 57 UINT32 Etype); 58 59 60 /******************************************************************************* 61 * 62 * FUNCTION: AnMapArgTypeToBtype 63 * 64 * PARAMETERS: ArgType - The ARGI required type(s) for this 65 * argument, from the opcode info table 66 * 67 * RETURN: The corresponding Bit-encoded types 68 * 69 * DESCRIPTION: Convert an encoded ARGI required argument type code into a 70 * bitfield type code. Implements the implicit source conversion 71 * rules. 72 * 73 ******************************************************************************/ 74 75 UINT32 76 AnMapArgTypeToBtype ( 77 UINT32 ArgType) 78 { 79 80 switch (ArgType) 81 { 82 83 /* Simple types */ 84 85 case ARGI_ANYTYPE: 86 87 return (ACPI_BTYPE_OBJECTS_AND_REFS); 88 89 case ARGI_PACKAGE: 90 91 return (ACPI_BTYPE_PACKAGE); 92 93 case ARGI_EVENT: 94 95 return (ACPI_BTYPE_EVENT); 96 97 case ARGI_MUTEX: 98 99 return (ACPI_BTYPE_MUTEX); 100 101 case ARGI_DDBHANDLE: 102 /* 103 * DDBHandleObject := SuperName 104 * ACPI_BTYPE_REFERENCE: Index reference as parameter of Load/Unload 105 */ 106 return (ACPI_BTYPE_DDB_HANDLE | ACPI_BTYPE_REFERENCE); 107 108 /* Interchangeable types */ 109 /* 110 * Source conversion rules: 111 * Integer, String, and Buffer are all interchangeable 112 */ 113 case ARGI_INTEGER: 114 case ARGI_STRING: 115 case ARGI_BUFFER: 116 case ARGI_BUFFER_OR_STRING: 117 case ARGI_COMPUTEDATA: 118 119 return (ACPI_BTYPE_COMPUTE_DATA); 120 121 /* References */ 122 123 case ARGI_INTEGER_REF: 124 125 return (ACPI_BTYPE_INTEGER); 126 127 case ARGI_OBJECT_REF: 128 129 return (ACPI_BTYPE_ALL_OBJECTS); 130 131 case ARGI_DEVICE_REF: 132 133 return (ACPI_BTYPE_DEVICE_OBJECTS); 134 135 case ARGI_REFERENCE: 136 137 return (ACPI_BTYPE_REFERENCE); 138 139 case ARGI_TARGETREF: 140 case ARGI_FIXED_TARGET: 141 case ARGI_SIMPLE_TARGET: 142 143 return (ACPI_BTYPE_OBJECTS_AND_REFS); 144 145 /* Complex types */ 146 147 case ARGI_DATAOBJECT: 148 /* 149 * Buffer, string, package or reference to a Op - 150 * Used only by SizeOf operator 151 */ 152 return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | 153 ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE); 154 155 case ARGI_COMPLEXOBJ: 156 157 /* Buffer, String, or package */ 158 159 return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | ACPI_BTYPE_PACKAGE); 160 161 case ARGI_REF_OR_STRING: 162 163 return (ACPI_BTYPE_STRING | ACPI_BTYPE_REFERENCE); 164 165 case ARGI_REGION_OR_BUFFER: 166 167 /* Used by Load() only. Allow buffers in addition to regions/fields */ 168 169 return (ACPI_BTYPE_REGION | ACPI_BTYPE_BUFFER | ACPI_BTYPE_FIELD_UNIT); 170 171 case ARGI_DATAREFOBJ: 172 173 return (ACPI_BTYPE_INTEGER |ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | 174 ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE); 175 176 default: 177 178 break; 179 } 180 181 return (ACPI_BTYPE_OBJECTS_AND_REFS); 182 } 183 184 185 /******************************************************************************* 186 * 187 * FUNCTION: AnMapEtypeToBtype 188 * 189 * PARAMETERS: Etype - Encoded ACPI Type 190 * 191 * RETURN: Btype corresponding to the Etype 192 * 193 * DESCRIPTION: Convert an encoded ACPI type to a bitfield type applying the 194 * operand conversion rules. In other words, returns the type(s) 195 * this Etype is implicitly converted to during interpretation. 196 * 197 ******************************************************************************/ 198 199 static UINT32 200 AnMapEtypeToBtype ( 201 UINT32 Etype) 202 { 203 204 205 if (Etype == ACPI_TYPE_ANY) 206 { 207 return (ACPI_BTYPE_OBJECTS_AND_REFS); 208 } 209 210 /* Try the standard ACPI data types */ 211 212 if (Etype <= ACPI_TYPE_EXTERNAL_MAX) 213 { 214 /* 215 * This switch statement implements the allowed operand conversion 216 * rules as per the "ASL Data Types" section of the ACPI 217 * specification. 218 */ 219 switch (Etype) 220 { 221 case ACPI_TYPE_INTEGER: 222 223 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_DDB_HANDLE); 224 225 case ACPI_TYPE_STRING: 226 case ACPI_TYPE_BUFFER: 227 228 return (ACPI_BTYPE_COMPUTE_DATA); 229 230 case ACPI_TYPE_PACKAGE: 231 232 return (ACPI_BTYPE_PACKAGE); 233 234 case ACPI_TYPE_FIELD_UNIT: 235 236 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); 237 238 case ACPI_TYPE_BUFFER_FIELD: 239 240 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_BUFFER_FIELD); 241 242 case ACPI_TYPE_DDB_HANDLE: 243 244 return (ACPI_BTYPE_INTEGER | ACPI_BTYPE_DDB_HANDLE); 245 246 case ACPI_TYPE_DEBUG_OBJECT: 247 248 /* Cannot be used as a source operand */ 249 250 return (0); 251 252 default: 253 254 return (1 << (Etype - 1)); 255 } 256 } 257 258 /* Try the internal data types */ 259 260 switch (Etype) 261 { 262 case ACPI_TYPE_LOCAL_REGION_FIELD: 263 case ACPI_TYPE_LOCAL_BANK_FIELD: 264 case ACPI_TYPE_LOCAL_INDEX_FIELD: 265 266 /* Named fields can be either Integer/Buffer/String */ 267 268 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); 269 270 case ACPI_TYPE_LOCAL_ALIAS: 271 272 return (ACPI_BTYPE_INTEGER); 273 274 275 case ACPI_TYPE_LOCAL_RESOURCE: 276 case ACPI_TYPE_LOCAL_RESOURCE_FIELD: 277 278 return (ACPI_BTYPE_REFERENCE); 279 280 default: 281 282 printf ("Unhandled encoded type: %X\n", Etype); 283 return (0); 284 } 285 } 286 287 288 /******************************************************************************* 289 * 290 * FUNCTION: AnFormatBtype 291 * 292 * PARAMETERS: Btype - Bitfield of ACPI types 293 * Buffer - Where to put the ascii string 294 * 295 * RETURN: None. 296 * 297 * DESCRIPTION: Convert a Btype to a string of ACPI types 298 * 299 ******************************************************************************/ 300 301 void 302 AnFormatBtype ( 303 char *Buffer, 304 UINT32 Btype) 305 { 306 UINT32 Type; 307 BOOLEAN First = TRUE; 308 309 310 *Buffer = 0; 311 312 if (Btype == 0) 313 { 314 strcat (Buffer, "NoReturnValue"); 315 return; 316 } 317 318 for (Type = 1; Type <= ACPI_TYPE_EXTERNAL_MAX; Type++) 319 { 320 if (Btype & 0x00000001) 321 { 322 if (!First) 323 { 324 strcat (Buffer, "|"); 325 } 326 First = FALSE; 327 strcat (Buffer, AcpiUtGetTypeName (Type)); 328 } 329 Btype >>= 1; 330 } 331 332 if (Btype & 0x00000001) 333 { 334 if (!First) 335 { 336 strcat (Buffer, "|"); 337 } 338 First = FALSE; 339 strcat (Buffer, "Reference"); 340 } 341 342 Btype >>= 1; 343 if (Btype & 0x00000001) 344 { 345 if (!First) 346 { 347 strcat (Buffer, "|"); 348 } 349 First = FALSE; 350 strcat (Buffer, "Resource"); 351 } 352 } 353 354 355 /******************************************************************************* 356 * 357 * FUNCTION: AnGetBtype 358 * 359 * PARAMETERS: Op - Parse node whose type will be returned. 360 * 361 * RETURN: The Btype associated with the Op. 362 * 363 * DESCRIPTION: Get the (bitfield) ACPI type associated with the parse node. 364 * Handles the case where the node is a name or method call and 365 * the actual type must be obtained from the namespace node. 366 * 367 ******************************************************************************/ 368 369 UINT32 370 AnGetBtype ( 371 ACPI_PARSE_OBJECT *Op) 372 { 373 ACPI_NAMESPACE_NODE *Node; 374 ACPI_PARSE_OBJECT *ReferencedNode; 375 UINT32 ThisNodeBtype = 0; 376 377 378 if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 379 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 380 (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 381 { 382 Node = Op->Asl.Node; 383 if (!Node) 384 { 385 DbgPrint (ASL_DEBUG_OUTPUT, 386 "No attached Nsnode: [%s] at line %u name [%s], ignoring typecheck\n", 387 Op->Asl.ParseOpName, Op->Asl.LineNumber, 388 Op->Asl.ExternalName); 389 return (ACPI_UINT32_MAX); 390 } 391 392 ThisNodeBtype = AnMapEtypeToBtype (Node->Type); 393 if (!ThisNodeBtype) 394 { 395 AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, 396 "could not map type"); 397 } 398 399 /* 400 * Since it was a named reference, enable the 401 * reference bit also 402 */ 403 ThisNodeBtype |= ACPI_BTYPE_REFERENCE; 404 405 if (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) 406 { 407 ReferencedNode = Node->Op; 408 if (!ReferencedNode) 409 { 410 /* Check for an internal method */ 411 412 if (AnIsInternalMethod (Op)) 413 { 414 return (AnGetInternalMethodReturnType (Op)); 415 } 416 417 AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, 418 "null Op pointer"); 419 return (ACPI_UINT32_MAX); 420 } 421 422 if (ReferencedNode->Asl.CompileFlags & NODE_METHOD_TYPED) 423 { 424 ThisNodeBtype = ReferencedNode->Asl.AcpiBtype; 425 } 426 else 427 { 428 return (ACPI_UINT32_MAX -1); 429 } 430 } 431 } 432 else 433 { 434 ThisNodeBtype = Op->Asl.AcpiBtype; 435 } 436 437 return (ThisNodeBtype); 438 } 439 440 441 /******************************************************************************* 442 * 443 * FUNCTION: AnMapObjTypeToBtype 444 * 445 * PARAMETERS: Op - A parse node 446 * 447 * RETURN: A Btype 448 * 449 * DESCRIPTION: Map object to the associated "Btype" 450 * 451 ******************************************************************************/ 452 453 UINT32 454 AnMapObjTypeToBtype ( 455 ACPI_PARSE_OBJECT *Op) 456 { 457 458 switch (Op->Asl.ParseOpcode) 459 { 460 case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */ 461 462 return (ACPI_BTYPE_BUFFER_FIELD); 463 464 case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */ 465 466 return (ACPI_BTYPE_BUFFER); 467 468 case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */ 469 470 return (ACPI_BTYPE_DDB_HANDLE); 471 472 case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */ 473 474 return (ACPI_BTYPE_DEVICE); 475 476 case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */ 477 478 return (ACPI_BTYPE_EVENT); 479 480 case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */ 481 482 return (ACPI_BTYPE_FIELD_UNIT); 483 484 case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */ 485 486 return (ACPI_BTYPE_INTEGER); 487 488 case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */ 489 490 return (ACPI_BTYPE_METHOD); 491 492 case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */ 493 494 return (ACPI_BTYPE_MUTEX); 495 496 case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */ 497 498 return (ACPI_BTYPE_REGION); 499 500 case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */ 501 502 return (ACPI_BTYPE_PACKAGE); 503 504 case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */ 505 506 return (ACPI_BTYPE_POWER); 507 508 case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */ 509 510 return (ACPI_BTYPE_STRING); 511 512 case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */ 513 514 return (ACPI_BTYPE_THERMAL); 515 516 case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */ 517 518 return (ACPI_BTYPE_OBJECTS_AND_REFS); 519 520 default: 521 522 return (0); 523 } 524 } 525 526 527 #ifdef ACPI_OBSOLETE_FUNCTIONS 528 /******************************************************************************* 529 * 530 * FUNCTION: AnMapBtypeToEtype 531 * 532 * PARAMETERS: Btype - Bitfield of ACPI types 533 * 534 * RETURN: The Etype corresponding the the Btype 535 * 536 * DESCRIPTION: Convert a bitfield type to an encoded type 537 * 538 ******************************************************************************/ 539 540 UINT32 541 AnMapBtypeToEtype ( 542 UINT32 Btype) 543 { 544 UINT32 i; 545 UINT32 Etype; 546 547 548 if (Btype == 0) 549 { 550 return (0); 551 } 552 553 Etype = 1; 554 for (i = 1; i < Btype; i *= 2) 555 { 556 Etype++; 557 } 558 559 return (Etype); 560 } 561 #endif