Release 4.7 drivers/acpi/acpica/excreate.c
  
  
/******************************************************************************
 *
 * Module Name: excreate - Named object creation
 *
 *****************************************************************************/
/*
 * Copyright (C) 2000 - 2016, Intel Corp.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 */
#include <acpi/acpi.h>
#include "accommon.h"
#include "acinterp.h"
#include "amlcode.h"
#include "acnamesp.h"
#define _COMPONENT          ACPI_EXECUTER
ACPI_MODULE_NAME("excreate")
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_alias
 *
 * PARAMETERS:  walk_state           - Current state, contains operands
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new named alias
 *
 ******************************************************************************/
acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state)
{
	struct acpi_namespace_node *target_node;
	struct acpi_namespace_node *alias_node;
	acpi_status status = AE_OK;
	ACPI_FUNCTION_TRACE(ex_create_alias);
	/* Get the source/alias operands (both namespace nodes) */
	alias_node = (struct acpi_namespace_node *)walk_state->operands[0];
	target_node = (struct acpi_namespace_node *)walk_state->operands[1];
	if ((target_node->type == ACPI_TYPE_LOCAL_ALIAS) ||
	    (target_node->type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) {
		/*
                 * Dereference an existing alias so that we don't create a chain
                 * of aliases. With this code, we guarantee that an alias is
                 * always exactly one level of indirection away from the
                 * actual aliased name.
                 */
		target_node =
		    ACPI_CAST_PTR(struct acpi_namespace_node,
				  target_node->object);
	}
	/*
         * For objects that can never change (i.e., the NS node will
         * permanently point to the same object), we can simply attach
         * the object to the new NS node. For other objects (such as
         * Integers, buffers, etc.), we have to point the Alias node
         * to the original Node.
         */
	switch (target_node->type) {
		/* For these types, the sub-object can change dynamically via a Store */
	case ACPI_TYPE_INTEGER:
	case ACPI_TYPE_STRING:
	case ACPI_TYPE_BUFFER:
	case ACPI_TYPE_PACKAGE:
	case ACPI_TYPE_BUFFER_FIELD:
		/*
                 * These types open a new scope, so we need the NS node in order to access
                 * any children.
                 */
	case ACPI_TYPE_DEVICE:
	case ACPI_TYPE_POWER:
	case ACPI_TYPE_PROCESSOR:
	case ACPI_TYPE_THERMAL:
	case ACPI_TYPE_LOCAL_SCOPE:
		/*
                 * The new alias has the type ALIAS and points to the original
                 * NS node, not the object itself.
                 */
		alias_node->type = ACPI_TYPE_LOCAL_ALIAS;
		alias_node->object =
		    ACPI_CAST_PTR(union acpi_operand_object, target_node);
		break;
	case ACPI_TYPE_METHOD:
		/*
                 * Control method aliases need to be differentiated
                 */
		alias_node->type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
		alias_node->object =
		    ACPI_CAST_PTR(union acpi_operand_object, target_node);
		break;
	default:
		/* Attach the original source object to the new Alias Node */
		/*
                 * The new alias assumes the type of the target, and it points
                 * to the same object. The reference count of the object has an
                 * additional reference to prevent deletion out from under either the
                 * target node or the alias Node
                 */
		status = acpi_ns_attach_object(alias_node,
					       acpi_ns_get_attached_object
					       (target_node),
					       target_node->type);
		break;
	}
	/* Since both operands are Nodes, we don't need to delete them */
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| andy grover | andy grover | 92 | 45.54% | 4 | 30.77% | 
| len brown | len brown | 37 | 18.32% | 2 | 15.38% | 
| linus torvalds | linus torvalds | 28 | 13.86% | 3 | 23.08% | 
| robert moore | robert moore | 23 | 11.39% | 3 | 23.08% | 
| pre-git | pre-git | 22 | 10.89% | 1 | 7.69% | 
 | Total | 202 | 100.00% | 13 | 100.00% | 
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_event
 *
 * PARAMETERS:  walk_state          - Current state
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new event object
 *
 ******************************************************************************/
acpi_status acpi_ex_create_event(struct acpi_walk_state *walk_state)
{
	acpi_status status;
	union acpi_operand_object *obj_desc;
	ACPI_FUNCTION_TRACE(ex_create_event);
	obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_EVENT);
	if (!obj_desc) {
		status = AE_NO_MEMORY;
		goto cleanup;
	}
	/*
         * Create the actual OS semaphore, with zero initial units -- meaning
         * that the event is created in an unsignalled state
         */
	status = acpi_os_create_semaphore(ACPI_NO_UNIT_LIMIT, 0,
					  &obj_desc->event.os_semaphore);
	if (ACPI_FAILURE(status)) {
		goto cleanup;
	}
	/* Attach object to the Node */
	status = acpi_ns_attach_object((struct acpi_namespace_node *)
				       walk_state->operands[0], obj_desc,
				       ACPI_TYPE_EVENT);
cleanup:
	/*
         * Remove local reference to the object (on error, will cause deletion
         * of both object and semaphore if present.)
         */
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| pre-git | pre-git | 75 | 69.44% | 2 | 20.00% | 
| linus torvalds | linus torvalds | 24 | 22.22% | 3 | 30.00% | 
| andy grover | andy grover | 6 | 5.56% | 2 | 20.00% | 
| robert moore | robert moore | 2 | 1.85% | 2 | 20.00% | 
| len brown | len brown | 1 | 0.93% | 1 | 10.00% | 
 | Total | 108 | 100.00% | 10 | 100.00% | 
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_mutex
 *
 * PARAMETERS:  walk_state          - Current state
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new mutex object
 *
 *              Mutex (Name[0], sync_level[1])
 *
 ******************************************************************************/
acpi_status acpi_ex_create_mutex(struct acpi_walk_state *walk_state)
{
	acpi_status status = AE_OK;
	union acpi_operand_object *obj_desc;
	ACPI_FUNCTION_TRACE_PTR(ex_create_mutex, ACPI_WALK_OPERANDS);
	/* Create the new mutex object */
	obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_MUTEX);
	if (!obj_desc) {
		status = AE_NO_MEMORY;
		goto cleanup;
	}
	/* Create the actual OS Mutex */
	status = acpi_os_create_mutex(&obj_desc->mutex.os_mutex);
	if (ACPI_FAILURE(status)) {
		goto cleanup;
	}
	/* Init object and attach to NS node */
	obj_desc->mutex.sync_level = (u8)walk_state->operands[1]->integer.value;
	obj_desc->mutex.node =
	    (struct acpi_namespace_node *)walk_state->operands[0];
	status =
	    acpi_ns_attach_object(obj_desc->mutex.node, obj_desc,
				  ACPI_TYPE_MUTEX);
cleanup:
	/*
         * Remove local reference to the object (on error, will cause deletion
         * of both object and semaphore if present.)
         */
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| pre-git | pre-git | 86 | 60.99% | 1 | 9.09% | 
| linus torvalds | linus torvalds | 30 | 21.28% | 4 | 36.36% | 
| andy grover | andy grover | 20 | 14.18% | 3 | 27.27% | 
| robert moore | robert moore | 4 | 2.84% | 2 | 18.18% | 
| len brown | len brown | 1 | 0.71% | 1 | 9.09% | 
 | Total | 141 | 100.00% | 11 | 100.00% | 
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_region
 *
 * PARAMETERS:  aml_start           - Pointer to the region declaration AML
 *              aml_length          - Max length of the declaration AML
 *              space_id            - Address space ID for the region
 *              walk_state          - Current state
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new operation region object
 *
 ******************************************************************************/
acpi_status
acpi_ex_create_region(u8 * aml_start,
		      u32 aml_length,
		      u8 space_id, struct acpi_walk_state *walk_state)
{
	acpi_status status;
	union acpi_operand_object *obj_desc;
	struct acpi_namespace_node *node;
	union acpi_operand_object *region_obj2;
	ACPI_FUNCTION_TRACE(ex_create_region);
	/* Get the Namespace Node */
	node = walk_state->op->common.node;
	/*
         * If the region object is already attached to this node,
         * just return
         */
	if (acpi_ns_get_attached_object(node)) {
		return_ACPI_STATUS(AE_OK);
	}
	/*
         * Space ID must be one of the predefined IDs, or in the user-defined
         * range
         */
	if (!acpi_is_valid_space_id(space_id)) {
		/*
                 * Print an error message, but continue. We don't want to abort
                 * a table load for this exception. Instead, if the region is
                 * actually used at runtime, abort the executing method.
                 */
		ACPI_ERROR((AE_INFO,
			    "Invalid/unknown Address Space ID: 0x%2.2X",
			    space_id));
	}
	ACPI_DEBUG_PRINT((ACPI_DB_LOAD, "Region Type - %s (0x%X)\n",
			  acpi_ut_get_region_name(space_id), space_id));
	/* Create the region descriptor */
	obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_REGION);
	if (!obj_desc) {
		status = AE_NO_MEMORY;
		goto cleanup;
	}
	/*
         * Remember location in AML stream of address & length
         * operands since they need to be evaluated at run time.
         */
	region_obj2 = acpi_ns_get_secondary_object(obj_desc);
	region_obj2->extra.aml_start = aml_start;
	region_obj2->extra.aml_length = aml_length;
	region_obj2->extra.method_REG = NULL;
	if (walk_state->scope_info) {
		region_obj2->extra.scope_node =
		    walk_state->scope_info->scope.node;
	} else {
		region_obj2->extra.scope_node = node;
	}
	/* Init the region from the operands */
	obj_desc->region.space_id = space_id;
	obj_desc->region.address = 0;
	obj_desc->region.length = 0;
	obj_desc->region.node = node;
	obj_desc->region.handler = NULL;
	obj_desc->common.flags &=
	    ~(AOPOBJ_SETUP_COMPLETE | AOPOBJ_REG_CONNECTED |
	      AOPOBJ_OBJECT_INITIALIZED);
	/* Install the new region object in the parent Node */
	status = acpi_ns_attach_object(node, obj_desc, ACPI_TYPE_REGION);
cleanup:
	/* Remove local reference to the object */
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| andy grover | andy grover | 75 | 27.17% | 3 | 17.65% | 
| pre-git | pre-git | 71 | 25.72% | 3 | 17.65% | 
| linus torvalds | linus torvalds | 45 | 16.30% | 3 | 17.65% | 
| lv zheng | lv zheng | 34 | 12.32% | 2 | 11.76% | 
| lin ming | lin ming | 33 | 11.96% | 1 | 5.88% | 
| robert moore | robert moore | 17 | 6.16% | 4 | 23.53% | 
| len brown | len brown | 1 | 0.36% | 1 | 5.88% | 
 | Total | 276 | 100.00% | 17 | 100.00% | 
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_processor
 *
 * PARAMETERS:  walk_state          - Current state
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new processor object and populate the fields
 *
 *              Processor (Name[0], cpu_ID[1], pblock_addr[2], pblock_length[3])
 *
 ******************************************************************************/
acpi_status acpi_ex_create_processor(struct acpi_walk_state *walk_state)
{
	union acpi_operand_object **operand = &walk_state->operands[0];
	union acpi_operand_object *obj_desc;
	acpi_status status;
	ACPI_FUNCTION_TRACE_PTR(ex_create_processor, walk_state);
	/* Create the processor object */
	obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PROCESSOR);
	if (!obj_desc) {
		return_ACPI_STATUS(AE_NO_MEMORY);
	}
	/* Initialize the processor object from the operands */
	obj_desc->processor.proc_id = (u8) operand[1]->integer.value;
	obj_desc->processor.length = (u8) operand[3]->integer.value;
	obj_desc->processor.address =
	    (acpi_io_address)operand[2]->integer.value;
	/* Install the processor object in the parent Node */
	status = acpi_ns_attach_object((struct acpi_namespace_node *)operand[0],
				       obj_desc, ACPI_TYPE_PROCESSOR);
	/* Remove local reference to the object */
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| linus torvalds | linus torvalds | 81 | 55.86% | 3 | 30.00% | 
| pre-git | pre-git | 50 | 34.48% | 1 | 10.00% | 
| robert moore | robert moore | 8 | 5.52% | 3 | 30.00% | 
| andy grover | andy grover | 5 | 3.45% | 2 | 20.00% | 
| len brown | len brown | 1 | 0.69% | 1 | 10.00% | 
 | Total | 145 | 100.00% | 10 | 100.00% | 
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_power_resource
 *
 * PARAMETERS:  walk_state          - Current state
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new power_resource object and populate the fields
 *
 *              power_resource (Name[0], system_level[1], resource_order[2])
 *
 ******************************************************************************/
acpi_status acpi_ex_create_power_resource(struct acpi_walk_state *walk_state)
{
	union acpi_operand_object **operand = &walk_state->operands[0];
	acpi_status status;
	union acpi_operand_object *obj_desc;
	ACPI_FUNCTION_TRACE_PTR(ex_create_power_resource, walk_state);
	/* Create the power resource object */
	obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_POWER);
	if (!obj_desc) {
		return_ACPI_STATUS(AE_NO_MEMORY);
	}
	/* Initialize the power object from the operands */
	obj_desc->power_resource.system_level = (u8) operand[1]->integer.value;
	obj_desc->power_resource.resource_order =
	    (u16) operand[2]->integer.value;
	/* Install the  power resource object in the parent Node */
	status = acpi_ns_attach_object((struct acpi_namespace_node *)operand[0],
				       obj_desc, ACPI_TYPE_POWER);
	/* Remove local reference to the object */
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| linus torvalds | linus torvalds | 74 | 58.27% | 3 | 37.50% | 
| pre-git | pre-git | 46 | 36.22% | 1 | 12.50% | 
| andy grover | andy grover | 5 | 3.94% | 2 | 25.00% | 
| robert moore | robert moore | 1 | 0.79% | 1 | 12.50% | 
| len brown | len brown | 1 | 0.79% | 1 | 12.50% | 
 | Total | 127 | 100.00% | 8 | 100.00% | 
#endif
/*******************************************************************************
 *
 * FUNCTION:    acpi_ex_create_method
 *
 * PARAMETERS:  aml_start       - First byte of the method's AML
 *              aml_length      - AML byte count for this method
 *              walk_state      - Current state
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a new method object
 *
 ******************************************************************************/
acpi_status
acpi_ex_create_method(u8 * aml_start,
		      u32 aml_length, struct acpi_walk_state *walk_state)
{
	union acpi_operand_object **operand = &walk_state->operands[0];
	union acpi_operand_object *obj_desc;
	acpi_status status;
	u8 method_flags;
	ACPI_FUNCTION_TRACE_PTR(ex_create_method, walk_state);
	/* Create a new method object */
	obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_METHOD);
	if (!obj_desc) {
		status = AE_NO_MEMORY;
		goto exit;
	}
	/* Save the method's AML pointer and length  */
	obj_desc->method.aml_start = aml_start;
	obj_desc->method.aml_length = aml_length;
	obj_desc->method.node = operand[0];
	/*
         * Disassemble the method flags. Split off the arg_count, Serialized
         * flag, and sync_level for efficiency.
         */
	method_flags = (u8)operand[1]->integer.value;
	obj_desc->method.param_count = (u8)
	    (method_flags & AML_METHOD_ARG_COUNT);
	/*
         * Get the sync_level. If method is serialized, a mutex will be
         * created for this method when it is parsed.
         */
	if (method_flags & AML_METHOD_SERIALIZED) {
		obj_desc->method.info_flags = ACPI_METHOD_SERIALIZED;
		/*
                 * ACPI 1.0: sync_level = 0
                 * ACPI 2.0: sync_level = sync_level in method declaration
                 */
		obj_desc->method.sync_level = (u8)
		    ((method_flags & AML_METHOD_SYNC_LEVEL) >> 4);
	}
	/* Attach the new object to the method Node */
	status = acpi_ns_attach_object((struct acpi_namespace_node *)operand[0],
				       obj_desc, ACPI_TYPE_METHOD);
	/* Remove local reference to the object */
	acpi_ut_remove_reference(obj_desc);
exit:
	/* Remove a reference to the operand */
	acpi_ut_remove_reference(operand[1]);
	return_ACPI_STATUS(status);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| pre-git | pre-git | 87 | 41.83% | 2 | 14.29% | 
| linus torvalds | linus torvalds | 82 | 39.42% | 3 | 21.43% | 
| lv zheng | lv zheng | 11 | 5.29% | 1 | 7.14% | 
| robert moore | robert moore | 11 | 5.29% | 3 | 21.43% | 
| lin ming | lin ming | 10 | 4.81% | 2 | 14.29% | 
| andy grover | andy grover | 5 | 2.40% | 2 | 14.29% | 
| len brown | len brown | 2 | 0.96% | 1 | 7.14% | 
 | Total | 208 | 100.00% | 14 | 100.00% | 
Overall Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| pre-git | pre-git | 450 | 36.17% | 3 | 7.69% | 
| linus torvalds | linus torvalds | 366 | 29.42% | 4 | 10.26% | 
| andy grover | andy grover | 215 | 17.28% | 7 | 17.95% | 
| robert moore | robert moore | 76 | 6.11% | 13 | 33.33% | 
| len brown | len brown | 48 | 3.86% | 5 | 12.82% | 
| lv zheng | lv zheng | 45 | 3.62% | 3 | 7.69% | 
| lin ming | lin ming | 43 | 3.46% | 3 | 7.69% | 
| patrick mochel | patrick mochel | 1 | 0.08% | 1 | 2.56% | 
 | Total | 1244 | 100.00% | 39 | 100.00% | 
  
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.