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 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 133 134 135
				/* 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 {
					ACPI_REPORT_NSERROR(op->common.value.
							    string, status);
				}

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

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

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

L
Len Brown 已提交
150 151 152 153 154 155
	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 已提交
156 157 158
	}

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

R
Robert Moore 已提交
162
/*******************************************************************************
L
Linus Torvalds 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175
 *
 * 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 已提交
176
 ******************************************************************************/
L
Linus Torvalds 已提交
177 178

acpi_status
L
Len Brown 已提交
179 180 181 182
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 已提交
183
{
L
Len Brown 已提交
184 185 186 187
	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 已提交
188

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

B
Bob Moore 已提交
191 192 193 194 195
	/*
	 * 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 已提交
196
	obj_desc = *obj_desc_ptr;
B
Bob Moore 已提交
197
	if (!obj_desc) {
L
Linus Torvalds 已提交
198 199
		/* Create a new buffer object */

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

	/*
	 * 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 已提交
212
	arg = op->common.value.arg;	/* skip first arg */
L
Linus Torvalds 已提交
213 214 215 216

	byte_list = arg->named.next;
	if (byte_list) {
		if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) {
B
Bob Moore 已提交
217
			ACPI_REPORT_ERROR(("Expecting bytelist, got AML opcode %X in op %p\n", byte_list->common.aml_opcode, byte_list));
L
Linus Torvalds 已提交
218

L
Len Brown 已提交
219
			acpi_ut_remove_reference(obj_desc);
L
Linus Torvalds 已提交
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
			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 已提交
240 241 242 243 244
		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 已提交
245
		if (!obj_desc->buffer.pointer) {
L
Len Brown 已提交
246 247
			acpi_ut_delete_object_desc(obj_desc);
			return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
248 249 250 251 252
		}

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

		if (byte_list) {
L
Len Brown 已提交
253 254
			ACPI_MEMCPY(obj_desc->buffer.pointer,
				    byte_list->named.data, byte_list_length);
L
Linus Torvalds 已提交
255 256 257 258
		}
	}

	obj_desc->buffer.flags |= AOPOBJ_DATA_VALID;
L
Len Brown 已提交
259 260
	op->common.node = (struct acpi_namespace_node *)obj_desc;
	return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
261 262
}

R
Robert Moore 已提交
263
/*******************************************************************************
L
Linus Torvalds 已提交
264 265 266 267 268 269 270 271 272 273 274 275 276
 *
 * 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 已提交
277
 ******************************************************************************/
L
Linus Torvalds 已提交
278 279

acpi_status
L
Len Brown 已提交
280 281 282 283
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 已提交
284
{
L
Len Brown 已提交
285 286 287 288 289
	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 已提交
290
	acpi_native_uint i;
L
Linus Torvalds 已提交
291

L
Len Brown 已提交
292
	ACPI_FUNCTION_TRACE("ds_build_internal_package_obj");
L
Linus Torvalds 已提交
293 294 295 296

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

	parent = op->common.parent;
L
Len Brown 已提交
297 298
	while ((parent->common.aml_opcode == AML_PACKAGE_OP) ||
	       (parent->common.aml_opcode == AML_VAR_PACKAGE_OP)) {
L
Linus Torvalds 已提交
299 300 301
		parent = parent->common.parent;
	}

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

		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 已提交
323
	for (package_list_length = 0; arg; package_list_length++) {
L
Linus Torvalds 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
		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 已提交
340 341 342
	obj_desc->package.elements = ACPI_MEM_CALLOCATE(((acpi_size) obj_desc->
							 package.count +
							 1) * sizeof(void *));
L
Linus Torvalds 已提交
343 344

	if (!obj_desc->package.elements) {
L
Len Brown 已提交
345 346
		acpi_ut_delete_object_desc(obj_desc);
		return_ACPI_STATUS(AE_NO_MEMORY);
L
Linus Torvalds 已提交
347 348 349
	}

	/*
B
Bob Moore 已提交
350
	 * Initialize all elements of the package
L
Linus Torvalds 已提交
351 352 353
	 */
	arg = op->common.value.arg;
	arg = arg->common.next;
B
Bob Moore 已提交
354
	for (i = 0; arg; i++) {
L
Linus Torvalds 已提交
355 356 357
		if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
			/* Object (package or buffer) is already built */

R
Robert Moore 已提交
358
			obj_desc->package.elements[i] =
L
Len Brown 已提交
359 360 361 362 363 364 365
			    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 已提交
366 367 368 369 370
		}
		arg = arg->common.next;
	}

	obj_desc->package.flags |= AOPOBJ_DATA_VALID;
L
Len Brown 已提交
371 372
	op->common.node = (struct acpi_namespace_node *)obj_desc;
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
373 374
}

R
Robert Moore 已提交
375
/*******************************************************************************
L
Linus Torvalds 已提交
376 377 378 379 380 381 382 383 384 385 386
 *
 * 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 已提交
387
 ******************************************************************************/
L
Linus Torvalds 已提交
388 389

acpi_status
L
Len Brown 已提交
390 391 392
acpi_ds_create_node(struct acpi_walk_state *walk_state,
		    struct acpi_namespace_node *node,
		    union acpi_parse_object *op)
L
Linus Torvalds 已提交
393
{
L
Len Brown 已提交
394 395
	acpi_status status;
	union acpi_operand_object *obj_desc;
L
Linus Torvalds 已提交
396

L
Len Brown 已提交
397
	ACPI_FUNCTION_TRACE_PTR("ds_create_node", op);
L
Linus Torvalds 已提交
398 399 400 401 402 403

	/*
	 * 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 已提交
404 405
	if (acpi_ns_get_attached_object(node)) {
		return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
406 407 408 409 410
	}

	if (!op->common.value.arg) {
		/* No arguments, there is nothing to do */

L
Len Brown 已提交
411
		return_ACPI_STATUS(AE_OK);
L
Linus Torvalds 已提交
412 413 414 415
	}

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

