1 /******************************************************************************
   2  *
   3  * Module Name: aslpredef - support for ACPI predefined names
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, 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 "aslcompiler.h"
  48 #include "aslcompiler.y.h"
  49 #include "acpredef.h"
  50 #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     /* Check parent method for a match against the predefined name list */
 255 
 256     Index = ApCheckForPredefinedName (MethodInfo->Op,
 257                 MethodInfo->Op->Asl.NameSeg);
 258 
 259     switch (Index)
 260     {
 261     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
 262 
 263         /* No return value expected, warn if there is one */
 264 
 265         ApCheckForUnexpectedReturnValue (Op, MethodInfo);
 266         return;
 267 
 268     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
 269     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
 270     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
 271 
 272         /* Just return, nothing to do */
 273         return;
 274 
 275     default: /* A standard predefined ACPI name */
 276 
 277         ThisName = &AcpiGbl_PredefinedMethods[Index];
 278         if (!ThisName->Info.ExpectedBtypes)
 279         {
 280             /* No return value expected, warn if there is one */
 281 
 282             ApCheckForUnexpectedReturnValue (Op, MethodInfo);
 283             return;
 284         }
 285 
 286         /* Get the object returned, it is the next argument */
 287 
 288         ReturnValueOp = Op->Asl.Child;
 289         switch (ReturnValueOp->Asl.ParseOpcode)
 290         {
 291         case PARSEOP_ZERO:
 292         case PARSEOP_ONE:
 293         case PARSEOP_ONES:
 294         case PARSEOP_INTEGER:
 295         case PARSEOP_STRING_LITERAL:
 296         case PARSEOP_BUFFER:
 297         case PARSEOP_PACKAGE:
 298 
 299             /* Static data return object - check against expected type */
 300 
 301             ApCheckObjectType (ThisName->Info.Name, ReturnValueOp,
 302                 ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
 303 
 304             /* For packages, check the individual package elements */
 305 
 306             if (ReturnValueOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
 307             {
 308                 ApCheckPackage (ReturnValueOp, ThisName);
 309             }
 310             break;
 311 
 312         default:
 313             /*
 314              * All other ops are very difficult or impossible to typecheck at
 315              * compile time. These include all Localx, Argx, and method
 316              * invocations. Also, NAMESEG and NAMESTRING because the type of
 317              * any named object can be changed at runtime (for example,
 318              * CopyObject will change the type of the target object.)
 319              */
 320             break;
 321         }
 322     }
 323 }
 324 
 325 
 326 /*******************************************************************************
 327  *
 328  * FUNCTION:    ApCheckForPredefinedObject
 329  *
 330  * PARAMETERS:  Op              - A parse node
 331  *              Name            - The ACPI name to be checked
 332  *
 333  * RETURN:      None
 334  *
 335  * DESCRIPTION: Check for a predefined name for a static object (created via
 336  *              the ASL Name operator). If it is a predefined ACPI name, ensure
 337  *              that the name does not require any arguments (which would
 338  *              require a control method implemenation of the name), and that
 339  *              the type of the object is one of the expected types for the
 340  *              predefined name.
 341  *
 342  ******************************************************************************/
 343 
 344 void
 345 ApCheckForPredefinedObject (
 346     ACPI_PARSE_OBJECT       *Op,
 347     char                    *Name)
 348 {
 349     UINT32                      Index;
 350     ACPI_PARSE_OBJECT           *ObjectOp;
 351     const ACPI_PREDEFINED_INFO  *ThisName;
 352 
 353 
 354     /*
 355      * Check for a real predefined name -- not a resource descriptor name
 356      * or a predefined scope name
 357      */
 358     Index = ApCheckForPredefinedName (Op, Name);
 359 
 360     switch (Index)
 361     {
 362     case ACPI_NOT_RESERVED_NAME:        /* No underscore or _Txx or _xxx name not matched */
 363     case ACPI_PREDEFINED_NAME:          /* Resource Name or reserved scope name */
 364     case ACPI_COMPILER_RESERVED_NAME:   /* A _Txx that was not emitted by compiler */
 365 
 366         /* Nothing to do */
 367         return;
 368 
 369     case ACPI_EVENT_RESERVED_NAME:      /* _Lxx/_Exx/_Wxx/_Qxx methods */
 370 
 371         /*
 372          * These names must be control methods, by definition in ACPI spec.
 373          * Also because they are defined to return no value. None of them
 374          * require any arguments.
 375          */
 376         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
 377             "with zero arguments");
 378         return;
 379 
 380     default:
 381 
 382         break;
 383     }
 384 
 385     /* A standard predefined ACPI name */
 386 
 387     /*
 388      * If this predefined name requires input arguments, then
 389      * it must be implemented as a control method
 390      */
 391     ThisName = &AcpiGbl_PredefinedMethods[Index];
 392     if (METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList) > 0)
 393     {
 394         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
 395             "with arguments");
 396         return;
 397     }
 398 
 399     /*
 400      * If no return value is expected from this predefined name, then
 401      * it follows that it must be implemented as a control method
 402      * (with zero args, because the args > 0 case was handled above)
 403      * Examples are: _DIS, _INI, _IRC, _OFF, _ON, _PSx
 404      */
 405     if (!ThisName->Info.ExpectedBtypes)
 406     {
 407         AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
 408             "with zero arguments");
 409         return;
 410     }
 411 
 412     /* Typecheck the actual object, it is the next argument */
 413 
 414     ObjectOp = Op->Asl.Child->Asl.Next;
 415     ApCheckObjectType (ThisName->Info.Name, Op->Asl.Child->Asl.Next,
 416         ThisName->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT);
 417 
 418     /* For packages, check the individual package elements */
 419 
 420     if (ObjectOp->Asl.ParseOpcode == PARSEOP_PACKAGE)
 421     {
 422         ApCheckPackage (ObjectOp, ThisName);
 423     }
 424 }
 425 
 426 
 427 /*******************************************************************************
 428  *
 429  * FUNCTION:    ApCheckForPredefinedName
 430  *
 431  * PARAMETERS:  Op              - A parse node
 432  *              Name            - NameSeg to check
 433  *
 434  * RETURN:      None
 435  *
 436  * DESCRIPTION: Check a NameSeg against the reserved list.
 437  *
 438  ******************************************************************************/
 439 
 440 UINT32
 441 ApCheckForPredefinedName (
 442     ACPI_PARSE_OBJECT       *Op,
 443     char                    *Name)
 444 {
 445     UINT32                      i;
 446     const ACPI_PREDEFINED_INFO  *ThisName;
 447 
 448 
 449     if (Name[0] == 0)
 450     {
 451         AcpiOsPrintf ("Found a null name, external = %s\n",
 452             Op->Asl.ExternalName);
 453     }
 454 
 455     /* All reserved names are prefixed with a single underscore */
 456 
 457     if (Name[0] != '_')
 458     {
 459         return (ACPI_NOT_RESERVED_NAME);
 460     }
 461 
 462     /* Check for a standard predefined method name */
 463 
 464     ThisName = AcpiGbl_PredefinedMethods;
 465     for (i = 0; ThisName->Info.Name[0]; i++)
 466     {
 467         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
 468         {
 469             /* Return index into predefined array */
 470             return (i);
 471         }
 472 
 473         ThisName++; /* Does not account for extra package data, but is OK */
 474     }
 475 
 476     /* Check for resource names and predefined scope names */
 477 
 478     ThisName = AcpiGbl_ResourceNames;
 479     while (ThisName->Info.Name[0])
 480     {
 481         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
 482         {
 483             return (ACPI_PREDEFINED_NAME);
 484         }
 485 
 486         ThisName++;
 487     }
 488 
 489     ThisName = AcpiGbl_ScopeNames;
 490     while (ThisName->Info.Name[0])
 491     {
 492         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
 493         {
 494             return (ACPI_PREDEFINED_NAME);
 495         }
 496 
 497         ThisName++;
 498     }
 499 
 500     /* Check for _Lxx/_Exx/_Wxx/_Qxx/_T_x. Warning if unknown predefined name */
 501 
 502     return (ApCheckForSpecialName (Op, Name));
 503 }
 504 
 505 
 506 /*******************************************************************************
 507  *
 508  * FUNCTION:    ApCheckForSpecialName
 509  *
 510  * PARAMETERS:  Op              - A parse node
 511  *              Name            - NameSeg to check
 512  *
 513  * RETURN:      None
 514  *
 515  * DESCRIPTION: Check for the "special" predefined names -
 516  *              _Lxx, _Exx, _Qxx, _Wxx, and _T_x
 517  *
 518  ******************************************************************************/
 519 
 520 static UINT32
 521 ApCheckForSpecialName (
 522     ACPI_PARSE_OBJECT       *Op,
 523     char                    *Name)
 524 {
 525 
 526     /*
 527      * Check for the "special" predefined names. We already know that the
 528      * first character is an underscore.
 529      *   GPE:  _Lxx
 530      *   GPE:  _Exx
 531      *   GPE:  _Wxx
 532      *   EC:   _Qxx
 533      */
 534     if ((Name[1] == 'L') ||
 535         (Name[1] == 'E') ||
 536         (Name[1] == 'W') ||
 537         (Name[1] == 'Q'))
 538     {
 539         /* The next two characters must be hex digits */
 540 
 541         if ((isxdigit ((int) Name[2])) &&
 542             (isxdigit ((int) Name[3])))
 543         {
 544             return (ACPI_EVENT_RESERVED_NAME);
 545         }
 546     }
 547 
 548     /* Check for the names reserved for the compiler itself: _T_x */
 549 
 550     else if ((Op->Asl.ExternalName[1] == 'T') &&
 551              (Op->Asl.ExternalName[2] == '_'))
 552     {
 553         /* Ignore if actually emitted by the compiler */
 554 
 555         if (Op->Asl.CompileFlags & NODE_COMPILER_EMITTED)
 556         {
 557             return (ACPI_NOT_RESERVED_NAME);
 558         }
 559 
 560         /*
 561          * Was not actually emitted by the compiler. This is a special case,
 562          * however. If the ASL code being compiled was the result of a
 563          * dissasembly, it may possibly contain valid compiler-emitted names
 564          * of the form "_T_x". We don't want to issue an error or even a
 565          * warning and force the user to manually change the names. So, we
 566          * will issue a remark instead.
 567          */
 568         AslError (ASL_REMARK, ASL_MSG_COMPILER_RESERVED, Op, Op->Asl.ExternalName);
 569         return (ACPI_COMPILER_RESERVED_NAME);
 570     }
 571 
 572     /*
 573      * The name didn't match any of the known predefined names. Flag it as a
 574      * warning, since the entire namespace starting with an underscore is
 575      * reserved by the ACPI spec.
 576      */
 577     AslError (ASL_WARNING, ASL_MSG_UNKNOWN_RESERVED_NAME, Op,
 578         Op->Asl.ExternalName);
 579 
 580     return (ACPI_NOT_RESERVED_NAME);
 581 }
 582 
 583 
 584 /*******************************************************************************
 585  *
 586  * FUNCTION:    ApCheckObjectType
 587  *
 588  * PARAMETERS:  PredefinedName  - Name of the predefined object we are checking
 589  *              Op              - Current parse node
 590  *              ExpectedBtypes  - Bitmap of expected return type(s)
 591  *              PackageIndex    - Index of object within parent package (if
 592  *                                applicable - ACPI_NOT_PACKAGE_ELEMENT
 593  *                                otherwise)
 594  *
 595  * RETURN:      None
 596  *
 597  * DESCRIPTION: Check if the object type is one of the types that is expected
 598  *              by the predefined name. Only a limited number of object types
 599  *              can be returned by the predefined names.
 600  *
 601  ******************************************************************************/
 602 
 603 ACPI_STATUS
 604 ApCheckObjectType (
 605     const char              *PredefinedName,
 606     ACPI_PARSE_OBJECT       *Op,
 607     UINT32                  ExpectedBtypes,
 608     UINT32                  PackageIndex)
 609 {
 610     UINT32                  ReturnBtype;
 611     char                    *TypeName;
 612 
 613 
 614     if (!Op)
 615     {
 616         return (AE_TYPE);
 617     }
 618 
 619     /* Map the parse opcode to a bitmapped return type (RTYPE) */
 620 
 621     switch (Op->Asl.ParseOpcode)
 622     {
 623     case PARSEOP_ZERO:
 624     case PARSEOP_ONE:
 625     case PARSEOP_ONES:
 626     case PARSEOP_INTEGER:
 627 
 628         ReturnBtype = ACPI_RTYPE_INTEGER;
 629         TypeName = "Integer";
 630         break;
 631 
 632     case PARSEOP_STRING_LITERAL:
 633 
 634         ReturnBtype = ACPI_RTYPE_STRING;
 635         TypeName = "String";
 636         break;
 637 
 638     case PARSEOP_BUFFER:
 639 
 640         ReturnBtype = ACPI_RTYPE_BUFFER;
 641         TypeName = "Buffer";
 642         break;
 643 
 644     case PARSEOP_PACKAGE:
 645     case PARSEOP_VAR_PACKAGE:
 646 
 647         ReturnBtype = ACPI_RTYPE_PACKAGE;
 648         TypeName = "Package";
 649         break;
 650 
 651     case PARSEOP_NAMESEG:
 652     case PARSEOP_NAMESTRING:
 653         /*
 654          * Ignore any named references within a package object.
 655          *
 656          * For Package objects, references are allowed instead of any of the
 657          * standard data types (Integer/String/Buffer/Package). These
 658          * references are resolved at runtime. NAMESEG and NAMESTRING are
 659          * impossible to typecheck at compile time because the type of
 660          * any named object can be changed at runtime (for example,
 661          * CopyObject will change the type of the target object).
 662          */
 663         if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT)
 664         {
 665             return (AE_OK);
 666         }
 667 
 668         ReturnBtype = ACPI_RTYPE_REFERENCE;
 669         TypeName = "Reference";
 670         break;
 671 
 672     default:
 673 
 674         /* Not one of the supported object types */
 675 
 676         TypeName = UtGetOpName (Op->Asl.ParseOpcode);
 677         goto TypeErrorExit;
 678     }
 679 
 680     /* Exit if the object is one of the expected types */
 681 
 682     if (ReturnBtype & ExpectedBtypes)
 683     {
 684         return (AE_OK);
 685     }
 686 
 687 
 688 TypeErrorExit:
 689 
 690     /* Format the expected types and emit an error message */
 691 
 692     AcpiUtGetExpectedReturnTypes (StringBuffer, ExpectedBtypes);
 693 
 694     if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
 695     {
 696         sprintf (MsgBuffer, "%4.4s: found %s, %s required",
 697             PredefinedName, TypeName, StringBuffer);
 698     }
 699     else
 700     {
 701         sprintf (MsgBuffer, "%4.4s: found %s at index %u, %s required",
 702             PredefinedName, TypeName, PackageIndex, StringBuffer);
 703     }
 704 
 705     AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Op, MsgBuffer);
 706     return (AE_TYPE);
 707 }
 708 
 709 
 710 /*******************************************************************************
 711  *
 712  * FUNCTION:    ApDisplayReservedNames
 713  *
 714  * PARAMETERS:  None
 715  *
 716  * RETURN:      None
 717  *
 718  * DESCRIPTION: Dump information about the ACPI predefined names and predefined
 719  *              resource descriptor names.
 720  *
 721  ******************************************************************************/
 722 
 723 void
 724 ApDisplayReservedNames (
 725     void)
 726 {
 727     const ACPI_PREDEFINED_INFO  *ThisName;
 728     UINT32                      Count;
 729     UINT32                      NumTypes;
 730 
 731 
 732     /*
 733      * Predefined names/methods
 734      */
 735     printf ("\nPredefined Name Information\n\n");
 736 
 737     Count = 0;
 738     ThisName = AcpiGbl_PredefinedMethods;
 739     while (ThisName->Info.Name[0])
 740     {
 741         AcpiUtDisplayPredefinedMethod (MsgBuffer, ThisName, FALSE);
 742         Count++;
 743         ThisName = AcpiUtGetNextPredefinedMethod (ThisName);
 744     }
 745 
 746     printf ("%u Predefined Names are recognized\n", Count);
 747 
 748     /*
 749      * Resource Descriptor names
 750      */
 751     printf ("\nPredefined Names for Resource Descriptor Fields\n\n");
 752 
 753     Count = 0;
 754     ThisName = AcpiGbl_ResourceNames;
 755     while (ThisName->Info.Name[0])
 756     {
 757         NumTypes = AcpiUtGetResourceBitWidth (MsgBuffer,
 758             ThisName->Info.ArgumentList);
 759 
 760         printf ("%4.4s    Field is %s bits wide%s\n",
 761             ThisName->Info.Name, MsgBuffer,
 762             (NumTypes > 1) ? " (depending on descriptor type)" : "");
 763 
 764         Count++;
 765         ThisName++;
 766     }
 767 
 768     printf ("%u Resource Descriptor Field Names are recognized\n", Count);
 769 
 770     /*
 771      * Predefined scope names
 772      */
 773     printf ("\nPredefined Scope/Device Names (automatically created at root)\n\n");
 774 
 775     ThisName = AcpiGbl_ScopeNames;
 776     while (ThisName->Info.Name[0])
 777     {
 778         printf ("%4.4s    Scope/Device\n", ThisName->Info.Name);
 779         ThisName++;
 780     }
 781 }