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 ******************************************************************************/ 70*a62a7117SBob 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 84*a62a7117SBob Moore * previously looked up in the namespace, it was stored in 85*a62a7117SBob Moore * this op. Otherwise, go ahead and look it up now 8695b482a8SLen Brown */ 8795b482a8SLen Brown if (!op->common.node) { 88*a62a7117SBob Moore 89*a62a7117SBob Moore /* Check if we are resolving a named reference within a package */ 90*a62a7117SBob Moore 91*a62a7117SBob Moore if ((op->common.parent->common.aml_opcode == 92*a62a7117SBob Moore AML_PACKAGE_OP) 93*a62a7117SBob Moore || (op->common.parent->common.aml_opcode == 94*a62a7117SBob Moore AML_VARIABLE_PACKAGE_OP)) { 95*a62a7117SBob Moore /* 96*a62a7117SBob Moore * We won't resolve package elements here, we will do this 97*a62a7117SBob Moore * after all ACPI tables are loaded into the namespace. This 98*a62a7117SBob Moore * behavior supports both forward references to named objects 99*a62a7117SBob Moore * and external references to objects in other tables. 100*a62a7117SBob Moore */ 101*a62a7117SBob Moore goto create_new_object; 102*a62a7117SBob 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 | 108*a62a7117SBob Moore ACPI_NS_DONT_OPEN_SCOPE, 109*a62a7117SBob Moore NULL, 110*a62a7117SBob Moore ACPI_CAST_INDIRECT_PTR 11195b482a8SLen Brown (struct 11295b482a8SLen Brown acpi_namespace_node, 113*a62a7117SBob Moore &(op->common.node))); 11495b482a8SLen Brown if (ACPI_FAILURE(status)) { 115*a62a7117SBob Moore ACPI_ERROR_NAMESPACE(op->common.value. 116*a62a7117SBob Moore string, status); 11795b482a8SLen Brown return_ACPI_STATUS(status); 11895b482a8SLen Brown } 11995b482a8SLen Brown } 12095b482a8SLen Brown } 12195b482a8SLen Brown } 12295b482a8SLen Brown 123*a62a7117SBob Moore create_new_object: 124*a62a7117SBob Moore 12595b482a8SLen Brown /* Create and init a new internal ACPI object */ 12695b482a8SLen Brown 12795b482a8SLen Brown obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info 12895b482a8SLen Brown (op->common.aml_opcode))-> 12995b482a8SLen Brown object_type); 13095b482a8SLen Brown if (!obj_desc) { 13195b482a8SLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 13295b482a8SLen Brown } 13395b482a8SLen Brown 13495b482a8SLen Brown status = 13595b482a8SLen Brown acpi_ds_init_object_from_op(walk_state, op, op->common.aml_opcode, 13695b482a8SLen Brown &obj_desc); 13795b482a8SLen Brown if (ACPI_FAILURE(status)) { 13895b482a8SLen Brown acpi_ut_remove_reference(obj_desc); 13995b482a8SLen Brown return_ACPI_STATUS(status); 14095b482a8SLen Brown } 14195b482a8SLen Brown 142*a62a7117SBob Moore /* 143*a62a7117SBob Moore * Handling for unresolved package reference elements. 144*a62a7117SBob Moore * These are elements that are namepaths. 145*a62a7117SBob Moore */ 146*a62a7117SBob Moore if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) || 147*a62a7117SBob Moore (op->common.parent->common.aml_opcode == AML_VARIABLE_PACKAGE_OP)) { 148*a62a7117SBob Moore obj_desc->reference.resolved = TRUE; 149*a62a7117SBob Moore 150*a62a7117SBob Moore if ((op->common.aml_opcode == AML_INT_NAMEPATH_OP) && 151*a62a7117SBob Moore !obj_desc->reference.node) { 152*a62a7117SBob Moore /* 153*a62a7117SBob Moore * Name was unresolved above. 154*a62a7117SBob Moore * Get the prefix node for later lookup 155*a62a7117SBob Moore */ 156*a62a7117SBob Moore obj_desc->reference.node = 157*a62a7117SBob Moore walk_state->scope_info->scope.node; 158*a62a7117SBob Moore obj_desc->reference.aml = op->common.aml; 159*a62a7117SBob Moore obj_desc->reference.resolved = FALSE; 160*a62a7117SBob Moore } 161*a62a7117SBob Moore } 162*a62a7117SBob Moore 16395b482a8SLen Brown *obj_desc_ptr = obj_desc; 16495b482a8SLen Brown return_ACPI_STATUS(status); 16595b482a8SLen Brown } 16695b482a8SLen Brown 16795b482a8SLen Brown /******************************************************************************* 16895b482a8SLen Brown * 16995b482a8SLen Brown * FUNCTION: acpi_ds_build_internal_buffer_obj 17095b482a8SLen Brown * 17195b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 172ba494beeSBob Moore * op - Parser object to be translated 17395b482a8SLen Brown * buffer_length - Length of the buffer 17495b482a8SLen Brown * obj_desc_ptr - Where the ACPI internal object is returned 17595b482a8SLen Brown * 17695b482a8SLen Brown * RETURN: Status 17795b482a8SLen Brown * 17895b482a8SLen Brown * DESCRIPTION: Translate a parser Op package object to the equivalent 17995b482a8SLen Brown * namespace object 18095b482a8SLen Brown * 18195b482a8SLen Brown ******************************************************************************/ 18295b482a8SLen Brown 18395b482a8SLen Brown acpi_status 18495b482a8SLen Brown acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, 18595b482a8SLen Brown union acpi_parse_object *op, 18695b482a8SLen Brown u32 buffer_length, 18795b482a8SLen Brown union acpi_operand_object **obj_desc_ptr) 18895b482a8SLen Brown { 18995b482a8SLen Brown union acpi_parse_object *arg; 19095b482a8SLen Brown union acpi_operand_object *obj_desc; 19195b482a8SLen Brown union acpi_parse_object *byte_list; 19295b482a8SLen Brown u32 byte_list_length = 0; 19395b482a8SLen Brown 19495b482a8SLen Brown ACPI_FUNCTION_TRACE(ds_build_internal_buffer_obj); 19595b482a8SLen Brown 19695b482a8SLen Brown /* 19795b482a8SLen Brown * If we are evaluating a Named buffer object "Name (xxxx, Buffer)". 19895b482a8SLen Brown * The buffer object already exists (from the NS node), otherwise it must 19995b482a8SLen Brown * be created. 20095b482a8SLen Brown */ 20195b482a8SLen Brown obj_desc = *obj_desc_ptr; 20295b482a8SLen Brown if (!obj_desc) { 20395b482a8SLen Brown 20495b482a8SLen Brown /* Create a new buffer object */ 20595b482a8SLen Brown 20695b482a8SLen Brown obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); 20795b482a8SLen Brown *obj_desc_ptr = obj_desc; 20895b482a8SLen Brown if (!obj_desc) { 20995b482a8SLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 21095b482a8SLen Brown } 21195b482a8SLen Brown } 21295b482a8SLen Brown 21395b482a8SLen Brown /* 21495b482a8SLen Brown * Second arg is the buffer data (optional) byte_list can be either 21595b482a8SLen Brown * individual bytes or a string initializer. In either case, a 21695b482a8SLen Brown * byte_list appears in the AML. 21795b482a8SLen Brown */ 21895b482a8SLen Brown arg = op->common.value.arg; /* skip first arg */ 21995b482a8SLen Brown 22095b482a8SLen Brown byte_list = arg->named.next; 22195b482a8SLen Brown if (byte_list) { 22295b482a8SLen Brown if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) { 22395b482a8SLen Brown ACPI_ERROR((AE_INFO, 224f6a22b0bSBob Moore "Expecting bytelist, found AML opcode 0x%X in op %p", 22595b482a8SLen Brown byte_list->common.aml_opcode, byte_list)); 22695b482a8SLen Brown 22795b482a8SLen Brown acpi_ut_remove_reference(obj_desc); 22895b482a8SLen Brown return (AE_TYPE); 22995b482a8SLen Brown } 23095b482a8SLen Brown 23195b482a8SLen Brown byte_list_length = (u32) byte_list->common.value.integer; 23295b482a8SLen Brown } 23395b482a8SLen Brown 23495b482a8SLen Brown /* 23595b482a8SLen Brown * The buffer length (number of bytes) will be the larger of: 23695b482a8SLen Brown * 1) The specified buffer length and 23795b482a8SLen Brown * 2) The length of the initializer byte list 23895b482a8SLen Brown */ 23995b482a8SLen Brown obj_desc->buffer.length = buffer_length; 24095b482a8SLen Brown if (byte_list_length > buffer_length) { 24195b482a8SLen Brown obj_desc->buffer.length = byte_list_length; 24295b482a8SLen Brown } 24395b482a8SLen Brown 24495b482a8SLen Brown /* Allocate the buffer */ 24595b482a8SLen Brown 24695b482a8SLen Brown if (obj_desc->buffer.length == 0) { 24795b482a8SLen Brown obj_desc->buffer.pointer = NULL; 24895b482a8SLen Brown ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 24995b482a8SLen Brown "Buffer defined with zero length in AML, creating\n")); 25095b482a8SLen Brown } else { 25195b482a8SLen Brown obj_desc->buffer.pointer = 25295b482a8SLen Brown ACPI_ALLOCATE_ZEROED(obj_desc->buffer.length); 25395b482a8SLen Brown if (!obj_desc->buffer.pointer) { 25495b482a8SLen Brown acpi_ut_delete_object_desc(obj_desc); 25595b482a8SLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 25695b482a8SLen Brown } 25795b482a8SLen Brown 25895b482a8SLen Brown /* Initialize buffer from the byte_list (if present) */ 25995b482a8SLen Brown 26095b482a8SLen Brown if (byte_list) { 2614fa4616eSBob Moore memcpy(obj_desc->buffer.pointer, byte_list->named.data, 2624fa4616eSBob Moore byte_list_length); 26395b482a8SLen Brown } 26495b482a8SLen Brown } 26595b482a8SLen Brown 26695b482a8SLen Brown obj_desc->buffer.flags |= AOPOBJ_DATA_VALID; 26795b482a8SLen Brown op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc); 26895b482a8SLen Brown return_ACPI_STATUS(AE_OK); 26995b482a8SLen Brown } 27095b482a8SLen Brown 27195b482a8SLen Brown /******************************************************************************* 27295b482a8SLen Brown * 27395b482a8SLen Brown * FUNCTION: acpi_ds_create_node 27495b482a8SLen Brown * 27595b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 276ba494beeSBob Moore * node - NS Node to be initialized 277ba494beeSBob Moore * op - Parser object to be translated 27895b482a8SLen Brown * 27995b482a8SLen Brown * RETURN: Status 28095b482a8SLen Brown * 28195b482a8SLen Brown * DESCRIPTION: Create the object to be associated with a namespace node 28295b482a8SLen Brown * 28395b482a8SLen Brown ******************************************************************************/ 28495b482a8SLen Brown 28595b482a8SLen Brown acpi_status 28695b482a8SLen Brown acpi_ds_create_node(struct acpi_walk_state *walk_state, 28795b482a8SLen Brown struct acpi_namespace_node *node, 28895b482a8SLen Brown union acpi_parse_object *op) 28995b482a8SLen Brown { 29095b482a8SLen Brown acpi_status status; 29195b482a8SLen Brown union acpi_operand_object *obj_desc; 29295b482a8SLen Brown 29395b482a8SLen Brown ACPI_FUNCTION_TRACE_PTR(ds_create_node, op); 29495b482a8SLen Brown 29595b482a8SLen Brown /* 29695b482a8SLen Brown * Because of the execution pass through the non-control-method 29795b482a8SLen Brown * parts of the table, we can arrive here twice. Only init 29895b482a8SLen Brown * the named object node the first time through 29995b482a8SLen Brown */ 30095b482a8SLen Brown if (acpi_ns_get_attached_object(node)) { 30195b482a8SLen Brown return_ACPI_STATUS(AE_OK); 30295b482a8SLen Brown } 30395b482a8SLen Brown 30495b482a8SLen Brown if (!op->common.value.arg) { 30595b482a8SLen Brown 30695b482a8SLen Brown /* No arguments, there is nothing to do */ 30795b482a8SLen Brown 30895b482a8SLen Brown return_ACPI_STATUS(AE_OK); 30995b482a8SLen Brown } 31095b482a8SLen Brown 31195b482a8SLen Brown /* Build an internal object for the argument(s) */ 31295b482a8SLen Brown 3131fad8738SBob Moore status = 3141fad8738SBob Moore acpi_ds_build_internal_object(walk_state, op->common.value.arg, 31595b482a8SLen Brown &obj_desc); 31695b482a8SLen Brown if (ACPI_FAILURE(status)) { 31795b482a8SLen Brown return_ACPI_STATUS(status); 31895b482a8SLen Brown } 31995b482a8SLen Brown 32095b482a8SLen Brown /* Re-type the object according to its argument */ 32195b482a8SLen Brown 3223371c19cSBob Moore node->type = obj_desc->common.type; 32395b482a8SLen Brown 32495b482a8SLen Brown /* Attach obj to node */ 32595b482a8SLen Brown 32695b482a8SLen Brown status = acpi_ns_attach_object(node, obj_desc, node->type); 32795b482a8SLen Brown 32895b482a8SLen Brown /* Remove local reference to the object */ 32995b482a8SLen Brown 33095b482a8SLen Brown acpi_ut_remove_reference(obj_desc); 33195b482a8SLen Brown return_ACPI_STATUS(status); 33295b482a8SLen Brown } 33395b482a8SLen Brown 33495b482a8SLen Brown #endif /* ACPI_NO_METHOD_EXECUTION */ 33595b482a8SLen Brown 33695b482a8SLen Brown /******************************************************************************* 33795b482a8SLen Brown * 33895b482a8SLen Brown * FUNCTION: acpi_ds_init_object_from_op 33995b482a8SLen Brown * 34095b482a8SLen Brown * PARAMETERS: walk_state - Current walk state 341ba494beeSBob Moore * op - Parser op used to init the internal object 342ba494beeSBob Moore * opcode - AML opcode associated with the object 34395b482a8SLen Brown * ret_obj_desc - Namespace object to be initialized 34495b482a8SLen Brown * 34595b482a8SLen Brown * RETURN: Status 34695b482a8SLen Brown * 34795b482a8SLen Brown * DESCRIPTION: Initialize a namespace object from a parser Op and its 34895b482a8SLen Brown * associated arguments. The namespace object is a more compact 34995b482a8SLen Brown * representation of the Op and its arguments. 35095b482a8SLen Brown * 35195b482a8SLen Brown ******************************************************************************/ 35295b482a8SLen Brown 35395b482a8SLen Brown acpi_status 35495b482a8SLen Brown acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, 35595b482a8SLen Brown union acpi_parse_object *op, 35695b482a8SLen Brown u16 opcode, 35795b482a8SLen Brown union acpi_operand_object **ret_obj_desc) 35895b482a8SLen Brown { 35995b482a8SLen Brown const struct acpi_opcode_info *op_info; 36095b482a8SLen Brown union acpi_operand_object *obj_desc; 36195b482a8SLen Brown acpi_status status = AE_OK; 36295b482a8SLen Brown 36395b482a8SLen Brown ACPI_FUNCTION_TRACE(ds_init_object_from_op); 36495b482a8SLen Brown 36595b482a8SLen Brown obj_desc = *ret_obj_desc; 36695b482a8SLen Brown op_info = acpi_ps_get_opcode_info(opcode); 36795b482a8SLen Brown if (op_info->class == AML_CLASS_UNKNOWN) { 36895b482a8SLen Brown 36995b482a8SLen Brown /* Unknown opcode */ 37095b482a8SLen Brown 37195b482a8SLen Brown return_ACPI_STATUS(AE_TYPE); 37295b482a8SLen Brown } 37395b482a8SLen Brown 37495b482a8SLen Brown /* Perform per-object initialization */ 37595b482a8SLen Brown 3763371c19cSBob Moore switch (obj_desc->common.type) { 37795b482a8SLen Brown case ACPI_TYPE_BUFFER: 37895b482a8SLen Brown /* 37995b482a8SLen Brown * Defer evaluation of Buffer term_arg operand 38095b482a8SLen Brown */ 38195b482a8SLen Brown obj_desc->buffer.node = 38295b482a8SLen Brown ACPI_CAST_PTR(struct acpi_namespace_node, 38395b482a8SLen Brown walk_state->operands[0]); 38495b482a8SLen Brown obj_desc->buffer.aml_start = op->named.data; 38595b482a8SLen Brown obj_desc->buffer.aml_length = op->named.length; 38695b482a8SLen Brown break; 38795b482a8SLen Brown 38895b482a8SLen Brown case ACPI_TYPE_PACKAGE: 38995b482a8SLen Brown /* 390*a62a7117SBob Moore * Defer evaluation of Package term_arg operand and all 391*a62a7117SBob Moore * package elements. (01/2017): We defer the element 392*a62a7117SBob Moore * resolution to allow forward references from the package 393*a62a7117SBob Moore * in order to provide compatibility with other ACPI 394*a62a7117SBob Moore * implementations. 39595b482a8SLen Brown */ 39695b482a8SLen Brown obj_desc->package.node = 39795b482a8SLen Brown ACPI_CAST_PTR(struct acpi_namespace_node, 39895b482a8SLen Brown walk_state->operands[0]); 399*a62a7117SBob Moore 400*a62a7117SBob Moore if (!op->named.data) { 401*a62a7117SBob Moore return_ACPI_STATUS(AE_OK); 402*a62a7117SBob Moore } 403*a62a7117SBob Moore 40495b482a8SLen Brown obj_desc->package.aml_start = op->named.data; 40595b482a8SLen Brown obj_desc->package.aml_length = op->named.length; 40695b482a8SLen Brown break; 40795b482a8SLen Brown 40895b482a8SLen Brown case ACPI_TYPE_INTEGER: 40995b482a8SLen Brown 41095b482a8SLen Brown switch (op_info->type) { 41195b482a8SLen Brown case AML_TYPE_CONSTANT: 41295b482a8SLen Brown /* 41395b482a8SLen Brown * Resolve AML Constants here - AND ONLY HERE! 41495b482a8SLen Brown * All constants are integers. 41595b482a8SLen Brown * We mark the integer with a flag that indicates that it started 41695b482a8SLen Brown * life as a constant -- so that stores to constants will perform 41795b482a8SLen Brown * as expected (noop). zero_op is used as a placeholder for optional 41895b482a8SLen Brown * target operands. 41995b482a8SLen Brown */ 42095b482a8SLen Brown obj_desc->common.flags = AOPOBJ_AML_CONSTANT; 42195b482a8SLen Brown 42295b482a8SLen Brown switch (opcode) { 42395b482a8SLen Brown case AML_ZERO_OP: 42495b482a8SLen Brown 42595b482a8SLen Brown obj_desc->integer.value = 0; 42695b482a8SLen Brown break; 42795b482a8SLen Brown 42895b482a8SLen Brown case AML_ONE_OP: 42995b482a8SLen Brown 43095b482a8SLen Brown obj_desc->integer.value = 1; 43195b482a8SLen Brown break; 43295b482a8SLen Brown 43395b482a8SLen Brown case AML_ONES_OP: 43495b482a8SLen Brown 4355df7e6cbSBob Moore obj_desc->integer.value = ACPI_UINT64_MAX; 43695b482a8SLen Brown 43795b482a8SLen Brown /* Truncate value if we are executing from a 32-bit ACPI table */ 43895b482a8SLen Brown 43995b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 440ef42e53fSBob Moore (void)acpi_ex_truncate_for32bit_table(obj_desc); 44195b482a8SLen Brown #endif 44295b482a8SLen Brown break; 44395b482a8SLen Brown 44495b482a8SLen Brown case AML_REVISION_OP: 44595b482a8SLen Brown 44695b482a8SLen Brown obj_desc->integer.value = ACPI_CA_VERSION; 44795b482a8SLen Brown break; 44895b482a8SLen Brown 44995b482a8SLen Brown default: 45095b482a8SLen Brown 45195b482a8SLen Brown ACPI_ERROR((AE_INFO, 452f6a22b0bSBob Moore "Unknown constant opcode 0x%X", 45395b482a8SLen Brown opcode)); 45495b482a8SLen Brown status = AE_AML_OPERAND_TYPE; 45595b482a8SLen Brown break; 45695b482a8SLen Brown } 45795b482a8SLen Brown break; 45895b482a8SLen Brown 45995b482a8SLen Brown case AML_TYPE_LITERAL: 46095b482a8SLen Brown 46195b482a8SLen Brown obj_desc->integer.value = op->common.value.integer; 462ef42e53fSBob Moore 46395b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 464ef42e53fSBob Moore if (acpi_ex_truncate_for32bit_table(obj_desc)) { 465ef42e53fSBob Moore 466ef42e53fSBob Moore /* Warn if we found a 64-bit constant in a 32-bit table */ 467ef42e53fSBob Moore 468ef42e53fSBob Moore ACPI_WARNING((AE_INFO, 469ef42e53fSBob Moore "Truncated 64-bit constant found in 32-bit table: %8.8X%8.8X => %8.8X", 470ef42e53fSBob Moore ACPI_FORMAT_UINT64(op->common. 471ef42e53fSBob Moore value.integer), 472ef42e53fSBob Moore (u32)obj_desc->integer.value)); 473ef42e53fSBob Moore } 47495b482a8SLen Brown #endif 47595b482a8SLen Brown break; 47695b482a8SLen Brown 47795b482a8SLen Brown default: 4781d1ea1b7SChao Guan 479f6a22b0bSBob Moore ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X", 48095b482a8SLen Brown op_info->type)); 48195b482a8SLen Brown status = AE_AML_OPERAND_TYPE; 48295b482a8SLen Brown break; 48395b482a8SLen Brown } 48495b482a8SLen Brown break; 48595b482a8SLen Brown 48695b482a8SLen Brown case ACPI_TYPE_STRING: 48795b482a8SLen Brown 48895b482a8SLen Brown obj_desc->string.pointer = op->common.value.string; 4894fa4616eSBob Moore obj_desc->string.length = (u32)strlen(op->common.value.string); 49095b482a8SLen Brown 49195b482a8SLen Brown /* 49295b482a8SLen Brown * The string is contained in the ACPI table, don't ever try 49395b482a8SLen Brown * to delete it 49495b482a8SLen Brown */ 49595b482a8SLen Brown obj_desc->common.flags |= AOPOBJ_STATIC_POINTER; 49695b482a8SLen Brown break; 49795b482a8SLen Brown 49895b482a8SLen Brown case ACPI_TYPE_METHOD: 49995b482a8SLen Brown break; 50095b482a8SLen Brown 50195b482a8SLen Brown case ACPI_TYPE_LOCAL_REFERENCE: 50295b482a8SLen Brown 50395b482a8SLen Brown switch (op_info->type) { 50495b482a8SLen Brown case AML_TYPE_LOCAL_VARIABLE: 50595b482a8SLen Brown 5069ff5a21aSBob Moore /* Local ID (0-7) is (AML opcode - base AML_FIRST_LOCAL_OP) */ 50795b482a8SLen Brown 508ba9c3f55SBob Moore obj_desc->reference.value = 5099ff5a21aSBob Moore ((u32)opcode) - AML_FIRST_LOCAL_OP; 51095b482a8SLen Brown obj_desc->reference.class = ACPI_REFCLASS_LOCAL; 51195b482a8SLen Brown 51295b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 51395b482a8SLen Brown status = 51495b482a8SLen Brown acpi_ds_method_data_get_node(ACPI_REFCLASS_LOCAL, 51595b482a8SLen Brown obj_desc->reference. 51695b482a8SLen Brown value, walk_state, 51795b482a8SLen Brown ACPI_CAST_INDIRECT_PTR 51895b482a8SLen Brown (struct 51995b482a8SLen Brown acpi_namespace_node, 52095b482a8SLen Brown &obj_desc->reference. 52195b482a8SLen Brown object)); 52295b482a8SLen Brown #endif 52395b482a8SLen Brown break; 52495b482a8SLen Brown 52595b482a8SLen Brown case AML_TYPE_METHOD_ARGUMENT: 52695b482a8SLen Brown 5279ff5a21aSBob Moore /* Arg ID (0-6) is (AML opcode - base AML_FIRST_ARG_OP) */ 52895b482a8SLen Brown 5299ff5a21aSBob Moore obj_desc->reference.value = 5309ff5a21aSBob Moore ((u32)opcode) - AML_FIRST_ARG_OP; 53195b482a8SLen Brown obj_desc->reference.class = ACPI_REFCLASS_ARG; 53295b482a8SLen Brown 53395b482a8SLen Brown #ifndef ACPI_NO_METHOD_EXECUTION 53495b482a8SLen Brown status = acpi_ds_method_data_get_node(ACPI_REFCLASS_ARG, 53595b482a8SLen Brown obj_desc-> 53695b482a8SLen Brown reference.value, 53795b482a8SLen Brown walk_state, 53895b482a8SLen Brown ACPI_CAST_INDIRECT_PTR 53995b482a8SLen Brown (struct 54095b482a8SLen Brown acpi_namespace_node, 54195b482a8SLen Brown &obj_desc-> 54295b482a8SLen Brown reference. 54395b482a8SLen Brown object)); 54495b482a8SLen Brown #endif 54595b482a8SLen Brown break; 54695b482a8SLen Brown 54795b482a8SLen Brown default: /* Object name or Debug object */ 54895b482a8SLen Brown 54995b482a8SLen Brown switch (op->common.aml_opcode) { 55095b482a8SLen Brown case AML_INT_NAMEPATH_OP: 55195b482a8SLen Brown 55295b482a8SLen Brown /* Node was saved in Op */ 55395b482a8SLen Brown 55495b482a8SLen Brown obj_desc->reference.node = op->common.node; 555*a62a7117SBob Moore obj_desc->reference.class = ACPI_REFCLASS_NAME; 556*a62a7117SBob Moore if (op->common.node) { 55795b482a8SLen Brown obj_desc->reference.object = 55895b482a8SLen Brown op->common.node->object; 559*a62a7117SBob Moore } 56095b482a8SLen Brown break; 56195b482a8SLen Brown 56295b482a8SLen Brown case AML_DEBUG_OP: 56395b482a8SLen Brown 56495b482a8SLen Brown obj_desc->reference.class = ACPI_REFCLASS_DEBUG; 56595b482a8SLen Brown break; 56695b482a8SLen Brown 56795b482a8SLen Brown default: 56895b482a8SLen Brown 56995b482a8SLen Brown ACPI_ERROR((AE_INFO, 570f6a22b0bSBob Moore "Unimplemented reference type for AML opcode: 0x%4.4X", 57195b482a8SLen Brown opcode)); 57295b482a8SLen Brown return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 57395b482a8SLen Brown } 57495b482a8SLen Brown break; 57595b482a8SLen Brown } 57695b482a8SLen Brown break; 57795b482a8SLen Brown 57895b482a8SLen Brown default: 57995b482a8SLen Brown 580f6a22b0bSBob Moore ACPI_ERROR((AE_INFO, "Unimplemented data type: 0x%X", 5813371c19cSBob Moore obj_desc->common.type)); 58295b482a8SLen Brown 58395b482a8SLen Brown status = AE_AML_OPERAND_TYPE; 58495b482a8SLen Brown break; 58595b482a8SLen Brown } 58695b482a8SLen Brown 58795b482a8SLen Brown return_ACPI_STATUS(status); 58895b482a8SLen Brown } 589