L
Len Brown 已提交
416 417 418 419
	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 已提交
420 421 422 423
	}

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

L
Len Brown 已提交
424
	node->type = ACPI_GET_OBJECT_TYPE(obj_desc);
L
Linus Torvalds 已提交
425 426 427

	/* Attach obj to node */

L
Len Brown 已提交
428
	status = acpi_ns_attach_object(node, obj_desc, node->type);
L
Linus Torvalds 已提交
429 430 431

	/* Remove local reference to the object */

L
Len Brown 已提交
432 433
	acpi_ut_remove_reference(obj_desc);
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
434 435
}

L
Len Brown 已提交
436
#endif				/* ACPI_NO_METHOD_EXECUTION */
L
Linus Torvalds 已提交
437

R
Robert Moore 已提交
438
/*******************************************************************************
L
Linus Torvalds 已提交
439 440 441 442 443 444 445 446 447 448 449 450 451 452
 *
 * 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 已提交
453
 ******************************************************************************/
L
Linus Torvalds 已提交
454 455

acpi_status
L
Len Brown 已提交
456 457 458 459
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 已提交
460
{
L
Len Brown 已提交
461 462 463
	const struct acpi_opcode_info *op_info;
	union acpi_operand_object *obj_desc;
	acpi_status status = AE_OK;
L
Linus Torvalds 已提交
464

L
Len Brown 已提交
465
	ACPI_FUNCTION_TRACE("ds_init_object_from_op");
L
Linus Torvalds 已提交
466 467

	obj_desc = *ret_obj_desc;
L
Len Brown 已提交
468
	op_info = acpi_ps_get_opcode_info(opcode);
L
Linus Torvalds 已提交
469 470 471
	if (op_info->class == AML_CLASS_UNKNOWN) {
		/* Unknown opcode */

L
Len Brown 已提交
472
		return_ACPI_STATUS(AE_TYPE);
L
Linus Torvalds 已提交
473 474 475 476
	}

	/* Perform per-object initialization */

L
Len Brown 已提交
477
	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
L
Linus Torvalds 已提交
478 479 480 481 482
	case ACPI_TYPE_BUFFER:

		/*
		 * Defer evaluation of Buffer term_arg operand
		 */
L
Len Brown 已提交
483 484
		obj_desc->buffer.node = (struct acpi_namespace_node *)
		    walk_state->operands[0];
L
Linus Torvalds 已提交
485 486 487 488 489 490 491 492 493
		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 已提交
494 495
		obj_desc->package.node = (struct acpi_namespace_node *)
		    walk_state->operands[0];
L
Linus Torvalds 已提交
496 497 498 499 500 501 502 503 504 505 506
		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 已提交
507 508 509 510
			 * 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 已提交
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
			 */
			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 已提交
532
				acpi_ex_truncate_for32bit_table(obj_desc);
L
Linus Torvalds 已提交
533 534 535 536 537 538 539 540 541 542
#endif
				break;

			case AML_REVISION_OP:

				obj_desc->integer.value = ACPI_CA_VERSION;
				break;

			default:

B
Bob Moore 已提交
543
				ACPI_REPORT_ERROR(("Unknown constant opcode %X\n", opcode));
L
Linus Torvalds 已提交
544 545 546 547 548 549 550 551
				status = AE_AML_OPERAND_TYPE;
				break;
			}
			break;

		case AML_TYPE_LITERAL:

			obj_desc->integer.value = op->common.value.integer;
552
#ifndef ACPI_NO_METHOD_EXECUTION
L
Len Brown 已提交
553
			acpi_ex_truncate_for32bit_table(obj_desc);
554
#endif
L
Linus Torvalds 已提交
555 556 557
			break;

		default:
B
Bob Moore 已提交
558 559
			ACPI_REPORT_ERROR(("Unknown Integer type %X\n",
					   op_info->type));
L
Linus Torvalds 已提交
560 561 562 563 564 565 566 567
			status = AE_AML_OPERAND_TYPE;
			break;
		}
		break;

	case ACPI_TYPE_STRING:

		obj_desc->string.pointer = op->common.value.string;
L
Len Brown 已提交
568 569
		obj_desc->string.length =
		    (u32) ACPI_STRLEN(op->common.value.string);
L
Linus Torvalds 已提交
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591

		/*
		 * 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 已提交
592 593 594 595 596 597 598 599
			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 已提交
600 601 602 603 604 605 606 607 608 609 610
#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 已提交
611 612 613 614 615 616 617 618
			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 已提交
619 620 621
#endif
			break;

L
Len Brown 已提交
622
		default:	/* Other literals, etc.. */
L
Linus Torvalds 已提交
623 624 625 626 627 628 629 630 631 632 633 634 635 636

			if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
				/* Node was saved in Op */

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

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

	default:

B
Bob Moore 已提交
637 638
		ACPI_REPORT_ERROR(("Unimplemented data type: %X\n",
				   ACPI_GET_OBJECT_TYPE(obj_desc)));
L
Linus Torvalds 已提交
639 640 641 642 643

		status = AE_AML_OPERAND_TYPE;
		break;
	}

L
Len Brown 已提交
644
	return_ACPI_STATUS(status);
L
Linus Torvalds 已提交
645
}