dsobject.c 18.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/******************************************************************************
 *
 * Module Name: dsobject - Dispatcher object management routines
 *
 *****************************************************************************/

/*
B
Bob Moore 已提交
8
 * Copyright (C) 2000 - 2006, R. Byron Moore
L
Linus Torvalds 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
 * 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 <acpi/acparser.h>
#include <acpi/amlcode.h>
#include <acpi/acdispat.h>
#include <acpi/acnamesp.h>
#include <acpi/acinterp.h>

#define _COMPONENT          ACPI_DISPATCHER
L
Len Brown 已提交
52
ACPI_MODULE_NAME("dsobject")
L
Linus Torvalds 已提交
53

B
Bob Moore 已提交
54
/* Local prototypes */
R
Robert Moore 已提交
55
static acpi_status
L
Len Brown 已提交
56 57 58
acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
			      union acpi_parse_object *op,
			      union acpi_operand_object **obj_desc_ptr);
L
Linus Torvalds 已提交
59 60

#ifndef ACPI_NO_METHOD_EXECUTION
R
Robert Moore 已提交
61
/*******************************************************************************
L
Linus Torvalds 已提交
62 63 64 65 66 67 68 69 70 71 72 73
 *
 * FUNCTION:    acpi_ds_build_internal_object
 *
 * PARAMETERS:  walk_state      - Current walk state
 *              Op              - Parser object to be translated
 *              obj_desc_ptr    - Where the ACPI internal object is returned
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Translate a parser Op object to the equivalent namespace object
 *              Simple objects are any objects other than a package object!
 *
R
Robert Moore 已提交
74
 ******************************************************************************/
L
Linus Torvalds 已提交
75

R
Robert Moore 已提交
76
static acpi_status
L
Len Brown 已提交
77 78 79
acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
			      union acpi_parse_object *op,
			      union acpi_operand_object **obj_desc_ptr)
L
Linus Torvalds 已提交
80
{
L
Len Brown 已提交
81 82
	union acpi_operand_object *obj_desc;
	acpi_status status;
L
Linus Torvalds 已提交
83

L
Len Brown 已提交
84
	ACPI_FUNCTION_TRACE("ds_build_internal_object");
L
Linus Torvalds 已提交
85 86 87 88

	*obj_desc_ptr = NULL;
	if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
		/*
B
Bob Moore 已提交
89
		 * This is a named object reference. If this name was
L
Linus Torvalds 已提交
90 91 92 93
		 * previously looked up in the namespace, it was stored in this op.
		 * Otherwise, go ahead and look it up now
		 */
		if (!op->common.node) {
L
Len Brown 已提交
94 95 96 97 98 99
			status = acpi_ns_lookup(walk_state->scope_info,
						op->common.value.string,
						ACPI_TYPE_ANY,
						ACPI_IMODE_EXECUTE,
						ACPI_NS_SEARCH_PARENT |
						ACPI_NS_DONT_OPEN_SCOPE, NULL,
B
Bob Moore 已提交
100 101 102 103 104
						ACPI_CAST_INDIRECT_PTR(struct
								       acpi_namespace_node,
								       &(op->
									 common.
									 node)));
L
Len Brown 已提交
105
			if (ACPI_FAILURE(status)) {
B
Bob Moore 已提交
106

B
Bob Moore 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
				/* Check if we are resolving a named reference within a package */

				if ((status == AE_NOT_FOUND)
				    && (acpi_gbl_enable_interpreter_slack)
				    &&
				    ((op->common.parent->common.aml_opcode ==
				      AML_PACKAGE_OP)
				     || (op->common.parent->common.aml_opcode ==
					 AML_VAR_PACKAGE_OP))) {
					/*
					 * We didn't find the target and we are populating elements
					 * of a package - ignore if slack enabled. Some ASL code
					 * contains dangling invalid references in packages and
					 * expects that no exception will be issued. Leave the
					 * element as a null element. It cannot be used, but it
					 * can be overwritten by subsequent ASL code - this is
					 * typically the case.
					 */
					ACPI_DEBUG_PRINT((ACPI_DB_INFO,
							  "Ignoring unresolved reference in package [%4.4s]\n",
							  walk_state->
							  scope_info->scope.
							  node->name.ascii));

					return_ACPI_STATUS(AE_OK);
				} else {
B
Bob Moore 已提交
133 134
					ACPI_ERROR_NAMESPACE(op->common.value.
							     string, status);
B
Bob Moore 已提交
135 136
				}

L
Len Brown 已提交
137
				return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
138 139 140 141
			}
		}
	}

