aslbtypes.c revision 241973
1158115Sume/****************************************************************************** 2158115Sume * 3158115Sume * Module Name: aslbtypes - Support for bitfield types 4158115Sume * 5158115Sume *****************************************************************************/ 6158115Sume 7158115Sume/* 8158115Sume * Copyright (C) 2000 - 2012, Intel Corp. 9158115Sume * All rights reserved. 10158115Sume * 11158115Sume * Redistribution and use in source and binary forms, with or without 12158115Sume * modification, are permitted provided that the following conditions 13158115Sume * are met: 14158115Sume * 1. Redistributions of source code must retain the above copyright 15158115Sume * notice, this list of conditions, and the following disclaimer, 16158115Sume * without modification. 17158115Sume * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18158115Sume * substantially similar to the "NO WARRANTY" disclaimer below 19158115Sume * ("Disclaimer") and any redistribution must be conditioned upon 20158115Sume * including a substantially similar Disclaimer requirement for further 21158115Sume * binary redistribution. 22158115Sume * 3. Neither the names of the above-listed copyright holders nor the names 23158115Sume * of any contributors may be used to endorse or promote products derived 24158115Sume * from this software without specific prior written permission. 25158115Sume * 26158115Sume * Alternatively, this software may be distributed under the terms of the 27158115Sume * GNU General Public License ("GPL") version 2 as published by the Free 28158115Sume * Software Foundation. 29158115Sume * 30158115Sume * NO WARRANTY 31194093Sdes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32194093Sdes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33158115Sume * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34158115Sume * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35194093Sdes * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36158115Sume * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37158115Sume * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38194093Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39158115Sume * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40158115Sume * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41158115Sume * POSSIBILITY OF SUCH DAMAGES. 42158115Sume */ 43158115Sume 44158115Sume 45158115Sume#include <contrib/dev/acpica/compiler/aslcompiler.h> 46158115Sume#include "aslcompiler.y.h" 47158115Sume#include <contrib/dev/acpica/include/amlcode.h> 48158115Sume 49158115Sume 50158115Sume#define _COMPONENT ACPI_COMPILER 51158115Sume ACPI_MODULE_NAME ("aslbtypes") 52158115Sume 53158115Sume/* Local prototypes */ 54158115Sume 55158115Sumestatic UINT32 56158115SumeAnMapEtypeToBtype ( 57158115Sume UINT32 Etype); 58158115Sume 59158115Sume 60158115Sume/******************************************************************************* 61158115Sume * 62158115Sume * FUNCTION: AnMapArgTypeToBtype 63158115Sume * 64158115Sume * PARAMETERS: ArgType - The ARGI required type(s) for this 65158115Sume * argument, from the opcode info table 66158115Sume * 67158115Sume * RETURN: The corresponding Bit-encoded types 68158115Sume * 69158115Sume * DESCRIPTION: Convert an encoded ARGI required argument type code into a 70158115Sume * bitfield type code. Implements the implicit source conversion 71158115Sume * rules. 72158115Sume * 73158115Sume ******************************************************************************/ 74158115Sume 75158115SumeUINT32 76158115SumeAnMapArgTypeToBtype ( 77158115Sume UINT32 ArgType) 78158115Sume{ 79158115Sume 80158115Sume switch (ArgType) 81158115Sume { 82158115Sume 83158115Sume /* Simple types */ 84158115Sume 85158115Sume case ARGI_ANYTYPE: 86158115Sume return (ACPI_BTYPE_OBJECTS_AND_REFS); 87158115Sume 88158115Sume case ARGI_PACKAGE: 89158115Sume return (ACPI_BTYPE_PACKAGE); 90158115Sume 91158115Sume case ARGI_EVENT: 92158115Sume return (ACPI_BTYPE_EVENT); 93158115Sume 94158115Sume case ARGI_MUTEX: 95158115Sume return (ACPI_BTYPE_MUTEX); 96158115Sume 97158115Sume case ARGI_DDBHANDLE: 98158115Sume /* 99158115Sume * DDBHandleObject := SuperName 100158115Sume * ACPI_BTYPE_REFERENCE: Index reference as parameter of Load/Unload 101158115Sume */ 102158115Sume return (ACPI_BTYPE_DDB_HANDLE | ACPI_BTYPE_REFERENCE); 103158115Sume 104158115Sume /* Interchangeable types */ 105158115Sume /* 106158115Sume * Source conversion rules: 107158115Sume * Integer, String, and Buffer are all interchangeable 108158115Sume */ 109158115Sume case ARGI_INTEGER: 110158115Sume case ARGI_STRING: 111158115Sume case ARGI_BUFFER: 112158115Sume case ARGI_BUFFER_OR_STRING: 113158115Sume case ARGI_COMPUTEDATA: 114158115Sume return (ACPI_BTYPE_COMPUTE_DATA); 115158115Sume 116158115Sume /* References */ 117158115Sume 118158115Sume case ARGI_INTEGER_REF: 119158115Sume return (ACPI_BTYPE_INTEGER); 120158115Sume 121158115Sume case ARGI_OBJECT_REF: 122158115Sume return (ACPI_BTYPE_ALL_OBJECTS); 123158115Sume 124158115Sume case ARGI_DEVICE_REF: 125183770Sdelphij return (ACPI_BTYPE_DEVICE_OBJECTS); 126158115Sume 127158115Sume case ARGI_REFERENCE: 128158115Sume return (ACPI_BTYPE_REFERENCE); 129158115Sume 130158115Sume case ARGI_TARGETREF: 131158115Sume case ARGI_FIXED_TARGET: 132158115Sume case ARGI_SIMPLE_TARGET: 133158115Sume return (ACPI_BTYPE_OBJECTS_AND_REFS); 134158115Sume 135158115Sume /* Complex types */ 136158115Sume 137158115Sume case ARGI_DATAOBJECT: 138158115Sume 139158115Sume /* 140158115Sume * Buffer, string, package or reference to a Op - 141158115Sume * Used only by SizeOf operator 142158115Sume */ 143158115Sume return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | 144158115Sume ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE); 145158115Sume 146158115Sume case ARGI_COMPLEXOBJ: 147158115Sume 148194096Sdes /* Buffer, String, or package */ 149158115Sume 150158115Sume return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | ACPI_BTYPE_PACKAGE); 151158115Sume 152158115Sume case ARGI_REF_OR_STRING: 153158115Sume return (ACPI_BTYPE_STRING | ACPI_BTYPE_REFERENCE); 154158115Sume 155158115Sume case ARGI_REGION_OR_BUFFER: 156158115Sume 157158115Sume /* Used by Load() only. Allow buffers in addition to regions/fields */ 158158115Sume 159158115Sume return (ACPI_BTYPE_REGION | ACPI_BTYPE_BUFFER | ACPI_BTYPE_FIELD_UNIT); 160158115Sume 161158115Sume case ARGI_DATAREFOBJ: 162158115Sume return (ACPI_BTYPE_INTEGER |ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | 163158115Sume ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE); 164158115Sume 165158115Sume default: 166158115Sume break; 167158115Sume } 168158115Sume 169158115Sume return (ACPI_BTYPE_OBJECTS_AND_REFS); 170158115Sume} 171158115Sume 172158115Sume 173158115Sume/******************************************************************************* 174158115Sume * 175158115Sume * FUNCTION: AnMapEtypeToBtype 176158115Sume * 177158115Sume * PARAMETERS: Etype - Encoded ACPI Type 178158115Sume * 179158115Sume * RETURN: Btype corresponding to the Etype 180158115Sume * 181158115Sume * DESCRIPTION: Convert an encoded ACPI type to a bitfield type applying the 182158115Sume * operand conversion rules. In other words, returns the type(s) 183158115Sume * this Etype is implicitly converted to during interpretation. 184158115Sume * 185158115Sume ******************************************************************************/ 186158115Sume 187158115Sumestatic UINT32 188158115SumeAnMapEtypeToBtype ( 189158115Sume UINT32 Etype) 190158115Sume{ 191158115Sume 192158115Sume 193158115Sume if (Etype == ACPI_TYPE_ANY) 194158115Sume { 195158115Sume return (ACPI_BTYPE_OBJECTS_AND_REFS); 196158115Sume } 197158115Sume 198158115Sume /* Try the standard ACPI data types */ 199158115Sume 200158115Sume if (Etype <= ACPI_TYPE_EXTERNAL_MAX) 201158115Sume { 202158115Sume /* 203158115Sume * This switch statement implements the allowed operand conversion 204158115Sume * rules as per the "ASL Data Types" section of the ACPI 205171795Sbushman * specification. 206158115Sume */ 207158115Sume switch (Etype) 208158115Sume { 209158115Sume case ACPI_TYPE_INTEGER: 210158115Sume return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_DDB_HANDLE); 211158115Sume 212158115Sume case ACPI_TYPE_STRING: 213158115Sume case ACPI_TYPE_BUFFER: 214158115Sume return (ACPI_BTYPE_COMPUTE_DATA); 215158115Sume 216158115Sume case ACPI_TYPE_PACKAGE: 217158115Sume return (ACPI_BTYPE_PACKAGE); 218158115Sume 219194097Sdes case ACPI_TYPE_FIELD_UNIT: 220158115Sume return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); 221158115Sume 222158115Sume case ACPI_TYPE_BUFFER_FIELD: 223158115Sume return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_BUFFER_FIELD); 224158115Sume 225158115Sume case ACPI_TYPE_DDB_HANDLE: 226158115Sume return (ACPI_BTYPE_INTEGER | ACPI_BTYPE_DDB_HANDLE); 227158115Sume 228158115Sume case ACPI_BTYPE_DEBUG_OBJECT: 229158115Sume 230158115Sume /* Cannot be used as a source operand */ 231158115Sume 232158115Sume return (0); 233158115Sume 234158115Sume default: 235158115Sume return (1 << (Etype - 1)); 236158115Sume } 237158115Sume } 238158115Sume 239158115Sume /* Try the internal data types */ 240158115Sume 241158115Sume switch (Etype) 242158115Sume { 243158115Sume case ACPI_TYPE_LOCAL_REGION_FIELD: 244158115Sume case ACPI_TYPE_LOCAL_BANK_FIELD: 245158115Sume case ACPI_TYPE_LOCAL_INDEX_FIELD: 246158115Sume 247158115Sume /* Named fields can be either Integer/Buffer/String */ 248158115Sume 249158115Sume return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); 250158115Sume 251158115Sume case ACPI_TYPE_LOCAL_ALIAS: 252158115Sume 253158115Sume return (ACPI_BTYPE_INTEGER); 254158115Sume 255158115Sume 256158115Sume case ACPI_TYPE_LOCAL_RESOURCE: 257158115Sume case ACPI_TYPE_LOCAL_RESOURCE_FIELD: 258158115Sume 259158115Sume return (ACPI_BTYPE_REFERENCE); 260158115Sume 261158115Sume default: 262158115Sume printf ("Unhandled encoded type: %X\n", Etype); 263158115Sume return (0); 264158115Sume } 265158115Sume} 266158115Sume 267158115Sume 268158115Sume/******************************************************************************* 269158115Sume * 270158115Sume * FUNCTION: AnFormatBtype 271158115Sume * 272158115Sume * PARAMETERS: Btype - Bitfield of ACPI types 273158115Sume * Buffer - Where to put the ascii string 274158115Sume * 275158115Sume * RETURN: None. 276158115Sume * 277158115Sume * DESCRIPTION: Convert a Btype to a string of ACPI types 278158115Sume * 279158115Sume ******************************************************************************/ 280158115Sume 281158115Sumevoid 282158115SumeAnFormatBtype ( 283158115Sume char *Buffer, 284158115Sume UINT32 Btype) 285158115Sume{ 286158115Sume UINT32 Type; 287158115Sume BOOLEAN First = TRUE; 288158115Sume 289158115Sume 290158115Sume *Buffer = 0; 291158115Sume 292158115Sume if (Btype == 0) 293158115Sume { 294158115Sume strcat (Buffer, "NoReturnValue"); 295158115Sume return; 296158115Sume } 297158115Sume 298158115Sume for (Type = 1; Type <= ACPI_TYPE_EXTERNAL_MAX; Type++) 299158115Sume { 300158115Sume if (Btype & 0x00000001) 301158115Sume { 302158115Sume if (!First) 303158115Sume { 304158115Sume strcat (Buffer, "|"); 305158115Sume } 306158115Sume First = FALSE; 307158115Sume strcat (Buffer, AcpiUtGetTypeName (Type)); 308158115Sume } 309158115Sume Btype >>= 1; 310158115Sume } 311158115Sume 312158115Sume if (Btype & 0x00000001) 313158115Sume { 314158115Sume if (!First) 315158115Sume { 316158115Sume strcat (Buffer, "|"); 317158115Sume } 318158115Sume First = FALSE; 319158115Sume strcat (Buffer, "Reference"); 320158115Sume } 321158115Sume 322158115Sume Btype >>= 1; 323158115Sume if (Btype & 0x00000001) 324158115Sume { 325158115Sume if (!First) 326158115Sume { 327158115Sume strcat (Buffer, "|"); 328158115Sume } 329158115Sume First = FALSE; 330158115Sume strcat (Buffer, "Resource"); 331158115Sume } 332158115Sume} 333158115Sume 334158115Sume 335158115Sume/******************************************************************************* 336158115Sume * 337158115Sume * FUNCTION: AnGetBtype 338158115Sume * 339158115Sume * PARAMETERS: Op - Parse node whose type will be returned. 340158115Sume * 341158115Sume * RETURN: The Btype associated with the Op. 342158115Sume * 343158115Sume * DESCRIPTION: Get the (bitfield) ACPI type associated with the parse node. 344158115Sume * Handles the case where the node is a name or method call and 345158115Sume * the actual type must be obtained from the namespace node. 346158115Sume * 347158115Sume ******************************************************************************/ 348158115Sume 349158115SumeUINT32 350158115SumeAnGetBtype ( 351158115Sume ACPI_PARSE_OBJECT *Op) 352158115Sume{ 353158115Sume ACPI_NAMESPACE_NODE *Node; 354158115Sume ACPI_PARSE_OBJECT *ReferencedNode; 355158115Sume UINT32 ThisNodeBtype = 0; 356158115Sume 357158115Sume 358158115Sume if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 359158115Sume (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 360158115Sume (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 361158115Sume { 362158115Sume Node = Op->Asl.Node; 363158115Sume if (!Node) 364158115Sume { 365158115Sume DbgPrint (ASL_DEBUG_OUTPUT, 366158115Sume "No attached Nsnode: [%s] at line %u name [%s], ignoring typecheck\n", 367158115Sume Op->Asl.ParseOpName, Op->Asl.LineNumber, 368158115Sume Op->Asl.ExternalName); 369158115Sume return (ACPI_UINT32_MAX); 370158115Sume } 371158115Sume 372158115Sume ThisNodeBtype = AnMapEtypeToBtype (Node->Type); 373158115Sume if (!ThisNodeBtype) 374158115Sume { 375158115Sume AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, 376158115Sume "could not map type"); 377158115Sume } 378183770Sdelphij 379158115Sume /* 380158115Sume * Since it was a named reference, enable the 381158115Sume * reference bit also 382158115Sume */ 383158115Sume ThisNodeBtype |= ACPI_BTYPE_REFERENCE; 384158115Sume 385158115Sume if (Op->Asl.ParseOpcode == PARSEOP_METHODCALL) 386158115Sume { 387158115Sume ReferencedNode = Node->Op; 388158115Sume if (!ReferencedNode) 389158115Sume { 390158115Sume /* Check for an internal method */ 391158115Sume 392158115Sume if (AnIsInternalMethod (Op)) 393158115Sume { 394158115Sume return (AnGetInternalMethodReturnType (Op)); 395158115Sume } 396158115Sume 397158115Sume AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, 398158115Sume "null Op pointer"); 399158115Sume return (ACPI_UINT32_MAX); 400194096Sdes } 401158115Sume 402158115Sume if (ReferencedNode->Asl.CompileFlags & NODE_METHOD_TYPED) 403158115Sume { 404158115Sume ThisNodeBtype = ReferencedNode->Asl.AcpiBtype; 405158115Sume } 406158115Sume else 407158115Sume { 408158115Sume return (ACPI_UINT32_MAX -1); 409158115Sume } 410158115Sume } 411158115Sume } 412158115Sume else 413158115Sume { 414158115Sume ThisNodeBtype = Op->Asl.AcpiBtype; 415158115Sume } 416158115Sume 417158115Sume return (ThisNodeBtype); 418158115Sume} 419158115Sume 420158115Sume 421158115Sume/******************************************************************************* 422158115Sume * 423158115Sume * FUNCTION: AnMapObjTypeToBtype 424158115Sume * 425158115Sume * PARAMETERS: Op - A parse node 426158115Sume * 427158115Sume * RETURN: A Btype 428158115Sume * 429158115Sume * DESCRIPTION: Map object to the associated "Btype" 430158115Sume * 431158115Sume ******************************************************************************/ 432158115Sume 433158115SumeUINT32 434158115SumeAnMapObjTypeToBtype ( 435158115Sume ACPI_PARSE_OBJECT *Op) 436158115Sume{ 437158115Sume 438158115Sume switch (Op->Asl.ParseOpcode) 439158115Sume { 440158115Sume case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */ 441158115Sume return (ACPI_BTYPE_BUFFER_FIELD); 442158115Sume 443158115Sume case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */ 444158115Sume return (ACPI_BTYPE_BUFFER); 445158115Sume 446158115Sume case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */ 447158115Sume return (ACPI_BTYPE_DDB_HANDLE); 448158115Sume 449158115Sume case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */ 450158115Sume return (ACPI_BTYPE_DEVICE); 451158115Sume 452158115Sume case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */ 453158115Sume return (ACPI_BTYPE_EVENT); 454158115Sume 455158115Sume case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */ 456158115Sume return (ACPI_BTYPE_FIELD_UNIT); 457158115Sume 458158115Sume case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */ 459158115Sume return (ACPI_BTYPE_INTEGER); 460158115Sume 461158115Sume case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */ 462158115Sume return (ACPI_BTYPE_METHOD); 463158115Sume 464158115Sume case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */ 465158115Sume return (ACPI_BTYPE_MUTEX); 466158115Sume 467158115Sume case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */ 468158115Sume return (ACPI_BTYPE_REGION); 469158115Sume 470158115Sume case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */ 471158115Sume return (ACPI_BTYPE_PACKAGE); 472158115Sume 473158115Sume case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */ 474158115Sume return (ACPI_BTYPE_POWER); 475158115Sume 476158115Sume case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */ 477158115Sume return (ACPI_BTYPE_STRING); 478158115Sume 479158115Sume case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */ 480158115Sume return (ACPI_BTYPE_THERMAL); 481158115Sume 482158115Sume case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */ 483158115Sume return (ACPI_BTYPE_OBJECTS_AND_REFS); 484158115Sume 485158115Sume default: 486158115Sume return (0); 487158115Sume } 488158115Sume} 489158115Sume 490158115Sume 491158115Sume#ifdef ACPI_OBSOLETE_FUNCTIONS 492158115Sume/******************************************************************************* 493158115Sume * 494158115Sume * FUNCTION: AnMapBtypeToEtype 495158115Sume * 496158115Sume * PARAMETERS: Btype - Bitfield of ACPI types 497158115Sume * 498158115Sume * RETURN: The Etype corresponding the the Btype 499158115Sume * 500158115Sume * DESCRIPTION: Convert a bitfield type to an encoded type 501158115Sume * 502158115Sume ******************************************************************************/ 503158115Sume 504158115SumeUINT32 505158115SumeAnMapBtypeToEtype ( 506158115Sume UINT32 Btype) 507158115Sume{ 508158115Sume UINT32 i; 509158115Sume UINT32 Etype; 510158115Sume 511158115Sume 512158115Sume if (Btype == 0) 513158115Sume { 514158115Sume return (0); 515158115Sume } 516158115Sume 517158115Sume Etype = 1; 518158115Sume for (i = 1; i < Btype; i *= 2) 519158115Sume { 520158115Sume Etype++; 521158115Sume } 522158115Sume 523158115Sume return (Etype); 524158115Sume} 525194097Sdes#endif 526194097Sdes