aslbtypes.c revision 218585
155714Skris/****************************************************************************** 255714Skris * 355714Skris * Module Name: aslbtypes - Support for bitfield types 455714Skris * 555714Skris *****************************************************************************/ 655714Skris 755714Skris/* 8280304Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 955714Skris * All rights reserved. 1055714Skris * 1155714Skris * Redistribution and use in source and binary forms, with or without 1255714Skris * modification, are permitted provided that the following conditions 1355714Skris * are met: 1455714Skris * 1. Redistributions of source code must retain the above copyright 15280304Sjkim * notice, this list of conditions, and the following disclaimer, 1655714Skris * without modification. 1755714Skris * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1855714Skris * substantially similar to the "NO WARRANTY" disclaimer below 1955714Skris * ("Disclaimer") and any redistribution must be conditioned upon 2055714Skris * including a substantially similar Disclaimer requirement for further 2155714Skris * binary redistribution. 22280304Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 2355714Skris * of any contributors may be used to endorse or promote products derived 2455714Skris * from this software without specific prior written permission. 2555714Skris * 2655714Skris * Alternatively, this software may be distributed under the terms of the 2755714Skris * GNU General Public License ("GPL") version 2 as published by the Free 2855714Skris * Software Foundation. 2955714Skris * 3055714Skris * NO WARRANTY 3155714Skris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3255714Skris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3355714Skris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3455714Skris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3555714Skris * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37280304Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3955714Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40280304Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4155714Skris * POSSIBILITY OF SUCH DAMAGES. 4255714Skris */ 4355714Skris 4455714Skris 4555714Skris#include "aslcompiler.h" 4655714Skris#include "aslcompiler.y.h" 4755714Skris#include "amlcode.h" 4855714Skris 4955714Skris 5055714Skris#define _COMPONENT ACPI_COMPILER 5155714Skris ACPI_MODULE_NAME ("aslbtypes") 52280304Sjkim 5355714Skris/* Local prototypes */ 5455714Skris 5555714Skrisstatic UINT32 5655714SkrisAnMapEtypeToBtype ( 5755714Skris UINT32 Etype); 5855714Skris 5955714Skris 6055714Skris/******************************************************************************* 6155714Skris * 6255714Skris * FUNCTION: AnMapArgTypeToBtype 6355714Skris * 6455714Skris * PARAMETERS: ArgType - The ARGI required type(s) for this 65280304Sjkim * argument, from the opcode info table 66280304Sjkim * 67280304Sjkim * RETURN: The corresponding Bit-encoded types 68280304Sjkim * 6955714Skris * DESCRIPTION: Convert an encoded ARGI required argument type code into a 70280304Sjkim * bitfield type code. Implements the implicit source conversion 71280304Sjkim * rules. 7255714Skris * 73280304Sjkim ******************************************************************************/ 74280304Sjkim 75280304SjkimUINT32 76280304SjkimAnMapArgTypeToBtype ( 77280304Sjkim UINT32 ArgType) 78109998Smarkm{ 79280304Sjkim 80280304Sjkim switch (ArgType) 81280304Sjkim { 82280304Sjkim 83280304Sjkim /* Simple types */ 84280304Sjkim 85280304Sjkim case ARGI_ANYTYPE: 86280304Sjkim return (ACPI_BTYPE_OBJECTS_AND_REFS); 87280304Sjkim 88280304Sjkim case ARGI_PACKAGE: 89280304Sjkim return (ACPI_BTYPE_PACKAGE); 90280304Sjkim 91280304Sjkim case ARGI_EVENT: 92280304Sjkim return (ACPI_BTYPE_EVENT); 93280304Sjkim 94280304Sjkim case ARGI_MUTEX: 95280304Sjkim return (ACPI_BTYPE_MUTEX); 96280304Sjkim 97280304Sjkim case ARGI_DDBHANDLE: 98280304Sjkim /* 99280304Sjkim * DDBHandleObject := SuperName 100280304Sjkim * ACPI_BTYPE_REFERENCE: Index reference as parameter of Load/Unload 10155714Skris */ 10255714Skris return (ACPI_BTYPE_DDB_HANDLE | ACPI_BTYPE_REFERENCE); 103280304Sjkim 104280304Sjkim /* Interchangeable types */ 105280304Sjkim /* 106280304Sjkim * Source conversion rules: 107280304Sjkim * Integer, String, and Buffer are all interchangeable 108280304Sjkim */ 10955714Skris case ARGI_INTEGER: 110280304Sjkim case ARGI_STRING: 11155714Skris case ARGI_BUFFER: 112280304Sjkim case ARGI_BUFFER_OR_STRING: 113280304Sjkim case ARGI_COMPUTEDATA: 114280304Sjkim return (ACPI_BTYPE_COMPUTE_DATA); 115280304Sjkim 116280304Sjkim /* References */ 117280304Sjkim 118280304Sjkim case ARGI_INTEGER_REF: 119280304Sjkim return (ACPI_BTYPE_INTEGER); 120280304Sjkim 121280304Sjkim case ARGI_OBJECT_REF: 122280304Sjkim return (ACPI_BTYPE_ALL_OBJECTS); 123280304Sjkim 124280304Sjkim case ARGI_DEVICE_REF: 125280304Sjkim return (ACPI_BTYPE_DEVICE_OBJECTS); 12655714Skris 127280304Sjkim case ARGI_REFERENCE: 12855714Skris return (ACPI_BTYPE_REFERENCE); 129280304Sjkim 130280304Sjkim case ARGI_TARGETREF: 131280304Sjkim case ARGI_FIXED_TARGET: 13255714Skris case ARGI_SIMPLE_TARGET: 133280304Sjkim return (ACPI_BTYPE_OBJECTS_AND_REFS); 134280304Sjkim 135280304Sjkim /* Complex types */ 136280304Sjkim 137280304Sjkim case ARGI_DATAOBJECT: 138280304Sjkim 13955714Skris /* 140280304Sjkim * Buffer, string, package or reference to a Op - 141280304Sjkim * Used only by SizeOf operator 142280304Sjkim */ 143280304Sjkim return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | 144280304Sjkim ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE); 145280304Sjkim 146280304Sjkim case ARGI_COMPLEXOBJ: 147280304Sjkim 148280304Sjkim /* Buffer, String, or package */ 149280304Sjkim 150280304Sjkim return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | ACPI_BTYPE_PACKAGE); 15155714Skris 152280304Sjkim case ARGI_REF_OR_STRING: 153280304Sjkim return (ACPI_BTYPE_STRING | ACPI_BTYPE_REFERENCE); 154280304Sjkim 155280304Sjkim case ARGI_REGION_OR_BUFFER: 156280304Sjkim 157280304Sjkim /* Used by Load() only. Allow buffers in addition to regions/fields */ 158280304Sjkim 159280304Sjkim return (ACPI_BTYPE_REGION | ACPI_BTYPE_BUFFER | ACPI_BTYPE_FIELD_UNIT); 160280304Sjkim 161280304Sjkim case ARGI_DATAREFOBJ: 162280304Sjkim return (ACPI_BTYPE_INTEGER |ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | 163280304Sjkim ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE); 164280304Sjkim 165280304Sjkim default: 166280304Sjkim break; 167280304Sjkim } 168280304Sjkim 169280304Sjkim return (ACPI_BTYPE_OBJECTS_AND_REFS); 170280304Sjkim} 171280304Sjkim 172280304Sjkim 173280304Sjkim/******************************************************************************* 174280304Sjkim * 175280304Sjkim * FUNCTION: AnMapEtypeToBtype 176280304Sjkim * 177280304Sjkim * PARAMETERS: Etype - Encoded ACPI Type 178280304Sjkim * 179280304Sjkim * RETURN: Btype corresponding to the Etype 180280304Sjkim * 181280304Sjkim * DESCRIPTION: Convert an encoded ACPI type to a bitfield type applying the 182280304Sjkim * operand conversion rules. In other words, returns the type(s) 183280304Sjkim * this Etype is implicitly converted to during interpretation. 184280304Sjkim * 185280304Sjkim ******************************************************************************/ 186280304Sjkim 187280304Sjkimstatic UINT32 188280304SjkimAnMapEtypeToBtype ( 189280304Sjkim UINT32 Etype) 190280304Sjkim{ 191280304Sjkim 192280304Sjkim 193280304Sjkim if (Etype == ACPI_TYPE_ANY) 194280304Sjkim { 195280304Sjkim return (ACPI_BTYPE_OBJECTS_AND_REFS); 196280304Sjkim } 197280304Sjkim 198280304Sjkim /* Try the standard ACPI data types */ 199280304Sjkim 200280304Sjkim if (Etype <= ACPI_TYPE_EXTERNAL_MAX) 201280304Sjkim { 202280304Sjkim /* 203280304Sjkim * This switch statement implements the allowed operand conversion 204280304Sjkim * rules as per the "ASL Data Types" section of the ACPI 205280304Sjkim * specification. 206280304Sjkim */ 207280304Sjkim switch (Etype) 208280304Sjkim { 209280304Sjkim case ACPI_TYPE_INTEGER: 210280304Sjkim return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_DDB_HANDLE); 211280304Sjkim 212306196Sjkim case ACPI_TYPE_STRING: 213306196Sjkim case ACPI_TYPE_BUFFER: 214280304Sjkim return (ACPI_BTYPE_COMPUTE_DATA); 215280304Sjkim 216 case ACPI_TYPE_PACKAGE: 217 return (ACPI_BTYPE_PACKAGE); 218 219 case ACPI_TYPE_FIELD_UNIT: 220 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); 221 222 case ACPI_TYPE_BUFFER_FIELD: 223 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_BUFFER_FIELD); 224 225 case ACPI_TYPE_DDB_HANDLE: 226 return (ACPI_BTYPE_INTEGER | ACPI_BTYPE_DDB_HANDLE); 227 228 case ACPI_BTYPE_DEBUG_OBJECT: 229 230 /* Cannot be used as a source operand */ 231 232 return (0); 233 234 default: 235 return (1 << (Etype - 1)); 236 } 237 } 238 239 /* Try the internal data types */ 240 241 switch (Etype) 242 { 243 case ACPI_TYPE_LOCAL_REGION_FIELD: 244 case ACPI_TYPE_LOCAL_BANK_FIELD: 245 case ACPI_TYPE_LOCAL_INDEX_FIELD: 246 247 /* Named fields can be either Integer/Buffer/String */ 248 249 return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); 250 251 case ACPI_TYPE_LOCAL_ALIAS: 252 253 return (ACPI_BTYPE_INTEGER); 254 255 256 case ACPI_TYPE_LOCAL_RESOURCE: 257 case ACPI_TYPE_LOCAL_RESOURCE_FIELD: 258 259 return (ACPI_BTYPE_REFERENCE); 260 261 default: 262 printf ("Unhandled encoded type: %X\n", Etype); 263 return (0); 264 } 265} 266 267 268/******************************************************************************* 269 * 270 * FUNCTION: AnFormatBtype 271 * 272 * PARAMETERS: Btype - Bitfield of ACPI types 273 * Buffer - Where to put the ascii string 274 * 275 * RETURN: None. 276 * 277 * DESCRIPTION: Convert a Btype to a string of ACPI types 278 * 279 ******************************************************************************/ 280 281void 282AnFormatBtype ( 283 char *Buffer, 284 UINT32 Btype) 285{ 286 UINT32 Type; 287 BOOLEAN First = TRUE; 288 289 290 *Buffer = 0; 291 292 if (Btype == 0) 293 { 294 strcat (Buffer, "NoReturnValue"); 295 return; 296 } 297 298 for (Type = 1; Type <= ACPI_TYPE_EXTERNAL_MAX; Type++) 299 { 300 if (Btype & 0x00000001) 301 { 302 if (!First) 303 { 304 strcat (Buffer, "|"); 305 } 306 First = FALSE; 307 strcat (Buffer, AcpiUtGetTypeName (Type)); 308 } 309 Btype >>= 1; 310 } 311 312 if (Btype & 0x00000001) 313 { 314 if (!First) 315 { 316 strcat (Buffer, "|"); 317 } 318 First = FALSE; 319 strcat (Buffer, "Reference"); 320 } 321 322 Btype >>= 1; 323 if (Btype & 0x00000001) 324 { 325 if (!First) 326 { 327 strcat (Buffer, "|"); 328 } 329 First = FALSE; 330 strcat (Buffer, "Resource"); 331 } 332} 333 334 335/******************************************************************************* 336 * 337 * FUNCTION: AnGetBtype 338 * 339 * PARAMETERS: Op - Parse node whose type will be returned. 340 * 341 * RETURN: The Btype associated with the Op. 342 * 343 * DESCRIPTION: Get the (bitfield) ACPI type associated with the parse node. 344 * Handles the case where the node is a name or method call and 345 * the actual type must be obtained from the namespace node. 346 * 347 ******************************************************************************/ 348 349UINT32 350AnGetBtype ( 351 ACPI_PARSE_OBJECT *Op) 352{ 353 ACPI_NAMESPACE_NODE *Node; 354 ACPI_PARSE_OBJECT *ReferencedNode; 355 UINT32 ThisNodeBtype = 0; 356 357 358 if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 359 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 360 (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 361 { 362 Node = Op->Asl.Node; 363 if (!Node) 364 { 365 DbgPrint (ASL_DEBUG_OUTPUT, 366 "No attached Nsnode: [%s] at line %u name [%s], ignoring typecheck\n", 367 Op->Asl.ParseOpName, Op->Asl.LineNumber, 368 Op->Asl.ExternalName); 369 return (ACPI_UINT32_MAX); 370 } 371 372 ThisNodeBtype = AnMapEtypeToBtype (Node->Type); 373 if (!ThisNodeBtype) 374 { 375 AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, 376 "could not map type"); 377 } 378 379 /* 380 * Since it was a named reference, enable the 381 * reference bit also 382 */ 383 ThisNodeBtype |= ACPI_BTYPE_REFERENCE; 384 385 if (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) 386 { 387 ReferencedNode = Node->Op; 388 if (!ReferencedNode) 389 { 390 /* Check for an internal method */ 391 392 if (AnIsInternalMethod (Op)) 393 { 394 return (AnGetInternalMethodReturnType (Op)); 395 } 396 397 AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, 398 "null Op pointer"); 399 return (ACPI_UINT32_MAX); 400 } 401 402 if (ReferencedNode->Asl.CompileFlags & NODE_METHOD_TYPED) 403 { 404 ThisNodeBtype = ReferencedNode->Asl.AcpiBtype; 405 } 406 else 407 { 408 return (ACPI_UINT32_MAX -1); 409 } 410 } 411 } 412 else 413 { 414 ThisNodeBtype = Op->Asl.AcpiBtype; 415 } 416 417 return (ThisNodeBtype); 418} 419 420 421/******************************************************************************* 422 * 423 * FUNCTION: AnMapObjTypeToBtype 424 * 425 * PARAMETERS: Op - A parse node 426 * 427 * RETURN: A Btype 428 * 429 * DESCRIPTION: Map object to the associated "Btype" 430 * 431 ******************************************************************************/ 432 433UINT32 434AnMapObjTypeToBtype ( 435 ACPI_PARSE_OBJECT *Op) 436{ 437 438 switch (Op->Asl.ParseOpcode) 439 { 440 case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */ 441 return (ACPI_BTYPE_BUFFER_FIELD); 442 443 case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */ 444 return (ACPI_BTYPE_BUFFER); 445 446 case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */ 447 return (ACPI_BTYPE_DDB_HANDLE); 448 449 case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */ 450 return (ACPI_BTYPE_DEVICE); 451 452 case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */ 453 return (ACPI_BTYPE_EVENT); 454 455 case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */ 456 return (ACPI_BTYPE_FIELD_UNIT); 457 458 case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */ 459 return (ACPI_BTYPE_INTEGER); 460 461 case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */ 462 return (ACPI_BTYPE_METHOD); 463 464 case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */ 465 return (ACPI_BTYPE_MUTEX); 466 467 case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */ 468 return (ACPI_BTYPE_REGION); 469 470 case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */ 471 return (ACPI_BTYPE_PACKAGE); 472 473 case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */ 474 return (ACPI_BTYPE_POWER); 475 476 case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */ 477 return (ACPI_BTYPE_STRING); 478 479 case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */ 480 return (ACPI_BTYPE_THERMAL); 481 482 case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */ 483 return (ACPI_BTYPE_OBJECTS_AND_REFS); 484 485 default: 486 return (0); 487 } 488} 489 490 491#ifdef ACPI_OBSOLETE_FUNCTIONS 492/******************************************************************************* 493 * 494 * FUNCTION: AnMapBtypeToEtype 495 * 496 * PARAMETERS: Btype - Bitfield of ACPI types 497 * 498 * RETURN: The Etype corresponding the the Btype 499 * 500 * DESCRIPTION: Convert a bitfield type to an encoded type 501 * 502 ******************************************************************************/ 503 504UINT32 505AnMapBtypeToEtype ( 506 UINT32 Btype) 507{ 508 UINT32 i; 509 UINT32 Etype; 510 511 512 if (Btype == 0) 513 { 514 return (0); 515 } 516 517 Etype = 1; 518 for (i = 1; i < Btype; i *= 2) 519 { 520 Etype++; 521 } 522 523 return (Etype); 524} 525#endif 526