B
Bob Moore 已提交
142
	/* Create and init a new internal ACPI object */
L
Linus Torvalds 已提交
143

L
Len Brown 已提交
144 145 146
	obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info
						   (op->common.aml_opcode))->
						  object_type);
L
Linus Torvalds 已提交
147
	if (!obj_desc) {
L
Len Brown 已提交
148
		return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
149 150
	}

L
Len Brown 已提交
151 152 153 154 155 156
	status =
	    acpi_ds_init_object_from_op(walk_state, op, op->common.aml_opcode,
					&obj_desc);
	if (ACPI_FAILURE(status)) {
		acpi_ut_remove_reference(obj_desc);
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
157 158 159
	}

	*obj_desc_ptr = obj_desc;
L
Len Brown 已提交
160
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
161 162
}

R
Robert Moore 已提交
163
/*******************************************************************************
L
Linus Torvalds 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176
 *
 * FUNCTION:    acpi_ds_build_internal_buffer_obj
 *
 * PARAMETERS:  walk_state      - Current walk state
 *              Op              - Parser object to be translated
 *              buffer_length   - Length of the buffer
 *              obj_desc_ptr    - Where the ACPI internal object is returned
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Translate a parser Op package object to the equivalent
 *              namespace object
 *
R
Robert Moore 已提交
177
 ******************************************************************************/
L
Linus Torvalds 已提交
178 179

acpi_status
L
Len Brown 已提交
180 181 182 183
acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
				  union acpi_parse_object *op,
				  u32 buffer_length,
				  union acpi_operand_object **obj_desc_ptr)
L
Linus Torvalds 已提交
184
{
L
Len Brown 已提交
185 186 187 188
	union acpi_parse_object *arg;
	union acpi_operand_object *obj_desc;
	union acpi_parse_object *byte_list;
	u32 byte_list_length = 0;
L
Linus Torvalds 已提交
189

L
Len Brown 已提交
190
	ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj");
L
Linus Torvalds 已提交
191

B
Bob Moore 已提交
192 193 194 195 196
	/*
	 * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
	 * The buffer object already exists (from the NS node), otherwise it must
	 * be created.
	 */
L
Linus Torvalds 已提交
197
	obj_desc = *obj_desc_ptr;
B
Bob Moore 已提交
198
	if (!obj_desc) {
B
Bob Moore 已提交
199

L
Linus Torvalds 已提交
200 201
		/* Create a new buffer object */

L
Len Brown 已提交
202
		obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER);
L
Linus Torvalds 已提交
203 204
		*obj_desc_ptr = obj_desc;
		if (!obj_desc) {
L
Len Brown 已提交
205
			return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
206 207 208 209 210 211 212 213
		}
	}

	/*
	 * Second arg is the buffer data (optional) byte_list can be either
	 * individual bytes or a string initializer.  In either case, a
	 * byte_list appears in the AML.
	 */
L
Len Brown 已提交
214
	arg = op->common.value.arg;	/* skip first arg */
