1 /****************************************************************************** 2 * 3 * Module Name: dswexec - Dispatcher method execution callbacks; 4 * dispatch to interpreter. 5 * 6 *****************************************************************************/ 7 8 /* 9 * Copyright (C) 2000 - 2008, 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 "acdebug.h" 53 54 #define _COMPONENT ACPI_DISPATCHER 55 ACPI_MODULE_NAME("dswexec") 56 57 /* 58 * Dispatch table for opcode classes 59 */ 60 static ACPI_EXECUTE_OP acpi_gbl_op_type_dispatch[] = { 61 acpi_ex_opcode_0A_0T_1R, 62 acpi_ex_opcode_1A_0T_0R, 63 acpi_ex_opcode_1A_0T_1R, 64 acpi_ex_opcode_1A_1T_0R, 65 acpi_ex_opcode_1A_1T_1R, 66 acpi_ex_opcode_2A_0T_0R, 67 acpi_ex_opcode_2A_0T_1R, 68 acpi_ex_opcode_2A_1T_1R, 69 acpi_ex_opcode_2A_2T_1R, 70 acpi_ex_opcode_3A_0T_0R, 71 acpi_ex_opcode_3A_1T_1R, 72 acpi_ex_opcode_6A_0T_1R 73 }; 74 75 /***************************************************************************** 76 * 77 * FUNCTION: acpi_ds_get_predicate_value 78 * 79 * PARAMETERS: walk_state - Current state of the parse tree walk 80 * result_obj - if non-zero, pop result from result stack 81 * 82 * RETURN: Status 83 * 84 * DESCRIPTION: Get the result of a predicate evaluation 85 * 86 ****************************************************************************/ 87 88 acpi_status 89 acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, 90 union acpi_operand_object *result_obj) 91 { 92 acpi_status status = AE_OK; 93 union acpi_operand_object *obj_desc; 94 union acpi_operand_object *local_obj_desc = NULL; 95 96 ACPI_FUNCTION_TRACE_PTR(ds_get_predicate_value, walk_state); 97 98 walk_state->control_state->common.state = 0; 99 100 if (result_obj) { 101 status = acpi_ds_result_pop(&obj_desc, walk_state); 102 if (ACPI_FAILURE(status)) { 103 ACPI_EXCEPTION((AE_INFO, status, 104 "Could not get result from predicate evaluation")); 105 106 return_ACPI_STATUS(status); 107 } 108 } else { 109 status = acpi_ds_create_operand(walk_state, walk_state->op, 0); 110 if (ACPI_FAILURE(status)) { 111 return_ACPI_STATUS(status); 112 } 113 114 status = 115 acpi_ex_resolve_to_value(&walk_state->operands[0], 116 walk_state); 117 if (ACPI_FAILURE(status)) { 118 return_ACPI_STATUS(status); 119 } 120 121 obj_desc = walk_state->operands[0]; 122 } 123 124 if (!obj_desc) { 125 ACPI_ERROR((AE_INFO, 126 "No predicate ObjDesc=%p State=%p", 127 obj_desc, walk_state)); 128 129 return_ACPI_STATUS(AE_AML_NO_OPERAND); 130 } 131 132 /* 133 * Result of predicate evaluation must be an Integer 134 * object. Implicitly convert the argument if necessary. 135 */ 136 status = acpi_ex_convert_to_integer(obj_desc, &local_obj_desc, 16); 137 if (ACPI_FAILURE(status)) { 138 goto cleanup; 139 } 140 141 if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) { 142 ACPI_ERROR((AE_INFO, 143 "Bad predicate (not an integer) ObjDesc=%p State=%p Type=%X", 144 obj_desc, walk_state, 145 ACPI_GET_OBJECT_TYPE(obj_desc))); 146 147 status = AE_AML_OPERAND_TYPE; 148 goto cleanup; 149 } 150 151 /* Truncate the predicate to 32-bits if necessary */ 152 153 acpi_ex_truncate_for32bit_table(local_obj_desc); 154 155 /* 156 * Save the result of the predicate evaluation on 157 * the control stack 158 */ 159 if (local_obj_desc->integer.value) { 160 walk_state->control_state->common.value = TRUE; 161 } else { 162 /* 163 * Predicate is FALSE, we will just toss the 164 * rest of the package 165 */ 166 walk_state->control_state->common.value = FALSE; 167 status = AE_CTRL_FALSE; 168 } 169 170 /* Predicate can be used for an implicit return value */ 171 172 (void)acpi_ds_do_implicit_return(local_obj_desc, walk_state, TRUE); 173 174 cleanup: 175 176 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", 177 walk_state->control_state->common.value, 178 walk_state->op)); 179 180 /* Break to debugger to display result */ 181 182 ACPI_DEBUGGER_EXEC(acpi_db_display_result_object 183 (local_obj_desc, walk_state)); 184 185 /* 186 * Delete the predicate result object (we know that 187 * we don't need it anymore) 188 */ 189 if (local_obj_desc != obj_desc) { 190 acpi_ut_remove_reference(local_obj_desc); 191 } 192 acpi_ut_remove_reference(obj_desc); 193 194 walk_state->control_state->common.state = ACPI_CONTROL_NORMAL; 195 return_ACPI_STATUS(status); 196 } 197 198 /***************************************************************************** 199 * 200 * FUNCTION: acpi_ds_exec_begin_op 201 * 202 * PARAMETERS: walk_state - Current state of the parse tree walk 203 * out_op - Where to return op if a new one is created 204 * 205 * RETURN: Status 206 * 207 * DESCRIPTION: Descending callback used during the execution of control 208 * methods. This is where most operators and operands are 209 * dispatched to the interpreter. 210 * 211 ****************************************************************************/ 212 213 acpi_status 214 acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, 215 union acpi_parse_object **out_op) 216 { 217 union acpi_parse_object *op; 218 acpi_status status = AE_OK; 219 u32 opcode_class; 220 221 ACPI_FUNCTION_TRACE_PTR(ds_exec_begin_op, walk_state); 222 223 op = walk_state->op; 224 if (!op) { 225 status = acpi_ds_load2_begin_op(walk_state, out_op); 226 if (ACPI_FAILURE(status)) { 227 goto error_exit; 228 } 229 230 op = *out_op; 231 walk_state->op = op; 232 walk_state->opcode = op->common.aml_opcode; 233 walk_state->op_info = 234 acpi_ps_get_opcode_info(op->common.aml_opcode); 235 236 if (acpi_ns_opens_scope(walk_state->op_info->object_type)) { 237 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 238 "(%s) Popping scope for Op %p\n", 239 acpi_ut_get_type_name(walk_state-> 240 op_info-> 241 object_type), 242 op)); 243 244 status = acpi_ds_scope_stack_pop(walk_state); 245 if (ACPI_FAILURE(status)) { 246 goto error_exit; 247 } 248 } 249 } 250 251 if (op == walk_state->origin) { 252 if (out_op) { 253 *out_op = op; 254 } 255 256 return_ACPI_STATUS(AE_OK); 257 } 258 259 /* 260 * If the previous opcode was a conditional, this opcode 261 * must be the beginning of the associated predicate. 262 * Save this knowledge in the current scope descriptor 263 */ 264 if ((walk_state->control_state) && 265 (walk_state->control_state->common.state == 266 ACPI_CONTROL_CONDITIONAL_EXECUTING)) { 267 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 268 "Exec predicate Op=%p State=%p\n", op, 269 walk_state)); 270 271 walk_state->control_state->common.state = 272 ACPI_CONTROL_PREDICATE_EXECUTING; 273 274 /* Save start of predicate */ 275 276 walk_state->control_state->control.predicate_op = op; 277 } 278 279 opcode_class = walk_state->op_info->class; 280 281 /* We want to send namepaths to the load code */ 282 283 if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { 284 opcode_class = AML_CLASS_NAMED_OBJECT; 285 } 286 287 /* 288 * Handle the opcode based upon the opcode type 289 */ 290 switch (opcode_class) { 291 case AML_CLASS_CONTROL: 292 293 status = acpi_ds_exec_begin_control_op(walk_state, op); 294 break; 295 296 case AML_CLASS_NAMED_OBJECT: 297 298 if (walk_state->walk_type & ACPI_WALK_METHOD) { 299 /* 300 * Found a named object declaration during method execution; 301 * we must enter this object into the namespace. The created 302 * object is temporary and will be deleted upon completion of 303 * the execution of this method. 304 */ 305 status = acpi_ds_load2_begin_op(walk_state, NULL); 306 } 307 308 break; 309 310 case AML_CLASS_EXECUTE: 311 case AML_CLASS_CREATE: 312 313 break; 314 315 default: 316 break; 317 } 318 319 /* Nothing to do here during method execution */ 320 321 return_ACPI_STATUS(status); 322 323 error_exit: 324 status = acpi_ds_method_error(status, walk_state); 325 return_ACPI_STATUS(status); 326 } 327 328 /***************************************************************************** 329 * 330 * FUNCTION: acpi_ds_exec_end_op 331 * 332 * PARAMETERS: walk_state - Current state of the parse tree walk 333 * 334 * RETURN: Status 335 * 336 * DESCRIPTION: Ascending callback used during the execution of control 337 * methods. The only thing we really need to do here is to 338 * notice the beginning of IF, ELSE, and WHILE blocks. 339 * 340 ****************************************************************************/ 341 342 acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) 343 { 344 union acpi_parse_object *op; 345 acpi_status status = AE_OK; 346 u32 op_type; 347 u32 op_class; 348 union acpi_parse_object *next_op; 349 union acpi_parse_object *first_arg; 350 351 ACPI_FUNCTION_TRACE_PTR(ds_exec_end_op, walk_state); 352 353 op = walk_state->op; 354 op_type = walk_state->op_info->type; 355 op_class = walk_state->op_info->class; 356 357 if (op_class == AML_CLASS_UNKNOWN) { 358 ACPI_ERROR((AE_INFO, "Unknown opcode %X", 359 op->common.aml_opcode)); 360 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 361 } 362 363 first_arg = op->common.value.arg; 364 365 /* Init the walk state */ 366 367 walk_state->num_operands = 0; 368 walk_state->operand_index = 0; 369 walk_state->return_desc = NULL; 370 walk_state->result_obj = NULL; 371 372 /* Call debugger for single step support (DEBUG build only) */ 373 374 ACPI_DEBUGGER_EXEC(status = 375 acpi_db_single_step(walk_state, op, op_class)); 376 ACPI_DEBUGGER_EXEC(if (ACPI_FAILURE(status)) { 377 return_ACPI_STATUS(status);} 378 ) ; 379 380 /* Decode the Opcode Class */ 381 382 switch (op_class) { 383 case AML_CLASS_ARGUMENT: /* Constants, literals, etc. */ 384 385 if (walk_state->opcode == AML_INT_NAMEPATH_OP) { 386 status = acpi_ds_evaluate_name_path(walk_state); 387 if (ACPI_FAILURE(status)) { 388 goto cleanup; 389 } 390 } 391 break; 392 393 case AML_CLASS_EXECUTE: /* Most operators with arguments */ 394 395 /* Build resolved operand stack */ 396 397 status = acpi_ds_create_operands(walk_state, first_arg); 398 if (ACPI_FAILURE(status)) { 399 goto cleanup; 400 } 401 402 /* 403 * All opcodes require operand resolution, with the only exceptions 404 * being the object_type and size_of operators. 405 */ 406 if (!(walk_state->op_info->flags & AML_NO_OPERAND_RESOLVE)) { 407 408 /* Resolve all operands */ 409 410 status = acpi_ex_resolve_operands(walk_state->opcode, 411 &(walk_state-> 412 operands 413 [walk_state-> 414 num_operands - 1]), 415 walk_state); 416 } 417 418 if (ACPI_SUCCESS(status)) { 419 /* 420 * Dispatch the request to the appropriate interpreter handler 421 * routine. There is one routine per opcode "type" based upon the 422 * number of opcode arguments and return type. 423 */ 424 status = 425 acpi_gbl_op_type_dispatch[op_type] (walk_state); 426 } else { 427 /* 428 * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the 429 * Local is uninitialized. 430 */ 431 if ((status == AE_AML_UNINITIALIZED_LOCAL) && 432 (walk_state->opcode == AML_STORE_OP) && 433 (walk_state->operands[0]->common.type == 434 ACPI_TYPE_LOCAL_REFERENCE) 435 && (walk_state->operands[1]->common.type == 436 ACPI_TYPE_LOCAL_REFERENCE) 437 && (walk_state->operands[0]->reference.class == 438 walk_state->operands[1]->reference.class) 439 && (walk_state->operands[0]->reference.value == 440 walk_state->operands[1]->reference.value)) { 441 status = AE_OK; 442 } else { 443 ACPI_EXCEPTION((AE_INFO, status, 444 "While resolving operands for [%s]", 445 acpi_ps_get_opcode_name 446 (walk_state->opcode))); 447 } 448 } 449 450 /* Always delete the argument objects and clear the operand stack */ 451 452 acpi_ds_clear_operands(walk_state); 453 454 /* 455 * If a result object was returned from above, push it on the 456 * current result stack 457 */ 458 if (ACPI_SUCCESS(status) && walk_state->result_obj) { 459 status = 460 acpi_ds_result_push(walk_state->result_obj, 461 walk_state); 462 } 463 break; 464 465 default: 466 467 switch (op_type) { 468 case AML_TYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ 469 470 /* 1 Operand, 0 external_result, 0 internal_result */ 471 472 status = acpi_ds_exec_end_control_op(walk_state, op); 473 474 break; 475 476 case AML_TYPE_METHOD_CALL: 477 478 /* 479 * If the method is referenced from within a package 480 * declaration, it is not a invocation of the method, just 481 * a reference to it. 482 */ 483 if ((op->asl.parent) && 484 ((op->asl.parent->asl.aml_opcode == AML_PACKAGE_OP) 485 || (op->asl.parent->asl.aml_opcode == 486 AML_VAR_PACKAGE_OP))) { 487 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 488 "Method Reference in a Package, Op=%p\n", 489 op)); 490 491 op->common.node = 492 (struct acpi_namespace_node *)op->asl.value. 493 arg->asl.node; 494 acpi_ut_add_reference(op->asl.value.arg->asl. 495 node->object); 496 return_ACPI_STATUS(AE_OK); 497 } 498 499 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 500 "Method invocation, Op=%p\n", op)); 501 502 /* 503 * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains 504 * the method Node pointer 505 */ 506 /* next_op points to the op that holds the method name */ 507 508 next_op = first_arg; 509 510 /* next_op points to first argument op */ 511 512 next_op = next_op->common.next; 513 514 /* 515 * Get the method's arguments and put them on the operand stack 516 */ 517 status = acpi_ds_create_operands(walk_state, next_op); 518 if (ACPI_FAILURE(status)) { 519 break; 520 } 521 522 /* 523 * Since the operands will be passed to another control method, 524 * we must resolve all local references here (Local variables, 525 * arguments to *this* method, etc.) 526 */ 527 status = acpi_ds_resolve_operands(walk_state); 528 if (ACPI_FAILURE(status)) { 529 530 /* On error, clear all resolved operands */ 531 532 acpi_ds_clear_operands(walk_state); 533 break; 534 } 535 536 /* 537 * Tell the walk loop to preempt this running method and 538 * execute the new method 539 */ 540 status = AE_CTRL_TRANSFER; 541 542 /* 543 * Return now; we don't want to disturb anything, 544 * especially the operand count! 545 */ 546 return_ACPI_STATUS(status); 547 548 case AML_TYPE_CREATE_FIELD: 549 550 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 551 "Executing CreateField Buffer/Index Op=%p\n", 552 op)); 553 554 status = acpi_ds_load2_end_op(walk_state); 555 if (ACPI_FAILURE(status)) { 556 break; 557 } 558 559 status = 560 acpi_ds_eval_buffer_field_operands(walk_state, op); 561 break; 562 563 case AML_TYPE_CREATE_OBJECT: 564 565 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 566 "Executing CreateObject (Buffer/Package) Op=%p\n", 567 op)); 568 569 switch (op->common.parent->common.aml_opcode) { 570 case AML_NAME_OP: 571 572 /* 573 * Put the Node on the object stack (Contains the ACPI Name 574 * of this object) 575 */ 576 walk_state->operands[0] = 577 (void *)op->common.parent->common.node; 578 walk_state->num_operands = 1; 579 580 status = acpi_ds_create_node(walk_state, 581 op->common.parent-> 582 common.node, 583 op->common.parent); 584 if (ACPI_FAILURE(status)) { 585 break; 586 } 587 588 /* Fall through */ 589 /*lint -fallthrough */ 590 591 case AML_INT_EVAL_SUBTREE_OP: 592 593 status = 594 acpi_ds_eval_data_object_operands 595 (walk_state, op, 596 acpi_ns_get_attached_object(op->common. 597 parent->common. 598 node)); 599 break; 600 601 default: 602 603 status = 604 acpi_ds_eval_data_object_operands 605 (walk_state, op, NULL); 606 break; 607 } 608 609 /* 610 * If a result object was returned from above, push it on the 611 * current result stack 612 */ 613 if (walk_state->result_obj) { 614 status = 615 acpi_ds_result_push(walk_state->result_obj, 616 walk_state); 617 } 618 break; 619 620 case AML_TYPE_NAMED_FIELD: 621 case AML_TYPE_NAMED_COMPLEX: 622 case AML_TYPE_NAMED_SIMPLE: 623 case AML_TYPE_NAMED_NO_OBJ: 624 625 status = acpi_ds_load2_end_op(walk_state); 626 if (ACPI_FAILURE(status)) { 627 break; 628 } 629 630 if (op->common.aml_opcode == AML_REGION_OP) { 631 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 632 "Executing OpRegion Address/Length Op=%p\n", 633 op)); 634 635 status = 636 acpi_ds_eval_region_operands(walk_state, 637 op); 638 if (ACPI_FAILURE(status)) { 639 break; 640 } 641 } else if (op->common.aml_opcode == AML_DATA_REGION_OP) { 642 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 643 "Executing DataTableRegion Strings Op=%p\n", 644 op)); 645 646 status = 647 acpi_ds_eval_table_region_operands 648 (walk_state, op); 649 if (ACPI_FAILURE(status)) { 650 break; 651 } 652 } else if (op->common.aml_opcode == AML_BANK_FIELD_OP) { 653 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 654 "Executing BankField Op=%p\n", 655 op)); 656 657 status = 658 acpi_ds_eval_bank_field_operands(walk_state, 659 op); 660 if (ACPI_FAILURE(status)) { 661 break; 662 } 663 } 664 break; 665 666 case AML_TYPE_UNDEFINED: 667 668 ACPI_ERROR((AE_INFO, 669 "Undefined opcode type Op=%p", op)); 670 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 671 672 case AML_TYPE_BOGUS: 673 674 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 675 "Internal opcode=%X type Op=%p\n", 676 walk_state->opcode, op)); 677 break; 678 679 default: 680 681 ACPI_ERROR((AE_INFO, 682 "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p", 683 op_class, op_type, op->common.aml_opcode, 684 op)); 685 686 status = AE_NOT_IMPLEMENTED; 687 break; 688 } 689 } 690 691 /* 692 * ACPI 2.0 support for 64-bit integers: Truncate numeric 693 * result value if we are executing from a 32-bit ACPI table 694 */ 695 acpi_ex_truncate_for32bit_table(walk_state->result_obj); 696 697 /* 698 * Check if we just completed the evaluation of a 699 * conditional predicate 700 */ 701 if ((ACPI_SUCCESS(status)) && 702 (walk_state->control_state) && 703 (walk_state->control_state->common.state == 704 ACPI_CONTROL_PREDICATE_EXECUTING) && 705 (walk_state->control_state->control.predicate_op == op)) { 706 status = 707 acpi_ds_get_predicate_value(walk_state, 708 walk_state->result_obj); 709 walk_state->result_obj = NULL; 710 } 711 712 cleanup: 713 714 if (walk_state->result_obj) { 715 716 /* Break to debugger to display result */ 717 718 ACPI_DEBUGGER_EXEC(acpi_db_display_result_object 719 (walk_state->result_obj, walk_state)); 720 721 /* 722 * Delete the result op if and only if: 723 * Parent will not use the result -- such as any 724 * non-nested type2 op in a method (parent will be method) 725 */ 726 acpi_ds_delete_result_if_not_used(op, walk_state->result_obj, 727 walk_state); 728 } 729 #ifdef _UNDER_DEVELOPMENT 730 731 if (walk_state->parser_state.aml == walk_state->parser_state.aml_end) { 732 acpi_db_method_end(walk_state); 733 } 734 #endif 735 736 /* Invoke exception handler on error */ 737 738 if (ACPI_FAILURE(status)) { 739 status = acpi_ds_method_error(status, walk_state); 740 } 741 742 /* Always clear the object stack */ 743 744 walk_state->num_operands = 0; 745 return_ACPI_STATUS(status); 746 } 747