1 /****************************************************************************** 2 * 3 * Module Name: dswexec - Dispatcher method execution callbacks; 4 * dispatch to interpreter. 5 * 6 *****************************************************************************/ 7 8 /* 9 * Copyright (C) 2000 - 2011, 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 #define __DSWEXEC_C__ 46 47 #include "acpi.h" 48 #include "accommon.h" 49 #include "acparser.h" 50 #include "amlcode.h" 51 #include "acdispat.h" 52 #include "acinterp.h" 53 #include "acnamesp.h" 54 #include "acdebug.h" 55 56 57 #define _COMPONENT ACPI_DISPATCHER 58 ACPI_MODULE_NAME ("dswexec") 59 60 /* 61 * Dispatch table for opcode classes 62 */ 63 static ACPI_EXECUTE_OP AcpiGbl_OpTypeDispatch [] = 64 { 65 AcpiExOpcode_0A_0T_1R, 66 AcpiExOpcode_1A_0T_0R, 67 AcpiExOpcode_1A_0T_1R, 68 AcpiExOpcode_1A_1T_0R, 69 AcpiExOpcode_1A_1T_1R, 70 AcpiExOpcode_2A_0T_0R, 71 AcpiExOpcode_2A_0T_1R, 72 AcpiExOpcode_2A_1T_1R, 73 AcpiExOpcode_2A_2T_1R, 74 AcpiExOpcode_3A_0T_0R, 75 AcpiExOpcode_3A_1T_1R, 76 AcpiExOpcode_6A_0T_1R 77 }; 78 79 80 /***************************************************************************** 81 * 82 * FUNCTION: AcpiDsGetPredicateValue 83 * 84 * PARAMETERS: WalkState - Current state of the parse tree walk 85 * ResultObj - if non-zero, pop result from result stack 86 * 87 * RETURN: Status 88 * 89 * DESCRIPTION: Get the result of a predicate evaluation 90 * 91 ****************************************************************************/ 92 93 ACPI_STATUS 94 AcpiDsGetPredicateValue ( 95 ACPI_WALK_STATE *WalkState, 96 ACPI_OPERAND_OBJECT *ResultObj) 97 { 98 ACPI_STATUS Status = AE_OK; 99 ACPI_OPERAND_OBJECT *ObjDesc; 100 ACPI_OPERAND_OBJECT *LocalObjDesc = NULL; 101 102 103 ACPI_FUNCTION_TRACE_PTR (DsGetPredicateValue, WalkState); 104 105 106 WalkState->ControlState->Common.State = 0; 107 108 if (ResultObj) 109 { 110 Status = AcpiDsResultPop (&ObjDesc, WalkState); 111 if (ACPI_FAILURE (Status)) 112 { 113 ACPI_EXCEPTION ((AE_INFO, Status, 114 "Could not get result from predicate evaluation")); 115 116 return_ACPI_STATUS (Status); 117 } 118 } 119 else 120 { 121 Status = AcpiDsCreateOperand (WalkState, WalkState->Op, 0); 122 if (ACPI_FAILURE (Status)) 123 { 124 return_ACPI_STATUS (Status); 125 } 126 127 Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState); 128 if (ACPI_FAILURE (Status)) 129 { 130 return_ACPI_STATUS (Status); 131 } 132 133 ObjDesc = WalkState->Operands [0]; 134 } 135 136 if (!ObjDesc) 137 { 138 ACPI_ERROR ((AE_INFO, 139 "No predicate ObjDesc=%p State=%p", 140 ObjDesc, WalkState)); 141 142 return_ACPI_STATUS (AE_AML_NO_OPERAND); 143 } 144 145 /* 146 * Result of predicate evaluation must be an Integer 147 * object. Implicitly convert the argument if necessary. 148 */ 149 Status = AcpiExConvertToInteger (ObjDesc, &LocalObjDesc, 16); 150 if (ACPI_FAILURE (Status)) 151 { 152 goto Cleanup; 153 } 154 155 if (LocalObjDesc->Common.Type != ACPI_TYPE_INTEGER) 156 { 157 ACPI_ERROR ((AE_INFO, 158 "Bad predicate (not an integer) ObjDesc=%p State=%p Type=0x%X", 159 ObjDesc, WalkState, ObjDesc->Common.Type)); 160 161 Status = AE_AML_OPERAND_TYPE; 162 goto Cleanup; 163 } 164 165 /* Truncate the predicate to 32-bits if necessary */ 166 167 AcpiExTruncateFor32bitTable (LocalObjDesc); 168 169 /* 170 * Save the result of the predicate evaluation on 171 * the control stack 172 */ 173 if (LocalObjDesc->Integer.Value) 174 { 175 WalkState->ControlState->Common.Value = TRUE; 176 } 177 else 178 { 179 /* 180 * Predicate is FALSE, we will just toss the 181 * rest of the package 182 */ 183 WalkState->ControlState->Common.Value = FALSE; 184 Status = AE_CTRL_FALSE; 185 } 186 187 /* Predicate can be used for an implicit return value */ 188 189 (void) AcpiDsDoImplicitReturn (LocalObjDesc, WalkState, TRUE); 190 191 192 Cleanup: 193 194 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", 195 WalkState->ControlState->Common.Value, WalkState->Op)); 196 197 /* Break to debugger to display result */ 198 199 ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (LocalObjDesc, WalkState)); 200 201 /* 202 * Delete the predicate result object (we know that 203 * we don't need it anymore) 204 */ 205 if (LocalObjDesc != ObjDesc) 206 { 207 AcpiUtRemoveReference (LocalObjDesc); 208 } 209 AcpiUtRemoveReference (ObjDesc); 210 211 WalkState->ControlState->Common.State = ACPI_CONTROL_NORMAL; 212 return_ACPI_STATUS (Status); 213 } 214 215 216 /***************************************************************************** 217 * 218 * FUNCTION: AcpiDsExecBeginOp 219 * 220 * PARAMETERS: WalkState - Current state of the parse tree walk 221 * OutOp - Where to return op if a new one is created 222 * 223 * RETURN: Status 224 * 225 * DESCRIPTION: Descending callback used during the execution of control 226 * methods. This is where most operators and operands are 227 * dispatched to the interpreter. 228 * 229 ****************************************************************************/ 230 231 ACPI_STATUS 232 AcpiDsExecBeginOp ( 233 ACPI_WALK_STATE *WalkState, 234 ACPI_PARSE_OBJECT **OutOp) 235 { 236 ACPI_PARSE_OBJECT *Op; 237 ACPI_STATUS Status = AE_OK; 238 UINT32 OpcodeClass; 239 240 241 ACPI_FUNCTION_TRACE_PTR (DsExecBeginOp, WalkState); 242 243 244 Op = WalkState->Op; 245 if (!Op) 246 { 247 Status = AcpiDsLoad2BeginOp (WalkState, OutOp); 248 if (ACPI_FAILURE (Status)) 249 { 250 goto ErrorExit; 251 } 252 253 Op = *OutOp; 254 WalkState->Op = Op; 255 WalkState->Opcode = Op->Common.AmlOpcode; 256 WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 257 258 if (AcpiNsOpensScope (WalkState->OpInfo->ObjectType)) 259 { 260 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 261 "(%s) Popping scope for Op %p\n", 262 AcpiUtGetTypeName (WalkState->OpInfo->ObjectType), Op)); 263 264 Status = AcpiDsScopeStackPop (WalkState); 265 if (ACPI_FAILURE (Status)) 266 { 267 goto ErrorExit; 268 } 269 } 270 } 271 272 if (Op == WalkState->Origin) 273 { 274 if (OutOp) 275 { 276 *OutOp = Op; 277 } 278 279 return_ACPI_STATUS (AE_OK); 280 } 281 282 /* 283 * If the previous opcode was a conditional, this opcode 284 * must be the beginning of the associated predicate. 285 * Save this knowledge in the current scope descriptor 286 */ 287 if ((WalkState->ControlState) && 288 (WalkState->ControlState->Common.State == 289 ACPI_CONTROL_CONDITIONAL_EXECUTING)) 290 { 291 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%p State=%p\n", 292 Op, WalkState)); 293 294 WalkState->ControlState->Common.State = ACPI_CONTROL_PREDICATE_EXECUTING; 295 296 /* Save start of predicate */ 297 298 WalkState->ControlState->Control.PredicateOp = Op; 299 } 300 301 302 OpcodeClass = WalkState->OpInfo->Class; 303 304 /* We want to send namepaths to the load code */ 305 306 if (Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 307 { 308 OpcodeClass = AML_CLASS_NAMED_OBJECT; 309 } 310 311 /* 312 * Handle the opcode based upon the opcode type 313 */ 314 switch (OpcodeClass) 315 { 316 case AML_CLASS_CONTROL: 317 318 Status = AcpiDsExecBeginControlOp (WalkState, Op); 319 break; 320 321 322 case AML_CLASS_NAMED_OBJECT: 323 324 if (WalkState->WalkType & ACPI_WALK_METHOD) 325 { 326 /* 327 * Found a named object declaration during method execution; 328 * we must enter this object into the namespace. The created 329 * object is temporary and will be deleted upon completion of 330 * the execution of this method. 331 * 332 * Note 10/2010: Except for the Scope() op. This opcode does 333 * not actually create a new object, it refers to an existing 334 * object. However, for Scope(), we want to indeed open a 335 * new scope. 336 */ 337 if (Op->Common.AmlOpcode != AML_SCOPE_OP) 338 { 339 Status = AcpiDsLoad2BeginOp (WalkState, NULL); 340 } 341 else 342 { 343 Status = AcpiDsScopeStackPush (Op->Named.Node, 344 Op->Named.Node->Type, WalkState); 345 if (ACPI_FAILURE (Status)) 346 { 347 return_ACPI_STATUS (Status); 348 } 349 } 350 } 351 break; 352 353 354 case AML_CLASS_EXECUTE: 355 case AML_CLASS_CREATE: 356 357 break; 358 359 360 default: 361 break; 362 } 363 364 /* Nothing to do here during method execution */ 365 366 return_ACPI_STATUS (Status); 367 368 369 ErrorExit: 370 Status = AcpiDsMethodError (Status, WalkState); 371 return_ACPI_STATUS (Status); 372 } 373 374 375 /***************************************************************************** 376 * 377 * FUNCTION: AcpiDsExecEndOp 378 * 379 * PARAMETERS: WalkState - Current state of the parse tree walk 380 * 381 * RETURN: Status 382 * 383 * DESCRIPTION: Ascending callback used during the execution of control 384 * methods. The only thing we really need to do here is to 385 * notice the beginning of IF, ELSE, and WHILE blocks. 386 * 387 ****************************************************************************/ 388 389 ACPI_STATUS 390 AcpiDsExecEndOp ( 391 ACPI_WALK_STATE *WalkState) 392 { 393 ACPI_PARSE_OBJECT *Op; 394 ACPI_STATUS Status = AE_OK; 395 UINT32 OpType; 396 UINT32 OpClass; 397 ACPI_PARSE_OBJECT *NextOp; 398 ACPI_PARSE_OBJECT *FirstArg; 399 400 401 ACPI_FUNCTION_TRACE_PTR (DsExecEndOp, WalkState); 402 403 404 Op = WalkState->Op; 405 OpType = WalkState->OpInfo->Type; 406 OpClass = WalkState->OpInfo->Class; 407 408 if (OpClass == AML_CLASS_UNKNOWN) 409 { 410 ACPI_ERROR ((AE_INFO, "Unknown opcode 0x%X", Op->Common.AmlOpcode)); 411 return_ACPI_STATUS (AE_NOT_IMPLEMENTED); 412 } 413 414 FirstArg = Op->Common.Value.Arg; 415 416 /* Init the walk state */ 417 418 WalkState->NumOperands = 0; 419 WalkState->OperandIndex = 0; 420 WalkState->ReturnDesc = NULL; 421 WalkState->ResultObj = NULL; 422 423 /* Call debugger for single step support (DEBUG build only) */ 424 425 ACPI_DEBUGGER_EXEC (Status = AcpiDbSingleStep (WalkState, Op, OpClass)); 426 ACPI_DEBUGGER_EXEC (if (ACPI_FAILURE (Status)) {return_ACPI_STATUS (Status);}); 427 428 /* Decode the Opcode Class */ 429 430 switch (OpClass) 431 { 432 case AML_CLASS_ARGUMENT: /* Constants, literals, etc. */ 433 434 if (WalkState->Opcode == AML_INT_NAMEPATH_OP) 435 { 436 Status = AcpiDsEvaluateNamePath (WalkState); 437 if (ACPI_FAILURE (Status)) 438 { 439 goto Cleanup; 440 } 441 } 442 break; 443 444 445 case AML_CLASS_EXECUTE: /* Most operators with arguments */ 446 447 /* Build resolved operand stack */ 448 449 Status = AcpiDsCreateOperands (WalkState, FirstArg); 450 if (ACPI_FAILURE (Status)) 451 { 452 goto Cleanup; 453 } 454 455 /* 456 * All opcodes require operand resolution, with the only exceptions 457 * being the ObjectType and SizeOf operators. 458 */ 459 if (!(WalkState->OpInfo->Flags & AML_NO_OPERAND_RESOLVE)) 460 { 461 /* Resolve all operands */ 462 463 Status = AcpiExResolveOperands (WalkState->Opcode, 464 &(WalkState->Operands [WalkState->NumOperands -1]), 465 WalkState); 466 } 467 468 if (ACPI_SUCCESS (Status)) 469 { 470 /* 471 * Dispatch the request to the appropriate interpreter handler 472 * routine. There is one routine per opcode "type" based upon the 473 * number of opcode arguments and return type. 474 */ 475 Status = AcpiGbl_OpTypeDispatch[OpType] (WalkState); 476 } 477 else 478 { 479 /* 480 * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the 481 * Local is uninitialized. 482 */ 483 if ((Status == AE_AML_UNINITIALIZED_LOCAL) && 484 (WalkState->Opcode == AML_STORE_OP) && 485 (WalkState->Operands[0]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && 486 (WalkState->Operands[1]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) && 487 (WalkState->Operands[0]->Reference.Class == 488 WalkState->Operands[1]->Reference.Class) && 489 (WalkState->Operands[0]->Reference.Value == 490 WalkState->Operands[1]->Reference.Value)) 491 { 492 Status = AE_OK; 493 } 494 else 495 { 496 ACPI_EXCEPTION ((AE_INFO, Status, 497 "While resolving operands for [%s]", 498 AcpiPsGetOpcodeName (WalkState->Opcode))); 499 } 500 } 501 502 /* Always delete the argument objects and clear the operand stack */ 503 504 AcpiDsClearOperands (WalkState); 505 506 /* 507 * If a result object was returned from above, push it on the 508 * current result stack 509 */ 510 if (ACPI_SUCCESS (Status) && 511 WalkState->ResultObj) 512 { 513 Status = AcpiDsResultPush (WalkState->ResultObj, WalkState); 514 } 515 break; 516 517 518 default: 519 520 switch (OpType) 521 { 522 case AML_TYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ 523 524 /* 1 Operand, 0 ExternalResult, 0 InternalResult */ 525 526 Status = AcpiDsExecEndControlOp (WalkState, Op); 527 528 break; 529 530 531 case AML_TYPE_METHOD_CALL: 532 533 /* 534 * If the method is referenced from within a package 535 * declaration, it is not a invocation of the method, just 536 * a reference to it. 537 */ 538 if ((Op->Asl.Parent) && 539 ((Op->Asl.Parent->Asl.AmlOpcode == AML_PACKAGE_OP) || 540 (Op->Asl.Parent->Asl.AmlOpcode == AML_VAR_PACKAGE_OP))) 541 { 542 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 543 "Method Reference in a Package, Op=%p\n", Op)); 544 545 Op->Common.Node = (ACPI_NAMESPACE_NODE *) Op->Asl.Value.Arg->Asl.Node; 546 AcpiUtAddReference (Op->Asl.Value.Arg->Asl.Node->Object); 547 return_ACPI_STATUS (AE_OK); 548 } 549 550 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%p\n", Op)); 551 552 /* 553 * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains 554 * the method Node pointer 555 */ 556 /* NextOp points to the op that holds the method name */ 557 558 NextOp = FirstArg; 559 560 /* NextOp points to first argument op */ 561 562 NextOp = NextOp->Common.Next; 563 564 /* 565 * Get the method's arguments and put them on the operand stack 566 */ 567 Status = AcpiDsCreateOperands (WalkState, NextOp); 568 if (ACPI_FAILURE (Status)) 569 { 570 break; 571 } 572 573 /* 574 * Since the operands will be passed to another control method, 575 * we must resolve all local references here (Local variables, 576 * arguments to *this* method, etc.) 577 */ 578 Status = AcpiDsResolveOperands (WalkState); 579 if (ACPI_FAILURE (Status)) 580 { 581 /* On error, clear all resolved operands */ 582 583 AcpiDsClearOperands (WalkState); 584 break; 585 } 586 587 /* 588 * Tell the walk loop to preempt this running method and 589 * execute the new method 590 */ 591 Status = AE_CTRL_TRANSFER; 592 593 /* 594 * Return now; we don't want to disturb anything, 595 * especially the operand count! 596 */ 597 return_ACPI_STATUS (Status); 598 599 600 case AML_TYPE_CREATE_FIELD: 601 602 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 603 "Executing CreateField Buffer/Index Op=%p\n", Op)); 604 605 Status = AcpiDsLoad2EndOp (WalkState); 606 if (ACPI_FAILURE (Status)) 607 { 608 break; 609 } 610 611 Status = AcpiDsEvalBufferFieldOperands (WalkState, Op); 612 break; 613 614 615 case AML_TYPE_CREATE_OBJECT: 616 617 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 618 "Executing CreateObject (Buffer/Package) Op=%p\n", Op)); 619 620 switch (Op->Common.Parent->Common.AmlOpcode) 621 { 622 case AML_NAME_OP: 623 624 /* 625 * Put the Node on the object stack (Contains the ACPI Name 626 * of this object) 627 */ 628 WalkState->Operands[0] = (void *) Op->Common.Parent->Common.Node; 629 WalkState->NumOperands = 1; 630 631 Status = AcpiDsCreateNode (WalkState, 632 Op->Common.Parent->Common.Node, 633 Op->Common.Parent); 634 if (ACPI_FAILURE (Status)) 635 { 636 break; 637 } 638 639 /* Fall through */ 640 /*lint -fallthrough */ 641 642 case AML_INT_EVAL_SUBTREE_OP: 643 644 Status = AcpiDsEvalDataObjectOperands (WalkState, Op, 645 AcpiNsGetAttachedObject (Op->Common.Parent->Common.Node)); 646 break; 647 648 default: 649 650 Status = AcpiDsEvalDataObjectOperands (WalkState, Op, NULL); 651 break; 652 } 653 654 /* 655 * If a result object was returned from above, push it on the 656 * current result stack 657 */ 658 if (WalkState->ResultObj) 659 { 660 Status = AcpiDsResultPush (WalkState->ResultObj, WalkState); 661 } 662 break; 663 664 665 case AML_TYPE_NAMED_FIELD: 666 case AML_TYPE_NAMED_COMPLEX: 667 case AML_TYPE_NAMED_SIMPLE: 668 case AML_TYPE_NAMED_NO_OBJ: 669 670 Status = AcpiDsLoad2EndOp (WalkState); 671 if (ACPI_FAILURE (Status)) 672 { 673 break; 674 } 675 676 if (Op->Common.AmlOpcode == AML_REGION_OP) 677 { 678 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 679 "Executing OpRegion Address/Length Op=%p\n", Op)); 680 681 Status = AcpiDsEvalRegionOperands (WalkState, Op); 682 if (ACPI_FAILURE (Status)) 683 { 684 break; 685 } 686 } 687 else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP) 688 { 689 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 690 "Executing DataTableRegion Strings Op=%p\n", Op)); 691 692 Status = AcpiDsEvalTableRegionOperands (WalkState, Op); 693 if (ACPI_FAILURE (Status)) 694 { 695 break; 696 } 697 } 698 else if (Op->Common.AmlOpcode == AML_BANK_FIELD_OP) 699 { 700 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 701 "Executing BankField Op=%p\n", Op)); 702 703 Status = AcpiDsEvalBankFieldOperands (WalkState, Op); 704 if (ACPI_FAILURE (Status)) 705 { 706 break; 707 } 708 } 709 break; 710 711 712 case AML_TYPE_UNDEFINED: 713 714 ACPI_ERROR ((AE_INFO, 715 "Undefined opcode type Op=%p", Op)); 716 return_ACPI_STATUS (AE_NOT_IMPLEMENTED); 717 718 719 case AML_TYPE_BOGUS: 720 721 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 722 "Internal opcode=%X type Op=%p\n", 723 WalkState->Opcode, Op)); 724 break; 725 726 727 default: 728 729 ACPI_ERROR ((AE_INFO, 730 "Unimplemented opcode, class=0x%X type=0x%X Opcode=-0x%X Op=%p", 731 OpClass, OpType, Op->Common.AmlOpcode, Op)); 732 733 Status = AE_NOT_IMPLEMENTED; 734 break; 735 } 736 } 737 738 /* 739 * ACPI 2.0 support for 64-bit integers: Truncate numeric 740 * result value if we are executing from a 32-bit ACPI table 741 */ 742 AcpiExTruncateFor32bitTable (WalkState->ResultObj); 743 744 /* 745 * Check if we just completed the evaluation of a 746 * conditional predicate 747 */ 748 if ((ACPI_SUCCESS (Status)) && 749 (WalkState->ControlState) && 750 (WalkState->ControlState->Common.State == 751 ACPI_CONTROL_PREDICATE_EXECUTING) && 752 (WalkState->ControlState->Control.PredicateOp == Op)) 753 { 754 Status = AcpiDsGetPredicateValue (WalkState, WalkState->ResultObj); 755 WalkState->ResultObj = NULL; 756 } 757 758 759 Cleanup: 760 761 if (WalkState->ResultObj) 762 { 763 /* Break to debugger to display result */ 764 765 ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (WalkState->ResultObj, 766 WalkState)); 767 768 /* 769 * Delete the result op if and only if: 770 * Parent will not use the result -- such as any 771 * non-nested type2 op in a method (parent will be method) 772 */ 773 AcpiDsDeleteResultIfNotUsed (Op, WalkState->ResultObj, WalkState); 774 } 775 776 #ifdef _UNDER_DEVELOPMENT 777 778 if (WalkState->ParserState.Aml == WalkState->ParserState.AmlEnd) 779 { 780 AcpiDbMethodEnd (WalkState); 781 } 782 #endif 783 784 /* Invoke exception handler on error */ 785 786 if (ACPI_FAILURE (Status)) 787 { 788 Status = AcpiDsMethodError (Status, WalkState); 789 } 790 791 /* Always clear the object stack */ 792 793 WalkState->NumOperands = 0; 794 return_ACPI_STATUS (Status); 795 } 796 797 798