linux/drivers/acpi/acpica/exresop.c
<<
>>
Prefs
   1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2/******************************************************************************
   3 *
   4 * Module Name: exresop - AML Interpreter operand/object resolution
   5 *
   6 * Copyright (C) 2000 - 2020, Intel Corp.
   7 *
   8 *****************************************************************************/
   9
  10#include <acpi/acpi.h>
  11#include "accommon.h"
  12#include "amlcode.h"
  13#include "acparser.h"
  14#include "acinterp.h"
  15#include "acnamesp.h"
  16
  17#define _COMPONENT          ACPI_EXECUTER
  18ACPI_MODULE_NAME("exresop")
  19
  20/* Local prototypes */
  21static acpi_status
  22acpi_ex_check_object_type(acpi_object_type type_needed,
  23                          acpi_object_type this_type, void *object);
  24
  25/*******************************************************************************
  26 *
  27 * FUNCTION:    acpi_ex_check_object_type
  28 *
  29 * PARAMETERS:  type_needed         Object type needed
  30 *              this_type           Actual object type
  31 *              Object              Object pointer
  32 *
  33 * RETURN:      Status
  34 *
  35 * DESCRIPTION: Check required type against actual type
  36 *
  37 ******************************************************************************/
  38
  39static acpi_status
  40acpi_ex_check_object_type(acpi_object_type type_needed,
  41                          acpi_object_type this_type, void *object)
  42{
  43        ACPI_FUNCTION_ENTRY();
  44
  45        if (type_needed == ACPI_TYPE_ANY) {
  46
  47                /* All types OK, so we don't perform any typechecks */
  48
  49                return (AE_OK);
  50        }
  51
  52        if (type_needed == ACPI_TYPE_LOCAL_REFERENCE) {
  53                /*
  54                 * Allow the AML "Constant" opcodes (Zero, One, etc.) to be reference
  55                 * objects and thus allow them to be targets. (As per the ACPI
  56                 * specification, a store to a constant is a noop.)
  57                 */
  58                if ((this_type == ACPI_TYPE_INTEGER) &&
  59                    (((union acpi_operand_object *)object)->common.flags &
  60                     AOPOBJ_AML_CONSTANT)) {
  61                        return (AE_OK);
  62                }
  63        }
  64
  65        if (type_needed != this_type) {
  66                ACPI_ERROR((AE_INFO,
  67                            "Needed type [%s], found [%s] %p",
  68                            acpi_ut_get_type_name(type_needed),
  69                            acpi_ut_get_type_name(this_type), object));
  70
  71                return (AE_AML_OPERAND_TYPE);
  72        }
  73
  74        return (AE_OK);
  75}
  76
  77/*******************************************************************************
  78 *
  79 * FUNCTION:    acpi_ex_resolve_operands
  80 *
  81 * PARAMETERS:  opcode              - Opcode being interpreted
  82 *              stack_ptr           - Pointer to the operand stack to be
  83 *                                    resolved
  84 *              walk_state          - Current state
  85 *
  86 * RETURN:      Status
  87 *
  88 * DESCRIPTION: Convert multiple input operands to the types required by the
  89 *              target operator.
  90 *
  91 *      Each 5-bit group in arg_types represents one required
  92 *      operand and indicates the required Type. The corresponding operand
  93 *      will be converted to the required type if possible, otherwise we
  94 *      abort with an exception.
  95 *
  96 ******************************************************************************/
  97
  98acpi_status
  99acpi_ex_resolve_operands(u16 opcode,
 100                         union acpi_operand_object **stack_ptr,
 101                         struct acpi_walk_state *walk_state)
 102{
 103        union acpi_operand_object *obj_desc;
 104        acpi_status status = AE_OK;
 105        u8 object_type;
 106        u32 arg_types;
 107        const struct acpi_opcode_info *op_info;
 108        u32 this_arg_type;
 109        acpi_object_type type_needed;
 110        u16 target_op = 0;
 111
 112        ACPI_FUNCTION_TRACE_U32(ex_resolve_operands, opcode);
 113
 114        op_info = acpi_ps_get_opcode_info(opcode);
 115        if (op_info->class == AML_CLASS_UNKNOWN) {
 116                return_ACPI_STATUS(AE_AML_BAD_OPCODE);
 117        }
 118
 119        arg_types = op_info->runtime_args;
 120        if (arg_types == ARGI_INVALID_OPCODE) {
 121                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", opcode));
 122
 123                return_ACPI_STATUS(AE_AML_INTERNAL);
 124        }
 125
 126        ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
 127                          "Opcode %X [%s] RequiredOperandTypes=%8.8X\n",
 128                          opcode, op_info->name, arg_types));
 129
 130        /*
 131         * Normal exit is with (arg_types == 0) at end of argument list.
 132         * Function will return an exception from within the loop upon
 133         * finding an entry which is not (or cannot be converted
 134         * to) the required type; if stack underflows; or upon
 135         * finding a NULL stack entry (which should not happen).
 136         */
 137        while (GET_CURRENT_ARG_TYPE(arg_types)) {
 138                if (!stack_ptr || !*stack_ptr) {
 139                        ACPI_ERROR((AE_INFO, "Null stack entry at %p",
 140                                    stack_ptr));
 141
 142                        return_ACPI_STATUS(AE_AML_INTERNAL);
 143                }
 144
 145                /* Extract useful items */
 146
 147                obj_desc = *stack_ptr;
 148
 149                /* Decode the descriptor type */
 150
 151                switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
 152                case ACPI_DESC_TYPE_NAMED:
 153
 154                        /* Namespace Node */
 155
 156                        object_type =
 157                            ((struct acpi_namespace_node *)obj_desc)->type;
 158
 159                        /*
 160                         * Resolve an alias object. The construction of these objects
 161                         * guarantees that there is only one level of alias indirection;
 162                         * thus, the attached object is always the aliased namespace node
 163                         */
 164                        if (object_type == ACPI_TYPE_LOCAL_ALIAS) {
 165                                obj_desc = acpi_ns_get_attached_object((struct
 166                                                                        acpi_namespace_node
 167                                                                        *)
 168                                                                       obj_desc);
 169                                *stack_ptr = obj_desc;
 170                                object_type =
 171                                    ((struct acpi_namespace_node *)obj_desc)->
 172                                    type;
 173                        }
 174                        break;
 175
 176                case ACPI_DESC_TYPE_OPERAND:
 177
 178                        /* ACPI internal object */
 179
 180                        object_type = obj_desc->common.type;
 181
 182                        /* Check for bad acpi_object_type */
 183
 184                        if (!acpi_ut_valid_object_type(object_type)) {
 185                                ACPI_ERROR((AE_INFO,
 186                                            "Bad operand object type [0x%X]",
 187                                            object_type));
 188
 189                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 190                        }
 191
 192                        if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) {
 193
 194                                /* Validate the Reference */
 195
 196                                switch (obj_desc->reference.class) {
 197                                case ACPI_REFCLASS_DEBUG:
 198
 199                                        target_op = AML_DEBUG_OP;
 200
 201                                        /*lint -fallthrough */
 202
 203                                case ACPI_REFCLASS_ARG:
 204                                case ACPI_REFCLASS_LOCAL:
 205                                case ACPI_REFCLASS_INDEX:
 206                                case ACPI_REFCLASS_REFOF:
 207                                case ACPI_REFCLASS_TABLE:       /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */
 208                                case ACPI_REFCLASS_NAME:        /* Reference to a named object */
 209
 210                                        ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
 211                                                          "Operand is a Reference, Class [%s] %2.2X\n",
 212                                                          acpi_ut_get_reference_name
 213                                                          (obj_desc),
 214                                                          obj_desc->reference.
 215                                                          class));
 216                                        break;
 217
 218                                default:
 219
 220                                        ACPI_ERROR((AE_INFO,
 221                                                    "Unknown Reference Class 0x%2.2X in %p",
 222                                                    obj_desc->reference.class,
 223                                                    obj_desc));
 224
 225                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 226                                }
 227                        }
 228                        break;
 229
 230                default:
 231
 232                        /* Invalid descriptor */
 233
 234                        ACPI_ERROR((AE_INFO, "Invalid descriptor %p [%s]",
 235                                    obj_desc,
 236                                    acpi_ut_get_descriptor_name(obj_desc)));
 237
 238                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 239                }
 240
 241                /* Get one argument type, point to the next */
 242
 243                this_arg_type = GET_CURRENT_ARG_TYPE(arg_types);
 244                INCREMENT_ARG_LIST(arg_types);
 245
 246                /*
 247                 * Handle cases where the object does not need to be
 248                 * resolved to a value
 249                 */
 250                switch (this_arg_type) {
 251                case ARGI_REF_OR_STRING:        /* Can be a String or Reference */
 252
 253                        if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
 254                             ACPI_DESC_TYPE_OPERAND) &&
 255                            (obj_desc->common.type == ACPI_TYPE_STRING)) {
 256                                /*
 257                                 * String found - the string references a named object and
 258                                 * must be resolved to a node
 259                                 */
 260                                goto next_operand;
 261                        }
 262
 263                        /*
 264                         * Else not a string - fall through to the normal Reference
 265                         * case below
 266                         */
 267                        /*lint -fallthrough */
 268
 269                case ARGI_REFERENCE:    /* References: */
 270                case ARGI_INTEGER_REF:
 271                case ARGI_OBJECT_REF:
 272                case ARGI_DEVICE_REF:
 273                case ARGI_TARGETREF:    /* Allows implicit conversion rules before store */
 274                case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */
 275                case ARGI_SIMPLE_TARGET:        /* Name, Local, or arg - no implicit conversion  */
 276                case ARGI_STORE_TARGET:
 277
 278                        /*
 279                         * Need an operand of type ACPI_TYPE_LOCAL_REFERENCE
 280                         * A Namespace Node is OK as-is
 281                         */
 282                        if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
 283                            ACPI_DESC_TYPE_NAMED) {
 284                                goto next_operand;
 285                        }
 286
 287                        status =
 288                            acpi_ex_check_object_type(ACPI_TYPE_LOCAL_REFERENCE,
 289                                                      object_type, obj_desc);
 290                        if (ACPI_FAILURE(status)) {
 291                                return_ACPI_STATUS(status);
 292                        }
 293                        goto next_operand;
 294
 295                case ARGI_DATAREFOBJ:   /* Store operator only */
 296                        /*
 297                         * We don't want to resolve index_op reference objects during
 298                         * a store because this would be an implicit de_ref_of operation.
 299                         * Instead, we just want to store the reference object.
 300                         * -- All others must be resolved below.
 301                         */
 302                        if ((opcode == AML_STORE_OP) &&
 303                            ((*stack_ptr)->common.type ==
 304                             ACPI_TYPE_LOCAL_REFERENCE)
 305                            && ((*stack_ptr)->reference.class ==
 306                                ACPI_REFCLASS_INDEX)) {
 307                                goto next_operand;
 308                        }
 309                        break;
 310
 311                default:
 312
 313                        /* All cases covered above */
 314
 315                        break;
 316                }
 317
 318                /*
 319                 * Resolve this object to a value
 320                 */
 321                status = acpi_ex_resolve_to_value(stack_ptr, walk_state);
 322                if (ACPI_FAILURE(status)) {
 323                        return_ACPI_STATUS(status);
 324                }
 325
 326                /* Get the resolved object */
 327
 328                obj_desc = *stack_ptr;
 329
 330                /*
 331                 * Check the resulting object (value) type
 332                 */
 333                switch (this_arg_type) {
 334                        /*
 335                         * For the simple cases, only one type of resolved object
 336                         * is allowed
 337                         */
 338                case ARGI_MUTEX:
 339
 340                        /* Need an operand of type ACPI_TYPE_MUTEX */
 341
 342                        type_needed = ACPI_TYPE_MUTEX;
 343                        break;
 344
 345                case ARGI_EVENT:
 346
 347                        /* Need an operand of type ACPI_TYPE_EVENT */
 348
 349                        type_needed = ACPI_TYPE_EVENT;
 350                        break;
 351
 352                case ARGI_PACKAGE:      /* Package */
 353
 354                        /* Need an operand of type ACPI_TYPE_PACKAGE */
 355
 356                        type_needed = ACPI_TYPE_PACKAGE;
 357                        break;
 358
 359                case ARGI_ANYTYPE:
 360
 361                        /* Any operand type will do */
 362
 363                        type_needed = ACPI_TYPE_ANY;
 364                        break;
 365
 366                case ARGI_DDBHANDLE:
 367
 368                        /* Need an operand of type ACPI_TYPE_DDB_HANDLE */
 369
 370                        type_needed = ACPI_TYPE_LOCAL_REFERENCE;
 371                        break;
 372
 373                        /*
 374                         * The more complex cases allow multiple resolved object types
 375                         */
 376                case ARGI_INTEGER:
 377
 378                        /*
 379                         * Need an operand of type ACPI_TYPE_INTEGER, but we can
 380                         * implicitly convert from a STRING or BUFFER.
 381                         *
 382                         * Known as "Implicit Source Operand Conversion"
 383                         */
 384                        status = acpi_ex_convert_to_integer(obj_desc, stack_ptr,
 385                                                            ACPI_IMPLICIT_CONVERSION);
 386                        if (ACPI_FAILURE(status)) {
 387                                if (status == AE_TYPE) {
 388                                        ACPI_ERROR((AE_INFO,
 389                                                    "Needed [Integer/String/Buffer], found [%s] %p",
 390                                                    acpi_ut_get_object_type_name
 391                                                    (obj_desc), obj_desc));
 392
 393                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 394                                }
 395
 396                                return_ACPI_STATUS(status);
 397                        }
 398
 399                        if (obj_desc != *stack_ptr) {
 400                                acpi_ut_remove_reference(obj_desc);
 401                        }
 402                        goto next_operand;
 403
 404                case ARGI_BUFFER:
 405                        /*
 406                         * Need an operand of type ACPI_TYPE_BUFFER,
 407                         * But we can implicitly convert from a STRING or INTEGER
 408                         * aka - "Implicit Source Operand Conversion"
 409                         */
 410                        status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr);
 411                        if (ACPI_FAILURE(status)) {
 412                                if (status == AE_TYPE) {
 413                                        ACPI_ERROR((AE_INFO,
 414                                                    "Needed [Integer/String/Buffer], found [%s] %p",
 415                                                    acpi_ut_get_object_type_name
 416                                                    (obj_desc), obj_desc));
 417
 418                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 419                                }
 420
 421                                return_ACPI_STATUS(status);
 422                        }
 423
 424                        if (obj_desc != *stack_ptr) {
 425                                acpi_ut_remove_reference(obj_desc);
 426                        }
 427                        goto next_operand;
 428
 429                case ARGI_STRING:
 430                        /*
 431                         * Need an operand of type ACPI_TYPE_STRING,
 432                         * But we can implicitly convert from a BUFFER or INTEGER
 433                         * aka - "Implicit Source Operand Conversion"
 434                         */
 435                        status =
 436                            acpi_ex_convert_to_string(obj_desc, stack_ptr,
 437                                                      ACPI_IMPLICIT_CONVERT_HEX);
 438                        if (ACPI_FAILURE(status)) {
 439                                if (status == AE_TYPE) {
 440                                        ACPI_ERROR((AE_INFO,
 441                                                    "Needed [Integer/String/Buffer], found [%s] %p",
 442                                                    acpi_ut_get_object_type_name
 443                                                    (obj_desc), obj_desc));
 444
 445                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 446                                }
 447
 448                                return_ACPI_STATUS(status);
 449                        }
 450
 451                        if (obj_desc != *stack_ptr) {
 452                                acpi_ut_remove_reference(obj_desc);
 453                        }
 454                        goto next_operand;
 455
 456                case ARGI_COMPUTEDATA:
 457
 458                        /* Need an operand of type INTEGER, STRING or BUFFER */
 459
 460                        switch (obj_desc->common.type) {
 461                        case ACPI_TYPE_INTEGER:
 462                        case ACPI_TYPE_STRING:
 463                        case ACPI_TYPE_BUFFER:
 464
 465                                /* Valid operand */
 466                                break;
 467
 468                        default:
 469                                ACPI_ERROR((AE_INFO,
 470                                            "Needed [Integer/String/Buffer], found [%s] %p",
 471                                            acpi_ut_get_object_type_name
 472                                            (obj_desc), obj_desc));
 473
 474                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 475                        }
 476                        goto next_operand;
 477
 478                case ARGI_BUFFER_OR_STRING:
 479
 480                        /* Need an operand of type STRING or BUFFER */
 481
 482                        switch (obj_desc->common.type) {
 483                        case ACPI_TYPE_STRING:
 484                        case ACPI_TYPE_BUFFER:
 485
 486                                /* Valid operand */
 487                                break;
 488
 489                        case ACPI_TYPE_INTEGER:
 490
 491                                /* Highest priority conversion is to type Buffer */
 492
 493                                status =
 494                                    acpi_ex_convert_to_buffer(obj_desc,
 495                                                              stack_ptr);
 496                                if (ACPI_FAILURE(status)) {
 497                                        return_ACPI_STATUS(status);
 498                                }
 499
 500                                if (obj_desc != *stack_ptr) {
 501                                        acpi_ut_remove_reference(obj_desc);
 502                                }
 503                                break;
 504
 505                        default:
 506                                ACPI_ERROR((AE_INFO,
 507                                            "Needed [Integer/String/Buffer], found [%s] %p",
 508                                            acpi_ut_get_object_type_name
 509                                            (obj_desc), obj_desc));
 510
 511                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 512                        }
 513                        goto next_operand;
 514
 515                case ARGI_DATAOBJECT:
 516                        /*
 517                         * ARGI_DATAOBJECT is only used by the size_of operator.
 518                         * Need a buffer, string, package, or ref_of reference.
 519                         *
 520                         * The only reference allowed here is a direct reference to
 521                         * a namespace node.
 522                         */
 523                        switch (obj_desc->common.type) {
 524                        case ACPI_TYPE_PACKAGE:
 525                        case ACPI_TYPE_STRING:
 526                        case ACPI_TYPE_BUFFER:
 527                        case ACPI_TYPE_LOCAL_REFERENCE:
 528
 529                                /* Valid operand */
 530                                break;
 531
 532                        default:
 533
 534                                ACPI_ERROR((AE_INFO,
 535                                            "Needed [Buffer/String/Package/Reference], found [%s] %p",
 536                                            acpi_ut_get_object_type_name
 537                                            (obj_desc), obj_desc));
 538
 539                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 540                        }
 541                        goto next_operand;
 542
 543                case ARGI_COMPLEXOBJ:
 544
 545                        /* Need a buffer or package or (ACPI 2.0) String */
 546
 547                        switch (obj_desc->common.type) {
 548                        case ACPI_TYPE_PACKAGE:
 549                        case ACPI_TYPE_STRING:
 550                        case ACPI_TYPE_BUFFER:
 551
 552                                /* Valid operand */
 553                                break;
 554
 555                        default:
 556
 557                                ACPI_ERROR((AE_INFO,
 558                                            "Needed [Buffer/String/Package], found [%s] %p",
 559                                            acpi_ut_get_object_type_name
 560                                            (obj_desc), obj_desc));
 561
 562                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 563                        }
 564                        goto next_operand;
 565
 566                case ARGI_REGION_OR_BUFFER:     /* Used by Load() only */
 567
 568                        /*
 569                         * Need an operand of type REGION or a BUFFER
 570                         * (which could be a resolved region field)
 571                         */
 572                        switch (obj_desc->common.type) {
 573                        case ACPI_TYPE_BUFFER:
 574                        case ACPI_TYPE_REGION:
 575
 576                                /* Valid operand */
 577                                break;
 578
 579                        default:
 580
 581                                ACPI_ERROR((AE_INFO,
 582                                            "Needed [Region/Buffer], found [%s] %p",
 583                                            acpi_ut_get_object_type_name
 584                                            (obj_desc), obj_desc));
 585
 586                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 587                        }
 588                        goto next_operand;
 589
 590                case ARGI_DATAREFOBJ:
 591
 592                        /* Used by the Store() operator only */
 593
 594                        switch (obj_desc->common.type) {
 595                        case ACPI_TYPE_INTEGER:
 596                        case ACPI_TYPE_PACKAGE:
 597                        case ACPI_TYPE_STRING:
 598                        case ACPI_TYPE_BUFFER:
 599                        case ACPI_TYPE_BUFFER_FIELD:
 600                        case ACPI_TYPE_LOCAL_REFERENCE:
 601                        case ACPI_TYPE_LOCAL_REGION_FIELD:
 602                        case ACPI_TYPE_LOCAL_BANK_FIELD:
 603                        case ACPI_TYPE_LOCAL_INDEX_FIELD:
 604                        case ACPI_TYPE_DDB_HANDLE:
 605
 606                                /* Valid operand */
 607                                break;
 608
 609                        default:
 610
 611                                if (acpi_gbl_enable_interpreter_slack) {
 612                                        /*
 613                                         * Enable original behavior of Store(), allowing any
 614                                         * and all objects as the source operand. The ACPI
 615                                         * spec does not allow this, however.
 616                                         */
 617                                        break;
 618                                }
 619
 620                                if (target_op == AML_DEBUG_OP) {
 621
 622                                        /* Allow store of any object to the Debug object */
 623
 624                                        break;
 625                                }
 626
 627                                ACPI_ERROR((AE_INFO,
 628                                            "Needed Integer/Buffer/String/Package/Ref/Ddb]"
 629                                            ", found [%s] %p",
 630                                            acpi_ut_get_object_type_name
 631                                            (obj_desc), obj_desc));
 632
 633                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 634                        }
 635                        goto next_operand;
 636
 637                default:
 638
 639                        /* Unknown type */
 640
 641                        ACPI_ERROR((AE_INFO,
 642                                    "Internal - Unknown ARGI (required operand) type 0x%X",
 643                                    this_arg_type));
 644
 645                        return_ACPI_STATUS(AE_BAD_PARAMETER);
 646                }
 647
 648                /*
 649                 * Make sure that the original object was resolved to the
 650                 * required object type (Simple cases only).
 651                 */
 652                status =
 653                    acpi_ex_check_object_type(type_needed,
 654                                              (*stack_ptr)->common.type,
 655                                              *stack_ptr);
 656                if (ACPI_FAILURE(status)) {
 657                        return_ACPI_STATUS(status);
 658                }
 659
 660next_operand:
 661                /*
 662                 * If more operands needed, decrement stack_ptr to point
 663                 * to next operand on stack
 664                 */
 665                if (GET_CURRENT_ARG_TYPE(arg_types)) {
 666                        stack_ptr--;
 667                }
 668        }
 669
 670        ACPI_DUMP_OPERANDS(walk_state->operands,
 671                           acpi_ps_get_opcode_name(opcode),
 672                           walk_state->num_operands);
 673
 674        return_ACPI_STATUS(status);
 675}
 676