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