1 /****************************************************************************** 2 * 3 * Module Name: dsopcode - Dispatcher Op Region support and handling of 4 * "control" opcodes 5 * 6 *****************************************************************************/ 7 8 /* 9 * Copyright (C) 2000 - 2010, Intel Corp. 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions, and the following disclaimer, 17 * without modification. 18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19 * substantially similar to the "NO WARRANTY" disclaimer below 20 * ("Disclaimer") and any redistribution must be conditioned upon 21 * including a substantially similar Disclaimer requirement for further 22 * binary redistribution. 23 * 3. Neither the names of the above-listed copyright holders nor the names 24 * of any contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * Alternatively, this software may be distributed under the terms of the 28 * GNU General Public License ("GPL") version 2 as published by the Free 29 * Software Foundation. 30 * 31 * NO WARRANTY 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42 * POSSIBILITY OF SUCH DAMAGES. 43 */ 44 45 #include <acpi/acpi.h> 46 #include "accommon.h" 47 #include "acparser.h" 48 #include "amlcode.h" 49 #include "acdispat.h" 50 #include "acinterp.h" 51 #include "acnamesp.h" 52 #include "acevents.h" 53 #include "actables.h" 54 55 #define _COMPONENT ACPI_DISPATCHER 56 ACPI_MODULE_NAME("dsopcode") 57 58 /* Local prototypes */ 59 static acpi_status 60 acpi_ds_execute_arguments(struct acpi_namespace_node *node, 61 struct acpi_namespace_node *scope_node, 62 u32 aml_length, u8 * aml_start); 63 64 static acpi_status 65 acpi_ds_init_buffer_field(u16 aml_opcode, 66 union acpi_operand_object *obj_desc, 67 union acpi_operand_object *buffer_desc, 68 union acpi_operand_object *offset_desc, 69 union acpi_operand_object *length_desc, 70 union acpi_operand_object *result_desc); 71 72 /******************************************************************************* 73 * 74 * FUNCTION: acpi_ds_execute_arguments 75 * 76 * PARAMETERS: Node - Object NS node 77 * scope_node - Parent NS node 78 * aml_length - Length of executable AML 79 * aml_start - Pointer to the AML 80 * 81 * RETURN: Status. 82 * 83 * DESCRIPTION: Late (deferred) execution of region or field arguments 84 * 85 ******************************************************************************/ 86 87 static acpi_status 88 acpi_ds_execute_arguments(struct acpi_namespace_node *node, 89 struct acpi_namespace_node *scope_node, 90 u32 aml_length, u8 * aml_start) 91 { 92 acpi_status status; 93 union acpi_parse_object *op; 94 struct acpi_walk_state *walk_state; 95 96 ACPI_FUNCTION_TRACE(ds_execute_arguments); 97 98 /* 99 * Allocate a new parser op to be the root of the parsed tree 100 */ 101 op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP); 102 if (!op) { 103 return_ACPI_STATUS(AE_NO_MEMORY); 104 } 105 106 /* Save the Node for use in acpi_ps_parse_aml */ 107 108 op->common.node = scope_node; 109 110 /* Create and initialize a new parser state */ 111 112 walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL); 113 if (!walk_state) { 114 status = AE_NO_MEMORY; 115 goto cleanup; 116 } 117 118 status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, 119 aml_length, NULL, ACPI_IMODE_LOAD_PASS1); 120 if (ACPI_FAILURE(status)) { 121 acpi_ds_delete_walk_state(walk_state); 122 goto cleanup; 123 } 124 125 /* Mark this parse as a deferred opcode */ 126 127 walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP; 128 walk_state->deferred_node = node; 129 130 /* Pass1: Parse the entire declaration */ 131 132 status = acpi_ps_parse_aml(walk_state); 133 if (ACPI_FAILURE(status)) { 134 goto cleanup; 135 } 136 137 /* Get and init the Op created above */ 138 139 op->common.node = node; 140 acpi_ps_delete_parse_tree(op); 141 142 /* Evaluate the deferred arguments */ 143 144 op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP); 145 if (!op) { 146 return_ACPI_STATUS(AE_NO_MEMORY); 147 } 148 149 op->common.node = scope_node; 150 151 /* Create and initialize a new parser state */ 152 153 walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL); 154 if (!walk_state) { 155 status = AE_NO_MEMORY; 156 goto cleanup; 157 } 158 159 /* Execute the opcode and arguments */ 160 161 status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, 162 aml_length, NULL, ACPI_IMODE_EXECUTE); 163 if (ACPI_FAILURE(status)) { 164 acpi_ds_delete_walk_state(walk_state); 165 goto cleanup; 166 } 167 168 /* Mark this execution as a deferred opcode */ 169 170 walk_state->deferred_node = node; 171 status = acpi_ps_parse_aml(walk_state); 172 173 cleanup: 174 acpi_ps_delete_parse_tree(op); 175 return_ACPI_STATUS(status); 176 } 177 178 /******************************************************************************* 179 * 180 * FUNCTION: acpi_ds_get_buffer_field_arguments 181 * 182 * PARAMETERS: obj_desc - A valid buffer_field object 183 * 184 * RETURN: Status. 185 * 186 * DESCRIPTION: Get buffer_field Buffer and Index. This implements the late 187 * evaluation of these field attributes. 188 * 189 ******************************************************************************/ 190 191 acpi_status 192 acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc) 193 { 194 union acpi_operand_object *extra_desc; 195 struct acpi_namespace_node *node; 196 acpi_status status; 197 198 ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_field_arguments, obj_desc); 199 200 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { 201 return_ACPI_STATUS(AE_OK); 202 } 203 204 /* Get the AML pointer (method object) and buffer_field node */ 205 206 extra_desc = acpi_ns_get_secondary_object(obj_desc); 207 node = obj_desc->buffer_field.node; 208 209 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname 210 (ACPI_TYPE_BUFFER_FIELD, node, NULL)); 211 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n", 212 acpi_ut_get_node_name(node))); 213 214 /* Execute the AML code for the term_arg arguments */ 215 216 status = acpi_ds_execute_arguments(node, node->parent, 217 extra_desc->extra.aml_length, 218 extra_desc->extra.aml_start); 219 return_ACPI_STATUS(status); 220 } 221 222 /******************************************************************************* 223 * 224 * FUNCTION: acpi_ds_get_bank_field_arguments 225 * 226 * PARAMETERS: obj_desc - A valid bank_field object 227 * 228 * RETURN: Status. 229 * 230 * DESCRIPTION: Get bank_field bank_value. This implements the late 231 * evaluation of these field attributes. 232 * 233 ******************************************************************************/ 234 235 acpi_status 236 acpi_ds_get_bank_field_arguments(union acpi_operand_object *obj_desc) 237 { 238 union acpi_operand_object *extra_desc; 239 struct acpi_namespace_node *node; 240 acpi_status status; 241 242 ACPI_FUNCTION_TRACE_PTR(ds_get_bank_field_arguments, obj_desc); 243 244 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { 245 return_ACPI_STATUS(AE_OK); 246 } 247 248 /* Get the AML pointer (method object) and bank_field node */ 249 250 extra_desc = acpi_ns_get_secondary_object(obj_desc); 251 node = obj_desc->bank_field.node; 252 253 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname 254 (ACPI_TYPE_LOCAL_BANK_FIELD, node, NULL)); 255 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n", 256 acpi_ut_get_node_name(node))); 257 258 /* Execute the AML code for the term_arg arguments */ 259 260 status = acpi_ds_execute_arguments(node, node->parent, 261 extra_desc->extra.aml_length, 262 extra_desc->extra.aml_start); 263 return_ACPI_STATUS(status); 264 } 265 266 /******************************************************************************* 267 * 268 * FUNCTION: acpi_ds_get_buffer_arguments 269 * 270 * PARAMETERS: obj_desc - A valid Buffer object 271 * 272 * RETURN: Status. 273 * 274 * DESCRIPTION: Get Buffer length and initializer byte list. This implements 275 * the late evaluation of these attributes. 276 * 277 ******************************************************************************/ 278 279 acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc) 280 { 281 struct acpi_namespace_node *node; 282 acpi_status status; 283 284 ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_arguments, obj_desc); 285 286 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { 287 return_ACPI_STATUS(AE_OK); 288 } 289 290 /* Get the Buffer node */ 291 292 node = obj_desc->buffer.node; 293 if (!node) { 294 ACPI_ERROR((AE_INFO, 295 "No pointer back to namespace node in buffer object %p", 296 obj_desc)); 297 return_ACPI_STATUS(AE_AML_INTERNAL); 298 } 299 300 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Buffer Arg Init\n")); 301 302 /* Execute the AML code for the term_arg arguments */ 303 304 status = acpi_ds_execute_arguments(node, node, 305 obj_desc->buffer.aml_length, 306 obj_desc->buffer.aml_start); 307 return_ACPI_STATUS(status); 308 } 309 310 /******************************************************************************* 311 * 312 * FUNCTION: acpi_ds_get_package_arguments 313 * 314 * PARAMETERS: obj_desc - A valid Package object 315 * 316 * RETURN: Status. 317 * 318 * DESCRIPTION: Get Package length and initializer byte list. This implements 319 * the late evaluation of these attributes. 320 * 321 ******************************************************************************/ 322 323 acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc) 324 { 325 struct acpi_namespace_node *node; 326 acpi_status status; 327 328 ACPI_FUNCTION_TRACE_PTR(ds_get_package_arguments, obj_desc); 329 330 if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { 331 return_ACPI_STATUS(AE_OK); 332 } 333 334 /* Get the Package node */ 335 336 node = obj_desc->package.node; 337 if (!node) { 338 ACPI_ERROR((AE_INFO, 339 "No pointer back to namespace node in package %p", 340 obj_desc)); 341 return_ACPI_STATUS(AE_AML_INTERNAL); 342 } 343 344 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Package Arg Init\n")); 345 346 /* Execute the AML code for the term_arg arguments */ 347 348 status = acpi_ds_execute_arguments(node, node, 349 obj_desc->package.aml_length, 350 obj_desc->package.aml_start); 351 return_ACPI_STATUS(status); 352 } 353 354 /***************************************************************************** 355 * 356 * FUNCTION: acpi_ds_get_region_arguments 357 * 358 * PARAMETERS: obj_desc - A valid region object 359 * 360 * RETURN: Status. 361 * 362 * DESCRIPTION: Get region address and length. This implements the late 363 * evaluation of these region attributes. 364 * 365 ****************************************************************************/ 366 367 acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) 368 { 369 struct acpi_namespace_node *node; 370 acpi_status status; 371 union acpi_operand_object *extra_desc; 372 373 ACPI_FUNCTION_TRACE_PTR(ds_get_region_arguments, obj_desc); 374 375 if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { 376 return_ACPI_STATUS(AE_OK); 377 } 378 379 extra_desc = acpi_ns_get_secondary_object(obj_desc); 380 if (!extra_desc) { 381 return_ACPI_STATUS(AE_NOT_EXIST); 382 } 383 384 /* Get the Region node */ 385 386 node = obj_desc->region.node; 387 388 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname 389 (ACPI_TYPE_REGION, node, NULL)); 390 391 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n", 392 acpi_ut_get_node_name(node), 393 extra_desc->extra.aml_start)); 394 395 /* Execute the argument AML */ 396 397 status = acpi_ds_execute_arguments(node, node->parent, 398 extra_desc->extra.aml_length, 399 extra_desc->extra.aml_start); 400 if (ACPI_FAILURE(status)) { 401 return_ACPI_STATUS(status); 402 } 403 404 /* Validate the region address/length via the host OS */ 405 406 status = acpi_os_validate_address(obj_desc->region.space_id, 407 obj_desc->region.address, 408 (acpi_size) obj_desc->region.length, 409 acpi_ut_get_node_name(node)); 410 411 if (ACPI_FAILURE(status)) { 412 /* 413 * Invalid address/length. We will emit an error message and mark 414 * the region as invalid, so that it will cause an additional error if 415 * it is ever used. Then return AE_OK. 416 */ 417 ACPI_EXCEPTION((AE_INFO, status, 418 "During address validation of OpRegion [%4.4s]", 419 node->name.ascii)); 420 obj_desc->common.flags |= AOPOBJ_INVALID; 421 status = AE_OK; 422 } 423 424 return_ACPI_STATUS(status); 425 } 426 427 /******************************************************************************* 428 * 429 * FUNCTION: acpi_ds_initialize_region 430 * 431 * PARAMETERS: obj_handle - Region namespace node 432 * 433 * RETURN: Status 434 * 435 * DESCRIPTION: Front end to ev_initialize_region 436 * 437 ******************************************************************************/ 438 439 acpi_status acpi_ds_initialize_region(acpi_handle obj_handle) 440 { 441 union acpi_operand_object *obj_desc; 442 acpi_status status; 443 444 obj_desc = acpi_ns_get_attached_object(obj_handle); 445 446 /* Namespace is NOT locked */ 447 448 status = acpi_ev_initialize_region(obj_desc, FALSE); 449 return (status); 450 } 451 452 /******************************************************************************* 453 * 454 * FUNCTION: acpi_ds_init_buffer_field 455 * 456 * PARAMETERS: aml_opcode - create_xxx_field 457 * obj_desc - buffer_field object 458 * buffer_desc - Host Buffer 459 * offset_desc - Offset into buffer 460 * length_desc - Length of field (CREATE_FIELD_OP only) 461 * result_desc - Where to store the result 462 * 463 * RETURN: Status 464 * 465 * DESCRIPTION: Perform actual initialization of a buffer field 466 * 467 ******************************************************************************/ 468 469 static acpi_status 470 acpi_ds_init_buffer_field(u16 aml_opcode, 471 union acpi_operand_object *obj_desc, 472 union acpi_operand_object *buffer_desc, 473 union acpi_operand_object *offset_desc, 474 union acpi_operand_object *length_desc, 475 union acpi_operand_object *result_desc) 476 { 477 u32 offset; 478 u32 bit_offset; 479 u32 bit_count; 480 u8 field_flags; 481 acpi_status status; 482 483 ACPI_FUNCTION_TRACE_PTR(ds_init_buffer_field, obj_desc); 484 485 /* Host object must be a Buffer */ 486 487 if (buffer_desc->common.type != ACPI_TYPE_BUFFER) { 488 ACPI_ERROR((AE_INFO, 489 "Target of Create Field is not a Buffer object - %s", 490 acpi_ut_get_object_type_name(buffer_desc))); 491 492 status = AE_AML_OPERAND_TYPE; 493 goto cleanup; 494 } 495 496 /* 497 * The last parameter to all of these opcodes (result_desc) started 498 * out as a name_string, and should therefore now be a NS node 499 * after resolution in acpi_ex_resolve_operands(). 500 */ 501 if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) { 502 ACPI_ERROR((AE_INFO, 503 "(%s) destination not a NS Node [%s]", 504 acpi_ps_get_opcode_name(aml_opcode), 505 acpi_ut_get_descriptor_name(result_desc))); 506 507 status = AE_AML_OPERAND_TYPE; 508 goto cleanup; 509 } 510 511 offset = (u32) offset_desc->integer.value; 512 513 /* 514 * Setup the Bit offsets and counts, according to the opcode 515 */ 516 switch (aml_opcode) { 517 case AML_CREATE_FIELD_OP: 518 519 /* Offset is in bits, count is in bits */ 520 521 field_flags = AML_FIELD_ACCESS_BYTE; 522 bit_offset = offset; 523 bit_count = (u32) length_desc->integer.value; 524 525 /* Must have a valid (>0) bit count */ 526 527 if (bit_count == 0) { 528 ACPI_ERROR((AE_INFO, 529 "Attempt to CreateField of length zero")); 530 status = AE_AML_OPERAND_VALUE; 531 goto cleanup; 532 } 533 break; 534 535 case AML_CREATE_BIT_FIELD_OP: 536 537 /* Offset is in bits, Field is one bit */ 538 539 bit_offset = offset; 540 bit_count = 1; 541 field_flags = AML_FIELD_ACCESS_BYTE; 542 break; 543 544 case AML_CREATE_BYTE_FIELD_OP: 545 546 /* Offset is in bytes, field is one byte */ 547 548 bit_offset = 8 * offset; 549 bit_count = 8; 550 field_flags = AML_FIELD_ACCESS_BYTE; 551 break; 552 553 case AML_CREATE_WORD_FIELD_OP: 554 555 /* Offset is in bytes, field is one word */ 556 557 bit_offset = 8 * offset; 558 bit_count = 16; 559 field_flags = AML_FIELD_ACCESS_WORD; 560 break; 561 562 case AML_CREATE_DWORD_FIELD_OP: 563 564 /* Offset is in bytes, field is one dword */ 565 566 bit_offset = 8 * offset; 567 bit_count = 32; 568 field_flags = AML_FIELD_ACCESS_DWORD; 569 break; 570 571 case AML_CREATE_QWORD_FIELD_OP: 572 573 /* Offset is in bytes, field is one qword */ 574 575 bit_offset = 8 * offset; 576 bit_count = 64; 577 field_flags = AML_FIELD_ACCESS_QWORD; 578 break; 579 580 default: 581 582 ACPI_ERROR((AE_INFO, 583 "Unknown field creation opcode 0x%02X", 584 aml_opcode)); 585 status = AE_AML_BAD_OPCODE; 586 goto cleanup; 587 } 588 589 /* Entire field must fit within the current length of the buffer */ 590 591 if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { 592 ACPI_ERROR((AE_INFO, 593 "Field [%4.4s] at %u exceeds Buffer [%4.4s] size %u (bits)", 594 acpi_ut_get_node_name(result_desc), 595 bit_offset + bit_count, 596 acpi_ut_get_node_name(buffer_desc->buffer.node), 597 8 * (u32) buffer_desc->buffer.length)); 598 status = AE_AML_BUFFER_LIMIT; 599 goto cleanup; 600 } 601 602 /* 603 * Initialize areas of the field object that are common to all fields 604 * For field_flags, use LOCK_RULE = 0 (NO_LOCK), 605 * UPDATE_RULE = 0 (UPDATE_PRESERVE) 606 */ 607 status = acpi_ex_prep_common_field_object(obj_desc, field_flags, 0, 608 bit_offset, bit_count); 609 if (ACPI_FAILURE(status)) { 610 goto cleanup; 611 } 612 613 obj_desc->buffer_field.buffer_obj = buffer_desc; 614 615 /* Reference count for buffer_desc inherits obj_desc count */ 616 617 buffer_desc->common.reference_count = (u16) 618 (buffer_desc->common.reference_count + 619 obj_desc->common.reference_count); 620 621 cleanup: 622 623 /* Always delete the operands */ 624 625 acpi_ut_remove_reference(offset_desc); 626 acpi_ut_remove_reference(buffer_desc); 627 628 if (aml_opcode == AML_CREATE_FIELD_OP) { 629 acpi_ut_remove_reference(length_desc); 630 } 631 632 /* On failure, delete the result descriptor */ 633 634 if (ACPI_FAILURE(status)) { 635 acpi_ut_remove_reference(result_desc); /* Result descriptor */ 636 } else { 637 /* Now the address and length are valid for this buffer_field */ 638 639 obj_desc->buffer_field.flags |= AOPOBJ_DATA_VALID; 640 } 641 642 return_ACPI_STATUS(status); 643 } 644 645 /******************************************************************************* 646 * 647 * FUNCTION: acpi_ds_eval_buffer_field_operands 648 * 649 * PARAMETERS: walk_state - Current walk 650 * Op - A valid buffer_field Op object 651 * 652 * RETURN: Status 653 * 654 * DESCRIPTION: Get buffer_field Buffer and Index 655 * Called from acpi_ds_exec_end_op during buffer_field parse tree walk 656 * 657 ******************************************************************************/ 658 659 acpi_status 660 acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, 661 union acpi_parse_object *op) 662 { 663 acpi_status status; 664 union acpi_operand_object *obj_desc; 665 struct acpi_namespace_node *node; 666 union acpi_parse_object *next_op; 667 668 ACPI_FUNCTION_TRACE_PTR(ds_eval_buffer_field_operands, op); 669 670 /* 671 * This is where we evaluate the address and length fields of the 672 * create_xxx_field declaration 673 */ 674 node = op->common.node; 675 676 /* next_op points to the op that holds the Buffer */ 677 678 next_op = op->common.value.arg; 679 680 /* Evaluate/create the address and length operands */ 681 682 status = acpi_ds_create_operands(walk_state, next_op); 683 if (ACPI_FAILURE(status)) { 684 return_ACPI_STATUS(status); 685 } 686 687 obj_desc = acpi_ns_get_attached_object(node); 688 if (!obj_desc) { 689 return_ACPI_STATUS(AE_NOT_EXIST); 690 } 691 692 /* Resolve the operands */ 693 694 status = acpi_ex_resolve_operands(op->common.aml_opcode, 695 ACPI_WALK_OPERANDS, walk_state); 696 if (ACPI_FAILURE(status)) { 697 ACPI_ERROR((AE_INFO, "(%s) bad operand(s), status 0x%X", 698 acpi_ps_get_opcode_name(op->common.aml_opcode), 699 status)); 700 701 return_ACPI_STATUS(status); 702 } 703 704 /* Initialize the Buffer Field */ 705 706 if (op->common.aml_opcode == AML_CREATE_FIELD_OP) { 707 708 /* NOTE: Slightly different operands for this opcode */ 709 710 status = 711 acpi_ds_init_buffer_field(op->common.aml_opcode, obj_desc, 712 walk_state->operands[0], 713 walk_state->operands[1], 714 walk_state->operands[2], 715 walk_state->operands[3]); 716 } else { 717 /* All other, create_xxx_field opcodes */ 718 719 status = 720 acpi_ds_init_buffer_field(op->common.aml_opcode, obj_desc, 721 walk_state->operands[0], 722 walk_state->operands[1], NULL, 723 walk_state->operands[2]); 724 } 725 726 return_ACPI_STATUS(status); 727 } 728 729 /******************************************************************************* 730 * 731 * FUNCTION: acpi_ds_eval_region_operands 732 * 733 * PARAMETERS: walk_state - Current walk 734 * Op - A valid region Op object 735 * 736 * RETURN: Status 737 * 738 * DESCRIPTION: Get region address and length 739 * Called from acpi_ds_exec_end_op during op_region parse tree walk 740 * 741 ******************************************************************************/ 742 743 acpi_status 744 acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, 745 union acpi_parse_object *op) 746 { 747 acpi_status status; 748 union acpi_operand_object *obj_desc; 749 union acpi_operand_object *operand_desc; 750 struct acpi_namespace_node *node; 751 union acpi_parse_object *next_op; 752 753 ACPI_FUNCTION_TRACE_PTR(ds_eval_region_operands, op); 754 755 /* 756 * This is where we evaluate the address and length fields of the 757 * op_region declaration 758 */ 759 node = op->common.node; 760 761 /* next_op points to the op that holds the space_iD */ 762 763 next_op = op->common.value.arg; 764 765 /* next_op points to address op */ 766 767 next_op = next_op->common.next; 768 769 /* Evaluate/create the address and length operands */ 770 771 status = acpi_ds_create_operands(walk_state, next_op); 772 if (ACPI_FAILURE(status)) { 773 return_ACPI_STATUS(status); 774 } 775 776 /* Resolve the length and address operands to numbers */ 777 778 status = acpi_ex_resolve_operands(op->common.aml_opcode, 779 ACPI_WALK_OPERANDS, walk_state); 780 if (ACPI_FAILURE(status)) { 781 return_ACPI_STATUS(status); 782 } 783 784 obj_desc = acpi_ns_get_attached_object(node); 785 if (!obj_desc) { 786 return_ACPI_STATUS(AE_NOT_EXIST); 787 } 788 789 /* 790 * Get the length operand and save it 791 * (at Top of stack) 792 */ 793 operand_desc = walk_state->operands[walk_state->num_operands - 1]; 794 795 obj_desc->region.length = (u32) operand_desc->integer.value; 796 acpi_ut_remove_reference(operand_desc); 797 798 /* 799 * Get the address and save it 800 * (at top of stack - 1) 801 */ 802 operand_desc = walk_state->operands[walk_state->num_operands - 2]; 803 804 obj_desc->region.address = (acpi_physical_address) 805 operand_desc->integer.value; 806 acpi_ut_remove_reference(operand_desc); 807 808 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", 809 obj_desc, 810 ACPI_FORMAT_NATIVE_UINT(obj_desc->region.address), 811 obj_desc->region.length)); 812 813 /* Now the address and length are valid for this opregion */ 814 815 obj_desc->region.flags |= AOPOBJ_DATA_VALID; 816 817 return_ACPI_STATUS(status); 818 } 819 820 /******************************************************************************* 821 * 822 * FUNCTION: acpi_ds_eval_table_region_operands 823 * 824 * PARAMETERS: walk_state - Current walk 825 * Op - A valid region Op object 826 * 827 * RETURN: Status 828 * 829 * DESCRIPTION: Get region address and length 830 * Called from acpi_ds_exec_end_op during data_table_region parse tree walk 831 * 832 ******************************************************************************/ 833 834 acpi_status 835 acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state, 836 union acpi_parse_object *op) 837 { 838 acpi_status status; 839 union acpi_operand_object *obj_desc; 840 union acpi_operand_object **operand; 841 struct acpi_namespace_node *node; 842 union acpi_parse_object *next_op; 843 u32 table_index; 844 struct acpi_table_header *table; 845 846 ACPI_FUNCTION_TRACE_PTR(ds_eval_table_region_operands, op); 847 848 /* 849 * This is where we evaluate the signature_string and oem_iDString 850 * and oem_table_iDString of the data_table_region declaration 851 */ 852 node = op->common.node; 853 854 /* next_op points to signature_string op */ 855 856 next_op = op->common.value.arg; 857 858 /* 859 * Evaluate/create the signature_string and oem_iDString 860 * and oem_table_iDString operands 861 */ 862 status = acpi_ds_create_operands(walk_state, next_op); 863 if (ACPI_FAILURE(status)) { 864 return_ACPI_STATUS(status); 865 } 866 867 /* 868 * Resolve the signature_string and oem_iDString 869 * and oem_table_iDString operands 870 */ 871 status = acpi_ex_resolve_operands(op->common.aml_opcode, 872 ACPI_WALK_OPERANDS, walk_state); 873 if (ACPI_FAILURE(status)) { 874 return_ACPI_STATUS(status); 875 } 876 877 operand = &walk_state->operands[0]; 878 879 /* Find the ACPI table */ 880 881 status = acpi_tb_find_table(operand[0]->string.pointer, 882 operand[1]->string.pointer, 883 operand[2]->string.pointer, &table_index); 884 if (ACPI_FAILURE(status)) { 885 return_ACPI_STATUS(status); 886 } 887 888 acpi_ut_remove_reference(operand[0]); 889 acpi_ut_remove_reference(operand[1]); 890 acpi_ut_remove_reference(operand[2]); 891 892 status = acpi_get_table_by_index(table_index, &table); 893 if (ACPI_FAILURE(status)) { 894 return_ACPI_STATUS(status); 895 } 896 897 obj_desc = acpi_ns_get_attached_object(node); 898 if (!obj_desc) { 899 return_ACPI_STATUS(AE_NOT_EXIST); 900 } 901 902 obj_desc->region.address = 903 (acpi_physical_address) ACPI_TO_INTEGER(table); 904 obj_desc->region.length = table->length; 905 906 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", 907 obj_desc, 908 ACPI_FORMAT_NATIVE_UINT(obj_desc->region.address), 909 obj_desc->region.length)); 910 911 /* Now the address and length are valid for this opregion */ 912 913 obj_desc->region.flags |= AOPOBJ_DATA_VALID; 914 915 return_ACPI_STATUS(status); 916 } 917 918 /******************************************************************************* 919 * 920 * FUNCTION: acpi_ds_eval_data_object_operands 921 * 922 * PARAMETERS: walk_state - Current walk 923 * Op - A valid data_object Op object 924 * obj_desc - data_object 925 * 926 * RETURN: Status 927 * 928 * DESCRIPTION: Get the operands and complete the following data object types: 929 * Buffer, Package. 930 * 931 ******************************************************************************/ 932 933 acpi_status 934 acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state, 935 union acpi_parse_object *op, 936 union acpi_operand_object *obj_desc) 937 { 938 acpi_status status; 939 union acpi_operand_object *arg_desc; 940 u32 length; 941 942 ACPI_FUNCTION_TRACE(ds_eval_data_object_operands); 943 944 /* The first operand (for all of these data objects) is the length */ 945 946 /* 947 * Set proper index into operand stack for acpi_ds_obj_stack_push 948 * invoked inside acpi_ds_create_operand. 949 */ 950 walk_state->operand_index = walk_state->num_operands; 951 952 status = acpi_ds_create_operand(walk_state, op->common.value.arg, 1); 953 if (ACPI_FAILURE(status)) { 954 return_ACPI_STATUS(status); 955 } 956 957 status = acpi_ex_resolve_operands(walk_state->opcode, 958 &(walk_state-> 959 operands[walk_state->num_operands - 960 1]), walk_state); 961 if (ACPI_FAILURE(status)) { 962 return_ACPI_STATUS(status); 963 } 964 965 /* Extract length operand */ 966 967 arg_desc = walk_state->operands[walk_state->num_operands - 1]; 968 length = (u32) arg_desc->integer.value; 969 970 /* Cleanup for length operand */ 971 972 status = acpi_ds_obj_stack_pop(1, walk_state); 973 if (ACPI_FAILURE(status)) { 974 return_ACPI_STATUS(status); 975 } 976 977 acpi_ut_remove_reference(arg_desc); 978 979 /* 980 * Create the actual data object 981 */ 982 switch (op->common.aml_opcode) { 983 case AML_BUFFER_OP: 984 985 status = 986 acpi_ds_build_internal_buffer_obj(walk_state, op, length, 987 &obj_desc); 988 break; 989 990 case AML_PACKAGE_OP: 991 case AML_VAR_PACKAGE_OP: 992 993 status = 994 acpi_ds_build_internal_package_obj(walk_state, op, length, 995 &obj_desc); 996 break; 997 998 default: 999 return_ACPI_STATUS(AE_AML_BAD_OPCODE); 1000 } 1001 1002 if (ACPI_SUCCESS(status)) { 1003 /* 1004 * Return the object in the walk_state, unless the parent is a package - 1005 * in this case, the return object will be stored in the parse tree 1006 * for the package. 1007 */ 1008 if ((!op->common.parent) || 1009 ((op->common.parent->common.aml_opcode != AML_PACKAGE_OP) && 1010 (op->common.parent->common.aml_opcode != 1011 AML_VAR_PACKAGE_OP) 1012 && (op->common.parent->common.aml_opcode != AML_NAME_OP))) { 1013 walk_state->result_obj = obj_desc; 1014 } 1015 } 1016 1017 return_ACPI_STATUS(status); 1018 } 1019 1020 /******************************************************************************* 1021 * 1022 * FUNCTION: acpi_ds_eval_bank_field_operands 1023 * 1024 * PARAMETERS: walk_state - Current walk 1025 * Op - A valid bank_field Op object 1026 * 1027 * RETURN: Status 1028 * 1029 * DESCRIPTION: Get bank_field bank_value 1030 * Called from acpi_ds_exec_end_op during bank_field parse tree walk 1031 * 1032 ******************************************************************************/ 1033 1034 acpi_status 1035 acpi_ds_eval_bank_field_operands(struct acpi_walk_state *walk_state, 1036 union acpi_parse_object *op) 1037 { 1038 acpi_status status; 1039 union acpi_operand_object *obj_desc; 1040 union acpi_operand_object *operand_desc; 1041 struct acpi_namespace_node *node; 1042 union acpi_parse_object *next_op; 1043 union acpi_parse_object *arg; 1044 1045 ACPI_FUNCTION_TRACE_PTR(ds_eval_bank_field_operands, op); 1046 1047 /* 1048 * This is where we evaluate the bank_value field of the 1049 * bank_field declaration 1050 */ 1051 1052 /* next_op points to the op that holds the Region */ 1053 1054 next_op = op->common.value.arg; 1055 1056 /* next_op points to the op that holds the Bank Register */ 1057 1058 next_op = next_op->common.next; 1059 1060 /* next_op points to the op that holds the Bank Value */ 1061 1062 next_op = next_op->common.next; 1063 1064 /* 1065 * Set proper index into operand stack for acpi_ds_obj_stack_push 1066 * invoked inside acpi_ds_create_operand. 1067 * 1068 * We use walk_state->Operands[0] to store the evaluated bank_value 1069 */ 1070 walk_state->operand_index = 0; 1071 1072 status = acpi_ds_create_operand(walk_state, next_op, 0); 1073 if (ACPI_FAILURE(status)) { 1074 return_ACPI_STATUS(status); 1075 } 1076 1077 status = acpi_ex_resolve_to_value(&walk_state->operands[0], walk_state); 1078 if (ACPI_FAILURE(status)) { 1079 return_ACPI_STATUS(status); 1080 } 1081 1082 ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, 1083 acpi_ps_get_opcode_name(op->common.aml_opcode), 1); 1084 /* 1085 * Get the bank_value operand and save it 1086 * (at Top of stack) 1087 */ 1088 operand_desc = walk_state->operands[0]; 1089 1090 /* Arg points to the start Bank Field */ 1091 1092 arg = acpi_ps_get_arg(op, 4); 1093 while (arg) { 1094 1095 /* Ignore OFFSET and ACCESSAS terms here */ 1096 1097 if (arg->common.aml_opcode == AML_INT_NAMEDFIELD_OP) { 1098 node = arg->common.node; 1099 1100 obj_desc = acpi_ns_get_attached_object(node); 1101 if (!obj_desc) { 1102 return_ACPI_STATUS(AE_NOT_EXIST); 1103 } 1104 1105 obj_desc->bank_field.value = 1106 (u32) operand_desc->integer.value; 1107 } 1108 1109 /* Move to next field in the list */ 1110 1111 arg = arg->common.next; 1112 } 1113 1114 acpi_ut_remove_reference(operand_desc); 1115 return_ACPI_STATUS(status); 1116 } 1117 1118 /******************************************************************************* 1119 * 1120 * FUNCTION: acpi_ds_exec_begin_control_op 1121 * 1122 * PARAMETERS: walk_list - The list that owns the walk stack 1123 * Op - The control Op 1124 * 1125 * RETURN: Status 1126 * 1127 * DESCRIPTION: Handles all control ops encountered during control method 1128 * execution. 1129 * 1130 ******************************************************************************/ 1131 1132 acpi_status 1133 acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, 1134 union acpi_parse_object *op) 1135 { 1136 acpi_status status = AE_OK; 1137 union acpi_generic_state *control_state; 1138 1139 ACPI_FUNCTION_NAME(ds_exec_begin_control_op); 1140 1141 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", op, 1142 op->common.aml_opcode, walk_state)); 1143 1144 switch (op->common.aml_opcode) { 1145 case AML_WHILE_OP: 1146 1147 /* 1148 * If this is an additional iteration of a while loop, continue. 1149 * There is no need to allocate a new control state. 1150 */ 1151 if (walk_state->control_state) { 1152 if (walk_state->control_state->control.aml_predicate_start 1153 == (walk_state->parser_state.aml - 1)) { 1154 1155 /* Reset the state to start-of-loop */ 1156 1157 walk_state->control_state->common.state = 1158 ACPI_CONTROL_CONDITIONAL_EXECUTING; 1159 break; 1160 } 1161 } 1162 1163 /*lint -fallthrough */ 1164 1165 case AML_IF_OP: 1166 1167 /* 1168 * IF/WHILE: Create a new control state to manage these 1169 * constructs. We need to manage these as a stack, in order 1170 * to handle nesting. 1171 */ 1172 control_state = acpi_ut_create_control_state(); 1173 if (!control_state) { 1174 status = AE_NO_MEMORY; 1175 break; 1176 } 1177 /* 1178 * Save a pointer to the predicate for multiple executions 1179 * of a loop 1180 */ 1181 control_state->control.aml_predicate_start = 1182 walk_state->parser_state.aml - 1; 1183 control_state->control.package_end = 1184 walk_state->parser_state.pkg_end; 1185 control_state->control.opcode = op->common.aml_opcode; 1186 1187 /* Push the control state on this walk's control stack */ 1188 1189 acpi_ut_push_generic_state(&walk_state->control_state, 1190 control_state); 1191 break; 1192 1193 case AML_ELSE_OP: 1194 1195 /* Predicate is in the state object */ 1196 /* If predicate is true, the IF was executed, ignore ELSE part */ 1197 1198 if (walk_state->last_predicate) { 1199 status = AE_CTRL_TRUE; 1200 } 1201 1202 break; 1203 1204 case AML_RETURN_OP: 1205 1206 break; 1207 1208 default: 1209 break; 1210 } 1211 1212 return (status); 1213 } 1214 1215 /******************************************************************************* 1216 * 1217 * FUNCTION: acpi_ds_exec_end_control_op 1218 * 1219 * PARAMETERS: walk_list - The list that owns the walk stack 1220 * Op - The control Op 1221 * 1222 * RETURN: Status 1223 * 1224 * DESCRIPTION: Handles all control ops encountered during control method 1225 * execution. 1226 * 1227 ******************************************************************************/ 1228 1229 acpi_status 1230 acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, 1231 union acpi_parse_object * op) 1232 { 1233 acpi_status status = AE_OK; 1234 union acpi_generic_state *control_state; 1235 1236 ACPI_FUNCTION_NAME(ds_exec_end_control_op); 1237 1238 switch (op->common.aml_opcode) { 1239 case AML_IF_OP: 1240 1241 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", op)); 1242 1243 /* 1244 * Save the result of the predicate in case there is an 1245 * ELSE to come 1246 */ 1247 walk_state->last_predicate = 1248 (u8) walk_state->control_state->common.value; 1249 1250 /* 1251 * Pop the control state that was created at the start 1252 * of the IF and free it 1253 */ 1254 control_state = 1255 acpi_ut_pop_generic_state(&walk_state->control_state); 1256 acpi_ut_delete_generic_state(control_state); 1257 break; 1258 1259 case AML_ELSE_OP: 1260 1261 break; 1262 1263 case AML_WHILE_OP: 1264 1265 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op)); 1266 1267 control_state = walk_state->control_state; 1268 if (control_state->common.value) { 1269 1270 /* Predicate was true, the body of the loop was just executed */ 1271 1272 /* 1273 * This loop counter mechanism allows the interpreter to escape 1274 * possibly infinite loops. This can occur in poorly written AML 1275 * when the hardware does not respond within a while loop and the 1276 * loop does not implement a timeout. 1277 */ 1278 control_state->control.loop_count++; 1279 if (control_state->control.loop_count > 1280 ACPI_MAX_LOOP_ITERATIONS) { 1281 status = AE_AML_INFINITE_LOOP; 1282 break; 1283 } 1284 1285 /* 1286 * Go back and evaluate the predicate and maybe execute the loop 1287 * another time 1288 */ 1289 status = AE_CTRL_PENDING; 1290 walk_state->aml_last_while = 1291 control_state->control.aml_predicate_start; 1292 break; 1293 } 1294 1295 /* Predicate was false, terminate this while loop */ 1296 1297 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 1298 "[WHILE_OP] termination! Op=%p\n", op)); 1299 1300 /* Pop this control state and free it */ 1301 1302 control_state = 1303 acpi_ut_pop_generic_state(&walk_state->control_state); 1304 acpi_ut_delete_generic_state(control_state); 1305 break; 1306 1307 case AML_RETURN_OP: 1308 1309 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 1310 "[RETURN_OP] Op=%p Arg=%p\n", op, 1311 op->common.value.arg)); 1312 1313 /* 1314 * One optional operand -- the return value 1315 * It can be either an immediate operand or a result that 1316 * has been bubbled up the tree 1317 */ 1318 if (op->common.value.arg) { 1319 1320 /* Since we have a real Return(), delete any implicit return */ 1321 1322 acpi_ds_clear_implicit_return(walk_state); 1323 1324 /* Return statement has an immediate operand */ 1325 1326 status = 1327 acpi_ds_create_operands(walk_state, 1328 op->common.value.arg); 1329 if (ACPI_FAILURE(status)) { 1330 return (status); 1331 } 1332 1333 /* 1334 * If value being returned is a Reference (such as 1335 * an arg or local), resolve it now because it may 1336 * cease to exist at the end of the method. 1337 */ 1338 status = 1339 acpi_ex_resolve_to_value(&walk_state->operands[0], 1340 walk_state); 1341 if (ACPI_FAILURE(status)) { 1342 return (status); 1343 } 1344 1345 /* 1346 * Get the return value and save as the last result 1347 * value. This is the only place where walk_state->return_desc 1348 * is set to anything other than zero! 1349 */ 1350 walk_state->return_desc = walk_state->operands[0]; 1351 } else if (walk_state->result_count) { 1352 1353 /* Since we have a real Return(), delete any implicit return */ 1354 1355 acpi_ds_clear_implicit_return(walk_state); 1356 1357 /* 1358 * The return value has come from a previous calculation. 1359 * 1360 * If value being returned is a Reference (such as 1361 * an arg or local), resolve it now because it may 1362 * cease to exist at the end of the method. 1363 * 1364 * Allow references created by the Index operator to return unchanged. 1365 */ 1366 if ((ACPI_GET_DESCRIPTOR_TYPE 1367 (walk_state->results->results.obj_desc[0]) == 1368 ACPI_DESC_TYPE_OPERAND) 1369 && ((walk_state->results->results.obj_desc[0])-> 1370 common.type == ACPI_TYPE_LOCAL_REFERENCE) 1371 && ((walk_state->results->results.obj_desc[0])-> 1372 reference.class != ACPI_REFCLASS_INDEX)) { 1373 status = 1374 acpi_ex_resolve_to_value(&walk_state-> 1375 results->results. 1376 obj_desc[0], 1377 walk_state); 1378 if (ACPI_FAILURE(status)) { 1379 return (status); 1380 } 1381 } 1382 1383 walk_state->return_desc = 1384 walk_state->results->results.obj_desc[0]; 1385 } else { 1386 /* No return operand */ 1387 1388 if (walk_state->num_operands) { 1389 acpi_ut_remove_reference(walk_state-> 1390 operands[0]); 1391 } 1392 1393 walk_state->operands[0] = NULL; 1394 walk_state->num_operands = 0; 1395 walk_state->return_desc = NULL; 1396 } 1397 1398 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 1399 "Completed RETURN_OP State=%p, RetVal=%p\n", 1400 walk_state, walk_state->return_desc)); 1401 1402 /* End the control method execution right now */ 1403 1404 status = AE_CTRL_TERMINATE; 1405 break; 1406 1407 case AML_NOOP_OP: 1408 1409 /* Just do nothing! */ 1410 break; 1411 1412 case AML_BREAK_POINT_OP: 1413 1414 /* 1415 * Set the single-step flag. This will cause the debugger (if present) 1416 * to break to the console within the AML debugger at the start of the 1417 * next AML instruction. 1418 */ 1419 ACPI_DEBUGGER_EXEC(acpi_gbl_cm_single_step = TRUE); 1420 ACPI_DEBUGGER_EXEC(acpi_os_printf 1421 ("**break** Executed AML BreakPoint opcode\n")); 1422 1423 /* Call to the OSL in case OS wants a piece of the action */ 1424 1425 status = acpi_os_signal(ACPI_SIGNAL_BREAKPOINT, 1426 "Executed AML Breakpoint opcode"); 1427 break; 1428 1429 case AML_BREAK_OP: 1430 case AML_CONTINUE_OP: /* ACPI 2.0 */ 1431 1432 /* Pop and delete control states until we find a while */ 1433 1434 while (walk_state->control_state && 1435 (walk_state->control_state->control.opcode != 1436 AML_WHILE_OP)) { 1437 control_state = 1438 acpi_ut_pop_generic_state(&walk_state-> 1439 control_state); 1440 acpi_ut_delete_generic_state(control_state); 1441 } 1442 1443 /* No while found? */ 1444 1445 if (!walk_state->control_state) { 1446 return (AE_AML_NO_WHILE); 1447 } 1448 1449 /* Was: walk_state->aml_last_while = walk_state->control_state->Control.aml_predicate_start; */ 1450 1451 walk_state->aml_last_while = 1452 walk_state->control_state->control.package_end; 1453 1454 /* Return status depending on opcode */ 1455 1456 if (op->common.aml_opcode == AML_BREAK_OP) { 1457 status = AE_CTRL_BREAK; 1458 } else { 1459 status = AE_CTRL_CONTINUE; 1460 } 1461 break; 1462 1463 default: 1464 1465 ACPI_ERROR((AE_INFO, "Unknown control opcode=0x%X Op=%p", 1466 op->common.aml_opcode, op)); 1467 1468 status = AE_AML_BAD_OPCODE; 1469 break; 1470 } 1471 1472 return (status); 1473 } 1474