xref: /freebsd/sys/contrib/dev/acpica/compiler/aslpredef.c (revision f4b37ed0f8b307b1f3f0f630ca725d68f1dff30d)
1 /******************************************************************************
2  *
3  * Module Name: aslpredef - support for ACPI predefined names
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2015, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #define ACPI_CREATE_PREDEFINED_TABLE
45 #define ACPI_CREATE_RESOURCE_TABLE
46 
47 #include <contrib/dev/acpica/compiler/aslcompiler.h>
48 #include "aslcompiler.y.h"
49 #include <contrib/dev/acpica/include/acpredef.h>
50 #include <contrib/dev/acpica/include/acnamesp.h>
51 
52 
53 #define _COMPONENT          ACPI_COMPILER
54         ACPI_MODULE_NAME    ("aslpredef")
55 
56 
57 /* Local prototypes */
58 
59 static void
60 ApCheckForUnexpectedReturnValue (
61     ACPI_PARSE_OBJECT       *Op,
62     ASL_METHOD_INFO         *MethodInfo);
63 
64 static UINT32
65 ApCheckForSpecialName (
66     ACPI_PARSE_OBJECT       *Op,
67     char                    *Name);
68 
69 
70 /*******************************************************************************
71  *
72  * FUNCTION:    ApCheckForPredefinedMethod
73  *
74  * PARAMETERS:  Op              - A parse node of type "METHOD".
75  *              MethodInfo      - Saved info about this method
76  *
77  * RETURN:      None
78  *
79  * DESCRIPTION: If method is a predefined name, check that the number of
80  *              arguments and the return type (returns a value or not)
81  *              is correct.
82  *
83  ******************************************************************************/
84 
85 BOOLEAN
86 ApCheckForPredefinedMethod (
87     ACPI_PARSE_OBJECT       *Op,
88     ASL_METHOD_INFO         *MethodInfo)
89 {
90     UINT32                      Index;
91     UINT32                      RequiredArgCount;
92     const ACPI_PREDEFINED_INFO  *ThisName;
93 
94 
95     /* Check for a match against the predefined name list */
96 
97     Index = ApCheckForPredefinedName (Op, Op->Asl.NameSeg);
98 
99     switch (Index)
100     {
101     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
102     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
103     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
104 
105         /* Just return, nothing to do */
106         return (FALSE);
107 
108 
109     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
110 
111         Gbl_ReservedMethods++;
112 
113         /* NumArguments must be zero for all _Lxx/_Exx/_Wxx/_Qxx methods */
114 
115         if (MethodInfo->NumArguments != 0)
116         {
117             sprintf (MsgBuffer, "%s requires %u", Op->Asl.ExternalName, 0);
118 
119             AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
120                 MsgBuffer);
121         }
122         break;
123 
124 
125     default:
126         /*
127          * Matched a predefined method name - validate the ASL-defined
128          * argument count against the ACPI specification.
129          *
130          * Some methods are allowed to have a "minimum" number of args
131          * (_SCP) because their definition in ACPI has changed over time.
132          */
133         Gbl_ReservedMethods++;
134         ThisName = &AcpiGbl_PredefinedMethods[Index];
135         RequiredArgCount = METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList);
136 
137         if (MethodInfo->NumArguments != RequiredArgCount)
138         {
139             sprintf (MsgBuffer, "%4.4s requires %u",
140                 ThisName->Info.Name, RequiredArgCount);
141 
142             if (MethodInfo->NumArguments < RequiredArgCount)
143             {
144                 AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_LO, Op,
145                     MsgBuffer);
146             }
147             else if ((MethodInfo->NumArguments > RequiredArgCount) &&
148                 !(ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM))
149             {
150                 AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
151                     MsgBuffer);
152             }
153         }
154 
155         /*
156          * Check if method returns no value, but the predefined name is
157          * required to return a value
158          */
159         if (MethodInfo->NumReturnNoValue &&
160             ThisName->Info.ExpectedBtypes)
161         {
162             AcpiUtGetExpectedReturnTypes (StringBuffer,
163                 ThisName->Info.ExpectedBtypes);
164 
165             sprintf (MsgBuffer, "%s required for %4.4s",
166                 StringBuffer, ThisName->Info.Name);
167 
168             AslError (ASL_WARNING, ASL_MSG_RESERVED_RETURN_VALUE, Op,
169                 MsgBuffer);
170         }
171         break;
172     }
173 
174     return (TRUE);
175 }
176 
177 
178 /*******************************************************************************
179  *
180  * FUNCTION:    ApCheckForUnexpectedReturnValue
181  *
182  * PARAMETERS:  Op              - A parse node of type "RETURN".
183  *              MethodInfo      - Saved info about this method
184  *
185  * RETURN:      None
186  *
187  * DESCRIPTION: Check for an unexpected return value from a predefined method.
188  *              Invoked for predefined methods that are defined to not return
189  *              any value. If there is a return value, issue a remark, since
190  *              the ASL writer may be confused as to the method definition
191  *              and/or functionality.
192  *
193  * Note: We ignore all return values of "Zero", since this is what a standalone
194  *       Return() statement will always generate -- so we ignore it here --
195  *       i.e., there is no difference between Return() and Return(Zero).
196  *       Also, a null Return() will be disassembled to return(Zero) -- so, we
197  *       don't want to generate extraneous remarks/warnings for a disassembled
198  *       ASL file.
199  *
200  ******************************************************************************/
201 
202 static void
203 ApCheckForUnexpectedReturnValue (
204     ACPI_PARSE_OBJECT       *Op,
205     ASL_METHOD_INFO         *MethodInfo)
206 {
207     ACPI_PARSE_OBJECT       *ReturnValueOp;
208 
209 
210     /* Ignore Return() and Return(Zero) (they are the same) */
211 
212     ReturnValueOp = Op->Asl.Child;
213     if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_ZERO)
214     {
215         return;
216     }
217 
218     /* We have a valid return value, but the reserved name did not expect it */
219 
220     AslError (ASL_WARNING, ASL_MSG_RESERVED_NO_RETURN_VAL,
221         Op, MethodInfo->Op->Asl.ExternalName);
222 }
223 
224 
225 /*******************************************************************************
226  *
227  * FUNCTION:    ApCheckPredefinedReturnValue
228  *
229  * PARAMETERS:  Op              - A parse node of type "RETURN".
230  *              MethodInfo      - Saved info about this method
231  *
232  * RETURN:      None
233  *
234  * DESCRIPTION: If method is a predefined name, attempt to validate the return
235  *              value. Only "static" types can be validated - a simple return
236  *              of an integer/string/buffer/package or a named reference to
237  *              a static object. Values such as a Localx or Argx or a control
238  *              method invocation are not checked. Issue a warning if there is
239  *              a valid return value, but the reserved method defines no
240  *              return value.
241  *
242  ******************************************************************************/
243 
244 void
245 ApCheckPredefinedReturnValue (
246     ACPI_PARSE_OBJECT       *Op,
247     ASL_METHOD_INFO         *MethodInfo)
248 {
249     UINT32                      Index;
250     ACPI_PARSE_OBJECT           *ReturnValueOp;
251     const ACPI_PREDEFINED_INFO  *ThisName;
252 
253 
254     /*
255      * Check parent method for a match against the predefined name list.
256      *
257      * Note: Disable compiler errors/warnings because any errors will be
258      * caught when analyzing the parent method. Eliminates duplicate errors.
259      */
260     Gbl_AllExceptionsDisabled = TRUE;
261     Index = ApCheckForPredefinedName (MethodInfo->Op,
262                 MethodInfo->Op->Asl.NameSeg);
263     Gbl_AllExceptionsDisabled = FALSE;
264 
265     switch (Index)
266     {
267     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
268 
269         /* No return value expected, warn if there is one */
270 
271         ApCheckForUnexpectedReturnValue (Op, MethodInfo);
272         return;
273 
274     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
275     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
276     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
277 
278         /* Just return, nothing to do */
279         return;
280 
281     default: /* A standard predefined ACPI name */
282 
283         ThisName = &AcpiGbl_PredefinedMethods[Index];
284         if (!ThisName->Info.ExpectedBtypes)
285         {
286             /* No return value expected, warn if there is one */
287 
288             ApCheckForUnexpectedReturnValue (Op, MethodInfo);
289             return;
290         }
291 
292         /* Get the object returned, it is the next argument */
293 
294         ReturnValueOp = Op->Asl.Child;
295         switch (ReturnValueOp->Asl.ParseOpcode)
296         {
297         case PARSEOP_ZERO:
298         case PARSEOP_ONE:
299         case PARSEOP_ONES:
300         case PARSEOP_INTEGER:
301         case PARSEOP_STRING_LITERAL:
302         case PARSEOP_BUFFER:
303         case PARSEOP_PACKAGE:
304 
305             /* Static data return object - check against expected type */
306 
307             ApCheckObjectType (ThisName->Info.Name, ReturnValueOp,
308                 ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
309 
310             /* For packages, check the individual package elements */
311 
312             if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
313             {
314                 ApCheckPackage (ReturnValueOp, ThisName);
315             }
316             break;
317 
318         default:
319             /*
320              * All other ops are very difficult or impossible to typecheck at
321              * compile time. These include all Localx, Argx, and method
322              * invocations. Also, NAMESEG and NAMESTRING because the type of
323              * any named object can be changed at runtime (for example,
324              * CopyObject will change the type of the target object.)
325              */
326             break;
327         }
328     }
329 }
330 
331 
332 /*******************************************************************************
333  *
334  * FUNCTION:    ApCheckForPredefinedObject
335  *
336  * PARAMETERS:  Op              - A parse node
337  *              Name            - The ACPI name to be checked
338  *
339  * RETURN:      None
340  *
341  * DESCRIPTION: Check for a predefined name for a static object (created via
342  *              the ASL Name operator). If it is a predefined ACPI name, ensure
343  *              that the name does not require any arguments (which would
344  *              require a control method implemenation of the name), and that
345  *              the type of the object is one of the expected types for the
346  *              predefined name.
347  *
348  ******************************************************************************/
349 
350 void
351 ApCheckForPredefinedObject (
352     ACPI_PARSE_OBJECT       *Op,
353     char                    *Name)
354 {
355     UINT32                      Index;
356     ACPI_PARSE_OBJECT           *ObjectOp;
357     const ACPI_PREDEFINED_INFO  *ThisName;
358 
359 
360     /*
361      * Check for a real predefined name -- not a resource descriptor name
362      * or a predefined scope name
363      */
364     Index = ApCheckForPredefinedName (Op, Name);
365 
366     switch (Index)
367     {
368     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
369     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
370     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
371 
372         /* Nothing to do */
373         return;
374 
375     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
376 
377         /*
378          * These names must be control methods, by definition in ACPI spec.
379          * Also because they are defined to return no value. None of them
380          * require any arguments.
381          */
382         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
383             "with zero arguments");
384         return;
385 
386     default:
387 
388         break;
389     }
390 
391     /* A standard predefined ACPI name */
392 
393     /*
394      * If this predefined name requires input arguments, then
395      * it must be implemented as a control method
396      */
397     ThisName = &AcpiGbl_PredefinedMethods[Index];
398     if (METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList) > 0)
399     {
400         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
401             "with arguments");
402         return;
403     }
404 
405     /*
406      * If no return value is expected from this predefined name, then
407      * it follows that it must be implemented as a control method
408      * (with zero args, because the args > 0 case was handled above)
409      * Examples are: _DIS, _INI, _IRC, _OFF, _ON, _PSx
410      */
411     if (!ThisName->Info.ExpectedBtypes)
412     {
413         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
414             "with zero arguments");
415         return;
416     }
417 
418     /* Typecheck the actual object, it is the next argument */
419 
420     ObjectOp = Op->Asl.Child->Asl.Next;
421     ApCheckObjectType (ThisName->Info.Name, Op->Asl.Child->Asl.Next,
422         ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
423 
424     /* For packages, check the individual package elements */
425 
426     if (ObjectOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
427     {
428         ApCheckPackage (ObjectOp, ThisName);
429     }
430 }
431 
432 
433 /*******************************************************************************
434  *
435  * FUNCTION:    ApCheckForPredefinedName
436  *
437  * PARAMETERS:  Op              - A parse node
438  *              Name            - NameSeg to check
439  *
440  * RETURN:      None
441  *
442  * DESCRIPTION: Check a NameSeg against the reserved list.
443  *
444  ******************************************************************************/
445 
446 UINT32
447 ApCheckForPredefinedName (
448     ACPI_PARSE_OBJECT       *Op,
449     char                    *Name)
450 {
451     UINT32                      i;
452     const ACPI_PREDEFINED_INFO  *ThisName;
453 
454 
455     if (Name[0] == 0)
456     {
457         AcpiOsPrintf ("Found a null name, external = %s\n",
458             Op->Asl.ExternalName);
459     }
460 
461     /* All reserved names are prefixed with a single underscore */
462 
463     if (Name[0] != '_')
464     {
465         return (ACPI_NOT_RESERVED_NAME);
466     }
467 
468     /* Check for a standard predefined method name */
469 
470     ThisName = AcpiGbl_PredefinedMethods;
471     for (i = 0; ThisName->Info.Name[0]; i++)
472     {
473         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
474         {
475             /* Return index into predefined array */
476             return (i);
477         }
478 
479         ThisName++; /* Does not account for extra package data, but is OK */
480     }
481 
482     /* Check for resource names and predefined scope names */
483 
484     ThisName = AcpiGbl_ResourceNames;
485     while (ThisName->Info.Name[0])
486     {
487         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
488         {
489             return (ACPI_PREDEFINED_NAME);
490         }
491 
492         ThisName++;
493     }
494 
495     ThisName = AcpiGbl_ScopeNames;
496     while (ThisName->Info.Name[0])
497     {
498         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
499         {
500             return (ACPI_PREDEFINED_NAME);
501         }
502 
503         ThisName++;
504     }
505 
506     /* Check for _Lxx/_Exx/_Wxx/_Qxx/_T_x. Warning if unknown predefined name */
507 
508     return (ApCheckForSpecialName (Op, Name));
509 }
510 
511 
512 /*******************************************************************************
513  *
514  * FUNCTION:    ApCheckForSpecialName
515  *
516  * PARAMETERS:  Op              - A parse node
517  *              Name            - NameSeg to check
518  *
519  * RETURN:      None
520  *
521  * DESCRIPTION: Check for the "special" predefined names -
522  *              _Lxx, _Exx, _Qxx, _Wxx, and _T_x
523  *
524  ******************************************************************************/
525 
526 static UINT32
527 ApCheckForSpecialName (
528     ACPI_PARSE_OBJECT       *Op,
529     char                    *Name)
530 {
531 
532     /*
533      * Check for the "special" predefined names. We already know that the
534      * first character is an underscore.
535      *   GPE:  _Lxx
536      *   GPE:  _Exx
537      *   GPE:  _Wxx
538      *   EC:   _Qxx
539      */
540     if ((Name[1] == 'L') ||
541         (Name[1] == 'E') ||
542         (Name[1] == 'W') ||
543         (Name[1] == 'Q'))
544     {
545         /* The next two characters must be hex digits */
546 
547         if ((isxdigit ((int) Name[2])) &&
548             (isxdigit ((int) Name[3])))
549         {
550             return (ACPI_EVENT_RESERVED_NAME);
551         }
552     }
553 
554     /* Check for the names reserved for the compiler itself: _T_x */
555 
556     else if ((Op->Asl.ExternalName[1] == 'T') &&
557              (Op->Asl.ExternalName[2] == '_'))
558     {
559         /* Ignore if actually emitted by the compiler */
560 
561         if (Op->Asl.CompileFlags & NODE_COMPILER_EMITTED)
562         {
563             return (ACPI_NOT_RESERVED_NAME);
564         }
565 
566         /*
567          * Was not actually emitted by the compiler. This is a special case,
568          * however. If the ASL code being compiled was the result of a
569          * dissasembly, it may possibly contain valid compiler-emitted names
570          * of the form "_T_x". We don't want to issue an error or even a
571          * warning and force the user to manually change the names. So, we
572          * will issue a remark instead.
573          */
574         AslError (ASL_REMARK, ASL_MSG_COMPILER_RESERVED, Op, Op->Asl.ExternalName);
575         return (ACPI_COMPILER_RESERVED_NAME);
576     }
577 
578     /*
579      * The name didn't match any of the known predefined names. Flag it as a
580      * warning, since the entire namespace starting with an underscore is
581      * reserved by the ACPI spec.
582      */
583     AslError (ASL_WARNING, ASL_MSG_UNKNOWN_RESERVED_NAME, Op,
584         Op->Asl.ExternalName);
585 
586     return (ACPI_NOT_RESERVED_NAME);
587 }
588 
589 
590 /*******************************************************************************
591  *
592  * FUNCTION:    ApCheckObjectType
593  *
594  * PARAMETERS:  PredefinedName  - Name of the predefined object we are checking
595  *              Op              - Current parse node
596  *              ExpectedBtypes  - Bitmap of expected return type(s)
597  *              PackageIndex    - Index of object within parent package (if
598  *                                applicable - ACPI_NOT_PACKAGE_ELEMENT
599  *                                otherwise)
600  *
601  * RETURN:      None
602  *
603  * DESCRIPTION: Check if the object type is one of the types that is expected
604  *              by the predefined name. Only a limited number of object types
605  *              can be returned by the predefined names.
606  *
607  ******************************************************************************/
608 
609 ACPI_STATUS
610 ApCheckObjectType (
611     const char              *PredefinedName,
612     ACPI_PARSE_OBJECT       *Op,
613     UINT32                  ExpectedBtypes,
614     UINT32                  PackageIndex)
615 {
616     UINT32                  ReturnBtype;
617     char                    *TypeName;
618 
619 
620     if (!Op)
621     {
622         return (AE_TYPE);
623     }
624 
625     /* Map the parse opcode to a bitmapped return type (RTYPE) */
626 
627     switch (Op->Asl.ParseOpcode)
628     {
629     case PARSEOP_ZERO:
630     case PARSEOP_ONE:
631     case PARSEOP_ONES:
632     case PARSEOP_INTEGER:
633 
634         ReturnBtype = ACPI_RTYPE_INTEGER;
635         TypeName = "Integer";
636         break;
637 
638     case PARSEOP_STRING_LITERAL:
639 
640         ReturnBtype = ACPI_RTYPE_STRING;
641         TypeName = "String";
642         break;
643 
644     case PARSEOP_BUFFER:
645 
646         ReturnBtype = ACPI_RTYPE_BUFFER;
647         TypeName = "Buffer";
648         break;
649 
650     case PARSEOP_PACKAGE:
651     case PARSEOP_VAR_PACKAGE:
652 
653         ReturnBtype = ACPI_RTYPE_PACKAGE;
654         TypeName = "Package";
655         break;
656 
657     case PARSEOP_NAMESEG:
658     case PARSEOP_NAMESTRING:
659         /*
660          * Ignore any named references within a package object.
661          *
662          * For Package objects, references are allowed instead of any of the
663          * standard data types (Integer/String/Buffer/Package). These
664          * references are resolved at runtime. NAMESEG and NAMESTRING are
665          * impossible to typecheck at compile time because the type of
666          * any named object can be changed at runtime (for example,
667          * CopyObject will change the type of the target object).
668          */
669         if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT)
670         {
671             return (AE_OK);
672         }
673 
674         ReturnBtype = ACPI_RTYPE_REFERENCE;
675         TypeName = "Reference";
676         break;
677 
678     default:
679 
680         /* Not one of the supported object types */
681 
682         TypeName = UtGetOpName (Op->Asl.ParseOpcode);
683         goto TypeErrorExit;
684     }
685 
686     /* Exit if the object is one of the expected types */
687 
688     if (ReturnBtype & ExpectedBtypes)
689     {
690         return (AE_OK);
691     }
692 
693 
694 TypeErrorExit:
695 
696     /* Format the expected types and emit an error message */
697 
698     AcpiUtGetExpectedReturnTypes (StringBuffer, ExpectedBtypes);
699 
700     if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
701     {
702         sprintf (MsgBuffer, "%4.4s: found %s, %s required",
703             PredefinedName, TypeName, StringBuffer);
704     }
705     else
706     {
707         sprintf (MsgBuffer, "%4.4s: found %s at index %u, %s required",
708             PredefinedName, TypeName, PackageIndex, StringBuffer);
709     }
710 
711     AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Op, MsgBuffer);
712     return (AE_TYPE);
713 }
714 
715 
716 /*******************************************************************************
717  *
718  * FUNCTION:    ApDisplayReservedNames
719  *
720  * PARAMETERS:  None
721  *
722  * RETURN:      None
723  *
724  * DESCRIPTION: Dump information about the ACPI predefined names and predefined
725  *              resource descriptor names.
726  *
727  ******************************************************************************/
728 
729 void
730 ApDisplayReservedNames (
731     void)
732 {
733     const ACPI_PREDEFINED_INFO  *ThisName;
734     UINT32                      Count;
735     UINT32                      NumTypes;
736 
737 
738     /*
739      * Predefined names/methods
740      */
741     printf ("\nPredefined Name Information\n\n");
742 
743     Count = 0;
744     ThisName = AcpiGbl_PredefinedMethods;
745     while (ThisName->Info.Name[0])
746     {
747         AcpiUtDisplayPredefinedMethod (MsgBuffer, ThisName, FALSE);
748         Count++;
749         ThisName = AcpiUtGetNextPredefinedMethod (ThisName);
750     }
751 
752     printf ("%u Predefined Names are recognized\n", Count);
753 
754     /*
755      * Resource Descriptor names
756      */
757     printf ("\nPredefined Names for Resource Descriptor Fields\n\n");
758 
759     Count = 0;
760     ThisName = AcpiGbl_ResourceNames;
761     while (ThisName->Info.Name[0])
762     {
763         NumTypes = AcpiUtGetResourceBitWidth (MsgBuffer,
764             ThisName->Info.ArgumentList);
765 
766         printf ("%4.4s    Field is %s bits wide%s\n",
767             ThisName->Info.Name, MsgBuffer,
768             (NumTypes > 1) ? " (depending on descriptor type)" : "");
769 
770         Count++;
771         ThisName++;
772     }
773 
774     printf ("%u Resource Descriptor Field Names are recognized\n", Count);
775 
776     /*
777      * Predefined scope names
778      */
779     printf ("\nPredefined Scope/Device Names (automatically created at root)\n\n");
780 
781     ThisName = AcpiGbl_ScopeNames;
782     while (ThisName->Info.Name[0])
783     {
784         printf ("%4.4s    Scope/Device\n", ThisName->Info.Name);
785         ThisName++;
786     }
787 }
788