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
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim *
90d84335fSJung-uk Kim * 1. Copyright Notice
100d84335fSJung-uk Kim *
11*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
12ca3cf4faSJung-uk Kim * All rights reserved.
13ca3cf4faSJung-uk Kim *
140d84335fSJung-uk Kim * 2. License
150d84335fSJung-uk Kim *
160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim * property rights.
200d84335fSJung-uk Kim *
210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim *
280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim *
370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim * conditions are met:
390d84335fSJung-uk Kim *
400d84335fSJung-uk Kim * 3. Conditions
410d84335fSJung-uk Kim *
420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim *
540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim * make.
650d84335fSJung-uk Kim *
660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim * distribution.
710d84335fSJung-uk Kim *
720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim * Intel Code.
740d84335fSJung-uk Kim *
750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim * without prior written authorization from Intel.
790d84335fSJung-uk Kim *
800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim *
820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim *
900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim * LIMITED REMEDY.
980d84335fSJung-uk Kim *
990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim * such license, approval or letter.
1130d84335fSJung-uk Kim *
1140d84335fSJung-uk Kim *****************************************************************************
1150d84335fSJung-uk Kim *
1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim * following license:
1180d84335fSJung-uk Kim *
119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim * are met:
122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim * without modification.
125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim * binary redistribution.
130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim * from this software without specific prior written permission.
133ca3cf4faSJung-uk Kim *
1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim *
1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim * Software Foundation.
149ca3cf4faSJung-uk Kim *
1500d84335fSJung-uk Kim *****************************************************************************/
151ca3cf4faSJung-uk Kim
152ca3cf4faSJung-uk Kim #define ACPI_CREATE_PREDEFINED_TABLE
1539c7c683cSJung-uk Kim #define ACPI_CREATE_RESOURCE_TABLE
154ca3cf4faSJung-uk Kim
155ca3cf4faSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
156ca3cf4faSJung-uk Kim #include "aslcompiler.y.h"
157ca3cf4faSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
1589c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
159ca3cf4faSJung-uk Kim
160ca3cf4faSJung-uk Kim
161ca3cf4faSJung-uk Kim #define _COMPONENT ACPI_COMPILER
162ca3cf4faSJung-uk Kim ACPI_MODULE_NAME ("aslpredef")
163ca3cf4faSJung-uk Kim
164ca3cf4faSJung-uk Kim
165ca3cf4faSJung-uk Kim /* Local prototypes */
166ca3cf4faSJung-uk Kim
1670b94ba42SJung-uk Kim static void
1680b94ba42SJung-uk Kim ApCheckForUnexpectedReturnValue (
1690b94ba42SJung-uk Kim ACPI_PARSE_OBJECT *Op,
1700b94ba42SJung-uk Kim ASL_METHOD_INFO *MethodInfo);
1710b94ba42SJung-uk Kim
172ca3cf4faSJung-uk Kim static UINT32
173ca3cf4faSJung-uk Kim ApCheckForSpecialName (
174ca3cf4faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
175ca3cf4faSJung-uk Kim char *Name);
176ca3cf4faSJung-uk Kim
177ca3cf4faSJung-uk Kim
178ca3cf4faSJung-uk Kim /*******************************************************************************
179ca3cf4faSJung-uk Kim *
180ca3cf4faSJung-uk Kim * FUNCTION: ApCheckForPredefinedMethod
181ca3cf4faSJung-uk Kim *
182ca3cf4faSJung-uk Kim * PARAMETERS: Op - A parse node of type "METHOD".
183ca3cf4faSJung-uk Kim * MethodInfo - Saved info about this method
184ca3cf4faSJung-uk Kim *
185ca3cf4faSJung-uk Kim * RETURN: None
186ca3cf4faSJung-uk Kim *
187ca3cf4faSJung-uk Kim * DESCRIPTION: If method is a predefined name, check that the number of
188ca3cf4faSJung-uk Kim * arguments and the return type (returns a value or not)
189ca3cf4faSJung-uk Kim * is correct.
190ca3cf4faSJung-uk Kim *
191ca3cf4faSJung-uk Kim ******************************************************************************/
192ca3cf4faSJung-uk Kim
193d052a1ccSJung-uk Kim BOOLEAN
ApCheckForPredefinedMethod(ACPI_PARSE_OBJECT * Op,ASL_METHOD_INFO * MethodInfo)194ca3cf4faSJung-uk Kim ApCheckForPredefinedMethod (
195ca3cf4faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
196ca3cf4faSJung-uk Kim ASL_METHOD_INFO *MethodInfo)
197ca3cf4faSJung-uk Kim {
198ca3cf4faSJung-uk Kim UINT32 Index;
1999c7c683cSJung-uk Kim UINT32 RequiredArgCount;
2009c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *ThisName;
201ca3cf4faSJung-uk Kim
202ca3cf4faSJung-uk Kim
203ca3cf4faSJung-uk Kim /* Check for a match against the predefined name list */
204ca3cf4faSJung-uk Kim
205ca3cf4faSJung-uk Kim Index = ApCheckForPredefinedName (Op, Op->Asl.NameSeg);
206ca3cf4faSJung-uk Kim
207ca3cf4faSJung-uk Kim switch (Index)
208ca3cf4faSJung-uk Kim {
209ca3cf4faSJung-uk Kim case ACPI_NOT_RESERVED_NAME: /* No underscore or _Txx or _xxx name not matched */
210ca3cf4faSJung-uk Kim case ACPI_PREDEFINED_NAME: /* Resource Name or reserved scope name */
211ca3cf4faSJung-uk Kim case ACPI_COMPILER_RESERVED_NAME: /* A _Txx that was not emitted by compiler */
212ca3cf4faSJung-uk Kim
213ca3cf4faSJung-uk Kim /* Just return, nothing to do */
214d052a1ccSJung-uk Kim return (FALSE);
215ca3cf4faSJung-uk Kim
216ca3cf4faSJung-uk Kim
2173f5e024cSJung-uk Kim case ACPI_EVENT_RESERVED_NAME: /* _Lxx/_Exx/_Wxx/_Qxx methods */
218ca3cf4faSJung-uk Kim
2196f1f1a63SJung-uk Kim AslGbl_ReservedMethods++;
220ca3cf4faSJung-uk Kim
2213f5e024cSJung-uk Kim /* NumArguments must be zero for all _Lxx/_Exx/_Wxx/_Qxx methods */
222ca3cf4faSJung-uk Kim
223ca3cf4faSJung-uk Kim if (MethodInfo->NumArguments != 0)
224ca3cf4faSJung-uk Kim {
2254a38ee6dSJung-uk Kim sprintf (AslGbl_MsgBuffer, "%s requires %d", Op->Asl.ExternalName, 0);
226ca3cf4faSJung-uk Kim
227ca3cf4faSJung-uk Kim AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
2286f1f1a63SJung-uk Kim AslGbl_MsgBuffer);
229ca3cf4faSJung-uk Kim }
230ca3cf4faSJung-uk Kim break;
231ca3cf4faSJung-uk Kim
232ca3cf4faSJung-uk Kim
233ca3cf4faSJung-uk Kim default:
234ca3cf4faSJung-uk Kim /*
235895f26a9SJung-uk Kim * Matched a predefined method name - validate the ASL-defined
236895f26a9SJung-uk Kim * argument count against the ACPI specification.
237ca3cf4faSJung-uk Kim *
238895f26a9SJung-uk Kim * Some methods are allowed to have a "minimum" number of args
239895f26a9SJung-uk Kim * (_SCP) because their definition in ACPI has changed over time.
240ca3cf4faSJung-uk Kim */
2416f1f1a63SJung-uk Kim AslGbl_ReservedMethods++;
2429c7c683cSJung-uk Kim ThisName = &AcpiGbl_PredefinedMethods[Index];
243895f26a9SJung-uk Kim RequiredArgCount = METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList);
244ca3cf4faSJung-uk Kim
2459c7c683cSJung-uk Kim if (MethodInfo->NumArguments != RequiredArgCount)
246ca3cf4faSJung-uk Kim {
2476f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s requires %u",
2489c7c683cSJung-uk Kim ThisName->Info.Name, RequiredArgCount);
249ca3cf4faSJung-uk Kim
250895f26a9SJung-uk Kim if (MethodInfo->NumArguments < RequiredArgCount)
251895f26a9SJung-uk Kim {
252895f26a9SJung-uk Kim AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_LO, Op,
2536f1f1a63SJung-uk Kim AslGbl_MsgBuffer);
254895f26a9SJung-uk Kim }
255895f26a9SJung-uk Kim else if ((MethodInfo->NumArguments > RequiredArgCount) &&
2569c7c683cSJung-uk Kim !(ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM))
257ca3cf4faSJung-uk Kim {
258ca3cf4faSJung-uk Kim AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
2596f1f1a63SJung-uk Kim AslGbl_MsgBuffer);
260ca3cf4faSJung-uk Kim }
261ca3cf4faSJung-uk Kim }
262ca3cf4faSJung-uk Kim
263ca3cf4faSJung-uk Kim /*
264ca3cf4faSJung-uk Kim * Check if method returns no value, but the predefined name is
265ca3cf4faSJung-uk Kim * required to return a value
266ca3cf4faSJung-uk Kim */
267ca3cf4faSJung-uk Kim if (MethodInfo->NumReturnNoValue &&
2689c7c683cSJung-uk Kim ThisName->Info.ExpectedBtypes)
269ca3cf4faSJung-uk Kim {
2706f1f1a63SJung-uk Kim AcpiUtGetExpectedReturnTypes (AslGbl_StringBuffer,
2719c7c683cSJung-uk Kim ThisName->Info.ExpectedBtypes);
2728c8be05fSJung-uk Kim
2736f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%s required for %4.4s",
2746f1f1a63SJung-uk Kim AslGbl_StringBuffer, ThisName->Info.Name);
275ca3cf4faSJung-uk Kim
276ca3cf4faSJung-uk Kim AslError (ASL_WARNING, ASL_MSG_RESERVED_RETURN_VALUE, Op,
2776f1f1a63SJung-uk Kim AslGbl_MsgBuffer);
278ca3cf4faSJung-uk Kim }
279ca3cf4faSJung-uk Kim break;
280ca3cf4faSJung-uk Kim }
281d052a1ccSJung-uk Kim
282d052a1ccSJung-uk Kim return (TRUE);
283ca3cf4faSJung-uk Kim }
284ca3cf4faSJung-uk Kim
285ca3cf4faSJung-uk Kim
286ca3cf4faSJung-uk Kim /*******************************************************************************
287ca3cf4faSJung-uk Kim *
2880b94ba42SJung-uk Kim * FUNCTION: ApCheckForUnexpectedReturnValue
2890b94ba42SJung-uk Kim *
2900b94ba42SJung-uk Kim * PARAMETERS: Op - A parse node of type "RETURN".
2910b94ba42SJung-uk Kim * MethodInfo - Saved info about this method
2920b94ba42SJung-uk Kim *
2930b94ba42SJung-uk Kim * RETURN: None
2940b94ba42SJung-uk Kim *
2950b94ba42SJung-uk Kim * DESCRIPTION: Check for an unexpected return value from a predefined method.
2960b94ba42SJung-uk Kim * Invoked for predefined methods that are defined to not return
2970b94ba42SJung-uk Kim * any value. If there is a return value, issue a remark, since
2980b94ba42SJung-uk Kim * the ASL writer may be confused as to the method definition
2990b94ba42SJung-uk Kim * and/or functionality.
3000b94ba42SJung-uk Kim *
3010b94ba42SJung-uk Kim * Note: We ignore all return values of "Zero", since this is what a standalone
3020b94ba42SJung-uk Kim * Return() statement will always generate -- so we ignore it here --
3030b94ba42SJung-uk Kim * i.e., there is no difference between Return() and Return(Zero).
3040b94ba42SJung-uk Kim * Also, a null Return() will be disassembled to return(Zero) -- so, we
3050b94ba42SJung-uk Kim * don't want to generate extraneous remarks/warnings for a disassembled
3060b94ba42SJung-uk Kim * ASL file.
3070b94ba42SJung-uk Kim *
3080b94ba42SJung-uk Kim ******************************************************************************/
3090b94ba42SJung-uk Kim
3100b94ba42SJung-uk Kim static void
ApCheckForUnexpectedReturnValue(ACPI_PARSE_OBJECT * Op,ASL_METHOD_INFO * MethodInfo)3110b94ba42SJung-uk Kim ApCheckForUnexpectedReturnValue (
3120b94ba42SJung-uk Kim ACPI_PARSE_OBJECT *Op,
3130b94ba42SJung-uk Kim ASL_METHOD_INFO *MethodInfo)
3140b94ba42SJung-uk Kim {
3150b94ba42SJung-uk Kim ACPI_PARSE_OBJECT *ReturnValueOp;
3160b94ba42SJung-uk Kim
3170b94ba42SJung-uk Kim
3180b94ba42SJung-uk Kim /* Ignore Return() and Return(Zero) (they are the same) */
3190b94ba42SJung-uk Kim
3200b94ba42SJung-uk Kim ReturnValueOp = Op->Asl.Child;
3210b94ba42SJung-uk Kim if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_ZERO)
3220b94ba42SJung-uk Kim {
3230b94ba42SJung-uk Kim return;
3240b94ba42SJung-uk Kim }
3250b94ba42SJung-uk Kim
3260b94ba42SJung-uk Kim /* We have a valid return value, but the reserved name did not expect it */
3270b94ba42SJung-uk Kim
3280b94ba42SJung-uk Kim AslError (ASL_WARNING, ASL_MSG_RESERVED_NO_RETURN_VAL,
3290b94ba42SJung-uk Kim Op, MethodInfo->Op->Asl.ExternalName);
3300b94ba42SJung-uk Kim }
3310b94ba42SJung-uk Kim
3320b94ba42SJung-uk Kim
3330b94ba42SJung-uk Kim /*******************************************************************************
3340b94ba42SJung-uk Kim *
3358c8be05fSJung-uk Kim * FUNCTION: ApCheckPredefinedReturnValue
3368c8be05fSJung-uk Kim *
3378c8be05fSJung-uk Kim * PARAMETERS: Op - A parse node of type "RETURN".
3388c8be05fSJung-uk Kim * MethodInfo - Saved info about this method
3398c8be05fSJung-uk Kim *
3408c8be05fSJung-uk Kim * RETURN: None
3418c8be05fSJung-uk Kim *
3428c8be05fSJung-uk Kim * DESCRIPTION: If method is a predefined name, attempt to validate the return
3438c8be05fSJung-uk Kim * value. Only "static" types can be validated - a simple return
3448c8be05fSJung-uk Kim * of an integer/string/buffer/package or a named reference to
3458c8be05fSJung-uk Kim * a static object. Values such as a Localx or Argx or a control
3460b94ba42SJung-uk Kim * method invocation are not checked. Issue a warning if there is
3470b94ba42SJung-uk Kim * a valid return value, but the reserved method defines no
3480b94ba42SJung-uk Kim * return value.
3498c8be05fSJung-uk Kim *
3508c8be05fSJung-uk Kim ******************************************************************************/
3518c8be05fSJung-uk Kim
3528c8be05fSJung-uk Kim void
ApCheckPredefinedReturnValue(ACPI_PARSE_OBJECT * Op,ASL_METHOD_INFO * MethodInfo)3538c8be05fSJung-uk Kim ApCheckPredefinedReturnValue (
3548c8be05fSJung-uk Kim ACPI_PARSE_OBJECT *Op,
3558c8be05fSJung-uk Kim ASL_METHOD_INFO *MethodInfo)
3568c8be05fSJung-uk Kim {
3578c8be05fSJung-uk Kim UINT32 Index;
3588c8be05fSJung-uk Kim ACPI_PARSE_OBJECT *ReturnValueOp;
3599c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *ThisName;
3608c8be05fSJung-uk Kim
3618c8be05fSJung-uk Kim
362313a0c13SJung-uk Kim /*
363313a0c13SJung-uk Kim * Check parent method for a match against the predefined name list.
364313a0c13SJung-uk Kim *
365313a0c13SJung-uk Kim * Note: Disable compiler errors/warnings because any errors will be
366313a0c13SJung-uk Kim * caught when analyzing the parent method. Eliminates duplicate errors.
367313a0c13SJung-uk Kim */
3686f1f1a63SJung-uk Kim AslGbl_AllExceptionsDisabled = TRUE;
3698c8be05fSJung-uk Kim Index = ApCheckForPredefinedName (MethodInfo->Op,
3708c8be05fSJung-uk Kim MethodInfo->Op->Asl.NameSeg);
3716f1f1a63SJung-uk Kim AslGbl_AllExceptionsDisabled = FALSE;
3728c8be05fSJung-uk Kim
3738c8be05fSJung-uk Kim switch (Index)
3748c8be05fSJung-uk Kim {
3750b94ba42SJung-uk Kim case ACPI_EVENT_RESERVED_NAME: /* _Lxx/_Exx/_Wxx/_Qxx methods */
3760b94ba42SJung-uk Kim
3770b94ba42SJung-uk Kim /* No return value expected, warn if there is one */
3780b94ba42SJung-uk Kim
3790b94ba42SJung-uk Kim ApCheckForUnexpectedReturnValue (Op, MethodInfo);
3800b94ba42SJung-uk Kim return;
3810b94ba42SJung-uk Kim
3828c8be05fSJung-uk Kim case ACPI_NOT_RESERVED_NAME: /* No underscore or _Txx or _xxx name not matched */
3838c8be05fSJung-uk Kim case ACPI_PREDEFINED_NAME: /* Resource Name or reserved scope name */
3848c8be05fSJung-uk Kim case ACPI_COMPILER_RESERVED_NAME: /* A _Txx that was not emitted by compiler */
3858c8be05fSJung-uk Kim
3868c8be05fSJung-uk Kim /* Just return, nothing to do */
3878c8be05fSJung-uk Kim return;
3888c8be05fSJung-uk Kim
3893f5e024cSJung-uk Kim default: /* A standard predefined ACPI name */
3908c8be05fSJung-uk Kim
3919c7c683cSJung-uk Kim ThisName = &AcpiGbl_PredefinedMethods[Index];
3929c7c683cSJung-uk Kim if (!ThisName->Info.ExpectedBtypes)
3938c8be05fSJung-uk Kim {
3940b94ba42SJung-uk Kim /* No return value expected, warn if there is one */
3950b94ba42SJung-uk Kim
3960b94ba42SJung-uk Kim ApCheckForUnexpectedReturnValue (Op, MethodInfo);
3978c8be05fSJung-uk Kim return;
3988c8be05fSJung-uk Kim }
3998c8be05fSJung-uk Kim
4008c8be05fSJung-uk Kim /* Get the object returned, it is the next argument */
4018c8be05fSJung-uk Kim
4028c8be05fSJung-uk Kim ReturnValueOp = Op->Asl.Child;
4038c8be05fSJung-uk Kim switch (ReturnValueOp->Asl.ParseOpcode)
4048c8be05fSJung-uk Kim {
4058c8be05fSJung-uk Kim case PARSEOP_ZERO:
4068c8be05fSJung-uk Kim case PARSEOP_ONE:
4078c8be05fSJung-uk Kim case PARSEOP_ONES:
4088c8be05fSJung-uk Kim case PARSEOP_INTEGER:
4098c8be05fSJung-uk Kim case PARSEOP_STRING_LITERAL:
4108c8be05fSJung-uk Kim case PARSEOP_BUFFER:
4118c8be05fSJung-uk Kim case PARSEOP_PACKAGE:
4128c8be05fSJung-uk Kim
4138c8be05fSJung-uk Kim /* Static data return object - check against expected type */
4148c8be05fSJung-uk Kim
4159c7c683cSJung-uk Kim ApCheckObjectType (ThisName->Info.Name, ReturnValueOp,
4169c7c683cSJung-uk Kim ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
4179c48c75eSJung-uk Kim
4189c48c75eSJung-uk Kim /* For packages, check the individual package elements */
4199c48c75eSJung-uk Kim
4209c48c75eSJung-uk Kim if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
4219c48c75eSJung-uk Kim {
4229c7c683cSJung-uk Kim ApCheckPackage (ReturnValueOp, ThisName);
4239c48c75eSJung-uk Kim }
4248c8be05fSJung-uk Kim break;
4258c8be05fSJung-uk Kim
4268c8be05fSJung-uk Kim default:
4278c8be05fSJung-uk Kim /*
4288c8be05fSJung-uk Kim * All other ops are very difficult or impossible to typecheck at
4298c8be05fSJung-uk Kim * compile time. These include all Localx, Argx, and method
4308c8be05fSJung-uk Kim * invocations. Also, NAMESEG and NAMESTRING because the type of
4318c8be05fSJung-uk Kim * any named object can be changed at runtime (for example,
4328c8be05fSJung-uk Kim * CopyObject will change the type of the target object.)
4338c8be05fSJung-uk Kim */
4348c8be05fSJung-uk Kim break;
4358c8be05fSJung-uk Kim }
4368c8be05fSJung-uk Kim }
4378c8be05fSJung-uk Kim }
4388c8be05fSJung-uk Kim
4398c8be05fSJung-uk Kim
4408c8be05fSJung-uk Kim /*******************************************************************************
4418c8be05fSJung-uk Kim *
442ca3cf4faSJung-uk Kim * FUNCTION: ApCheckForPredefinedObject
443ca3cf4faSJung-uk Kim *
444ca3cf4faSJung-uk Kim * PARAMETERS: Op - A parse node
445ca3cf4faSJung-uk Kim * Name - The ACPI name to be checked
446ca3cf4faSJung-uk Kim *
447ca3cf4faSJung-uk Kim * RETURN: None
448ca3cf4faSJung-uk Kim *
449ca3cf4faSJung-uk Kim * DESCRIPTION: Check for a predefined name for a static object (created via
450ca3cf4faSJung-uk Kim * the ASL Name operator). If it is a predefined ACPI name, ensure
451ca3cf4faSJung-uk Kim * that the name does not require any arguments (which would
452cd6518c7SJung-uk Kim * require a control method implementation of the name), and that
453ca3cf4faSJung-uk Kim * the type of the object is one of the expected types for the
454ca3cf4faSJung-uk Kim * predefined name.
455ca3cf4faSJung-uk Kim *
456ca3cf4faSJung-uk Kim ******************************************************************************/
457ca3cf4faSJung-uk Kim
458ca3cf4faSJung-uk Kim void
ApCheckForPredefinedObject(ACPI_PARSE_OBJECT * Op,char * Name)459ca3cf4faSJung-uk Kim ApCheckForPredefinedObject (
460ca3cf4faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
461ca3cf4faSJung-uk Kim char *Name)
462ca3cf4faSJung-uk Kim {
463ca3cf4faSJung-uk Kim UINT32 Index;
4649c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ObjectOp;
4659c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *ThisName;
466ca3cf4faSJung-uk Kim
467ca3cf4faSJung-uk Kim
468ca3cf4faSJung-uk Kim /*
469ca3cf4faSJung-uk Kim * Check for a real predefined name -- not a resource descriptor name
470ca3cf4faSJung-uk Kim * or a predefined scope name
471ca3cf4faSJung-uk Kim */
472ca3cf4faSJung-uk Kim Index = ApCheckForPredefinedName (Op, Name);
4733f5e024cSJung-uk Kim
4743f5e024cSJung-uk Kim switch (Index)
475ca3cf4faSJung-uk Kim {
4763f5e024cSJung-uk Kim case ACPI_NOT_RESERVED_NAME: /* No underscore or _Txx or _xxx name not matched */
4773f5e024cSJung-uk Kim case ACPI_PREDEFINED_NAME: /* Resource Name or reserved scope name */
4783f5e024cSJung-uk Kim case ACPI_COMPILER_RESERVED_NAME: /* A _Txx that was not emitted by compiler */
4793f5e024cSJung-uk Kim
4803f5e024cSJung-uk Kim /* Nothing to do */
4813f5e024cSJung-uk Kim return;
4823f5e024cSJung-uk Kim
4833f5e024cSJung-uk Kim case ACPI_EVENT_RESERVED_NAME: /* _Lxx/_Exx/_Wxx/_Qxx methods */
4843f5e024cSJung-uk Kim
4853f5e024cSJung-uk Kim /*
4863f5e024cSJung-uk Kim * These names must be control methods, by definition in ACPI spec.
4873f5e024cSJung-uk Kim * Also because they are defined to return no value. None of them
4883f5e024cSJung-uk Kim * require any arguments.
4893f5e024cSJung-uk Kim */
4903f5e024cSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
4913f5e024cSJung-uk Kim "with zero arguments");
4923f5e024cSJung-uk Kim return;
4933f5e024cSJung-uk Kim
4949c48c75eSJung-uk Kim default:
495a9d8d09cSJung-uk Kim
4969c48c75eSJung-uk Kim break;
4979c48c75eSJung-uk Kim }
4989c48c75eSJung-uk Kim
4999c48c75eSJung-uk Kim /* A standard predefined ACPI name */
5003f5e024cSJung-uk Kim
5013f5e024cSJung-uk Kim /*
5023f5e024cSJung-uk Kim * If this predefined name requires input arguments, then
5033f5e024cSJung-uk Kim * it must be implemented as a control method
5043f5e024cSJung-uk Kim */
5059c7c683cSJung-uk Kim ThisName = &AcpiGbl_PredefinedMethods[Index];
506895f26a9SJung-uk Kim if (METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList) > 0)
5073f5e024cSJung-uk Kim {
5083f5e024cSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
5093f5e024cSJung-uk Kim "with arguments");
510ca3cf4faSJung-uk Kim return;
511ca3cf4faSJung-uk Kim }
512ca3cf4faSJung-uk Kim
513ca3cf4faSJung-uk Kim /*
5143f5e024cSJung-uk Kim * If no return value is expected from this predefined name, then
5153f5e024cSJung-uk Kim * it follows that it must be implemented as a control method
5163f5e024cSJung-uk Kim * (with zero args, because the args > 0 case was handled above)
5173f5e024cSJung-uk Kim * Examples are: _DIS, _INI, _IRC, _OFF, _ON, _PSx
518ca3cf4faSJung-uk Kim */
5199c7c683cSJung-uk Kim if (!ThisName->Info.ExpectedBtypes)
520ca3cf4faSJung-uk Kim {
521ca3cf4faSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
5223f5e024cSJung-uk Kim "with zero arguments");
5233f5e024cSJung-uk Kim return;
524ca3cf4faSJung-uk Kim }
525ca3cf4faSJung-uk Kim
526ca3cf4faSJung-uk Kim /* Typecheck the actual object, it is the next argument */
527ca3cf4faSJung-uk Kim
5289c48c75eSJung-uk Kim ObjectOp = Op->Asl.Child->Asl.Next;
5299c7c683cSJung-uk Kim ApCheckObjectType (ThisName->Info.Name, Op->Asl.Child->Asl.Next,
5309c7c683cSJung-uk Kim ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
5319c48c75eSJung-uk Kim
5329c48c75eSJung-uk Kim /* For packages, check the individual package elements */
5339c48c75eSJung-uk Kim
5349c48c75eSJung-uk Kim if (ObjectOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
5359c48c75eSJung-uk Kim {
5369c7c683cSJung-uk Kim ApCheckPackage (ObjectOp, ThisName);
5373f5e024cSJung-uk Kim }
538ca3cf4faSJung-uk Kim }
539ca3cf4faSJung-uk Kim
540ca3cf4faSJung-uk Kim
541ca3cf4faSJung-uk Kim /*******************************************************************************
542ca3cf4faSJung-uk Kim *
543ca3cf4faSJung-uk Kim * FUNCTION: ApCheckForPredefinedName
544ca3cf4faSJung-uk Kim *
545ca3cf4faSJung-uk Kim * PARAMETERS: Op - A parse node
546ca3cf4faSJung-uk Kim * Name - NameSeg to check
547ca3cf4faSJung-uk Kim *
548ca3cf4faSJung-uk Kim * RETURN: None
549ca3cf4faSJung-uk Kim *
550ca3cf4faSJung-uk Kim * DESCRIPTION: Check a NameSeg against the reserved list.
551ca3cf4faSJung-uk Kim *
552ca3cf4faSJung-uk Kim ******************************************************************************/
553ca3cf4faSJung-uk Kim
554ca3cf4faSJung-uk Kim UINT32
ApCheckForPredefinedName(ACPI_PARSE_OBJECT * Op,char * Name)555ca3cf4faSJung-uk Kim ApCheckForPredefinedName (
556ca3cf4faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
557ca3cf4faSJung-uk Kim char *Name)
558ca3cf4faSJung-uk Kim {
559ca3cf4faSJung-uk Kim UINT32 i;
5609c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *ThisName;
561ca3cf4faSJung-uk Kim
562ca3cf4faSJung-uk Kim
563ca3cf4faSJung-uk Kim if (Name[0] == 0)
564ca3cf4faSJung-uk Kim {
565f8146b88SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op,
5669a4bc520SJung-uk Kim "Zero length name found");
567ca3cf4faSJung-uk Kim }
568ca3cf4faSJung-uk Kim
569ca3cf4faSJung-uk Kim /* All reserved names are prefixed with a single underscore */
570ca3cf4faSJung-uk Kim
571ca3cf4faSJung-uk Kim if (Name[0] != '_')
572ca3cf4faSJung-uk Kim {
573ca3cf4faSJung-uk Kim return (ACPI_NOT_RESERVED_NAME);
574ca3cf4faSJung-uk Kim }
575ca3cf4faSJung-uk Kim
576ca3cf4faSJung-uk Kim /* Check for a standard predefined method name */
577ca3cf4faSJung-uk Kim
5789c7c683cSJung-uk Kim ThisName = AcpiGbl_PredefinedMethods;
5799c7c683cSJung-uk Kim for (i = 0; ThisName->Info.Name[0]; i++)
580ca3cf4faSJung-uk Kim {
581278f0de6SJung-uk Kim if (ACPI_COMPARE_NAMESEG (Name, ThisName->Info.Name))
582ca3cf4faSJung-uk Kim {
583ca3cf4faSJung-uk Kim /* Return index into predefined array */
584ca3cf4faSJung-uk Kim return (i);
585ca3cf4faSJung-uk Kim }
5869c7c683cSJung-uk Kim
5879c7c683cSJung-uk Kim ThisName++; /* Does not account for extra package data, but is OK */
588ca3cf4faSJung-uk Kim }
589ca3cf4faSJung-uk Kim
590ca3cf4faSJung-uk Kim /* Check for resource names and predefined scope names */
591ca3cf4faSJung-uk Kim
5929c7c683cSJung-uk Kim ThisName = AcpiGbl_ResourceNames;
5939c7c683cSJung-uk Kim while (ThisName->Info.Name[0])
594ca3cf4faSJung-uk Kim {
595278f0de6SJung-uk Kim if (ACPI_COMPARE_NAMESEG (Name, ThisName->Info.Name))
596ca3cf4faSJung-uk Kim {
597ca3cf4faSJung-uk Kim return (ACPI_PREDEFINED_NAME);
598ca3cf4faSJung-uk Kim }
599ca3cf4faSJung-uk Kim
6009c7c683cSJung-uk Kim ThisName++;
6019c7c683cSJung-uk Kim }
6029c7c683cSJung-uk Kim
6039c7c683cSJung-uk Kim ThisName = AcpiGbl_ScopeNames;
6049c7c683cSJung-uk Kim while (ThisName->Info.Name[0])
605ca3cf4faSJung-uk Kim {
606278f0de6SJung-uk Kim if (ACPI_COMPARE_NAMESEG (Name, ThisName->Info.Name))
607ca3cf4faSJung-uk Kim {
608ca3cf4faSJung-uk Kim return (ACPI_PREDEFINED_NAME);
609ca3cf4faSJung-uk Kim }
6109c7c683cSJung-uk Kim
6119c7c683cSJung-uk Kim ThisName++;
612ca3cf4faSJung-uk Kim }
613ca3cf4faSJung-uk Kim
6143f5e024cSJung-uk Kim /* Check for _Lxx/_Exx/_Wxx/_Qxx/_T_x. Warning if unknown predefined name */
615ca3cf4faSJung-uk Kim
616ca3cf4faSJung-uk Kim return (ApCheckForSpecialName (Op, Name));
617ca3cf4faSJung-uk Kim }
618ca3cf4faSJung-uk Kim
619ca3cf4faSJung-uk Kim
620ca3cf4faSJung-uk Kim /*******************************************************************************
621ca3cf4faSJung-uk Kim *
622ca3cf4faSJung-uk Kim * FUNCTION: ApCheckForSpecialName
623ca3cf4faSJung-uk Kim *
624ca3cf4faSJung-uk Kim * PARAMETERS: Op - A parse node
625ca3cf4faSJung-uk Kim * Name - NameSeg to check
626ca3cf4faSJung-uk Kim *
627ca3cf4faSJung-uk Kim * RETURN: None
628ca3cf4faSJung-uk Kim *
629ca3cf4faSJung-uk Kim * DESCRIPTION: Check for the "special" predefined names -
6303f5e024cSJung-uk Kim * _Lxx, _Exx, _Qxx, _Wxx, and _T_x
631ca3cf4faSJung-uk Kim *
632ca3cf4faSJung-uk Kim ******************************************************************************/
633ca3cf4faSJung-uk Kim
634ca3cf4faSJung-uk Kim static UINT32
ApCheckForSpecialName(ACPI_PARSE_OBJECT * Op,char * Name)635ca3cf4faSJung-uk Kim ApCheckForSpecialName (
636ca3cf4faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
637ca3cf4faSJung-uk Kim char *Name)
638ca3cf4faSJung-uk Kim {
639ca3cf4faSJung-uk Kim
640ca3cf4faSJung-uk Kim /*
6413f5e024cSJung-uk Kim * Check for the "special" predefined names. We already know that the
6423f5e024cSJung-uk Kim * first character is an underscore.
643ca3cf4faSJung-uk Kim * GPE: _Lxx
644ca3cf4faSJung-uk Kim * GPE: _Exx
6453f5e024cSJung-uk Kim * GPE: _Wxx
646ca3cf4faSJung-uk Kim * EC: _Qxx
647ca3cf4faSJung-uk Kim */
648ca3cf4faSJung-uk Kim if ((Name[1] == 'L') ||
649ca3cf4faSJung-uk Kim (Name[1] == 'E') ||
6503f5e024cSJung-uk Kim (Name[1] == 'W') ||
651ca3cf4faSJung-uk Kim (Name[1] == 'Q'))
652ca3cf4faSJung-uk Kim {
653ca3cf4faSJung-uk Kim /* The next two characters must be hex digits */
654ca3cf4faSJung-uk Kim
655ca3cf4faSJung-uk Kim if ((isxdigit ((int) Name[2])) &&
656ca3cf4faSJung-uk Kim (isxdigit ((int) Name[3])))
657ca3cf4faSJung-uk Kim {
658ca3cf4faSJung-uk Kim return (ACPI_EVENT_RESERVED_NAME);
659ca3cf4faSJung-uk Kim }
660ca3cf4faSJung-uk Kim }
661ca3cf4faSJung-uk Kim
662ca3cf4faSJung-uk Kim /* Check for the names reserved for the compiler itself: _T_x */
663ca3cf4faSJung-uk Kim
664ca3cf4faSJung-uk Kim else if ((Op->Asl.ExternalName[1] == 'T') &&
665ca3cf4faSJung-uk Kim (Op->Asl.ExternalName[2] == '_'))
666ca3cf4faSJung-uk Kim {
667ca3cf4faSJung-uk Kim /* Ignore if actually emitted by the compiler */
668ca3cf4faSJung-uk Kim
6695f9b24faSJung-uk Kim if (Op->Asl.CompileFlags & OP_COMPILER_EMITTED)
670ca3cf4faSJung-uk Kim {
671ca3cf4faSJung-uk Kim return (ACPI_NOT_RESERVED_NAME);
672ca3cf4faSJung-uk Kim }
673ca3cf4faSJung-uk Kim
674ca3cf4faSJung-uk Kim /*
675ca3cf4faSJung-uk Kim * Was not actually emitted by the compiler. This is a special case,
676ca3cf4faSJung-uk Kim * however. If the ASL code being compiled was the result of a
67708ddfe86SJung-uk Kim * disassembly, it may possibly contain valid compiler-emitted names
678ca3cf4faSJung-uk Kim * of the form "_T_x". We don't want to issue an error or even a
679ca3cf4faSJung-uk Kim * warning and force the user to manually change the names. So, we
680ca3cf4faSJung-uk Kim * will issue a remark instead.
681ca3cf4faSJung-uk Kim */
682f8146b88SJung-uk Kim AslError (ASL_REMARK, ASL_MSG_COMPILER_RESERVED,
683f8146b88SJung-uk Kim Op, Op->Asl.ExternalName);
684ca3cf4faSJung-uk Kim return (ACPI_COMPILER_RESERVED_NAME);
685ca3cf4faSJung-uk Kim }
686ca3cf4faSJung-uk Kim
687ca3cf4faSJung-uk Kim /*
688ca3cf4faSJung-uk Kim * The name didn't match any of the known predefined names. Flag it as a
689ca3cf4faSJung-uk Kim * warning, since the entire namespace starting with an underscore is
690ca3cf4faSJung-uk Kim * reserved by the ACPI spec.
691ca3cf4faSJung-uk Kim */
692f8146b88SJung-uk Kim AslError (ASL_WARNING, ASL_MSG_UNKNOWN_RESERVED_NAME,
693f8146b88SJung-uk Kim Op, Op->Asl.ExternalName);
694ca3cf4faSJung-uk Kim
695ca3cf4faSJung-uk Kim return (ACPI_NOT_RESERVED_NAME);
696ca3cf4faSJung-uk Kim }
697ca3cf4faSJung-uk Kim
698ca3cf4faSJung-uk Kim
699ca3cf4faSJung-uk Kim /*******************************************************************************
700ca3cf4faSJung-uk Kim *
701ca3cf4faSJung-uk Kim * FUNCTION: ApCheckObjectType
702ca3cf4faSJung-uk Kim *
703efcc2a30SJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object we are checking
704efcc2a30SJung-uk Kim * Op - Current parse node
705ca3cf4faSJung-uk Kim * ExpectedBtypes - Bitmap of expected return type(s)
7069c48c75eSJung-uk Kim * PackageIndex - Index of object within parent package (if
7079c48c75eSJung-uk Kim * applicable - ACPI_NOT_PACKAGE_ELEMENT
7089c48c75eSJung-uk Kim * otherwise)
709ca3cf4faSJung-uk Kim *
710ca3cf4faSJung-uk Kim * RETURN: None
711ca3cf4faSJung-uk Kim *
712ca3cf4faSJung-uk Kim * DESCRIPTION: Check if the object type is one of the types that is expected
713ca3cf4faSJung-uk Kim * by the predefined name. Only a limited number of object types
714ca3cf4faSJung-uk Kim * can be returned by the predefined names.
715ca3cf4faSJung-uk Kim *
716ca3cf4faSJung-uk Kim ******************************************************************************/
717ca3cf4faSJung-uk Kim
7189c48c75eSJung-uk Kim ACPI_STATUS
ApCheckObjectType(const char * PredefinedName,ACPI_PARSE_OBJECT * Op,UINT32 ExpectedBtypes,UINT32 PackageIndex)719ca3cf4faSJung-uk Kim ApCheckObjectType (
720efcc2a30SJung-uk Kim const char *PredefinedName,
721ca3cf4faSJung-uk Kim ACPI_PARSE_OBJECT *Op,
7229c48c75eSJung-uk Kim UINT32 ExpectedBtypes,
7239c48c75eSJung-uk Kim UINT32 PackageIndex)
724ca3cf4faSJung-uk Kim {
725ca3cf4faSJung-uk Kim UINT32 ReturnBtype;
7269c48c75eSJung-uk Kim char *TypeName;
727ca3cf4faSJung-uk Kim
728ca3cf4faSJung-uk Kim
7299c48c75eSJung-uk Kim if (!Op)
7309c48c75eSJung-uk Kim {
7319c48c75eSJung-uk Kim return (AE_TYPE);
7329c48c75eSJung-uk Kim }
7339c48c75eSJung-uk Kim
7349c48c75eSJung-uk Kim /* Map the parse opcode to a bitmapped return type (RTYPE) */
7359c48c75eSJung-uk Kim
736ca3cf4faSJung-uk Kim switch (Op->Asl.ParseOpcode)
737ca3cf4faSJung-uk Kim {
7388c8be05fSJung-uk Kim case PARSEOP_ZERO:
7398c8be05fSJung-uk Kim case PARSEOP_ONE:
7408c8be05fSJung-uk Kim case PARSEOP_ONES:
741ca3cf4faSJung-uk Kim case PARSEOP_INTEGER:
742a9d8d09cSJung-uk Kim
743ca3cf4faSJung-uk Kim ReturnBtype = ACPI_RTYPE_INTEGER;
7449c48c75eSJung-uk Kim TypeName = "Integer";
745ca3cf4faSJung-uk Kim break;
746ca3cf4faSJung-uk Kim
747ca3cf4faSJung-uk Kim case PARSEOP_STRING_LITERAL:
748a9d8d09cSJung-uk Kim
749ca3cf4faSJung-uk Kim ReturnBtype = ACPI_RTYPE_STRING;
7509c48c75eSJung-uk Kim TypeName = "String";
7519c48c75eSJung-uk Kim break;
7529c48c75eSJung-uk Kim
7539c48c75eSJung-uk Kim case PARSEOP_BUFFER:
754a9d8d09cSJung-uk Kim
7559c48c75eSJung-uk Kim ReturnBtype = ACPI_RTYPE_BUFFER;
7569c48c75eSJung-uk Kim TypeName = "Buffer";
757ca3cf4faSJung-uk Kim break;
758ca3cf4faSJung-uk Kim
759ca3cf4faSJung-uk Kim case PARSEOP_PACKAGE:
7603f0275a0SJung-uk Kim case PARSEOP_VAR_PACKAGE:
761a9d8d09cSJung-uk Kim
762ca3cf4faSJung-uk Kim ReturnBtype = ACPI_RTYPE_PACKAGE;
7639c48c75eSJung-uk Kim TypeName = "Package";
7649c48c75eSJung-uk Kim break;
7659c48c75eSJung-uk Kim
7669c48c75eSJung-uk Kim case PARSEOP_NAMESEG:
7679c48c75eSJung-uk Kim case PARSEOP_NAMESTRING:
768a9d8d09cSJung-uk Kim /*
769a9d8d09cSJung-uk Kim * Ignore any named references within a package object.
770a9d8d09cSJung-uk Kim *
771a9d8d09cSJung-uk Kim * For Package objects, references are allowed instead of any of the
772a9d8d09cSJung-uk Kim * standard data types (Integer/String/Buffer/Package). These
773a9d8d09cSJung-uk Kim * references are resolved at runtime. NAMESEG and NAMESTRING are
774a9d8d09cSJung-uk Kim * impossible to typecheck at compile time because the type of
775a9d8d09cSJung-uk Kim * any named object can be changed at runtime (for example,
776a9d8d09cSJung-uk Kim * CopyObject will change the type of the target object).
777a9d8d09cSJung-uk Kim */
778a9d8d09cSJung-uk Kim if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT)
779a9d8d09cSJung-uk Kim {
780a9d8d09cSJung-uk Kim return (AE_OK);
781a9d8d09cSJung-uk Kim }
782a9d8d09cSJung-uk Kim
7839c48c75eSJung-uk Kim ReturnBtype = ACPI_RTYPE_REFERENCE;
7849c48c75eSJung-uk Kim TypeName = "Reference";
785ca3cf4faSJung-uk Kim break;
786ca3cf4faSJung-uk Kim
787ca3cf4faSJung-uk Kim default:
788a9d8d09cSJung-uk Kim
789ca3cf4faSJung-uk Kim /* Not one of the supported object types */
790ca3cf4faSJung-uk Kim
7919c48c75eSJung-uk Kim TypeName = UtGetOpName (Op->Asl.ParseOpcode);
792ca3cf4faSJung-uk Kim goto TypeErrorExit;
793ca3cf4faSJung-uk Kim }
794ca3cf4faSJung-uk Kim
7958c8be05fSJung-uk Kim /* Exit if the object is one of the expected types */
796ca3cf4faSJung-uk Kim
797ca3cf4faSJung-uk Kim if (ReturnBtype & ExpectedBtypes)
798ca3cf4faSJung-uk Kim {
7999c48c75eSJung-uk Kim return (AE_OK);
800ca3cf4faSJung-uk Kim }
801ca3cf4faSJung-uk Kim
802ca3cf4faSJung-uk Kim
803ca3cf4faSJung-uk Kim TypeErrorExit:
804ca3cf4faSJung-uk Kim
805ca3cf4faSJung-uk Kim /* Format the expected types and emit an error message */
806ca3cf4faSJung-uk Kim
8076f1f1a63SJung-uk Kim AcpiUtGetExpectedReturnTypes (AslGbl_StringBuffer, ExpectedBtypes);
8088c8be05fSJung-uk Kim
8099c48c75eSJung-uk Kim if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
8109c48c75eSJung-uk Kim {
8116f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s: found %s, %s required",
8126f1f1a63SJung-uk Kim PredefinedName, TypeName, AslGbl_StringBuffer);
8139c48c75eSJung-uk Kim }
8149c48c75eSJung-uk Kim else
8159c48c75eSJung-uk Kim {
8166f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s: found %s at index %u, %s required",
8176f1f1a63SJung-uk Kim PredefinedName, TypeName, PackageIndex, AslGbl_StringBuffer);
8189c48c75eSJung-uk Kim }
819ca3cf4faSJung-uk Kim
8206f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Op, AslGbl_MsgBuffer);
8219c48c75eSJung-uk Kim return (AE_TYPE);
822ca3cf4faSJung-uk Kim }
823ca3cf4faSJung-uk Kim
824ca3cf4faSJung-uk Kim
825ca3cf4faSJung-uk Kim /*******************************************************************************
826ca3cf4faSJung-uk Kim *
827ca3cf4faSJung-uk Kim * FUNCTION: ApDisplayReservedNames
828ca3cf4faSJung-uk Kim *
829ca3cf4faSJung-uk Kim * PARAMETERS: None
830ca3cf4faSJung-uk Kim *
831ca3cf4faSJung-uk Kim * RETURN: None
832ca3cf4faSJung-uk Kim *
833ca3cf4faSJung-uk Kim * DESCRIPTION: Dump information about the ACPI predefined names and predefined
834ca3cf4faSJung-uk Kim * resource descriptor names.
835ca3cf4faSJung-uk Kim *
836ca3cf4faSJung-uk Kim ******************************************************************************/
837ca3cf4faSJung-uk Kim
838ca3cf4faSJung-uk Kim void
ApDisplayReservedNames(void)839ca3cf4faSJung-uk Kim ApDisplayReservedNames (
840ca3cf4faSJung-uk Kim void)
841ca3cf4faSJung-uk Kim {
842ca3cf4faSJung-uk Kim const ACPI_PREDEFINED_INFO *ThisName;
843ca3cf4faSJung-uk Kim UINT32 Count;
8449c7c683cSJung-uk Kim UINT32 NumTypes;
845ca3cf4faSJung-uk Kim
846ca3cf4faSJung-uk Kim
847ca3cf4faSJung-uk Kim /*
848ca3cf4faSJung-uk Kim * Predefined names/methods
849ca3cf4faSJung-uk Kim */
850ca3cf4faSJung-uk Kim printf ("\nPredefined Name Information\n\n");
851ca3cf4faSJung-uk Kim
852ca3cf4faSJung-uk Kim Count = 0;
8539c7c683cSJung-uk Kim ThisName = AcpiGbl_PredefinedMethods;
854ca3cf4faSJung-uk Kim while (ThisName->Info.Name[0])
855ca3cf4faSJung-uk Kim {
8566f1f1a63SJung-uk Kim AcpiUtDisplayPredefinedMethod (AslGbl_MsgBuffer, ThisName, FALSE);
857ca3cf4faSJung-uk Kim Count++;
8589c7c683cSJung-uk Kim ThisName = AcpiUtGetNextPredefinedMethod (ThisName);
859ca3cf4faSJung-uk Kim }
860ca3cf4faSJung-uk Kim
861ca3cf4faSJung-uk Kim printf ("%u Predefined Names are recognized\n", Count);
862ca3cf4faSJung-uk Kim
863ca3cf4faSJung-uk Kim /*
864ca3cf4faSJung-uk Kim * Resource Descriptor names
865ca3cf4faSJung-uk Kim */
8669c7c683cSJung-uk Kim printf ("\nPredefined Names for Resource Descriptor Fields\n\n");
867ca3cf4faSJung-uk Kim
868ca3cf4faSJung-uk Kim Count = 0;
8699c7c683cSJung-uk Kim ThisName = AcpiGbl_ResourceNames;
870ca3cf4faSJung-uk Kim while (ThisName->Info.Name[0])
871ca3cf4faSJung-uk Kim {
8726f1f1a63SJung-uk Kim NumTypes = AcpiUtGetResourceBitWidth (AslGbl_MsgBuffer,
8739c7c683cSJung-uk Kim ThisName->Info.ArgumentList);
8749c7c683cSJung-uk Kim
8759c7c683cSJung-uk Kim printf ("%4.4s Field is %s bits wide%s\n",
8766f1f1a63SJung-uk Kim ThisName->Info.Name, AslGbl_MsgBuffer,
8779c7c683cSJung-uk Kim (NumTypes > 1) ? " (depending on descriptor type)" : "");
8789c7c683cSJung-uk Kim
879ca3cf4faSJung-uk Kim Count++;
880ca3cf4faSJung-uk Kim ThisName++;
881ca3cf4faSJung-uk Kim }
882ca3cf4faSJung-uk Kim
8839c7c683cSJung-uk Kim printf ("%u Resource Descriptor Field Names are recognized\n", Count);
884ca3cf4faSJung-uk Kim
885ca3cf4faSJung-uk Kim /*
886ca3cf4faSJung-uk Kim * Predefined scope names
887ca3cf4faSJung-uk Kim */
8889c7c683cSJung-uk Kim printf ("\nPredefined Scope/Device Names (automatically created at root)\n\n");
889ca3cf4faSJung-uk Kim
8909c7c683cSJung-uk Kim ThisName = AcpiGbl_ScopeNames;
891ca3cf4faSJung-uk Kim while (ThisName->Info.Name[0])
892ca3cf4faSJung-uk Kim {
8939c7c683cSJung-uk Kim printf ("%4.4s Scope/Device\n", ThisName->Info.Name);
894ca3cf4faSJung-uk Kim ThisName++;
895ca3cf4faSJung-uk Kim }
896ca3cf4faSJung-uk Kim }
897