1 /******************************************************************************
3 * Module Name: aslbtypes - Support for bitfield types
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2016, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
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.
44 #include "aslcompiler.h"
45 #include "aslcompiler.y.h"
49 #define _COMPONENT ACPI_COMPILER
50 ACPI_MODULE_NAME ("aslbtypes")
52 /* Local prototypes */
59 /*******************************************************************************
61 * FUNCTION: AnMapArgTypeToBtype
63 * PARAMETERS: ArgType - The ARGI required type(s) for this
64 * argument, from the opcode info table
66 * RETURN: The corresponding Bit-encoded types
68 * DESCRIPTION: Convert an encoded ARGI required argument type code into a
69 * bitfield type code. Implements the implicit source conversion
72 ******************************************************************************/
85 return (ACPI_BTYPE_OBJECTS_AND_REFS
);
89 return (ACPI_BTYPE_PACKAGE
);
93 return (ACPI_BTYPE_EVENT
);
97 return (ACPI_BTYPE_MUTEX
);
101 * DDBHandleObject := SuperName
102 * ACPI_BTYPE_REFERENCE_OBJECT:
103 * Index reference as parameter of Load/Unload
105 return (ACPI_BTYPE_DDB_HANDLE
| ACPI_BTYPE_REFERENCE_OBJECT
);
107 /* Interchangeable types */
109 * Source conversion rules:
110 * Integer, String, and Buffer are all interchangeable
115 case ARGI_BUFFER_OR_STRING
:
116 case ARGI_COMPUTEDATA
:
118 return (ACPI_BTYPE_COMPUTE_DATA
);
122 case ARGI_INTEGER_REF
:
124 return (ACPI_BTYPE_INTEGER
);
126 case ARGI_OBJECT_REF
:
128 return (ACPI_BTYPE_ALL_OBJECTS
);
130 case ARGI_DEVICE_REF
:
132 return (ACPI_BTYPE_DEVICE_OBJECTS
);
136 return (ACPI_BTYPE_NAMED_REFERENCE
); /* Name or Namestring */
141 * Target operand for most math and logic operators.
142 * Package objects not allowed as target.
144 return (ACPI_BTYPE_COMPUTE_DATA
| ACPI_BTYPE_DEBUG_OBJECT
|
145 ACPI_BTYPE_REFERENCE_OBJECT
);
147 case ARGI_STORE_TARGET
:
149 /* Special target for Store(), includes packages */
151 return (ACPI_BTYPE_DATA
| ACPI_BTYPE_DEBUG_OBJECT
|
152 ACPI_BTYPE_REFERENCE_OBJECT
);
154 case ARGI_SIMPLE_TARGET
:
156 return (ACPI_BTYPE_OBJECTS_AND_REFS
);
160 case ARGI_DATAOBJECT
:
162 * Buffer, string, package or reference to a Op -
163 * Used only by SizeOf operator
165 return (ACPI_BTYPE_STRING
| ACPI_BTYPE_BUFFER
|
166 ACPI_BTYPE_PACKAGE
| ACPI_BTYPE_REFERENCE_OBJECT
);
168 case ARGI_COMPLEXOBJ
:
170 /* Buffer, String, or package */
172 return (ACPI_BTYPE_STRING
| ACPI_BTYPE_BUFFER
|
175 case ARGI_REF_OR_STRING
:
177 /* Used by DeRefOf operator only */
179 return (ACPI_BTYPE_STRING
| ACPI_BTYPE_REFERENCE_OBJECT
);
181 case ARGI_REGION_OR_BUFFER
:
183 /* Used by Load() only. Allow buffers in addition to regions/fields */
185 return (ACPI_BTYPE_REGION
| ACPI_BTYPE_BUFFER
|
186 ACPI_BTYPE_FIELD_UNIT
);
188 case ARGI_DATAREFOBJ
:
190 /* Used by Store() only, as the source operand */
192 return (ACPI_BTYPE_DATA_REFERENCE
| ACPI_BTYPE_REFERENCE_OBJECT
);
199 return (ACPI_BTYPE_OBJECTS_AND_REFS
);
203 /*******************************************************************************
205 * FUNCTION: AnMapEtypeToBtype
207 * PARAMETERS: Etype - Encoded ACPI Type
209 * RETURN: Btype corresponding to the Etype
211 * DESCRIPTION: Convert an encoded ACPI type to a bitfield type applying the
212 * operand conversion rules. In other words, returns the type(s)
213 * this Etype is implicitly converted to during interpretation.
215 ******************************************************************************/
222 if (Etype
== ACPI_TYPE_ANY
)
224 return (ACPI_BTYPE_OBJECTS_AND_REFS
);
227 /* Try the standard ACPI data types */
229 if (Etype
<= ACPI_TYPE_EXTERNAL_MAX
)
232 * This switch statement implements the allowed operand conversion
233 * rules as per the "ASL Data Types" section of the ACPI
238 case ACPI_TYPE_INTEGER
:
240 return (ACPI_BTYPE_COMPUTE_DATA
| ACPI_BTYPE_DDB_HANDLE
);
242 case ACPI_TYPE_STRING
:
243 case ACPI_TYPE_BUFFER
:
245 return (ACPI_BTYPE_COMPUTE_DATA
);
247 case ACPI_TYPE_PACKAGE
:
249 return (ACPI_BTYPE_PACKAGE
);
251 case ACPI_TYPE_FIELD_UNIT
:
253 return (ACPI_BTYPE_COMPUTE_DATA
| ACPI_BTYPE_FIELD_UNIT
);
255 case ACPI_TYPE_BUFFER_FIELD
:
257 return (ACPI_BTYPE_COMPUTE_DATA
| ACPI_BTYPE_BUFFER_FIELD
);
259 case ACPI_TYPE_DDB_HANDLE
:
261 return (ACPI_BTYPE_INTEGER
| ACPI_BTYPE_DDB_HANDLE
);
263 case ACPI_TYPE_DEBUG_OBJECT
:
265 /* Cannot be used as a source operand */
271 return (1 << (Etype
- 1));
275 /* Try the internal data types */
279 case ACPI_TYPE_LOCAL_REGION_FIELD
:
280 case ACPI_TYPE_LOCAL_BANK_FIELD
:
281 case ACPI_TYPE_LOCAL_INDEX_FIELD
:
283 /* Named fields can be either Integer/Buffer/String */
285 return (ACPI_BTYPE_COMPUTE_DATA
| ACPI_BTYPE_FIELD_UNIT
);
287 case ACPI_TYPE_LOCAL_ALIAS
:
289 return (ACPI_BTYPE_INTEGER
);
292 case ACPI_TYPE_LOCAL_RESOURCE
:
293 case ACPI_TYPE_LOCAL_RESOURCE_FIELD
:
295 return (ACPI_BTYPE_REFERENCE_OBJECT
);
299 printf ("Unhandled encoded type: %X\n", Etype
);
305 /*******************************************************************************
307 * FUNCTION: AnFormatBtype
309 * PARAMETERS: Btype - Bitfield of ACPI types
310 * Buffer - Where to put the ascii string
314 * DESCRIPTION: Convert a Btype to a string of ACPI types
316 ******************************************************************************/
324 BOOLEAN First
= TRUE
;
330 strcat (Buffer
, "NoReturnValue");
334 for (Type
= 1; Type
<= ACPI_TYPE_EXTERNAL_MAX
; Type
++)
336 if (Btype
& 0x00000001)
340 strcat (Buffer
, "|");
344 strcat (Buffer
, AcpiUtGetTypeName (Type
));
349 if (Btype
& 0x00000001)
353 strcat (Buffer
, "|");
357 strcat (Buffer
, "Reference");
361 if (Btype
& 0x00000001)
365 strcat (Buffer
, "|");
369 strcat (Buffer
, "Resource");
374 /*******************************************************************************
376 * FUNCTION: AnGetBtype
378 * PARAMETERS: Op - Parse node whose type will be returned.
380 * RETURN: The Btype associated with the Op.
382 * DESCRIPTION: Get the (bitfield) ACPI type associated with the parse node.
383 * Handles the case where the node is a name or method call and
384 * the actual type must be obtained from the namespace node.
386 ******************************************************************************/
390 ACPI_PARSE_OBJECT
*Op
)
392 ACPI_NAMESPACE_NODE
*Node
;
393 ACPI_PARSE_OBJECT
*ReferencedNode
;
394 UINT32 ThisNodeBtype
= 0;
399 AcpiOsPrintf ("Null Op in AnGetBtype\n");
400 return (ACPI_UINT32_MAX
);
403 if ((Op
->Asl
.ParseOpcode
== PARSEOP_NAMESEG
) ||
404 (Op
->Asl
.ParseOpcode
== PARSEOP_NAMESTRING
) ||
405 (Op
->Asl
.ParseOpcode
== PARSEOP_METHODCALL
))
410 /* These are not expected to have a node at this time */
412 if ((Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CREATEWORDFIELD
) ||
413 (Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CREATEDWORDFIELD
) ||
414 (Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CREATEQWORDFIELD
) ||
415 (Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CREATEBYTEFIELD
) ||
416 (Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CREATEBITFIELD
) ||
417 (Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CREATEFIELD
) ||
418 (Op
->Asl
.Parent
->Asl
.ParseOpcode
== PARSEOP_CONDREFOF
))
420 return (ACPI_UINT32_MAX
- 1);
423 DbgPrint (ASL_DEBUG_OUTPUT
,
424 "No attached Nsnode: [%s] at line %u name [%s], "
425 "ignoring typecheck. Parent [%s]\n",
426 Op
->Asl
.ParseOpName
, Op
->Asl
.LineNumber
,
427 Op
->Asl
.ExternalName
, Op
->Asl
.Parent
->Asl
.ParseOpName
);
428 return (ACPI_UINT32_MAX
- 1);
431 ThisNodeBtype
= AnMapEtypeToBtype (Node
->Type
);
434 AslError (ASL_ERROR
, ASL_MSG_COMPILER_INTERNAL
, Op
,
435 "could not map type");
438 if (Op
->Asl
.ParseOpcode
== PARSEOP_METHODCALL
)
440 ReferencedNode
= Node
->Op
;
443 /* Check for an internal method */
445 if (AnIsInternalMethod (Op
))
447 return (AnGetInternalMethodReturnType (Op
));
450 AslError (ASL_ERROR
, ASL_MSG_COMPILER_INTERNAL
, Op
,
452 return (ACPI_UINT32_MAX
);
455 if (ReferencedNode
->Asl
.CompileFlags
& NODE_METHOD_TYPED
)
457 ThisNodeBtype
= ReferencedNode
->Asl
.AcpiBtype
;
461 return (ACPI_UINT32_MAX
-1);
467 ThisNodeBtype
= Op
->Asl
.AcpiBtype
;
470 return (ThisNodeBtype
);
474 /*******************************************************************************
476 * FUNCTION: AnMapObjTypeToBtype
478 * PARAMETERS: Op - A parse node
482 * DESCRIPTION: Map object to the associated "Btype"
484 ******************************************************************************/
487 AnMapObjTypeToBtype (
488 ACPI_PARSE_OBJECT
*Op
)
491 switch (Op
->Asl
.ParseOpcode
)
493 case PARSEOP_OBJECTTYPE_BFF
: /* "BuffFieldObj" */
495 return (ACPI_BTYPE_BUFFER_FIELD
);
497 case PARSEOP_OBJECTTYPE_BUF
: /* "BuffObj" */
499 return (ACPI_BTYPE_BUFFER
);
501 case PARSEOP_OBJECTTYPE_DDB
: /* "DDBHandleObj" */
503 return (ACPI_BTYPE_DDB_HANDLE
);
505 case PARSEOP_OBJECTTYPE_DEV
: /* "DeviceObj" */
507 return (ACPI_BTYPE_DEVICE
);
509 case PARSEOP_OBJECTTYPE_EVT
: /* "EventObj" */
511 return (ACPI_BTYPE_EVENT
);
513 case PARSEOP_OBJECTTYPE_FLD
: /* "FieldUnitObj" */
515 return (ACPI_BTYPE_FIELD_UNIT
);
517 case PARSEOP_OBJECTTYPE_INT
: /* "IntObj" */
519 return (ACPI_BTYPE_INTEGER
);
521 case PARSEOP_OBJECTTYPE_MTH
: /* "MethodObj" */
523 return (ACPI_BTYPE_METHOD
);
525 case PARSEOP_OBJECTTYPE_MTX
: /* "MutexObj" */
527 return (ACPI_BTYPE_MUTEX
);
529 case PARSEOP_OBJECTTYPE_OPR
: /* "OpRegionObj" */
531 return (ACPI_BTYPE_REGION
);
533 case PARSEOP_OBJECTTYPE_PKG
: /* "PkgObj" */
535 return (ACPI_BTYPE_PACKAGE
);
537 case PARSEOP_OBJECTTYPE_POW
: /* "PowerResObj" */
539 return (ACPI_BTYPE_POWER
);
541 case PARSEOP_OBJECTTYPE_STR
: /* "StrObj" */
543 return (ACPI_BTYPE_STRING
);
545 case PARSEOP_OBJECTTYPE_THZ
: /* "ThermalZoneObj" */
547 return (ACPI_BTYPE_THERMAL
);
549 case PARSEOP_OBJECTTYPE_UNK
: /* "UnknownObj" */
551 return (ACPI_BTYPE_OBJECTS_AND_REFS
);
560 #ifdef ACPI_OBSOLETE_FUNCTIONS
561 /*******************************************************************************
563 * FUNCTION: AnMapBtypeToEtype
565 * PARAMETERS: Btype - Bitfield of ACPI types
567 * RETURN: The Etype corresponding the the Btype
569 * DESCRIPTION: Convert a bitfield type to an encoded type
571 ******************************************************************************/
587 for (i
= 1; i
< Btype
; i
*= 2)