1ca3cf4faSJung-uk Kim /******************************************************************************
2ca3cf4faSJung-uk Kim  *
3ca3cf4faSJung-uk Kim  * Module Name: aslpredef - support for ACPI predefined names
4ca3cf4faSJung-uk Kim  *
5ca3cf4faSJung-uk Kim  *****************************************************************************/
6ca3cf4faSJung-uk Kim 
7d244b227SJung-uk Kim /*
8313a0c13SJung-uk Kim  * Copyright (C) 2000 - 2014, Intel Corp.
9ca3cf4faSJung-uk Kim  * All rights reserved.
10ca3cf4faSJung-uk Kim  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
25ca3cf4faSJung-uk Kim  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
29ca3cf4faSJung-uk Kim  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
43ca3cf4faSJung-uk Kim 
44ca3cf4faSJung-uk Kim #define ACPI_CREATE_PREDEFINED_TABLE
459c7c683cSJung-uk Kim #define ACPI_CREATE_RESOURCE_TABLE
46ca3cf4faSJung-uk Kim 
47ca3cf4faSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
48ca3cf4faSJung-uk Kim #include "aslcompiler.y.h"
49ca3cf4faSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
509c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
51ca3cf4faSJung-uk Kim 
52ca3cf4faSJung-uk Kim 
53ca3cf4faSJung-uk Kim #define _COMPONENT          ACPI_COMPILER
54ca3cf4faSJung-uk Kim         ACPI_MODULE_NAME    ("aslpredef")
55ca3cf4faSJung-uk Kim 
56ca3cf4faSJung-uk Kim 
57ca3cf4faSJung-uk Kim /* Local prototypes */
58ca3cf4faSJung-uk Kim 
590b94ba42SJung-uk Kim static void
600b94ba42SJung-uk Kim ApCheckForUnexpectedReturnValue (
610b94ba42SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
620b94ba42SJung-uk Kim     ASL_METHOD_INFO         *MethodInfo);
630b94ba42SJung-uk Kim 
64ca3cf4faSJung-uk Kim static UINT32
65ca3cf4faSJung-uk Kim ApCheckForSpecialName (
66ca3cf4faSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
67ca3cf4faSJung-uk Kim     char                    *Name);
68ca3cf4faSJung-uk Kim 
69ca3cf4faSJung-uk Kim 
70ca3cf4faSJung-uk Kim /*******************************************************************************
71ca3cf4faSJung-uk Kim  *
72ca3cf4faSJung-uk Kim  * FUNCTION:    ApCheckForPredefinedMethod
73ca3cf4faSJung-uk Kim  *
74ca3cf4faSJung-uk Kim  * PARAMETERS:  Op              - A parse node of type "METHOD".
75ca3cf4faSJung-uk Kim  *              MethodInfo      - Saved info about this method
76ca3cf4faSJung-uk Kim  *
77ca3cf4faSJung-uk Kim  * RETURN:      None
78ca3cf4faSJung-uk Kim  *
79ca3cf4faSJung-uk Kim  * DESCRIPTION: If method is a predefined name, check that the number of
80ca3cf4faSJung-uk Kim  *              arguments and the return type (returns a value or not)
81ca3cf4faSJung-uk Kim  *              is correct.
82ca3cf4faSJung-uk Kim  *
83ca3cf4faSJung-uk Kim  ******************************************************************************/
84ca3cf4faSJung-uk Kim 
85d052a1ccSJung-uk Kim BOOLEAN
86ca3cf4faSJung-uk Kim ApCheckForPredefinedMethod (
87ca3cf4faSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
88ca3cf4faSJung-uk Kim     ASL_METHOD_INFO         *MethodInfo)
89ca3cf4faSJung-uk Kim {
90ca3cf4faSJung-uk Kim     UINT32                      Index;
919c7c683cSJung-uk Kim     UINT32                      RequiredArgCount;
929c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
93ca3cf4faSJung-uk Kim 
94ca3cf4faSJung-uk Kim 
95ca3cf4faSJung-uk Kim     /* Check for a match against the predefined name list */
96ca3cf4faSJung-uk Kim 
97ca3cf4faSJung-uk Kim     Index = ApCheckForPredefinedName (Op, Op->Asl.NameSeg);
98ca3cf4faSJung-uk Kim 
99ca3cf4faSJung-uk Kim     switch (Index)
100ca3cf4faSJung-uk Kim     {
101ca3cf4faSJung-uk Kim     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
102ca3cf4faSJung-uk Kim     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
103ca3cf4faSJung-uk Kim     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
104ca3cf4faSJung-uk Kim 
105ca3cf4faSJung-uk Kim         /* Just return, nothing to do */
106d052a1ccSJung-uk Kim         return (FALSE);
107ca3cf4faSJung-uk Kim 
108ca3cf4faSJung-uk Kim 
1093f5e024cSJung-uk Kim     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
110ca3cf4faSJung-uk Kim 
111ca3cf4faSJung-uk Kim         Gbl_ReservedMethods++;
112ca3cf4faSJung-uk Kim 
1133f5e024cSJung-uk Kim         /* NumArguments must be zero for all _Lxx/_Exx/_Wxx/_Qxx methods */
114ca3cf4faSJung-uk Kim 
115ca3cf4faSJung-uk Kim         if (MethodInfo->NumArguments != 0)
116ca3cf4faSJung-uk Kim         {
117a88e22b7SJung-uk Kim             sprintf (MsgBuffer, "%s requires %u", Op->Asl.ExternalName, 0);
118ca3cf4faSJung-uk Kim 
119ca3cf4faSJung-uk Kim             AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
120ca3cf4faSJung-uk Kim                 MsgBuffer);
121ca3cf4faSJung-uk Kim         }
122ca3cf4faSJung-uk Kim         break;
123ca3cf4faSJung-uk Kim 
124ca3cf4faSJung-uk Kim 
125ca3cf4faSJung-uk Kim     default:
126ca3cf4faSJung-uk Kim         /*
127895f26a9SJung-uk Kim          * Matched a predefined method name - validate the ASL-defined
128895f26a9SJung-uk Kim          * argument count against the ACPI specification.
129ca3cf4faSJung-uk Kim          *
130895f26a9SJung-uk Kim          * Some methods are allowed to have a "minimum" number of args
131895f26a9SJung-uk Kim          * (_SCP) because their definition in ACPI has changed over time.
132ca3cf4faSJung-uk Kim          */
133ca3cf4faSJung-uk Kim         Gbl_ReservedMethods++;
1349c7c683cSJung-uk Kim         ThisName = &AcpiGbl_PredefinedMethods[Index];
135895f26a9SJung-uk Kim         RequiredArgCount = METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList);
136ca3cf4faSJung-uk Kim 
1379c7c683cSJung-uk Kim         if (MethodInfo->NumArguments != RequiredArgCount)
138ca3cf4faSJung-uk Kim         {
139a88e22b7SJung-uk Kim             sprintf (MsgBuffer, "%4.4s requires %u",
1409c7c683cSJung-uk Kim                 ThisName->Info.Name, RequiredArgCount);
141ca3cf4faSJung-uk Kim 
142895f26a9SJung-uk Kim             if (MethodInfo->NumArguments < RequiredArgCount)
143895f26a9SJung-uk Kim             {
144895f26a9SJung-uk Kim                 AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_LO, Op,
145895f26a9SJung-uk Kim                     MsgBuffer);
146895f26a9SJung-uk Kim             }
147895f26a9SJung-uk Kim             else if ((MethodInfo->NumArguments > RequiredArgCount) &&
1489c7c683cSJung-uk Kim                 !(ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM))
149ca3cf4faSJung-uk Kim             {
150ca3cf4faSJung-uk Kim                 AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
151ca3cf4faSJung-uk Kim                     MsgBuffer);
152ca3cf4faSJung-uk Kim             }
153ca3cf4faSJung-uk Kim         }
154ca3cf4faSJung-uk Kim 
155ca3cf4faSJung-uk Kim         /*
156ca3cf4faSJung-uk Kim          * Check if method returns no value, but the predefined name is
157ca3cf4faSJung-uk Kim          * required to return a value
158ca3cf4faSJung-uk Kim          */
159ca3cf4faSJung-uk Kim         if (MethodInfo->NumReturnNoValue &&
1609c7c683cSJung-uk Kim             ThisName->Info.ExpectedBtypes)
161ca3cf4faSJung-uk Kim         {
1629c7c683cSJung-uk Kim             AcpiUtGetExpectedReturnTypes (StringBuffer,
1639c7c683cSJung-uk Kim                 ThisName->Info.ExpectedBtypes);
1648c8be05fSJung-uk Kim 
1658c8be05fSJung-uk Kim             sprintf (MsgBuffer, "%s required for %4.4s",
1669c7c683cSJung-uk Kim                 StringBuffer, ThisName->Info.Name);
167ca3cf4faSJung-uk Kim 
168ca3cf4faSJung-uk Kim             AslError (ASL_WARNING, ASL_MSG_RESERVED_RETURN_VALUE, Op,
169ca3cf4faSJung-uk Kim                 MsgBuffer);
170ca3cf4faSJung-uk Kim         }
171ca3cf4faSJung-uk Kim         break;
172ca3cf4faSJung-uk Kim     }
173d052a1ccSJung-uk Kim 
174d052a1ccSJung-uk Kim     return (TRUE);
175ca3cf4faSJung-uk Kim }
176ca3cf4faSJung-uk Kim 
177ca3cf4faSJung-uk Kim 
178ca3cf4faSJung-uk Kim /*******************************************************************************
179ca3cf4faSJung-uk Kim  *
1800b94ba42SJung-uk Kim  * FUNCTION:    ApCheckForUnexpectedReturnValue
1810b94ba42SJung-uk Kim  *
1820b94ba42SJung-uk Kim  * PARAMETERS:  Op              - A parse node of type "RETURN".
1830b94ba42SJung-uk Kim  *              MethodInfo      - Saved info about this method
1840b94ba42SJung-uk Kim  *
1850b94ba42SJung-uk Kim  * RETURN:      None
1860b94ba42SJung-uk Kim  *
1870b94ba42SJung-uk Kim  * DESCRIPTION: Check for an unexpected return value from a predefined method.
1880b94ba42SJung-uk Kim  *              Invoked for predefined methods that are defined to not return
1890b94ba42SJung-uk Kim  *              any value. If there is a return value, issue a remark, since
1900b94ba42SJung-uk Kim  *              the ASL writer may be confused as to the method definition
1910b94ba42SJung-uk Kim  *              and/or functionality.
1920b94ba42SJung-uk Kim  *
1930b94ba42SJung-uk Kim  * Note: We ignore all return values of "Zero", since this is what a standalone
1940b94ba42SJung-uk Kim  *       Return() statement will always generate -- so we ignore it here --
1950b94ba42SJung-uk Kim  *       i.e., there is no difference between Return() and Return(Zero).
1960b94ba42SJung-uk Kim  *       Also, a null Return() will be disassembled to return(Zero) -- so, we
1970b94ba42SJung-uk Kim  *       don't want to generate extraneous remarks/warnings for a disassembled
1980b94ba42SJung-uk Kim  *       ASL file.
1990b94ba42SJung-uk Kim  *
2000b94ba42SJung-uk Kim  ******************************************************************************/
2010b94ba42SJung-uk Kim 
2020b94ba42SJung-uk Kim static void
2030b94ba42SJung-uk Kim ApCheckForUnexpectedReturnValue (
2040b94ba42SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
2050b94ba42SJung-uk Kim     ASL_METHOD_INFO         *MethodInfo)
2060b94ba42SJung-uk Kim {
2070b94ba42SJung-uk Kim     ACPI_PARSE_OBJECT       *ReturnValueOp;
2080b94ba42SJung-uk Kim 
2090b94ba42SJung-uk Kim 
2100b94ba42SJung-uk Kim     /* Ignore Return() and Return(Zero) (they are the same) */
2110b94ba42SJung-uk Kim 
2120b94ba42SJung-uk Kim     ReturnValueOp = Op->Asl.Child;
2130b94ba42SJung-uk Kim     if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_ZERO)
2140b94ba42SJung-uk Kim     {
2150b94ba42SJung-uk Kim         return;
2160b94ba42SJung-uk Kim     }
2170b94ba42SJung-uk Kim 
2180b94ba42SJung-uk Kim     /* We have a valid return value, but the reserved name did not expect it */
2190b94ba42SJung-uk Kim 
2200b94ba42SJung-uk Kim     AslError (ASL_WARNING, ASL_MSG_RESERVED_NO_RETURN_VAL,
2210b94ba42SJung-uk Kim         Op, MethodInfo->Op->Asl.ExternalName);
2220b94ba42SJung-uk Kim }
2230b94ba42SJung-uk Kim 
2240b94ba42SJung-uk Kim 
2250b94ba42SJung-uk Kim /*******************************************************************************
2260b94ba42SJung-uk Kim  *
2278c8be05fSJung-uk Kim  * FUNCTION:    ApCheckPredefinedReturnValue
2288c8be05fSJung-uk Kim  *
2298c8be05fSJung-uk Kim  * PARAMETERS:  Op              - A parse node of type "RETURN".
2308c8be05fSJung-uk Kim  *              MethodInfo      - Saved info about this method
2318c8be05fSJung-uk Kim  *
2328c8be05fSJung-uk Kim  * RETURN:      None
2338c8be05fSJung-uk Kim  *
2348c8be05fSJung-uk Kim  * DESCRIPTION: If method is a predefined name, attempt to validate the return
2358c8be05fSJung-uk Kim  *              value. Only "static" types can be validated - a simple return
2368c8be05fSJung-uk Kim  *              of an integer/string/buffer/package or a named reference to
2378c8be05fSJung-uk Kim  *              a static object. Values such as a Localx or Argx or a control
2380b94ba42SJung-uk Kim  *              method invocation are not checked. Issue a warning if there is
2390b94ba42SJung-uk Kim  *              a valid return value, but the reserved method defines no
2400b94ba42SJung-uk Kim  *              return value.
2418c8be05fSJung-uk Kim  *
2428c8be05fSJung-uk Kim  ******************************************************************************/
2438c8be05fSJung-uk Kim 
2448c8be05fSJung-uk Kim void
2458c8be05fSJung-uk Kim ApCheckPredefinedReturnValue (
2468c8be05fSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
2478c8be05fSJung-uk Kim     ASL_METHOD_INFO         *MethodInfo)
2488c8be05fSJung-uk Kim {
2498c8be05fSJung-uk Kim     UINT32                      Index;
2508c8be05fSJung-uk Kim     ACPI_PARSE_OBJECT           *ReturnValueOp;
2519c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
2528c8be05fSJung-uk Kim 
2538c8be05fSJung-uk Kim 
254313a0c13SJung-uk Kim     /*
255313a0c13SJung-uk Kim      * Check parent method for a match against the predefined name list.
256313a0c13SJung-uk Kim      *
257313a0c13SJung-uk Kim      * Note: Disable compiler errors/warnings because any errors will be
258313a0c13SJung-uk Kim      * caught when analyzing the parent method. Eliminates duplicate errors.
259313a0c13SJung-uk Kim      */
260313a0c13SJung-uk Kim     Gbl_AllExceptionsDisabled = TRUE;
2618c8be05fSJung-uk Kim     Index = ApCheckForPredefinedName (MethodInfo->Op,
2628c8be05fSJung-uk Kim                 MethodInfo->Op->Asl.NameSeg);
263313a0c13SJung-uk Kim     Gbl_AllExceptionsDisabled = FALSE;
2648c8be05fSJung-uk Kim 
2658c8be05fSJung-uk Kim     switch (Index)
2668c8be05fSJung-uk Kim     {
2670b94ba42SJung-uk Kim     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
2680b94ba42SJung-uk Kim 
2690b94ba42SJung-uk Kim         /* No return value expected, warn if there is one */
2700b94ba42SJung-uk Kim 
2710b94ba42SJung-uk Kim         ApCheckForUnexpectedReturnValue (Op, MethodInfo);
2720b94ba42SJung-uk Kim         return;
2730b94ba42SJung-uk Kim 
2748c8be05fSJung-uk Kim     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
2758c8be05fSJung-uk Kim     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
2768c8be05fSJung-uk Kim     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
2778c8be05fSJung-uk Kim 
2788c8be05fSJung-uk Kim         /* Just return, nothing to do */
2798c8be05fSJung-uk Kim         return;
2808c8be05fSJung-uk Kim 
2813f5e024cSJung-uk Kim     default: /* A standard predefined ACPI name */
2828c8be05fSJung-uk Kim 
2839c7c683cSJung-uk Kim         ThisName = &AcpiGbl_PredefinedMethods[Index];
2849c7c683cSJung-uk Kim         if (!ThisName->Info.ExpectedBtypes)
2858c8be05fSJung-uk Kim         {
2860b94ba42SJung-uk Kim             /* No return value expected, warn if there is one */
2870b94ba42SJung-uk Kim 
2880b94ba42SJung-uk Kim             ApCheckForUnexpectedReturnValue (Op, MethodInfo);
2898c8be05fSJung-uk Kim             return;
2908c8be05fSJung-uk Kim         }
2918c8be05fSJung-uk Kim 
2928c8be05fSJung-uk Kim         /* Get the object returned, it is the next argument */
2938c8be05fSJung-uk Kim 
2948c8be05fSJung-uk Kim         ReturnValueOp = Op->Asl.Child;
2958c8be05fSJung-uk Kim         switch (ReturnValueOp->Asl.ParseOpcode)
2968c8be05fSJung-uk Kim         {
2978c8be05fSJung-uk Kim         case PARSEOP_ZERO:
2988c8be05fSJung-uk Kim         case PARSEOP_ONE:
2998c8be05fSJung-uk Kim         case PARSEOP_ONES:
3008c8be05fSJung-uk Kim         case PARSEOP_INTEGER:
3018c8be05fSJung-uk Kim         case PARSEOP_STRING_LITERAL:
3028c8be05fSJung-uk Kim         case PARSEOP_BUFFER:
3038c8be05fSJung-uk Kim         case PARSEOP_PACKAGE:
3048c8be05fSJung-uk Kim 
3058c8be05fSJung-uk Kim             /* Static data return object - check against expected type */
3068c8be05fSJung-uk Kim 
3079c7c683cSJung-uk Kim             ApCheckObjectType (ThisName->Info.Name, ReturnValueOp,
3089c7c683cSJung-uk Kim                 ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
3099c48c75eSJung-uk Kim 
3109c48c75eSJung-uk Kim             /* For packages, check the individual package elements */
3119c48c75eSJung-uk Kim 
3129c48c75eSJung-uk Kim             if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
3139c48c75eSJung-uk Kim             {
3149c7c683cSJung-uk Kim                 ApCheckPackage (ReturnValueOp, ThisName);
3159c48c75eSJung-uk Kim             }
3168c8be05fSJung-uk Kim             break;
3178c8be05fSJung-uk Kim 
3188c8be05fSJung-uk Kim         default:
3198c8be05fSJung-uk Kim             /*
3208c8be05fSJung-uk Kim              * All other ops are very difficult or impossible to typecheck at
3218c8be05fSJung-uk Kim              * compile time. These include all Localx, Argx, and method
3228c8be05fSJung-uk Kim              * invocations. Also, NAMESEG and NAMESTRING because the type of
3238c8be05fSJung-uk Kim              * any named object can be changed at runtime (for example,
3248c8be05fSJung-uk Kim              * CopyObject will change the type of the target object.)
3258c8be05fSJung-uk Kim              */
3268c8be05fSJung-uk Kim             break;
3278c8be05fSJung-uk Kim         }
3288c8be05fSJung-uk Kim     }
3298c8be05fSJung-uk Kim }
3308c8be05fSJung-uk Kim 
3318c8be05fSJung-uk Kim 
3328c8be05fSJung-uk Kim /*******************************************************************************
3338c8be05fSJung-uk Kim  *
334ca3cf4faSJung-uk Kim  * FUNCTION:    ApCheckForPredefinedObject
335ca3cf4faSJung-uk Kim  *
336ca3cf4faSJung-uk Kim  * PARAMETERS:  Op              - A parse node
337ca3cf4faSJung-uk Kim  *              Name            - The ACPI name to be checked
338ca3cf4faSJung-uk Kim  *
339ca3cf4faSJung-uk Kim  * RETURN:      None
340ca3cf4faSJung-uk Kim  *
341ca3cf4faSJung-uk Kim  * DESCRIPTION: Check for a predefined name for a static object (created via
342ca3cf4faSJung-uk Kim  *              the ASL Name operator). If it is a predefined ACPI name, ensure
343ca3cf4faSJung-uk Kim  *              that the name does not require any arguments (which would
344ca3cf4faSJung-uk Kim  *              require a control method implemenation of the name), and that
345ca3cf4faSJung-uk Kim  *              the type of the object is one of the expected types for the
346ca3cf4faSJung-uk Kim  *              predefined name.
347ca3cf4faSJung-uk Kim  *
348ca3cf4faSJung-uk Kim  ******************************************************************************/
349ca3cf4faSJung-uk Kim 
350ca3cf4faSJung-uk Kim void
351ca3cf4faSJung-uk Kim ApCheckForPredefinedObject (
352ca3cf4faSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
353ca3cf4faSJung-uk Kim     char                    *Name)
354ca3cf4faSJung-uk Kim {
355ca3cf4faSJung-uk Kim     UINT32                      Index;
3569c48c75eSJung-uk Kim     ACPI_PARSE_OBJECT           *ObjectOp;
3579c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
358ca3cf4faSJung-uk Kim 
359ca3cf4faSJung-uk Kim 
360ca3cf4faSJung-uk Kim     /*
361ca3cf4faSJung-uk Kim      * Check for a real predefined name -- not a resource descriptor name
362ca3cf4faSJung-uk Kim      * or a predefined scope name
363ca3cf4faSJung-uk Kim      */
364ca3cf4faSJung-uk Kim     Index = ApCheckForPredefinedName (Op, Name);
3653f5e024cSJung-uk Kim 
3663f5e024cSJung-uk Kim     switch (Index)
367ca3cf4faSJung-uk Kim     {
3683f5e024cSJung-uk Kim     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
3693f5e024cSJung-uk Kim     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
3703f5e024cSJung-uk Kim     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
3713f5e024cSJung-uk Kim 
3723f5e024cSJung-uk Kim         /* Nothing to do */
3733f5e024cSJung-uk Kim         return;
3743f5e024cSJung-uk Kim 
3753f5e024cSJung-uk Kim     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
3763f5e024cSJung-uk Kim 
3773f5e024cSJung-uk Kim         /*
3783f5e024cSJung-uk Kim          * These names must be control methods, by definition in ACPI spec.
3793f5e024cSJung-uk Kim          * Also because they are defined to return no value. None of them
3803f5e024cSJung-uk Kim          * require any arguments.
3813f5e024cSJung-uk Kim          */
3823f5e024cSJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
3833f5e024cSJung-uk Kim             "with zero arguments");
3843f5e024cSJung-uk Kim         return;
3853f5e024cSJung-uk Kim 
3869c48c75eSJung-uk Kim     default:
387a9d8d09cSJung-uk Kim 
3889c48c75eSJung-uk Kim         break;
3899c48c75eSJung-uk Kim     }
3909c48c75eSJung-uk Kim 
3919c48c75eSJung-uk Kim     /* A standard predefined ACPI name */
3923f5e024cSJung-uk Kim 
3933f5e024cSJung-uk Kim     /*
3943f5e024cSJung-uk Kim      * If this predefined name requires input arguments, then
3953f5e024cSJung-uk Kim      * it must be implemented as a control method
3963f5e024cSJung-uk Kim      */
3979c7c683cSJung-uk Kim     ThisName = &AcpiGbl_PredefinedMethods[Index];
398895f26a9SJung-uk Kim     if (METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList) > 0)
3993f5e024cSJung-uk Kim     {
4003f5e024cSJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
4013f5e024cSJung-uk Kim             "with arguments");
402ca3cf4faSJung-uk Kim         return;
403ca3cf4faSJung-uk Kim     }
404ca3cf4faSJung-uk Kim 
405ca3cf4faSJung-uk Kim     /*
4063f5e024cSJung-uk Kim      * If no return value is expected from this predefined name, then
4073f5e024cSJung-uk Kim      * it follows that it must be implemented as a control method
4083f5e024cSJung-uk Kim      * (with zero args, because the args > 0 case was handled above)
4093f5e024cSJung-uk Kim      * Examples are: _DIS, _INI, _IRC, _OFF, _ON, _PSx
410ca3cf4faSJung-uk Kim      */
4119c7c683cSJung-uk Kim     if (!ThisName->Info.ExpectedBtypes)
412ca3cf4faSJung-uk Kim     {
413ca3cf4faSJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
4143f5e024cSJung-uk Kim             "with zero arguments");
4153f5e024cSJung-uk Kim         return;
416ca3cf4faSJung-uk Kim     }
417ca3cf4faSJung-uk Kim 
418ca3cf4faSJung-uk Kim     /* Typecheck the actual object, it is the next argument */
419ca3cf4faSJung-uk Kim 
4209c48c75eSJung-uk Kim     ObjectOp = Op->Asl.Child->Asl.Next;
4219c7c683cSJung-uk Kim     ApCheckObjectType (ThisName->Info.Name, Op->Asl.Child->Asl.Next,
4229c7c683cSJung-uk Kim         ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
4239c48c75eSJung-uk Kim 
4249c48c75eSJung-uk Kim     /* For packages, check the individual package elements */
4259c48c75eSJung-uk Kim 
4269c48c75eSJung-uk Kim     if (ObjectOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
4279c48c75eSJung-uk Kim     {
4289c7c683cSJung-uk Kim         ApCheckPackage (ObjectOp, ThisName);
4293f5e024cSJung-uk Kim     }
430ca3cf4faSJung-uk Kim }
431ca3cf4faSJung-uk Kim 
432ca3cf4faSJung-uk Kim 
433ca3cf4faSJung-uk Kim /*******************************************************************************
434ca3cf4faSJung-uk Kim  *
435ca3cf4faSJung-uk Kim  * FUNCTION:    ApCheckForPredefinedName
436ca3cf4faSJung-uk Kim  *
437ca3cf4faSJung-uk Kim  * PARAMETERS:  Op              - A parse node
438ca3cf4faSJung-uk Kim  *              Name            - NameSeg to check
439ca3cf4faSJung-uk Kim  *
440ca3cf4faSJung-uk Kim  * RETURN:      None
441ca3cf4faSJung-uk Kim  *
442ca3cf4faSJung-uk Kim  * DESCRIPTION: Check a NameSeg against the reserved list.
443ca3cf4faSJung-uk Kim  *
444ca3cf4faSJung-uk Kim  ******************************************************************************/
445ca3cf4faSJung-uk Kim 
446ca3cf4faSJung-uk Kim UINT32
447ca3cf4faSJung-uk Kim ApCheckForPredefinedName (
448ca3cf4faSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
449ca3cf4faSJung-uk Kim     char                    *Name)
450ca3cf4faSJung-uk Kim {
451ca3cf4faSJung-uk Kim     UINT32                      i;
4529c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
453ca3cf4faSJung-uk Kim 
454ca3cf4faSJung-uk Kim 
455ca3cf4faSJung-uk Kim     if (Name[0] == 0)
456ca3cf4faSJung-uk Kim     {
457ca3cf4faSJung-uk Kim         AcpiOsPrintf ("Found a null name, external = %s\n",
458ca3cf4faSJung-uk Kim             Op->Asl.ExternalName);
459ca3cf4faSJung-uk Kim     }
460ca3cf4faSJung-uk Kim 
461ca3cf4faSJung-uk Kim     /* All reserved names are prefixed with a single underscore */
462ca3cf4faSJung-uk Kim 
463ca3cf4faSJung-uk Kim     if (Name[0] != '_')
464ca3cf4faSJung-uk Kim     {
465ca3cf4faSJung-uk Kim         return (ACPI_NOT_RESERVED_NAME);
466ca3cf4faSJung-uk Kim     }
467ca3cf4faSJung-uk Kim 
468ca3cf4faSJung-uk Kim     /* Check for a standard predefined method name */
469ca3cf4faSJung-uk Kim 
4709c7c683cSJung-uk Kim     ThisName = AcpiGbl_PredefinedMethods;
4719c7c683cSJung-uk Kim     for (i = 0; ThisName->Info.Name[0]; i++)
472ca3cf4faSJung-uk Kim     {
4739c7c683cSJung-uk Kim         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
474ca3cf4faSJung-uk Kim         {
475ca3cf4faSJung-uk Kim             /* Return index into predefined array */
476ca3cf4faSJung-uk Kim             return (i);
477ca3cf4faSJung-uk Kim         }
4789c7c683cSJung-uk Kim 
4799c7c683cSJung-uk Kim         ThisName++; /* Does not account for extra package data, but is OK */
480ca3cf4faSJung-uk Kim     }
481ca3cf4faSJung-uk Kim 
482ca3cf4faSJung-uk Kim     /* Check for resource names and predefined scope names */
483ca3cf4faSJung-uk Kim 
4849c7c683cSJung-uk Kim     ThisName = AcpiGbl_ResourceNames;
4859c7c683cSJung-uk Kim     while (ThisName->Info.Name[0])
486ca3cf4faSJung-uk Kim     {
4879c7c683cSJung-uk Kim         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
488ca3cf4faSJung-uk Kim         {
489ca3cf4faSJung-uk Kim             return (ACPI_PREDEFINED_NAME);
490ca3cf4faSJung-uk Kim         }
491ca3cf4faSJung-uk Kim 
4929c7c683cSJung-uk Kim         ThisName++;
4939c7c683cSJung-uk Kim     }
4949c7c683cSJung-uk Kim 
4959c7c683cSJung-uk Kim     ThisName = AcpiGbl_ScopeNames;
4969c7c683cSJung-uk Kim     while (ThisName->Info.Name[0])
497ca3cf4faSJung-uk Kim     {
4989c7c683cSJung-uk Kim         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
499ca3cf4faSJung-uk Kim         {
500ca3cf4faSJung-uk Kim             return (ACPI_PREDEFINED_NAME);
501ca3cf4faSJung-uk Kim         }
5029c7c683cSJung-uk Kim 
5039c7c683cSJung-uk Kim         ThisName++;
504ca3cf4faSJung-uk Kim     }
505ca3cf4faSJung-uk Kim 
5063f5e024cSJung-uk Kim     /* Check for _Lxx/_Exx/_Wxx/_Qxx/_T_x. Warning if unknown predefined name */
507ca3cf4faSJung-uk Kim 
508ca3cf4faSJung-uk Kim     return (ApCheckForSpecialName (Op, Name));
509ca3cf4faSJung-uk Kim }
510ca3cf4faSJung-uk Kim 
511ca3cf4faSJung-uk Kim 
512ca3cf4faSJung-uk Kim /*******************************************************************************
513ca3cf4faSJung-uk Kim  *
514ca3cf4faSJung-uk Kim  * FUNCTION:    ApCheckForSpecialName
515ca3cf4faSJung-uk Kim  *
516ca3cf4faSJung-uk Kim  * PARAMETERS:  Op              - A parse node
517ca3cf4faSJung-uk Kim  *              Name            - NameSeg to check
518ca3cf4faSJung-uk Kim  *
519ca3cf4faSJung-uk Kim  * RETURN:      None
520ca3cf4faSJung-uk Kim  *
521ca3cf4faSJung-uk Kim  * DESCRIPTION: Check for the "special" predefined names -
5223f5e024cSJung-uk Kim  *              _Lxx, _Exx, _Qxx, _Wxx, and _T_x
523ca3cf4faSJung-uk Kim  *
524ca3cf4faSJung-uk Kim  ******************************************************************************/
525ca3cf4faSJung-uk Kim 
526ca3cf4faSJung-uk Kim static UINT32
527ca3cf4faSJung-uk Kim ApCheckForSpecialName (
528ca3cf4faSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
529ca3cf4faSJung-uk Kim     char                    *Name)
530ca3cf4faSJung-uk Kim {
531ca3cf4faSJung-uk Kim 
532ca3cf4faSJung-uk Kim     /*
5333f5e024cSJung-uk Kim      * Check for the "special" predefined names. We already know that the
5343f5e024cSJung-uk Kim      * first character is an underscore.
535ca3cf4faSJung-uk Kim      *   GPE:  _Lxx
536ca3cf4faSJung-uk Kim      *   GPE:  _Exx
5373f5e024cSJung-uk Kim      *   GPE:  _Wxx
538ca3cf4faSJung-uk Kim      *   EC:   _Qxx
539ca3cf4faSJung-uk Kim      */
540ca3cf4faSJung-uk Kim     if ((Name[1] == 'L') ||
541ca3cf4faSJung-uk Kim         (Name[1] == 'E') ||
5423f5e024cSJung-uk Kim         (Name[1] == 'W') ||
543ca3cf4faSJung-uk Kim         (Name[1] == 'Q'))
544ca3cf4faSJung-uk Kim     {
545ca3cf4faSJung-uk Kim         /* The next two characters must be hex digits */
546ca3cf4faSJung-uk Kim 
547ca3cf4faSJung-uk Kim         if ((isxdigit ((int) Name[2])) &&
548ca3cf4faSJung-uk Kim             (isxdigit ((int) Name[3])))
549ca3cf4faSJung-uk Kim         {
550ca3cf4faSJung-uk Kim             return (ACPI_EVENT_RESERVED_NAME);
551ca3cf4faSJung-uk Kim         }
552ca3cf4faSJung-uk Kim     }
553ca3cf4faSJung-uk Kim 
554ca3cf4faSJung-uk Kim     /* Check for the names reserved for the compiler itself: _T_x */
555ca3cf4faSJung-uk Kim 
556ca3cf4faSJung-uk Kim     else if ((Op->Asl.ExternalName[1] == 'T') &&
557ca3cf4faSJung-uk Kim              (Op->Asl.ExternalName[2] == '_'))
558ca3cf4faSJung-uk Kim     {
559ca3cf4faSJung-uk Kim         /* Ignore if actually emitted by the compiler */
560ca3cf4faSJung-uk Kim 
561ca3cf4faSJung-uk Kim         if (Op->Asl.CompileFlags & NODE_COMPILER_EMITTED)
562ca3cf4faSJung-uk Kim         {
563ca3cf4faSJung-uk Kim             return (ACPI_NOT_RESERVED_NAME);
564ca3cf4faSJung-uk Kim         }
565ca3cf4faSJung-uk Kim 
566ca3cf4faSJung-uk Kim         /*
567ca3cf4faSJung-uk Kim          * Was not actually emitted by the compiler. This is a special case,
568ca3cf4faSJung-uk Kim          * however. If the ASL code being compiled was the result of a
569ca3cf4faSJung-uk Kim          * dissasembly, it may possibly contain valid compiler-emitted names
570ca3cf4faSJung-uk Kim          * of the form "_T_x". We don't want to issue an error or even a
571ca3cf4faSJung-uk Kim          * warning and force the user to manually change the names. So, we
572ca3cf4faSJung-uk Kim          * will issue a remark instead.
573ca3cf4faSJung-uk Kim          */
574ca3cf4faSJung-uk Kim         AslError (ASL_REMARK, ASL_MSG_COMPILER_RESERVED, Op, Op->Asl.ExternalName);
575ca3cf4faSJung-uk Kim         return (ACPI_COMPILER_RESERVED_NAME);
576ca3cf4faSJung-uk Kim     }
577ca3cf4faSJung-uk Kim 
578ca3cf4faSJung-uk Kim     /*
579ca3cf4faSJung-uk Kim      * The name didn't match any of the known predefined names. Flag it as a
580ca3cf4faSJung-uk Kim      * warning, since the entire namespace starting with an underscore is
581ca3cf4faSJung-uk Kim      * reserved by the ACPI spec.
582ca3cf4faSJung-uk Kim      */
583ca3cf4faSJung-uk Kim     AslError (ASL_WARNING, ASL_MSG_UNKNOWN_RESERVED_NAME, Op,
584ca3cf4faSJung-uk Kim         Op->Asl.ExternalName);
585ca3cf4faSJung-uk Kim 
586ca3cf4faSJung-uk Kim     return (ACPI_NOT_RESERVED_NAME);
587ca3cf4faSJung-uk Kim }
588ca3cf4faSJung-uk Kim 
589ca3cf4faSJung-uk Kim 
590ca3cf4faSJung-uk Kim /*******************************************************************************
591ca3cf4faSJung-uk Kim  *
592ca3cf4faSJung-uk Kim  * FUNCTION:    ApCheckObjectType
593ca3cf4faSJung-uk Kim  *
594efcc2a30SJung-uk Kim  * PARAMETERS:  PredefinedName  - Name of the predefined object we are checking
595efcc2a30SJung-uk Kim  *              Op              - Current parse node
596ca3cf4faSJung-uk Kim  *              ExpectedBtypes  - Bitmap of expected return type(s)
5979c48c75eSJung-uk Kim  *              PackageIndex    - Index of object within parent package (if
5989c48c75eSJung-uk Kim  *                                applicable - ACPI_NOT_PACKAGE_ELEMENT
5999c48c75eSJung-uk Kim  *                                otherwise)
600ca3cf4faSJung-uk Kim  *
601ca3cf4faSJung-uk Kim  * RETURN:      None
602ca3cf4faSJung-uk Kim  *
603ca3cf4faSJung-uk Kim  * DESCRIPTION: Check if the object type is one of the types that is expected
604ca3cf4faSJung-uk Kim  *              by the predefined name. Only a limited number of object types
605ca3cf4faSJung-uk Kim  *              can be returned by the predefined names.
606ca3cf4faSJung-uk Kim  *
607ca3cf4faSJung-uk Kim  ******************************************************************************/
608ca3cf4faSJung-uk Kim 
6099c48c75eSJung-uk Kim ACPI_STATUS
610ca3cf4faSJung-uk Kim ApCheckObjectType (
611efcc2a30SJung-uk Kim     const char              *PredefinedName,
612ca3cf4faSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
6139c48c75eSJung-uk Kim     UINT32                  ExpectedBtypes,
6149c48c75eSJung-uk Kim     UINT32                  PackageIndex)
615ca3cf4faSJung-uk Kim {
616ca3cf4faSJung-uk Kim     UINT32                  ReturnBtype;
6179c48c75eSJung-uk Kim     char                    *TypeName;
618ca3cf4faSJung-uk Kim 
619ca3cf4faSJung-uk Kim 
6209c48c75eSJung-uk Kim     if (!Op)
6219c48c75eSJung-uk Kim     {
6229c48c75eSJung-uk Kim         return (AE_TYPE);
6239c48c75eSJung-uk Kim     }
6249c48c75eSJung-uk Kim 
6259c48c75eSJung-uk Kim     /* Map the parse opcode to a bitmapped return type (RTYPE) */
6269c48c75eSJung-uk Kim 
627ca3cf4faSJung-uk Kim     switch (Op->Asl.ParseOpcode)
628ca3cf4faSJung-uk Kim     {
6298c8be05fSJung-uk Kim     case PARSEOP_ZERO:
6308c8be05fSJung-uk Kim     case PARSEOP_ONE:
6318c8be05fSJung-uk Kim     case PARSEOP_ONES:
632ca3cf4faSJung-uk Kim     case PARSEOP_INTEGER:
633a9d8d09cSJung-uk Kim 
634ca3cf4faSJung-uk Kim         ReturnBtype = ACPI_RTYPE_INTEGER;
6359c48c75eSJung-uk Kim         TypeName = "Integer";
636ca3cf4faSJung-uk Kim         break;
637ca3cf4faSJung-uk Kim 
638ca3cf4faSJung-uk Kim     case PARSEOP_STRING_LITERAL:
639a9d8d09cSJung-uk Kim 
640ca3cf4faSJung-uk Kim         ReturnBtype = ACPI_RTYPE_STRING;
6419c48c75eSJung-uk Kim         TypeName = "String";
6429c48c75eSJung-uk Kim         break;
6439c48c75eSJung-uk Kim 
6449c48c75eSJung-uk Kim     case PARSEOP_BUFFER:
645a9d8d09cSJung-uk Kim 
6469c48c75eSJung-uk Kim         ReturnBtype = ACPI_RTYPE_BUFFER;
6479c48c75eSJung-uk Kim         TypeName = "Buffer";
648ca3cf4faSJung-uk Kim         break;
649ca3cf4faSJung-uk Kim 
650ca3cf4faSJung-uk Kim     case PARSEOP_PACKAGE:
6513f0275a0SJung-uk Kim     case PARSEOP_VAR_PACKAGE:
652a9d8d09cSJung-uk Kim 
653ca3cf4faSJung-uk Kim         ReturnBtype = ACPI_RTYPE_PACKAGE;
6549c48c75eSJung-uk Kim         TypeName = "Package";
6559c48c75eSJung-uk Kim         break;
6569c48c75eSJung-uk Kim 
6579c48c75eSJung-uk Kim     case PARSEOP_NAMESEG:
6589c48c75eSJung-uk Kim     case PARSEOP_NAMESTRING:
659a9d8d09cSJung-uk Kim         /*
660a9d8d09cSJung-uk Kim          * Ignore any named references within a package object.
661a9d8d09cSJung-uk Kim          *
662a9d8d09cSJung-uk Kim          * For Package objects, references are allowed instead of any of the
663a9d8d09cSJung-uk Kim          * standard data types (Integer/String/Buffer/Package). These
664a9d8d09cSJung-uk Kim          * references are resolved at runtime. NAMESEG and NAMESTRING are
665a9d8d09cSJung-uk Kim          * impossible to typecheck at compile time because the type of
666a9d8d09cSJung-uk Kim          * any named object can be changed at runtime (for example,
667a9d8d09cSJung-uk Kim          * CopyObject will change the type of the target object).
668a9d8d09cSJung-uk Kim          */
669a9d8d09cSJung-uk Kim         if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT)
670a9d8d09cSJung-uk Kim         {
671a9d8d09cSJung-uk Kim             return (AE_OK);
672a9d8d09cSJung-uk Kim         }
673a9d8d09cSJung-uk Kim 
6749c48c75eSJung-uk Kim         ReturnBtype = ACPI_RTYPE_REFERENCE;
6759c48c75eSJung-uk Kim         TypeName = "Reference";
676ca3cf4faSJung-uk Kim         break;
677ca3cf4faSJung-uk Kim 
678ca3cf4faSJung-uk Kim     default:
679a9d8d09cSJung-uk Kim 
680ca3cf4faSJung-uk Kim         /* Not one of the supported object types */
681ca3cf4faSJung-uk Kim 
6829c48c75eSJung-uk Kim         TypeName = UtGetOpName (Op->Asl.ParseOpcode);
683ca3cf4faSJung-uk Kim         goto TypeErrorExit;
684ca3cf4faSJung-uk Kim     }
685ca3cf4faSJung-uk Kim 
6868c8be05fSJung-uk Kim     /* Exit if the object is one of the expected types */
687ca3cf4faSJung-uk Kim 
688ca3cf4faSJung-uk Kim     if (ReturnBtype & ExpectedBtypes)
689ca3cf4faSJung-uk Kim     {
6909c48c75eSJung-uk Kim         return (AE_OK);
691ca3cf4faSJung-uk Kim     }
692ca3cf4faSJung-uk Kim 
693ca3cf4faSJung-uk Kim 
694ca3cf4faSJung-uk Kim TypeErrorExit:
695ca3cf4faSJung-uk Kim 
696ca3cf4faSJung-uk Kim     /* Format the expected types and emit an error message */
697ca3cf4faSJung-uk Kim 
6989c7c683cSJung-uk Kim     AcpiUtGetExpectedReturnTypes (StringBuffer, ExpectedBtypes);
6998c8be05fSJung-uk Kim 
7009c48c75eSJung-uk Kim     if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
7019c48c75eSJung-uk Kim     {
7029c7c683cSJung-uk Kim         sprintf (MsgBuffer, "%4.4s: found %s, %s required",
7039c48c75eSJung-uk Kim             PredefinedName, TypeName, StringBuffer);
7049c48c75eSJung-uk Kim     }
7059c48c75eSJung-uk Kim     else
7069c48c75eSJung-uk Kim     {
7079c7c683cSJung-uk Kim         sprintf (MsgBuffer, "%4.4s: found %s at index %u, %s required",
7089c48c75eSJung-uk Kim             PredefinedName, TypeName, PackageIndex, StringBuffer);
7099c48c75eSJung-uk Kim     }
710ca3cf4faSJung-uk Kim 
7119c48c75eSJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Op, MsgBuffer);
7129c48c75eSJung-uk Kim     return (AE_TYPE);
713ca3cf4faSJung-uk Kim }
714ca3cf4faSJung-uk Kim 
715ca3cf4faSJung-uk Kim 
716ca3cf4faSJung-uk Kim /*******************************************************************************
717ca3cf4faSJung-uk Kim  *
718ca3cf4faSJung-uk Kim  * FUNCTION:    ApDisplayReservedNames
719ca3cf4faSJung-uk Kim  *
720ca3cf4faSJung-uk Kim  * PARAMETERS:  None
721ca3cf4faSJung-uk Kim  *
722ca3cf4faSJung-uk Kim  * RETURN:      None
723ca3cf4faSJung-uk Kim  *
724ca3cf4faSJung-uk Kim  * DESCRIPTION: Dump information about the ACPI predefined names and predefined
725ca3cf4faSJung-uk Kim  *              resource descriptor names.
726ca3cf4faSJung-uk Kim  *
727ca3cf4faSJung-uk Kim  ******************************************************************************/
728ca3cf4faSJung-uk Kim 
729ca3cf4faSJung-uk Kim void
730ca3cf4faSJung-uk Kim ApDisplayReservedNames (
731ca3cf4faSJung-uk Kim     void)
732ca3cf4faSJung-uk Kim {
733ca3cf4faSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
734ca3cf4faSJung-uk Kim     UINT32                      Count;
7359c7c683cSJung-uk Kim     UINT32                      NumTypes;
736ca3cf4faSJung-uk Kim 
737ca3cf4faSJung-uk Kim 
738ca3cf4faSJung-uk Kim     /*
739ca3cf4faSJung-uk Kim      * Predefined names/methods
740ca3cf4faSJung-uk Kim      */
741ca3cf4faSJung-uk Kim     printf ("\nPredefined Name Information\n\n");
742ca3cf4faSJung-uk Kim 
743ca3cf4faSJung-uk Kim     Count = 0;
7449c7c683cSJung-uk Kim     ThisName = AcpiGbl_PredefinedMethods;
745ca3cf4faSJung-uk Kim     while (ThisName->Info.Name[0])
746ca3cf4faSJung-uk Kim     {
7479c7c683cSJung-uk Kim         AcpiUtDisplayPredefinedMethod (MsgBuffer, ThisName, FALSE);
748ca3cf4faSJung-uk Kim         Count++;
7499c7c683cSJung-uk Kim         ThisName = AcpiUtGetNextPredefinedMethod (ThisName);
750ca3cf4faSJung-uk Kim     }
751ca3cf4faSJung-uk Kim 
752ca3cf4faSJung-uk Kim     printf ("%u Predefined Names are recognized\n", Count);
753ca3cf4faSJung-uk Kim 
754ca3cf4faSJung-uk Kim     /*
755ca3cf4faSJung-uk Kim      * Resource Descriptor names
756ca3cf4faSJung-uk Kim      */
7579c7c683cSJung-uk Kim     printf ("\nPredefined Names for Resource Descriptor Fields\n\n");
758ca3cf4faSJung-uk Kim 
759ca3cf4faSJung-uk Kim     Count = 0;
7609c7c683cSJung-uk Kim     ThisName = AcpiGbl_ResourceNames;
761ca3cf4faSJung-uk Kim     while (ThisName->Info.Name[0])
762ca3cf4faSJung-uk Kim     {
7639c7c683cSJung-uk Kim         NumTypes = AcpiUtGetResourceBitWidth (MsgBuffer,
7649c7c683cSJung-uk Kim             ThisName->Info.ArgumentList);
7659c7c683cSJung-uk Kim 
7669c7c683cSJung-uk Kim         printf ("%4.4s    Field is %s bits wide%s\n",
7679c7c683cSJung-uk Kim             ThisName->Info.Name, MsgBuffer,
7689c7c683cSJung-uk Kim             (NumTypes > 1) ? " (depending on descriptor type)" : "");
7699c7c683cSJung-uk Kim 
770ca3cf4faSJung-uk Kim         Count++;
771ca3cf4faSJung-uk Kim         ThisName++;
772ca3cf4faSJung-uk Kim     }
773ca3cf4faSJung-uk Kim 
7749c7c683cSJung-uk Kim     printf ("%u Resource Descriptor Field Names are recognized\n", Count);
775ca3cf4faSJung-uk Kim 
776ca3cf4faSJung-uk Kim     /*
777ca3cf4faSJung-uk Kim      * Predefined scope names
778ca3cf4faSJung-uk Kim      */
7799c7c683cSJung-uk Kim     printf ("\nPredefined Scope/Device Names (automatically created at root)\n\n");
780ca3cf4faSJung-uk Kim 
7819c7c683cSJung-uk Kim     ThisName = AcpiGbl_ScopeNames;
782ca3cf4faSJung-uk Kim     while (ThisName->Info.Name[0])
783ca3cf4faSJung-uk Kim     {
7849c7c683cSJung-uk Kim         printf ("%4.4s    Scope/Device\n", ThisName->Info.Name);
785ca3cf4faSJung-uk Kim         ThisName++;
786ca3cf4faSJung-uk Kim     }
787ca3cf4faSJung-uk Kim }
788