L
Linus Torvalds 已提交
215 216 217 218

	byte_list = arg->named.next;
	if (byte_list) {
		if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) {
B
Bob Moore 已提交
219 220 221
			ACPI_ERROR((AE_INFO,
				    "Expecting bytelist, got AML opcode %X in op %p",
				    byte_list->common.aml_opcode, byte_list));
L
Linus Torvalds 已提交
222

L
Len Brown 已提交
223
			acpi_ut_remove_reference(obj_desc);
L
Linus Torvalds 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
			return (AE_TYPE);
		}

		byte_list_length = (u32) byte_list->common.value.integer;
	}

	/*
	 * The buffer length (number of bytes) will be the larger of:
	 * 1) The specified buffer length and
	 * 2) The length of the initializer byte list
	 */
	obj_desc->buffer.length = buffer_length;
	if (byte_list_length > buffer_length) {
		obj_desc->buffer.length = byte_list_length;
	}

	/* Allocate the buffer */

	if (obj_desc->buffer.length == 0) {
		obj_desc->buffer.pointer = NULL;
L
Len Brown 已提交
244 245 246 247 248
		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
				  "Buffer defined with zero length in AML, creating\n"));
	} else {
		obj_desc->buffer.pointer =
		    ACPI_MEM_CALLOCATE(obj_desc->buffer.length);
L
Linus Torvalds 已提交
249
		if (!obj_desc->buffer.pointer) {
L
Len Brown 已提交
250 251
			acpi_ut_delete_object_desc(obj_desc);
			return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
252 253 254 255 256
		}

		/* Initialize buffer from the byte_list (if present) */

		if (byte_list) {
L
Len Brown 已提交
257 258
			ACPI_MEMCPY(obj_desc->buffer.pointer,
				    byte_list->named.data, byte_list_length);
L
Linus Torvalds 已提交
259 260 261 262
		}
	}

	obj_desc->buffer.flags |= AOPOBJ_DATA_VALID;
L
Len Brown 已提交
263 264
	op->common.node = (struct acpi_namespace_node *)obj_desc;
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
265 266
}

R
Robert Moore 已提交
267
/*******************************************************************************
L
Linus Torvalds 已提交
268 269 270 271 272 273 274 275 276 277 278 279 280
 *
 * FUNCTION:    acpi_ds_build_internal_package_obj
 *
 * PARAMETERS:  walk_state      - Current walk state
 *              Op              - Parser object to be translated
 *              package_length  - Number of elements in the package
 *              obj_desc_ptr    - Where the ACPI internal object is returned
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Translate a parser Op package object to the equivalent
 *              namespace object
 *
R
Robert Moore 已提交
281
 ******************************************************************************/
L
Linus Torvalds 已提交
282 283

acpi_status
L
Len Brown 已提交
284 285 286 287
acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
				   union acpi_parse_object *op,
				   u32 package_length,
				   union acpi_operand_object **obj_desc_ptr)
L
Linus Torvalds 已提交
288
{
L
Len Brown 已提交
289 290 291 292 293
	union acpi_parse_object *arg;
	union acpi_parse_object *parent;
	union acpi_operand_object *obj_desc = NULL;
	u32 package_list_length;
	acpi_status status = AE_OK;
B
Bob Moore 已提交
294
	acpi_native_uint i;
L
Linus Torvalds 已提交
295

L
Len Brown 已提交
296
	ACPI_FUNCTION_TRACE("ds_build_internal_package_obj");
L
Linus Torvalds 已提交
297 298 299 300

	/* Find the parent of a possibly nested package */

	parent = op->common.parent;
L
Len Brown 已提交
301 302
	while ((parent->common.aml_opcode == AML_PACKAGE_OP) ||
	       (parent->common.aml_opcode == AML_VAR_PACKAGE_OP)) {
L
Linus Torvalds 已提交
303 304 305
		parent = parent->common.parent;
	}

B
Bob Moore 已提交
306 307 308 309
	/*
	 * If we are evaluating a Named package object "Name (xxxx, Package)",
	 * the package object already exists, otherwise it must be created.
	 */
L
Linus Torvalds 已提交
310
	obj_desc = *obj_desc_ptr;
B
Bob Moore 已提交
311
	if (!obj_desc) {
L
Len Brown 已提交
312
		obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
L
Linus Torvalds 已提交
313 314
		*obj_desc_ptr = obj_desc;
		if (!obj_desc) {
L
Len Brown 已提交
315
			return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
316 317 318 319 320 321 322 323 324 325 326
		}

		obj_desc->package.node = parent->common.node;
	}

	obj_desc->package.count = package_length;

	/* Count the number of items in the package list */

	arg = op->common.value.arg;
	arg = arg->common.next;
B
Bob Moore 已提交
327
	for (package_list_length = 0; arg; package_list_length++) {
L
Linus Torvalds 已提交
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
		arg = arg->common.next;
	}

	/*
	 * The package length (number of elements) will be the greater
	 * of the specified length and the length of the initializer list
	 */
	if (package_list_length > package_length) {
		obj_desc->package.count = package_list_length;
	}

	/*
	 * Allocate the pointer array (array of pointers to the
	 * individual objects). Add an extra pointer slot so
	 * that the list is always null terminated.
	 */
L
Len Brown 已提交
344 345 346
	obj_desc->package.elements = ACPI_MEM_CALLOCATE(((acpi_size) obj_desc->
							 package.count +
							 1) * sizeof(void *));
L
Linus Torvalds 已提交
347 348

	if (!obj_desc->package.elements) {
L
Len Brown 已提交
349 350
		acpi_ut_delete_object_desc(obj_desc);
		return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
351 352 353
	}

	/*
B
Bob Moore 已提交
354
	 * Initialize all elements of the package
L
Linus Torvalds 已提交
355 356 357
	 */
	arg = op->common.value.arg;
	arg = arg->common.next;
B
Bob Moore 已提交
358
	for (i = 0; arg; i++) {
L
Linus Torvalds 已提交
359
		if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
B
Bob Moore 已提交
360

L
Linus Torvalds 已提交
361 362
			/* Object (package or buffer) is already built */

R
Robert Moore 已提交
363
			obj_desc->package.elements[i] =
L
Len Brown 已提交
364 365 366 367 368 369 370
			    ACPI_CAST_PTR(union acpi_operand_object,
					  arg->common.node);
		} else {
			status = acpi_ds_build_internal_object(walk_state, arg,
							       &obj_desc->
							       package.
							       elements[i]);
L
Linus Torvalds 已提交
371 372 373 374 375
		}
		arg = arg->common.next;
	}

	obj_desc->package.flags |= AOPOBJ_DATA_VALID;
