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