dswexec.c revision 644ef74e6d187ca2e8a23ff41a513964de36f93e
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: dswexec - Dispatcher method execution callbacks; 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dispatch to interpreter. 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/ 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 977848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acparser.h" 48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "amlcode.h" 49e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acdispat.h" 50e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acinterp.h" 51e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 52e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acdebug.h" 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_DISPATCHER 554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("dswexec") 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Dispatch table for opcode classes 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 60644ef74e6d187ca2e8a23ff41a513964de36f93eLv Zhengstatic acpi_execute_op acpi_gbl_op_type_dispatch[] = { 614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_0A_0T_1R, 624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_1A_0T_0R, 634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_1A_0T_1R, 644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_1A_1T_0R, 654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_1A_1T_1R, 664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_2A_0T_0R, 674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_2A_0T_1R, 684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_2A_1T_1R, 694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_2A_2T_1R, 704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_3A_0T_0R, 714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_3A_1T_1R, 724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_opcode_6A_0T_1R 734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown}; 7444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/***************************************************************************** 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ds_get_predicate_value 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: walk_state - Current state of the parse tree walk 8044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * result_obj - if non-zero, pop result from result stack 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Get the result of a predicate evaluation 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ****************************************************************************/ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, 904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *result_obj) 914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown{ 924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *obj_desc; 944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *local_obj_desc = NULL; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 96b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ds_get_predicate_value, walk_state); 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->control_state->common.state = 0; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (result_obj) { 1014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_result_pop(&obj_desc, walk_state); 1024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 103b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_EXCEPTION((AE_INFO, status, 104b8e4d89357fc434618a59c1047cac72641191805Bob Moore "Could not get result from predicate evaluation")); 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 1094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_create_operand(walk_state, walk_state->op, 0); 1104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 1154be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_resolve_to_value(&walk_state->operands[0], 1164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 1174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown obj_desc = walk_state->operands[0]; 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!obj_desc) { 125b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 126b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore "No predicate ObjDesc=%p State=%p", 127b8e4d89357fc434618a59c1047cac72641191805Bob Moore obj_desc, walk_state)); 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_AML_NO_OPERAND); 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Result of predicate evaluation must be an Integer 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * object. Implicitly convert the argument if necessary. 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ex_convert_to_integer(obj_desc, &local_obj_desc, 16); 1374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto cleanup; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1413371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore if (local_obj_desc->common.type != ACPI_TYPE_INTEGER) { 142b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 143f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "Bad predicate (not an integer) ObjDesc=%p State=%p Type=0x%X", 1443371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore obj_desc, walk_state, obj_desc->common.type)); 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_AML_OPERAND_TYPE; 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto cleanup; 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Truncate the predicate to 32-bits if necessary */ 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_truncate_for32bit_table(local_obj_desc); 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Save the result of the predicate evaluation on 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the control stack 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (local_obj_desc->integer.value) { 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->control_state->common.value = TRUE; 1604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Predicate is FALSE, we will just toss the 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * rest of the package 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->control_state->common.value = FALSE; 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_CTRL_FALSE; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 169b9d1312ad4246e467f333dfe2ac4dc7a79608d59Lin Ming /* Predicate can be used for an implicit return value */ 170b9d1312ad4246e467f333dfe2ac4dc7a79608d59Lin Ming 171b9d1312ad4246e467f333dfe2ac4dc7a79608d59Lin Ming (void)acpi_ds_do_implicit_return(local_obj_desc, walk_state, TRUE); 172b9d1312ad4246e467f333dfe2ac4dc7a79608d59Lin Ming 1734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown cleanup: 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", 1764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->control_state->common.value, 1774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->op)); 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown /* Break to debugger to display result */ 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUGGER_EXEC(acpi_db_display_result_object 1824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (local_obj_desc, walk_state)); 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Delete the predicate result object (we know that 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * we don't need it anymore) 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (local_obj_desc != obj_desc) { 1894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(local_obj_desc); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(obj_desc); 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->control_state->common.state = ACPI_CONTROL_NORMAL; 1944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/***************************************************************************** 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ds_exec_begin_op 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: walk_state - Current state of the parse tree walk 20244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * out_op - Where to return op if a new one is created 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Descending callback used during the execution of control 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * methods. This is where most operators and operands are 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dispatched to the interpreter. 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ****************************************************************************/ 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 2134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, 2144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_parse_object **out_op) 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_parse_object *op; 2174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 2184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 opcode_class; 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 220b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ds_exec_begin_op, walk_state); 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds op = walk_state->op; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!op) { 2244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_load2_begin_op(walk_state, out_op); 2254be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 226867c9aec576e0c0d89dfa3922019320619002129Bob Moore goto error_exit; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds op = *out_op; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->op = op; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->opcode = op->common.aml_opcode; 2324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->op_info = 2334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ps_get_opcode_info(op->common.aml_opcode); 2344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 2354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (acpi_ns_opens_scope(walk_state->op_info->object_type)) { 2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 2374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "(%s) Popping scope for Op %p\n", 2384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_type_name(walk_state-> 2394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op_info-> 2404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object_type), 2414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op)); 2424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 2434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_scope_stack_pop(walk_state); 2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 245867c9aec576e0c0d89dfa3922019320619002129Bob Moore goto error_exit; 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (op == walk_state->origin) { 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (out_op) { 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *out_op = op; 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the previous opcode was a conditional, this opcode 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * must be the beginning of the associated predicate. 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Save this knowledge in the current scope descriptor 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((walk_state->control_state) && 2644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->control_state->common.state == 2654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_CONTROL_CONDITIONAL_EXECUTING)) { 2664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 2674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "Exec predicate Op=%p State=%p\n", op, 2684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state)); 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->control_state->common.state = 2714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_CONTROL_PREDICATE_EXECUTING; 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Save start of predicate */ 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->control_state->control.predicate_op = op; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds opcode_class = walk_state->op_info->class; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We want to send namepaths to the load code */ 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds opcode_class = AML_CLASS_NAMED_OBJECT; 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Handle the opcode based upon the opcode type 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (opcode_class) { 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_CLASS_CONTROL: 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_exec_begin_control_op(walk_state, op); 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_CLASS_NAMED_OBJECT: 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2974119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (walk_state->walk_type & ACPI_WALK_METHOD) { 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 29944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * Found a named object declaration during method execution; 30044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * we must enter this object into the namespace. The created 30144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * object is temporary and will be deleted upon completion of 30244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * the execution of this method. 3038df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore * 3048df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore * Note 10/2010: Except for the Scope() op. This opcode does 3058df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore * not actually create a new object, it refers to an existing 3068df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore * object. However, for Scope(), we want to indeed open a 3078df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore * new scope. 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3098df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore if (op->common.aml_opcode != AML_SCOPE_OP) { 3108df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore status = 3118df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore acpi_ds_load2_begin_op(walk_state, NULL); 3128df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore } else { 3138df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore status = 3148df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore acpi_ds_scope_stack_push(op->named.node, 3158df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore op->named.node-> 3168df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore type, walk_state); 3178df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore if (ACPI_FAILURE(status)) { 3188df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore return_ACPI_STATUS(status); 3198df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore } 3208df3fc981dc12d9fdcaef4100a2193b605024d7aBob Moore } 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_CLASS_EXECUTE: 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_CLASS_CREATE: 326773069d48030e670cf2032a13ddf16a2e0034df3Bob Moore 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Nothing to do here during method execution */ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 336867c9aec576e0c0d89dfa3922019320619002129Bob Moore 337867c9aec576e0c0d89dfa3922019320619002129Bob Moore error_exit: 338867c9aec576e0c0d89dfa3922019320619002129Bob Moore status = acpi_ds_method_error(status, walk_state); 339867c9aec576e0c0d89dfa3922019320619002129Bob Moore return_ACPI_STATUS(status); 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/***************************************************************************** 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ds_exec_end_op 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: walk_state - Current state of the parse tree walk 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Ascending callback used during the execution of control 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * methods. The only thing we really need to do here is to 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice the beginning of IF, ELSE, and WHILE blocks. 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ****************************************************************************/ 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_parse_object *op; 3594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 3604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 op_type; 3614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 op_class; 3624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_parse_object *next_op; 3634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_parse_object *first_arg; 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 365b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ds_exec_end_op, walk_state); 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op = walk_state->op; 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds op_type = walk_state->op_info->type; 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds op_class = walk_state->op_info->class; 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (op_class == AML_CLASS_UNKNOWN) { 372f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Unknown opcode 0x%X", 373b8e4d89357fc434618a59c1047cac72641191805Bob Moore op->common.aml_opcode)); 3744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds first_arg = op->common.value.arg; 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Init the walk state */ 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->num_operands = 0; 382773069d48030e670cf2032a13ddf16a2e0034df3Bob Moore walk_state->operand_index = 0; 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->return_desc = NULL; 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->result_obj = NULL; 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Call debugger for single step support (DEBUG build only) */ 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUGGER_EXEC(status = 3894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_db_single_step(walk_state, op, op_class)); 3904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUGGER_EXEC(if (ACPI_FAILURE(status)) { 3914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status);} 3924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ) ; 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Decode the Opcode Class */ 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (op_class) { 3974e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore case AML_CLASS_ARGUMENT: /* Constants, literals, etc. */ 3984e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore 3994e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore if (walk_state->opcode == AML_INT_NAMEPATH_OP) { 4004e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore status = acpi_ds_evaluate_name_path(walk_state); 4014e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore if (ACPI_FAILURE(status)) { 4024e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore goto cleanup; 4034e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore } 4044e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore } 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4074e3156b183aa087bc19804b3295c7c1a71f64752Bob Moore case AML_CLASS_EXECUTE: /* Most operators with arguments */ 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Build resolved operand stack */ 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_create_operands(walk_state, first_arg); 4124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto cleanup; 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All opcodes require operand resolution, with the only exceptions 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * being the object_type and size_of operators. 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!(walk_state->op_info->flags & AML_NO_OPERAND_RESOLVE)) { 42152fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Resolve all operands */ 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ex_resolve_operands(walk_state->opcode, 4254be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &(walk_state-> 4264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown operands 4274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown [walk_state-> 4284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown num_operands - 1]), 4294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_SUCCESS(status)) { 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Dispatch the request to the appropriate interpreter handler 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * routine. There is one routine per opcode "type" based upon the 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * number of opcode arguments and return type. 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 4394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_gbl_op_type_dispatch[op_type] (walk_state); 4404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 442b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Local is uninitialized. 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if ((status == AE_AML_UNINITIALIZED_LOCAL) && 4464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->opcode == AML_STORE_OP) && 4474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->operands[0]->common.type == 4484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_TYPE_LOCAL_REFERENCE) 4494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown && (walk_state->operands[1]->common.type == 4504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_TYPE_LOCAL_REFERENCE) 4511044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore && (walk_state->operands[0]->reference.class == 4521044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore walk_state->operands[1]->reference.class) 4531044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore && (walk_state->operands[0]->reference.value == 4541044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore walk_state->operands[1]->reference.value)) { 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_OK; 4564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 457b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_EXCEPTION((AE_INFO, status, 458b8e4d89357fc434618a59c1047cac72641191805Bob Moore "While resolving operands for [%s]", 459b8e4d89357fc434618a59c1047cac72641191805Bob Moore acpi_ps_get_opcode_name 460b8e4d89357fc434618a59c1047cac72641191805Bob Moore (walk_state->opcode))); 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Always delete the argument objects and clear the operand stack */ 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_clear_operands(walk_state); 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If a result object was returned from above, push it on the 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * current result stack 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_SUCCESS(status) && walk_state->result_obj) { 4734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 4744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_result_push(walk_state->result_obj, 4754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (op_type) { 4824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown case AML_TYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1 Operand, 0 external_result, 0 internal_result */ 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_exec_end_control_op(walk_state, op); 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_METHOD_CALL: 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the method is referenced from within a package 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * declaration, it is not a invocation of the method, just 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a reference to it. 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((op->asl.parent) && 4984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ((op->asl.parent->asl.aml_opcode == AML_PACKAGE_OP) 4994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown || (op->asl.parent->asl.aml_opcode == 5004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown AML_VAR_PACKAGE_OP))) { 5014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 5024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "Method Reference in a Package, Op=%p\n", 5034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op)); 504967440e3be1af06ad4dc7bb18d2e3c16130fe067Bob Moore 5054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op->common.node = 5064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (struct acpi_namespace_node *)op->asl.value. 507b160987df7f49ee9c048a43b70ebae613a7e1437Bob Moore arg->asl.node; 5084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_add_reference(op->asl.value.arg->asl. 5094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown node->object); 5104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 5144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "Method invocation, Op=%p\n", op)); 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the method Node pointer 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* next_op points to the op that holds the method name */ 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds next_op = first_arg; 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* next_op points to first argument op */ 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds next_op = next_op->common.next; 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Get the method's arguments and put them on the operand stack 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_create_operands(walk_state, next_op); 5324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Since the operands will be passed to another control method, 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * we must resolve all local references here (Local variables, 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * arguments to *this* method, etc.) 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_resolve_operands(walk_state); 5424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 54352fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* On error, clear all resolved operands */ 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_clear_operands(walk_state); 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Tell the walk loop to preempt this running method and 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * execute the new method 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_CTRL_TRANSFER; 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Return now; we don't want to disturb anything, 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * especially the operand count! 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_CREATE_FIELD: 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 565b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore "Executing CreateField Buffer/Index Op=%p\n", 5664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op)); 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_load2_end_op(walk_state); 5694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 5744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_eval_buffer_field_operands(walk_state, op); 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_CREATE_OBJECT: 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 580b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore "Executing CreateObject (Buffer/Package) Op=%p\n", 5814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op)); 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (op->common.parent->common.aml_opcode) { 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_NAME_OP: 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 58744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * Put the Node on the object stack (Contains the ACPI Name 58844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * of this object) 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->operands[0] = 5914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void *)op->common.parent->common.node; 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->num_operands = 1; 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_create_node(walk_state, 5954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op->common.parent-> 5964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown common.node, 5974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op->common.parent); 5984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Fall through */ 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /*lint -fallthrough */ 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_INT_EVAL_SUBTREE_OP: 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_eval_data_object_operands 6094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state, op, 6104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ns_get_attached_object(op->common. 6114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown parent->common. 6124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown node)); 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_eval_data_object_operands 6194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state, op, NULL); 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If a result object was returned from above, push it on the 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * current result stack 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 62744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore if (walk_state->result_obj) { 6284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_result_push(walk_state->result_obj, 6304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_NAMED_FIELD: 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_NAMED_COMPLEX: 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_NAMED_SIMPLE: 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_NAMED_NO_OBJ: 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ds_load2_end_op(walk_state); 6404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (op->common.aml_opcode == AML_REGION_OP) { 6454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 646b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore "Executing OpRegion Address/Length Op=%p\n", 6474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op)); 6484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 6494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_eval_region_operands(walk_state, 6514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown op); 6524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 655941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming } else if (op->common.aml_opcode == AML_DATA_REGION_OP) { 656941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 657941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming "Executing DataTableRegion Strings Op=%p\n", 658941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming op)); 659941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming 660941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming status = 661941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming acpi_ds_eval_table_region_operands 662941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming (walk_state, op); 663941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming if (ACPI_FAILURE(status)) { 664941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming break; 665941f48bb465b0b291f8435b1e3de95b0975b84bcLin Ming } 666ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming } else if (op->common.aml_opcode == AML_BANK_FIELD_OP) { 667ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 668ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming "Executing BankField Op=%p\n", 669ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming op)); 670ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming 671ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming status = 672ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming acpi_ds_eval_bank_field_operands(walk_state, 673ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming op); 674ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming if (ACPI_FAILURE(status)) { 675ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming break; 676ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming } 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_UNDEFINED: 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 682b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 683b8e4d89357fc434618a59c1047cac72641191805Bob Moore "Undefined opcode type Op=%p", op)); 6844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_TYPE_BOGUS: 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 6894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "Internal opcode=%X type Op=%p\n", 6904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->opcode, op)); 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 695b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 696f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "Unimplemented opcode, class=0x%X type=0x%X Opcode=-0x%X Op=%p", 697b8e4d89357fc434618a59c1047cac72641191805Bob Moore op_class, op_type, op->common.aml_opcode, 698b8e4d89357fc434618a59c1047cac72641191805Bob Moore op)); 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_NOT_IMPLEMENTED; 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ACPI 2.0 support for 64-bit integers: Truncate numeric 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * result value if we are executing from a 32-bit ACPI table 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ex_truncate_for32bit_table(walk_state->result_obj); 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Check if we just completed the evaluation of a 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * conditional predicate 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7154be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if ((ACPI_SUCCESS(status)) && 7164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->control_state) && 7174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->control_state->common.state == 7184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_CONTROL_PREDICATE_EXECUTING) && 7194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->control_state->control.predicate_op == op)) { 7204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 7214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_get_predicate_value(walk_state, 7224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state->result_obj); 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds walk_state->result_obj = NULL; 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown cleanup: 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (walk_state->result_obj) { 72952fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Break to debugger to display result */ 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUGGER_EXEC(acpi_db_display_result_object 7334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (walk_state->result_obj, walk_state)); 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Delete the result op if and only if: 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Parent will not use the result -- such as any 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * non-nested type2 op in a method (parent will be method) 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_delete_result_if_not_used(op, walk_state->result_obj, 7414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef _UNDER_DEVELOPMENT 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (walk_state->parser_state.aml == walk_state->parser_state.aml_end) { 7464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_db_method_end(walk_state); 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 750defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore /* Invoke exception handler on error */ 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 753defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore status = acpi_ds_method_error(status, walk_state); 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 756defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore /* Always clear the object stack */ 757defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore 758defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore walk_state->num_operands = 0; 7594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 761