L
Len Brown 已提交
376 377
	op->common.node = (struct acpi_namespace_node *)obj_desc;
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
378 379
}

R
Robert Moore 已提交
380
/*******************************************************************************
L
Linus Torvalds 已提交
381 382 383 384 385 386 387 388 389 390 391
 *
 * FUNCTION:    acpi_ds_create_node
 *
 * PARAMETERS:  walk_state      - Current walk state
 *              Node            - NS Node to be initialized
 *              Op              - Parser object to be translated
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create the object to be associated with a namespace node
 *
R
Robert Moore 已提交
392
 ******************************************************************************/
L
Linus Torvalds 已提交
393 394

acpi_status
L
Len Brown 已提交
395 396 397
acpi_ds_create_node(struct acpi_walk_state *walk_state,
		    struct acpi_namespace_node *node,
		    union acpi_parse_object *op)
L
Linus Torvalds 已提交
398
{
L
Len Brown 已提交
399 400
	acpi_status status;
	union acpi_operand_object *obj_desc;
L
Linus Torvalds 已提交
401

L
Len Brown 已提交
402
	ACPI_FUNCTION_TRACE_PTR("ds_create_node", op);
L
Linus Torvalds 已提交
403 404 405 406 407 408

	/*
	 * Because of the execution pass through the non-control-method
	 * parts of the table, we can arrive here twice.  Only init
	 * the named object node the first time through
	 */
L
Len Brown 已提交
409 410
	if (acpi_ns_get_attached_object(node)) {
		return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
411 412 413
	}

	if (!op->common.value.arg) {
B
Bob Moore 已提交
414

L
Linus Torvalds 已提交
415 416
		/* No arguments, there is nothing to do */

L
Len Brown 已提交
417
		return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
418 419 420 421
	}

	/* Build an internal object for the argument(s) */

L
Len Brown 已提交
422 423 424 425
	status = acpi_ds_build_internal_object(walk_state, op->common.value.arg,
					       &obj_desc);
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
426 427 428 429
	}

	/* Re-type the object according to its argument */

L
Len Brown 已提交
430
	node->type = ACPI_GET_OBJECT_TYPE(obj_desc);
L
Linus Torvalds 已提交
431 432 433

	/* Attach obj to node */

L
Len Brown 已提交
434
	status = acpi_ns_attach_object(node, obj_desc, node->type);
L
Linus Torvalds 已提交
435 436 437

	/* Remove local reference to the object */

