195b482a8SLen Brown /****************************************************************************** 295b482a8SLen Brown * 395b482a8SLen Brown * Module Name: dsobject - Dispatcher object management routines 495b482a8SLen Brown * 595b482a8SLen Brown *****************************************************************************/ 695b482a8SLen Brown 795b482a8SLen Brown /* 87735ca0eSBob Moore * Copyright (C) 2000 - 2017, Intel Corp. 995b482a8SLen Brown * All rights reserved. 1095b482a8SLen Brown * 1195b482a8SLen Brown * Redistribution and use in source and binary forms, with or without 1295b482a8SLen Brown * modification, are permitted provided that the following conditions 1395b482a8SLen Brown * are met: 1495b482a8SLen Brown * 1. Redistributions of source code must retain the above copyright 1595b482a8SLen Brown * notice, this list of conditions, and the following disclaimer, 1695b482a8SLen Brown * without modification. 1795b482a8SLen Brown * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1895b482a8SLen Brown * substantially similar to the "NO WARRANTY" disclaimer below 1995b482a8SLen Brown * ("Disclaimer") and any redistribution must be conditioned upon 2095b482a8SLen Brown * including a substantially similar Disclaimer requirement for further 2195b482a8SLen Brown * binary redistribution. 2295b482a8SLen Brown * 3. Neither the names of the above-listed copyright holders nor the names 2395b482a8SLen Brown * of any contributors may be used to endorse or promote products derived 2495b482a8SLen Brown * from this software without specific prior written permission. 2595b482a8SLen Brown * 2695b482a8SLen Brown * Alternatively, this software may be distributed under the terms of the 2795b482a8SLen Brown * GNU General Public License ("GPL") version 2 as published by the Free 2895b482a8SLen Brown * Software Foundation. 2995b482a8SLen Brown * 3095b482a8SLen Brown * NO WARRANTY 3195b482a8SLen Brown * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3295b482a8SLen Brown * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3395b482a8SLen Brown * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3495b482a8SLen Brown * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3595b482a8SLen Brown * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3695b482a8SLen Brown * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3795b482a8SLen Brown * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3895b482a8SLen Brown * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3995b482a8SLen Brown * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4095b482a8SLen Brown * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4195b482a8SLen Brown * POSSIBILITY OF SUCH DAMAGES. 4295b482a8SLen Brown */ 4395b482a8SLen Brown 4495b482a8SLen Brown #include <acpi/acpi.h> 45e2f7a777SLen Brown #include "accommon.h" 46e2f7a777SLen Brown #include "acparser.h" 47e2f7a777SLen Brown #include "amlcode.h" 48e2f7a777SLen Brown #include "acdispat.h" 49e2f7a777SLen Brown #include "acnamesp.h" 50e2f7a777SLen Brown #include "acinterp.h" 5195b482a8SLen Brown 5295b482a8SLen Brown #define _COMPONENT ACPI_DISPATCHER 5395b482a8SLen Brown ACPI_MODULE_NAME("dsobject") 5495b482a8SLen Brown 5595b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 5695b482a8SLen Brown /******************************************************************************* 5795b482a8SLen Brown * 5895b482a8SLen Brown * FUNCTION: acpi_ds_build_internal_object 5995b482a8SLen Brown * 6095b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 61ba494beeSBob Moore * op - Parser object to be translated 6295b482a8SLen Brown * obj_desc_ptr - Where the ACPI internal object is returned 6395b482a8SLen Brown * 6495b482a8SLen Brown * RETURN: Status 6595b482a8SLen Brown * 6695b482a8SLen Brown * DESCRIPTION: Translate a parser Op object to the equivalent namespace object 6795b482a8SLen Brown * Simple objects are any objects other than a package object! 6895b482a8SLen Brown * 6995b482a8SLen Brown ******************************************************************************/ 70a62a7117SBob Moore acpi_status 7195b482a8SLen Brown acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, 7295b482a8SLen Brown union acpi_parse_object *op, 7395b482a8SLen Brown union acpi_operand_object **obj_desc_ptr) 7495b482a8SLen Brown { 7595b482a8SLen Brown union acpi_operand_object *obj_desc; 7695b482a8SLen Brown acpi_status status; 7795b482a8SLen Brown 7895b482a8SLen Brown ACPI_FUNCTION_TRACE(ds_build_internal_object); 7995b482a8SLen Brown 8095b482a8SLen Brown *obj_desc_ptr = NULL; 8195b482a8SLen Brown if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { 8295b482a8SLen Brown /* 8395b482a8SLen Brown * This is a named object reference. If this name was 84a62a7117SBob Moore * previously looked up in the namespace, it was stored in 85a62a7117SBob Moore * this op. Otherwise, go ahead and look it up now 8695b482a8SLen Brown */ 8795b482a8SLen Brown if (!op->common.node) { 88a62a7117SBob Moore 89a62a7117SBob Moore /* Check if we are resolving a named reference within a package */ 90a62a7117SBob Moore 91a62a7117SBob Moore if ((op->common.parent->common.aml_opcode == 92a62a7117SBob Moore AML_PACKAGE_OP) 93a62a7117SBob Moore || (op->common.parent->common.aml_opcode == 94a62a7117SBob Moore AML_VARIABLE_PACKAGE_OP)) { 95a62a7117SBob Moore /* 96a62a7117SBob Moore * We won't resolve package elements here, we will do this 97a62a7117SBob Moore * after all ACPI tables are loaded into the namespace. This 98a62a7117SBob Moore * behavior supports both forward references to named objects 99a62a7117SBob Moore * and external references to objects in other tables. 100a62a7117SBob Moore */ 101a62a7117SBob Moore goto create_new_object; 102a62a7117SBob Moore } else { 10395b482a8SLen Brown status = acpi_ns_lookup(walk_state->scope_info, 10495b482a8SLen Brown op->common.value.string, 10595b482a8SLen Brown ACPI_TYPE_ANY, 10695b482a8SLen Brown ACPI_IMODE_EXECUTE, 10795b482a8SLen Brown ACPI_NS_SEARCH_PARENT | 108a62a7117SBob Moore ACPI_NS_DONT_OPEN_SCOPE, 109a62a7117SBob Moore NULL, 110a62a7117SBob Moore ACPI_CAST_INDIRECT_PTR 11195b482a8SLen Brown (struct 11295b482a8SLen Brown acpi_namespace_node, 113a62a7117SBob Moore &(op->common.node))); 11495b482a8SLen Brown if (ACPI_FAILURE(status)) { 115*16ccf829SBob Moore ACPI_ERROR_NAMESPACE(walk_state-> 116*16ccf829SBob Moore scope_info, 117*16ccf829SBob Moore op->common.value. 118a62a7117SBob Moore string, status); 11995b482a8SLen Brown return_ACPI_STATUS(status); 12095b482a8SLen Brown } 12195b482a8SLen Brown } 12295b482a8SLen Brown } 12395b482a8SLen Brown } 12495b482a8SLen Brown 125a62a7117SBob Moore create_new_object: 126a62a7117SBob Moore 12795b482a8SLen Brown /* Create and init a new internal ACPI object */ 12895b482a8SLen Brown 12995b482a8SLen Brown obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info 13095b482a8SLen Brown (op->common.aml_opcode))-> 13195b482a8SLen Brown object_type); 13295b482a8SLen Brown if (!obj_desc) { 13395b482a8SLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 13495b482a8SLen Brown } 13595b482a8SLen Brown 13695b482a8SLen Brown status = 13795b482a8SLen Brown acpi_ds_init_object_from_op(walk_state, op, op->common.aml_opcode, 13895b482a8SLen Brown &obj_desc); 13995b482a8SLen Brown if (ACPI_FAILURE(status)) { 14095b482a8SLen Brown acpi_ut_remove_reference(obj_desc); 14195b482a8SLen Brown return_ACPI_STATUS(status); 14295b482a8SLen Brown } 14395b482a8SLen Brown 144a62a7117SBob Moore /* 145a62a7117SBob Moore * Handling for unresolved package reference elements. 146a62a7117SBob Moore * These are elements that are namepaths. 147a62a7117SBob Moore */ 148a62a7117SBob Moore if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) || 149a62a7117SBob Moore (op->common.parent->common.aml_opcode == AML_VARIABLE_PACKAGE_OP)) { 150a62a7117SBob Moore obj_desc->reference.resolved = TRUE; 151a62a7117SBob Moore 152a62a7117SBob Moore if ((op->common.aml_opcode == AML_INT_NAMEPATH_OP) && 153a62a7117SBob Moore !obj_desc->reference.node) { 154a62a7117SBob Moore /* 155a62a7117SBob Moore * Name was unresolved above. 156a62a7117SBob Moore * Get the prefix node for later lookup 157a62a7117SBob Moore */ 158a62a7117SBob Moore obj_desc->reference.node = 159a62a7117SBob Moore walk_state->scope_info->scope.node; 160a62a7117SBob Moore obj_desc->reference.aml = op->common.aml; 161a62a7117SBob Moore obj_desc->reference.resolved = FALSE; 162a62a7117SBob Moore } 163a62a7117SBob Moore } 164a62a7117SBob Moore 16595b482a8SLen Brown *obj_desc_ptr = obj_desc; 16695b482a8SLen Brown return_ACPI_STATUS(status); 16795b482a8SLen Brown } 16895b482a8SLen Brown 16995b482a8SLen Brown /******************************************************************************* 17095b482a8SLen Brown * 17195b482a8SLen Brown * FUNCTION: acpi_ds_build_internal_buffer_obj 17295b482a8SLen Brown * 17395b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 174ba494beeSBob Moore * op - Parser object to be translated 17595b482a8SLen Brown * buffer_length - Length of the buffer 17695b482a8SLen Brown * obj_desc_ptr - Where the ACPI internal object is returned 17795b482a8SLen Brown * 17895b482a8SLen Brown * RETURN: Status 17995b482a8SLen Brown * 18095b482a8SLen Brown * DESCRIPTION: Translate a parser Op package object to the equivalent 18195b482a8SLen Brown * namespace object 18295b482a8SLen Brown * 18395b482a8SLen Brown ******************************************************************************/ 18495b482a8SLen Brown 18595b482a8SLen Brown acpi_status 18695b482a8SLen Brown acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, 18795b482a8SLen Brown union acpi_parse_object *op, 18895b482a8SLen Brown u32 buffer_length, 18995b482a8SLen Brown union acpi_operand_object **obj_desc_ptr) 19095b482a8SLen Brown { 19195b482a8SLen Brown union acpi_parse_object *arg; 19295b482a8SLen Brown union acpi_operand_object *obj_desc; 19395b482a8SLen Brown union acpi_parse_object *byte_list; 19495b482a8SLen Brown u32 byte_list_length = 0; 19595b482a8SLen Brown 19695b482a8SLen Brown ACPI_FUNCTION_TRACE(ds_build_internal_buffer_obj); 19795b482a8SLen Brown 19895b482a8SLen Brown /* 19995b482a8SLen Brown * If we are evaluating a Named buffer object "Name (xxxx, Buffer)". 20095b482a8SLen Brown * The buffer object already exists (from the NS node), otherwise it must 20195b482a8SLen Brown * be created. 20295b482a8SLen Brown */ 20395b482a8SLen Brown obj_desc = *obj_desc_ptr; 20495b482a8SLen Brown if (!obj_desc) { 20595b482a8SLen Brown 20695b482a8SLen Brown /* Create a new buffer object */ 20795b482a8SLen Brown 20895b482a8SLen Brown obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); 20995b482a8SLen Brown *obj_desc_ptr = obj_desc; 21095b482a8SLen Brown if (!obj_desc) { 21195b482a8SLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 21295b482a8SLen Brown } 21395b482a8SLen Brown } 21495b482a8SLen Brown 21595b482a8SLen Brown /* 21695b482a8SLen Brown * Second arg is the buffer data (optional) byte_list can be either 21795b482a8SLen Brown * individual bytes or a string initializer. In either case, a 21895b482a8SLen Brown * byte_list appears in the AML. 21995b482a8SLen Brown */ 22095b482a8SLen Brown arg = op->common.value.arg; /* skip first arg */ 22195b482a8SLen Brown 22295b482a8SLen Brown byte_list = arg->named.next; 22395b482a8SLen Brown if (byte_list) { 22495b482a8SLen Brown if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) { 22595b482a8SLen Brown ACPI_ERROR((AE_INFO, 226f6a22b0bSBob Moore "Expecting bytelist, found AML opcode 0x%X in op %p", 22795b482a8SLen Brown byte_list->common.aml_opcode, byte_list)); 22895b482a8SLen Brown 22995b482a8SLen Brown acpi_ut_remove_reference(obj_desc); 23095b482a8SLen Brown return (AE_TYPE); 23195b482a8SLen Brown } 23295b482a8SLen Brown 23395b482a8SLen Brown byte_list_length = (u32) byte_list->common.value.integer; 23495b482a8SLen Brown } 23595b482a8SLen Brown 23695b482a8SLen Brown /* 23795b482a8SLen Brown * The buffer length (number of bytes) will be the larger of: 23895b482a8SLen Brown * 1) The specified buffer length and 23995b482a8SLen Brown * 2) The length of the initializer byte list 24095b482a8SLen Brown */ 24195b482a8SLen Brown obj_desc->buffer.length = buffer_length; 24295b482a8SLen Brown if (byte_list_length > buffer_length) { 24395b482a8SLen Brown obj_desc->buffer.length = byte_list_length; 24495b482a8SLen Brown } 24595b482a8SLen Brown 24695b482a8SLen Brown /* Allocate the buffer */ 24795b482a8SLen Brown 24895b482a8SLen Brown if (obj_desc->buffer.length == 0) { 24995b482a8SLen Brown obj_desc->buffer.pointer = NULL; 25095b482a8SLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 25195b482a8SLen Brown "Buffer defined with zero length in AML, creating\n")); 25295b482a8SLen Brown } else { 25395b482a8SLen Brown obj_desc->buffer.pointer = 25495b482a8SLen Brown ACPI_ALLOCATE_ZEROED(obj_desc->buffer.length); 25595b482a8SLen Brown if (!obj_desc->buffer.pointer) { 25695b482a8SLen Brown acpi_ut_delete_object_desc(obj_desc); 25795b482a8SLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 25895b482a8SLen Brown } 25995b482a8SLen Brown 26095b482a8SLen Brown /* Initialize buffer from the byte_list (if present) */ 26195b482a8SLen Brown 26295b482a8SLen Brown if (byte_list) { 2634fa4616eSBob Moore memcpy(obj_desc->buffer.pointer, byte_list->named.data, 2644fa4616eSBob Moore byte_list_length); 26595b482a8SLen Brown } 26695b482a8SLen Brown } 26795b482a8SLen Brown 26895b482a8SLen Brown obj_desc->buffer.flags |= AOPOBJ_DATA_VALID; 26995b482a8SLen Brown op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc); 27095b482a8SLen Brown return_ACPI_STATUS(AE_OK); 27195b482a8SLen Brown } 27295b482a8SLen Brown 27395b482a8SLen Brown /******************************************************************************* 27495b482a8SLen Brown * 27595b482a8SLen Brown * FUNCTION: acpi_ds_create_node 27695b482a8SLen Brown * 27795b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 278ba494beeSBob Moore * node - NS Node to be initialized 279ba494beeSBob Moore * op - Parser object to be translated 28095b482a8SLen Brown * 28195b482a8SLen Brown * RETURN: Status 28295b482a8SLen Brown * 28395b482a8SLen Brown * DESCRIPTION: Create the object to be associated with a namespace node 28495b482a8SLen Brown * 28595b482a8SLen Brown ******************************************************************************/ 28695b482a8SLen Brown 28795b482a8SLen Brown acpi_status 28895b482a8SLen Brown acpi_ds_create_node(struct acpi_walk_state *walk_state, 28995b482a8SLen Brown struct acpi_namespace_node *node, 29095b482a8SLen Brown union acpi_parse_object *op) 29195b482a8SLen Brown { 29295b482a8SLen Brown acpi_status status; 29395b482a8SLen Brown union acpi_operand_object *obj_desc; 29495b482a8SLen Brown 29595b482a8SLen Brown ACPI_FUNCTION_TRACE_PTR(ds_create_node, op); 29695b482a8SLen Brown 29795b482a8SLen Brown /* 29895b482a8SLen Brown * Because of the execution pass through the non-control-method 29995b482a8SLen Brown * parts of the table, we can arrive here twice. Only init 30095b482a8SLen Brown * the named object node the first time through 30195b482a8SLen Brown */ 30295b482a8SLen Brown if (acpi_ns_get_attached_object(node)) { 30395b482a8SLen Brown return_ACPI_STATUS(AE_OK); 30495b482a8SLen Brown } 30595b482a8SLen Brown 30695b482a8SLen Brown if (!op->common.value.arg) { 30795b482a8SLen Brown 30895b482a8SLen Brown /* No arguments, there is nothing to do */ 30995b482a8SLen Brown 31095b482a8SLen Brown return_ACPI_STATUS(AE_OK); 31195b482a8SLen Brown } 31295b482a8SLen Brown 31395b482a8SLen Brown /* Build an internal object for the argument(s) */ 31495b482a8SLen Brown 3151fad8738SBob Moore status = 3161fad8738SBob Moore acpi_ds_build_internal_object(walk_state, op->common.value.arg, 31795b482a8SLen Brown &obj_desc); 31895b482a8SLen Brown if (ACPI_FAILURE(status)) { 31995b482a8SLen Brown return_ACPI_STATUS(status); 32095b482a8SLen Brown } 32195b482a8SLen Brown 32295b482a8SLen Brown /* Re-type the object according to its argument */ 32395b482a8SLen Brown 3243371c19cSBob Moore node->type = obj_desc->common.type; 32595b482a8SLen Brown 32695b482a8SLen Brown /* Attach obj to node */ 32795b482a8SLen Brown 32895b482a8SLen Brown status = acpi_ns_attach_object(node, obj_desc, node->type); 32995b482a8SLen Brown 33095b482a8SLen Brown /* Remove local reference to the object */ 33195b482a8SLen Brown 33295b482a8SLen Brown acpi_ut_remove_reference(obj_desc); 33395b482a8SLen Brown return_ACPI_STATUS(status); 33495b482a8SLen Brown } 33595b482a8SLen Brown 33695b482a8SLen Brown #endif /* ACPI_NO_METHOD_EXECUTION */ 33795b482a8SLen Brown 33895b482a8SLen Brown /******************************************************************************* 33995b482a8SLen Brown * 34095b482a8SLen Brown * FUNCTION: acpi_ds_init_object_from_op 34195b482a8SLen Brown * 34295b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 343ba494beeSBob Moore * op - Parser op used to init the internal object 344ba494beeSBob Moore * opcode - AML opcode associated with the object 34595b482a8SLen Brown * ret_obj_desc - Namespace object to be initialized 34695b482a8SLen Brown * 34795b482a8SLen Brown * RETURN: Status 34895b482a8SLen Brown * 34995b482a8SLen Brown * DESCRIPTION: Initialize a namespace object from a parser Op and its 35095b482a8SLen Brown * associated arguments. The namespace object is a more compact 35195b482a8SLen Brown * representation of the Op and its arguments. 35295b482a8SLen Brown * 35395b482a8SLen Brown ******************************************************************************/ 35495b482a8SLen Brown 35595b482a8SLen Brown acpi_status 35695b482a8SLen Brown acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, 35795b482a8SLen Brown union acpi_parse_object *op, 35895b482a8SLen Brown u16 opcode, 35995b482a8SLen Brown union acpi_operand_object **ret_obj_desc) 36095b482a8SLen Brown { 36195b482a8SLen Brown const struct acpi_opcode_info *op_info; 36295b482a8SLen Brown union acpi_operand_object *obj_desc; 36395b482a8SLen Brown acpi_status status = AE_OK; 36495b482a8SLen Brown 36595b482a8SLen Brown ACPI_FUNCTION_TRACE(ds_init_object_from_op); 36695b482a8SLen Brown 36795b482a8SLen Brown obj_desc = *ret_obj_desc; 36895b482a8SLen Brown op_info = acpi_ps_get_opcode_info(opcode); 36995b482a8SLen Brown if (op_info->class == AML_CLASS_UNKNOWN) { 37095b482a8SLen Brown 37195b482a8SLen Brown /* Unknown opcode */ 37295b482a8SLen Brown 37395b482a8SLen Brown return_ACPI_STATUS(AE_TYPE); 37495b482a8SLen Brown } 37595b482a8SLen Brown 37695b482a8SLen Brown /* Perform per-object initialization */ 37795b482a8SLen Brown 3783371c19cSBob Moore switch (obj_desc->common.type) { 37995b482a8SLen Brown case ACPI_TYPE_BUFFER: 38095b482a8SLen Brown /* 38195b482a8SLen Brown * Defer evaluation of Buffer term_arg operand 38295b482a8SLen Brown */ 38395b482a8SLen Brown obj_desc->buffer.node = 38495b482a8SLen Brown ACPI_CAST_PTR(struct acpi_namespace_node, 38595b482a8SLen Brown walk_state->operands[0]); 38695b482a8SLen Brown obj_desc->buffer.aml_start = op->named.data; 38795b482a8SLen Brown obj_desc->buffer.aml_length = op->named.length; 38895b482a8SLen Brown break; 38995b482a8SLen Brown 39095b482a8SLen Brown case ACPI_TYPE_PACKAGE: 39195b482a8SLen Brown /* 392a62a7117SBob Moore * Defer evaluation of Package term_arg operand and all 393a62a7117SBob Moore * package elements. (01/2017): We defer the element 394a62a7117SBob Moore * resolution to allow forward references from the package 395a62a7117SBob Moore * in order to provide compatibility with other ACPI 396a62a7117SBob Moore * implementations. 39795b482a8SLen Brown */ 39895b482a8SLen Brown obj_desc->package.node = 39995b482a8SLen Brown ACPI_CAST_PTR(struct acpi_namespace_node, 40095b482a8SLen Brown walk_state->operands[0]); 401a62a7117SBob Moore 402a62a7117SBob Moore if (!op->named.data) { 403a62a7117SBob Moore return_ACPI_STATUS(AE_OK); 404a62a7117SBob Moore } 405a62a7117SBob Moore 40695b482a8SLen Brown obj_desc->package.aml_start = op->named.data; 40795b482a8SLen Brown obj_desc->package.aml_length = op->named.length; 40895b482a8SLen Brown break; 40995b482a8SLen Brown 41095b482a8SLen Brown case ACPI_TYPE_INTEGER: 41195b482a8SLen Brown 41295b482a8SLen Brown switch (op_info->type) { 41395b482a8SLen Brown case AML_TYPE_CONSTANT: 41495b482a8SLen Brown /* 41595b482a8SLen Brown * Resolve AML Constants here - AND ONLY HERE! 41695b482a8SLen Brown * All constants are integers. 41795b482a8SLen Brown * We mark the integer with a flag that indicates that it started 41895b482a8SLen Brown * life as a constant -- so that stores to constants will perform 41995b482a8SLen Brown * as expected (noop). zero_op is used as a placeholder for optional 42095b482a8SLen Brown * target operands. 42195b482a8SLen Brown */ 42295b482a8SLen Brown obj_desc->common.flags = AOPOBJ_AML_CONSTANT; 42395b482a8SLen Brown 42495b482a8SLen Brown switch (opcode) { 42595b482a8SLen Brown case AML_ZERO_OP: 42695b482a8SLen Brown 42795b482a8SLen Brown obj_desc->integer.value = 0; 42895b482a8SLen Brown break; 42995b482a8SLen Brown 43095b482a8SLen Brown case AML_ONE_OP: 43195b482a8SLen Brown 43295b482a8SLen Brown obj_desc->integer.value = 1; 43395b482a8SLen Brown break; 43495b482a8SLen Brown 43595b482a8SLen Brown case AML_ONES_OP: 43695b482a8SLen Brown 4375df7e6cbSBob Moore obj_desc->integer.value = ACPI_UINT64_MAX; 43895b482a8SLen Brown 43995b482a8SLen Brown /* Truncate value if we are executing from a 32-bit ACPI table */ 44095b482a8SLen Brown 44195b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 442ef42e53fSBob Moore (void)acpi_ex_truncate_for32bit_table(obj_desc); 44395b482a8SLen Brown #endif 44495b482a8SLen Brown break; 44595b482a8SLen Brown 44695b482a8SLen Brown case AML_REVISION_OP: 44795b482a8SLen Brown 44895b482a8SLen Brown obj_desc->integer.value = ACPI_CA_VERSION; 44995b482a8SLen Brown break; 45095b482a8SLen Brown 45195b482a8SLen Brown default: 45295b482a8SLen Brown 45395b482a8SLen Brown ACPI_ERROR((AE_INFO, 454f6a22b0bSBob Moore "Unknown constant opcode 0x%X", 45595b482a8SLen Brown opcode)); 45695b482a8SLen Brown status = AE_AML_OPERAND_TYPE; 45795b482a8SLen Brown break; 45895b482a8SLen Brown } 45995b482a8SLen Brown break; 46095b482a8SLen Brown 46195b482a8SLen Brown case AML_TYPE_LITERAL: 46295b482a8SLen Brown 46395b482a8SLen Brown obj_desc->integer.value = op->common.value.integer; 464ef42e53fSBob Moore 46595b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 466ef42e53fSBob Moore if (acpi_ex_truncate_for32bit_table(obj_desc)) { 467ef42e53fSBob Moore 468ef42e53fSBob Moore /* Warn if we found a 64-bit constant in a 32-bit table */ 469ef42e53fSBob Moore 470ef42e53fSBob Moore ACPI_WARNING((AE_INFO, 471ef42e53fSBob Moore "Truncated 64-bit constant found in 32-bit table: %8.8X%8.8X => %8.8X", 472ef42e53fSBob Moore ACPI_FORMAT_UINT64(op->common. 473ef42e53fSBob Moore value.integer), 474ef42e53fSBob Moore (u32)obj_desc->integer.value)); 475ef42e53fSBob Moore } 47695b482a8SLen Brown #endif 47795b482a8SLen Brown break; 47895b482a8SLen Brown 47995b482a8SLen Brown default: 4801d1ea1b7SChao Guan 481f6a22b0bSBob Moore ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X", 48295b482a8SLen Brown op_info->type)); 48395b482a8SLen Brown status = AE_AML_OPERAND_TYPE; 48495b482a8SLen Brown break; 48595b482a8SLen Brown } 48695b482a8SLen Brown break; 48795b482a8SLen Brown 48895b482a8SLen Brown case ACPI_TYPE_STRING: 48995b482a8SLen Brown 49095b482a8SLen Brown obj_desc->string.pointer = op->common.value.string; 4914fa4616eSBob Moore obj_desc->string.length = (u32)strlen(op->common.value.string); 49295b482a8SLen Brown 49395b482a8SLen Brown /* 49495b482a8SLen Brown * The string is contained in the ACPI table, don't ever try 49595b482a8SLen Brown * to delete it 49695b482a8SLen Brown */ 49795b482a8SLen Brown obj_desc->common.flags |= AOPOBJ_STATIC_POINTER; 49895b482a8SLen Brown break; 49995b482a8SLen Brown 50095b482a8SLen Brown case ACPI_TYPE_METHOD: 50195b482a8SLen Brown break; 50295b482a8SLen Brown 50395b482a8SLen Brown case ACPI_TYPE_LOCAL_REFERENCE: 50495b482a8SLen Brown 50595b482a8SLen Brown switch (op_info->type) { 50695b482a8SLen Brown case AML_TYPE_LOCAL_VARIABLE: 50795b482a8SLen Brown 5089ff5a21aSBob Moore /* Local ID (0-7) is (AML opcode - base AML_FIRST_LOCAL_OP) */ 50995b482a8SLen Brown 510ba9c3f55SBob Moore obj_desc->reference.value = 5119ff5a21aSBob Moore ((u32)opcode) - AML_FIRST_LOCAL_OP; 51295b482a8SLen Brown obj_desc->reference.class = ACPI_REFCLASS_LOCAL; 51395b482a8SLen Brown 51495b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 51595b482a8SLen Brown status = 51695b482a8SLen Brown acpi_ds_method_data_get_node(ACPI_REFCLASS_LOCAL, 51795b482a8SLen Brown obj_desc->reference. 51895b482a8SLen Brown value, walk_state, 51995b482a8SLen Brown ACPI_CAST_INDIRECT_PTR 52095b482a8SLen Brown (struct 52195b482a8SLen Brown acpi_namespace_node, 52295b482a8SLen Brown &obj_desc->reference. 52395b482a8SLen Brown object)); 52495b482a8SLen Brown #endif 52595b482a8SLen Brown break; 52695b482a8SLen Brown 52795b482a8SLen Brown case AML_TYPE_METHOD_ARGUMENT: 52895b482a8SLen Brown 5299ff5a21aSBob Moore /* Arg ID (0-6) is (AML opcode - base AML_FIRST_ARG_OP) */ 53095b482a8SLen Brown 5319ff5a21aSBob Moore obj_desc->reference.value = 5329ff5a21aSBob Moore ((u32)opcode) - AML_FIRST_ARG_OP; 53395b482a8SLen Brown obj_desc->reference.class = ACPI_REFCLASS_ARG; 53495b482a8SLen Brown 53595b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 53695b482a8SLen Brown status = acpi_ds_method_data_get_node(ACPI_REFCLASS_ARG, 53795b482a8SLen Brown obj_desc-> 53895b482a8SLen Brown reference.value, 53995b482a8SLen Brown walk_state, 54095b482a8SLen Brown ACPI_CAST_INDIRECT_PTR 54195b482a8SLen Brown (struct 54295b482a8SLen Brown acpi_namespace_node, 54395b482a8SLen Brown &obj_desc-> 54495b482a8SLen Brown reference. 54595b482a8SLen Brown object)); 54695b482a8SLen Brown #endif 54795b482a8SLen Brown break; 54895b482a8SLen Brown 54995b482a8SLen Brown default: /* Object name or Debug object */ 55095b482a8SLen Brown 55195b482a8SLen Brown switch (op->common.aml_opcode) { 55295b482a8SLen Brown case AML_INT_NAMEPATH_OP: 55395b482a8SLen Brown 55495b482a8SLen Brown /* Node was saved in Op */ 55595b482a8SLen Brown 55695b482a8SLen Brown obj_desc->reference.node = op->common.node; 557a62a7117SBob Moore obj_desc->reference.class = ACPI_REFCLASS_NAME; 558a62a7117SBob Moore if (op->common.node) { 55995b482a8SLen Brown obj_desc->reference.object = 56095b482a8SLen Brown op->common.node->object; 561a62a7117SBob Moore } 56295b482a8SLen Brown break; 56395b482a8SLen Brown 56495b482a8SLen Brown case AML_DEBUG_OP: 56595b482a8SLen Brown 56695b482a8SLen Brown obj_desc->reference.class = ACPI_REFCLASS_DEBUG; 56795b482a8SLen Brown break; 56895b482a8SLen Brown 56995b482a8SLen Brown default: 57095b482a8SLen Brown 57195b482a8SLen Brown ACPI_ERROR((AE_INFO, 572f6a22b0bSBob Moore "Unimplemented reference type for AML opcode: 0x%4.4X", 57395b482a8SLen Brown opcode)); 57495b482a8SLen Brown return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 57595b482a8SLen Brown } 57695b482a8SLen Brown break; 57795b482a8SLen Brown } 57895b482a8SLen Brown break; 57995b482a8SLen Brown 58095b482a8SLen Brown default: 58195b482a8SLen Brown 582f6a22b0bSBob Moore ACPI_ERROR((AE_INFO, "Unimplemented data type: 0x%X", 5833371c19cSBob Moore obj_desc->common.type)); 58495b482a8SLen Brown 58595b482a8SLen Brown status = AE_AML_OPERAND_TYPE; 58695b482a8SLen Brown break; 58795b482a8SLen Brown } 58895b482a8SLen Brown 58995b482a8SLen Brown return_ACPI_STATUS(status); 59095b482a8SLen Brown } 591