L
Len Brown 已提交
438 439
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
440 441
}

L
Len Brown 已提交
442
#endif				/* ACPI_NO_METHOD_EXECUTION */
L
Linus Torvalds 已提交
443

R
Robert Moore 已提交
444
/*******************************************************************************
L
Linus Torvalds 已提交
445 446 447 448 449 450 451 452 453 454 455 456 457 458
 *
 * FUNCTION:    acpi_ds_init_object_from_op
 *
 * PARAMETERS:  walk_state      - Current walk state
 *              Op              - Parser op used to init the internal object
 *              Opcode          - AML opcode associated with the object
 *              ret_obj_desc    - Namespace object to be initialized
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Initialize a namespace object from a parser Op and its
 *              associated arguments.  The namespace object is a more compact
 *              representation of the Op and its arguments.
 *
R
Robert Moore 已提交
459
 ******************************************************************************/
L
Linus Torvalds 已提交
460 461

acpi_status
L
Len Brown 已提交
462 463 464 465
acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
			    union acpi_parse_object *op,
			    u16 opcode,
			    union acpi_operand_object **ret_obj_desc)
L
Linus Torvalds 已提交
466
{
L
Len Brown 已提交
467 468 469
	const struct acpi_opcode_info *op_info;
	union acpi_operand_object *obj_desc;
	acpi_status status = AE_OK;
L
Linus Torvalds 已提交
470

L
Len Brown 已提交
471
	ACPI_FUNCTION_TRACE("ds_init_object_from_op");
L
Linus Torvalds 已提交
472 473

	obj_desc = *ret_obj_desc;
L
Len Brown 已提交
474
	op_info = acpi_ps_get_opcode_info(opcode);
L
Linus Torvalds 已提交
475
	if (op_info->class == AML_CLASS_UNKNOWN) {
B
Bob Moore 已提交
476

L
Linus Torvalds 已提交
477 478
		/* Unknown opcode */

L
Len Brown 已提交
479
		return_ACPI_STATUS(AE_TYPE);
L
Linus Torvalds 已提交
480 481 482 483
	}

	/* Perform per-object initialization */

L
Len Brown 已提交
484
	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
L
Linus Torvalds 已提交
485 486 487 488 489
	case ACPI_TYPE_BUFFER:

		/*
		 * Defer evaluation of Buffer term_arg operand
		 */
L
Len Brown 已提交
490 491
		obj_desc->buffer.node = (struct acpi_namespace_node *)
		    walk_state->operands[0];
L
Linus Torvalds 已提交
492 493 494 495 496 497 498 499 500
		obj_desc->buffer.aml_start = op->named.data;
		obj_desc->buffer.aml_length = op->named.length;
		break;

	case ACPI_TYPE_PACKAGE:

		/*
		 * Defer evaluation of Package term_arg operand
		 */
L
Len Brown 已提交
501 502
		obj_desc->package.node = (struct acpi_namespace_node *)
		    walk_state->operands[0];
L
Linus Torvalds 已提交
503 504 505 506 507 508 509 510 511 512 513
		obj_desc->package.aml_start = op->named.data;
		obj_desc->package.aml_length = op->named.length;
		break;

	case ACPI_TYPE_INTEGER:

		switch (op_info->type) {
		case AML_TYPE_CONSTANT:
			/*
			 * Resolve AML Constants here - AND ONLY HERE!
			 * All constants are integers.
R
Robert Moore 已提交
514 515 516 517
			 * We mark the integer with a flag that indicates that it started
			 * life as a constant -- so that stores to constants will perform
			 * as expected (noop). zero_op is used as a placeholder for optional
			 * target operands.
L
Linus Torvalds 已提交
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538
			 */
			obj_desc->common.flags = AOPOBJ_AML_CONSTANT;

			switch (opcode) {
			case AML_ZERO_OP:

				obj_desc->integer.value = 0;
				break;

			case AML_ONE_OP:

				obj_desc->integer.value = 1;
				break;

			case AML_ONES_OP:

				obj_desc->integer.value = ACPI_INTEGER_MAX;

				/* Truncate value if we are executing from a 32-bit ACPI table */

#ifndef ACPI_NO_METHOD_EXECUTION
L
Len Brown 已提交
539
				acpi_ex_truncate_for32bit_table(obj_desc);
L
Linus Torvalds 已提交
540 541 542 543 544 545 546 547 548 549
#endif
				break;

			case AML_REVISION_OP:

				obj_desc->integer.value = ACPI_CA_VERSION;
				break;

			default:

B
Bob Moore 已提交
550 551 552
				ACPI_ERROR((AE_INFO,
					    "Unknown constant opcode %X",
					    opcode));
L
Linus Torvalds 已提交
553 554 555 556 557 558 559 560
				status = AE_AML_OPERAND_TYPE;
				break;
			}
			break;

		case AML_TYPE_LITERAL:

			obj_desc->integer.value = op->common.value.integer;
561
#ifndef ACPI_NO_METHOD_EXECUTION
L
Len Brown 已提交
562
			acpi_ex_truncate_for32bit_table(obj_desc);
563
#endif
L
Linus Torvalds 已提交
564 565 566
			break;

		default:
B
Bob Moore 已提交
567 568
			ACPI_ERROR((AE_INFO, "Unknown Integer type %X",
				    op_info->type));
L
Linus Torvalds 已提交
569 570 571 572 573 574 575 576
			status = AE_AML_OPERAND_TYPE;
			break;
		}
		break;

	case ACPI_TYPE_STRING:

		obj_desc->string.pointer = op->common.value.string;
L
Len Brown 已提交
577 578
		obj_desc->string.length =
		    (u32) ACPI_STRLEN(op->common.value.string);
L
Linus Torvalds 已提交
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600

		/*
		 * The string is contained in the ACPI table, don't ever try
		 * to delete it
		 */
		obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;
		break;

	case ACPI_TYPE_METHOD:
		break;

	case ACPI_TYPE_LOCAL_REFERENCE:

		switch (op_info->type) {
		case AML_TYPE_LOCAL_VARIABLE:

			/* Split the opcode into a base opcode + offset */

			obj_desc->reference.opcode = AML_LOCAL_OP;
			obj_desc->reference.offset = opcode - AML_LOCAL_OP;

#ifndef ACPI_NO_METHOD_EXECUTION
L
Len Brown 已提交
601 602 603 604 605 606 607 608
			status = acpi_ds_method_data_get_node(AML_LOCAL_OP,
							      obj_desc->
							      reference.offset,
							      walk_state,
							      (struct
							       acpi_namespace_node
							       **)&obj_desc->
							      reference.object);
L
Linus Torvalds 已提交
609 610 611 612 613 614 615 616 617 618 619
#endif
			break;

		case AML_TYPE_METHOD_ARGUMENT:

			/* Split the opcode into a base opcode + offset */

			obj_desc->reference.opcode = AML_ARG_OP;
			obj_desc->reference.offset = opcode - AML_ARG_OP;

#ifndef ACPI_NO_METHOD_EXECUTION
L
Len Brown 已提交
620 621 622 623 624 625 626 627
			status = acpi_ds_method_data_get_node(AML_ARG_OP,
							      obj_desc->
							      reference.offset,
							      walk_state,
							      (struct
							       acpi_namespace_node
							       **)&obj_desc->
							      reference.object);
L
Linus Torvalds 已提交
628 629 630
#endif
			break;

L
Len Brown 已提交
631
		default:	/* Other literals, etc.. */
L
Linus Torvalds 已提交
632 633

			if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
B
Bob Moore 已提交
634

L
Linus Torvalds 已提交
635 636 637 638 639 640 641 642 643 644 645 646
				/* Node was saved in Op */

				obj_desc->reference.node = op->common.node;
			}

			obj_desc->reference.opcode = opcode;
			break;
		}
		break;

	default:

B
Bob Moore 已提交
647 648
		ACPI_ERROR((AE_INFO, "Unimplemented data type: %X",
			    ACPI_GET_OBJECT_TYPE(obj_desc)));
L
Linus Torvalds 已提交
649 650 651 652 653

		status = AE_AML_OPERAND_TYPE;
		break;
	}

L
Len Brown 已提交
654
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
655
}