1/******************************************************************************
2 *
3 * Module Name: exresop - AML Interpreter operand/object resolution
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2014, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions, and the following disclaimer,
16 *    without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 *    substantially similar to the "NO WARRANTY" disclaimer below
19 *    ("Disclaimer") and any redistribution must be conditioned upon
20 *    including a substantially similar Disclaimer requirement for further
21 *    binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 *    of any contributors may be used to endorse or promote products derived
24 *    from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46#include "amlcode.h"
47#include "acparser.h"
48#include "acinterp.h"
49#include "acnamesp.h"
50
51#define _COMPONENT          ACPI_EXECUTER
52ACPI_MODULE_NAME("exresop")
53
54/* Local prototypes */
55static acpi_status
56acpi_ex_check_object_type(acpi_object_type type_needed,
57			  acpi_object_type this_type, void *object);
58
59/*******************************************************************************
60 *
61 * FUNCTION:    acpi_ex_check_object_type
62 *
63 * PARAMETERS:  type_needed         Object type needed
64 *              this_type           Actual object type
65 *              Object              Object pointer
66 *
67 * RETURN:      Status
68 *
69 * DESCRIPTION: Check required type against actual type
70 *
71 ******************************************************************************/
72
73static acpi_status
74acpi_ex_check_object_type(acpi_object_type type_needed,
75			  acpi_object_type this_type, void *object)
76{
77	ACPI_FUNCTION_ENTRY();
78
79	if (type_needed == ACPI_TYPE_ANY) {
80
81		/* All types OK, so we don't perform any typechecks */
82
83		return (AE_OK);
84	}
85
86	if (type_needed == ACPI_TYPE_LOCAL_REFERENCE) {
87		/*
88		 * Allow the AML "Constant" opcodes (Zero, One, etc.) to be reference
89		 * objects and thus allow them to be targets. (As per the ACPI
90		 * specification, a store to a constant is a noop.)
91		 */
92		if ((this_type == ACPI_TYPE_INTEGER) &&
93		    (((union acpi_operand_object *)object)->common.
94		     flags & AOPOBJ_AML_CONSTANT)) {
95			return (AE_OK);
96		}
97	}
98
99	if (type_needed != this_type) {
100		ACPI_ERROR((AE_INFO,
101			    "Needed type [%s], found [%s] %p",
102			    acpi_ut_get_type_name(type_needed),
103			    acpi_ut_get_type_name(this_type), object));
104
105		return (AE_AML_OPERAND_TYPE);
106	}
107
108	return (AE_OK);
109}
110
111/*******************************************************************************
112 *
113 * FUNCTION:    acpi_ex_resolve_operands
114 *
115 * PARAMETERS:  opcode              - Opcode being interpreted
116 *              stack_ptr           - Pointer to the operand stack to be
117 *                                    resolved
118 *              walk_state          - Current state
119 *
120 * RETURN:      Status
121 *
122 * DESCRIPTION: Convert multiple input operands to the types required by the
123 *              target operator.
124 *
125 *      Each 5-bit group in arg_types represents one required
126 *      operand and indicates the required Type. The corresponding operand
127 *      will be converted to the required type if possible, otherwise we
128 *      abort with an exception.
129 *
130 ******************************************************************************/
131
132acpi_status
133acpi_ex_resolve_operands(u16 opcode,
134			 union acpi_operand_object ** stack_ptr,
135			 struct acpi_walk_state * walk_state)
136{
137	union acpi_operand_object *obj_desc;
138	acpi_status status = AE_OK;
139	u8 object_type;
140	u32 arg_types;
141	const struct acpi_opcode_info *op_info;
142	u32 this_arg_type;
143	acpi_object_type type_needed;
144	u16 target_op = 0;
145
146	ACPI_FUNCTION_TRACE_U32(ex_resolve_operands, opcode);
147
148	op_info = acpi_ps_get_opcode_info(opcode);
149	if (op_info->class == AML_CLASS_UNKNOWN) {
150		return_ACPI_STATUS(AE_AML_BAD_OPCODE);
151	}
152
153	arg_types = op_info->runtime_args;
154	if (arg_types == ARGI_INVALID_OPCODE) {
155		ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", opcode));
156
157		return_ACPI_STATUS(AE_AML_INTERNAL);
158	}
159
160	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
161			  "Opcode %X [%s] RequiredOperandTypes=%8.8X\n",
162			  opcode, op_info->name, arg_types));
163
164	/*
165	 * Normal exit is with (arg_types == 0) at end of argument list.
166	 * Function will return an exception from within the loop upon
167	 * finding an entry which is not (or cannot be converted
168	 * to) the required type; if stack underflows; or upon
169	 * finding a NULL stack entry (which should not happen).
170	 */
171	while (GET_CURRENT_ARG_TYPE(arg_types)) {
172		if (!stack_ptr || !*stack_ptr) {
173			ACPI_ERROR((AE_INFO, "Null stack entry at %p",
174				    stack_ptr));
175
176			return_ACPI_STATUS(AE_AML_INTERNAL);
177		}
178
179		/* Extract useful items */
180
181		obj_desc = *stack_ptr;
182
183		/* Decode the descriptor type */
184
185		switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
186		case ACPI_DESC_TYPE_NAMED:
187
188			/* Namespace Node */
189
190			object_type =
191			    ((struct acpi_namespace_node *)obj_desc)->type;
192
193			/*
194			 * Resolve an alias object. The construction of these objects
195			 * guarantees that there is only one level of alias indirection;
196			 * thus, the attached object is always the aliased namespace node
197			 */
198			if (object_type == ACPI_TYPE_LOCAL_ALIAS) {
199				obj_desc =
200				    acpi_ns_get_attached_object((struct
201								 acpi_namespace_node
202								 *)obj_desc);
203				*stack_ptr = obj_desc;
204				object_type =
205				    ((struct acpi_namespace_node *)obj_desc)->
206				    type;
207			}
208			break;
209
210		case ACPI_DESC_TYPE_OPERAND:
211
212			/* ACPI internal object */
213
214			object_type = obj_desc->common.type;
215
216			/* Check for bad acpi_object_type */
217
218			if (!acpi_ut_valid_object_type(object_type)) {
219				ACPI_ERROR((AE_INFO,
220					    "Bad operand object type [0x%X]",
221					    object_type));
222
223				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
224			}
225
226			if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) {
227
228				/* Validate the Reference */
229
230				switch (obj_desc->reference.class) {
231				case ACPI_REFCLASS_DEBUG:
232
233					target_op = AML_DEBUG_OP;
234
235					/*lint -fallthrough */
236
237				case ACPI_REFCLASS_ARG:
238				case ACPI_REFCLASS_LOCAL:
239				case ACPI_REFCLASS_INDEX:
240				case ACPI_REFCLASS_REFOF:
241				case ACPI_REFCLASS_TABLE:	/* ddb_handle from LOAD_OP or LOAD_TABLE_OP */
242				case ACPI_REFCLASS_NAME:	/* Reference to a named object */
243
244					ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
245							  "Operand is a Reference, Class [%s] %2.2X\n",
246							  acpi_ut_get_reference_name
247							  (obj_desc),
248							  obj_desc->reference.
249							  class));
250					break;
251
252				default:
253
254					ACPI_ERROR((AE_INFO,
255						    "Unknown Reference Class 0x%2.2X in %p",
256						    obj_desc->reference.class,
257						    obj_desc));
258
259					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
260				}
261			}
262			break;
263
264		default:
265
266			/* Invalid descriptor */
267
268			ACPI_ERROR((AE_INFO, "Invalid descriptor %p [%s]",
269				    obj_desc,
270				    acpi_ut_get_descriptor_name(obj_desc)));
271
272			return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
273		}
274
275		/* Get one argument type, point to the next */
276
277		this_arg_type = GET_CURRENT_ARG_TYPE(arg_types);
278		INCREMENT_ARG_LIST(arg_types);
279
280		/*
281		 * Handle cases where the object does not need to be
282		 * resolved to a value
283		 */
284		switch (this_arg_type) {
285		case ARGI_REF_OR_STRING:	/* Can be a String or Reference */
286
287			if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
288			     ACPI_DESC_TYPE_OPERAND)
289			    && (obj_desc->common.type == ACPI_TYPE_STRING)) {
290				/*
291				 * String found - the string references a named object and
292				 * must be resolved to a node
293				 */
294				goto next_operand;
295			}
296
297			/*
298			 * Else not a string - fall through to the normal Reference
299			 * case below
300			 */
301			/*lint -fallthrough */
302
303		case ARGI_REFERENCE:	/* References: */
304		case ARGI_INTEGER_REF:
305		case ARGI_OBJECT_REF:
306		case ARGI_DEVICE_REF:
307		case ARGI_TARGETREF:	/* Allows implicit conversion rules before store */
308		case ARGI_FIXED_TARGET:	/* No implicit conversion before store to target */
309		case ARGI_SIMPLE_TARGET:	/* Name, Local, or arg - no implicit conversion  */
310			/*
311			 * Need an operand of type ACPI_TYPE_LOCAL_REFERENCE
312			 * A Namespace Node is OK as-is
313			 */
314			if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
315			    ACPI_DESC_TYPE_NAMED) {
316				goto next_operand;
317			}
318
319			status =
320			    acpi_ex_check_object_type(ACPI_TYPE_LOCAL_REFERENCE,
321						      object_type, obj_desc);
322			if (ACPI_FAILURE(status)) {
323				return_ACPI_STATUS(status);
324			}
325			goto next_operand;
326
327		case ARGI_DATAREFOBJ:	/* Store operator only */
328			/*
329			 * We don't want to resolve index_op reference objects during
330			 * a store because this would be an implicit de_ref_of operation.
331			 * Instead, we just want to store the reference object.
332			 * -- All others must be resolved below.
333			 */
334			if ((opcode == AML_STORE_OP) &&
335			    ((*stack_ptr)->common.type ==
336			     ACPI_TYPE_LOCAL_REFERENCE)
337			    && ((*stack_ptr)->reference.class ==
338				ACPI_REFCLASS_INDEX)) {
339				goto next_operand;
340			}
341			break;
342
343		default:
344
345			/* All cases covered above */
346
347			break;
348		}
349
350		/*
351		 * Resolve this object to a value
352		 */
353		status = acpi_ex_resolve_to_value(stack_ptr, walk_state);
354		if (ACPI_FAILURE(status)) {
355			return_ACPI_STATUS(status);
356		}
357
358		/* Get the resolved object */
359
360		obj_desc = *stack_ptr;
361
362		/*
363		 * Check the resulting object (value) type
364		 */
365		switch (this_arg_type) {
366			/*
367			 * For the simple cases, only one type of resolved object
368			 * is allowed
369			 */
370		case ARGI_MUTEX:
371
372			/* Need an operand of type ACPI_TYPE_MUTEX */
373
374			type_needed = ACPI_TYPE_MUTEX;
375			break;
376
377		case ARGI_EVENT:
378
379			/* Need an operand of type ACPI_TYPE_EVENT */
380
381			type_needed = ACPI_TYPE_EVENT;
382			break;
383
384		case ARGI_PACKAGE:	/* Package */
385
386			/* Need an operand of type ACPI_TYPE_PACKAGE */
387
388			type_needed = ACPI_TYPE_PACKAGE;
389			break;
390
391		case ARGI_ANYTYPE:
392
393			/* Any operand type will do */
394
395			type_needed = ACPI_TYPE_ANY;
396			break;
397
398		case ARGI_DDBHANDLE:
399
400			/* Need an operand of type ACPI_TYPE_DDB_HANDLE */
401
402			type_needed = ACPI_TYPE_LOCAL_REFERENCE;
403			break;
404
405			/*
406			 * The more complex cases allow multiple resolved object types
407			 */
408		case ARGI_INTEGER:
409
410			/*
411			 * Need an operand of type ACPI_TYPE_INTEGER,
412			 * But we can implicitly convert from a STRING or BUFFER
413			 * aka - "Implicit Source Operand Conversion"
414			 */
415			status =
416			    acpi_ex_convert_to_integer(obj_desc, stack_ptr, 16);
417			if (ACPI_FAILURE(status)) {
418				if (status == AE_TYPE) {
419					ACPI_ERROR((AE_INFO,
420						    "Needed [Integer/String/Buffer], found [%s] %p",
421						    acpi_ut_get_object_type_name
422						    (obj_desc), obj_desc));
423
424					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
425				}
426
427				return_ACPI_STATUS(status);
428			}
429
430			if (obj_desc != *stack_ptr) {
431				acpi_ut_remove_reference(obj_desc);
432			}
433			goto next_operand;
434
435		case ARGI_BUFFER:
436			/*
437			 * Need an operand of type ACPI_TYPE_BUFFER,
438			 * But we can implicitly convert from a STRING or INTEGER
439			 * aka - "Implicit Source Operand Conversion"
440			 */
441			status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr);
442			if (ACPI_FAILURE(status)) {
443				if (status == AE_TYPE) {
444					ACPI_ERROR((AE_INFO,
445						    "Needed [Integer/String/Buffer], found [%s] %p",
446						    acpi_ut_get_object_type_name
447						    (obj_desc), obj_desc));
448
449					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
450				}
451
452				return_ACPI_STATUS(status);
453			}
454
455			if (obj_desc != *stack_ptr) {
456				acpi_ut_remove_reference(obj_desc);
457			}
458			goto next_operand;
459
460		case ARGI_STRING:
461			/*
462			 * Need an operand of type ACPI_TYPE_STRING,
463			 * But we can implicitly convert from a BUFFER or INTEGER
464			 * aka - "Implicit Source Operand Conversion"
465			 */
466			status = acpi_ex_convert_to_string(obj_desc, stack_ptr,
467							   ACPI_IMPLICIT_CONVERT_HEX);
468			if (ACPI_FAILURE(status)) {
469				if (status == AE_TYPE) {
470					ACPI_ERROR((AE_INFO,
471						    "Needed [Integer/String/Buffer], found [%s] %p",
472						    acpi_ut_get_object_type_name
473						    (obj_desc), obj_desc));
474
475					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
476				}
477
478				return_ACPI_STATUS(status);
479			}
480
481			if (obj_desc != *stack_ptr) {
482				acpi_ut_remove_reference(obj_desc);
483			}
484			goto next_operand;
485
486		case ARGI_COMPUTEDATA:
487
488			/* Need an operand of type INTEGER, STRING or BUFFER */
489
490			switch (obj_desc->common.type) {
491			case ACPI_TYPE_INTEGER:
492			case ACPI_TYPE_STRING:
493			case ACPI_TYPE_BUFFER:
494
495				/* Valid operand */
496				break;
497
498			default:
499				ACPI_ERROR((AE_INFO,
500					    "Needed [Integer/String/Buffer], found [%s] %p",
501					    acpi_ut_get_object_type_name
502					    (obj_desc), obj_desc));
503
504				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
505			}
506			goto next_operand;
507
508		case ARGI_BUFFER_OR_STRING:
509
510			/* Need an operand of type STRING or BUFFER */
511
512			switch (obj_desc->common.type) {
513			case ACPI_TYPE_STRING:
514			case ACPI_TYPE_BUFFER:
515
516				/* Valid operand */
517				break;
518
519			case ACPI_TYPE_INTEGER:
520
521				/* Highest priority conversion is to type Buffer */
522
523				status =
524				    acpi_ex_convert_to_buffer(obj_desc,
525							      stack_ptr);
526				if (ACPI_FAILURE(status)) {
527					return_ACPI_STATUS(status);
528				}
529
530				if (obj_desc != *stack_ptr) {
531					acpi_ut_remove_reference(obj_desc);
532				}
533				break;
534
535			default:
536				ACPI_ERROR((AE_INFO,
537					    "Needed [Integer/String/Buffer], found [%s] %p",
538					    acpi_ut_get_object_type_name
539					    (obj_desc), obj_desc));
540
541				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
542			}
543			goto next_operand;
544
545		case ARGI_DATAOBJECT:
546			/*
547			 * ARGI_DATAOBJECT is only used by the size_of operator.
548			 * Need a buffer, string, package, or ref_of reference.
549			 *
550			 * The only reference allowed here is a direct reference to
551			 * a namespace node.
552			 */
553			switch (obj_desc->common.type) {
554			case ACPI_TYPE_PACKAGE:
555			case ACPI_TYPE_STRING:
556			case ACPI_TYPE_BUFFER:
557			case ACPI_TYPE_LOCAL_REFERENCE:
558
559				/* Valid operand */
560				break;
561
562			default:
563
564				ACPI_ERROR((AE_INFO,
565					    "Needed [Buffer/String/Package/Reference], found [%s] %p",
566					    acpi_ut_get_object_type_name
567					    (obj_desc), obj_desc));
568
569				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
570			}
571			goto next_operand;
572
573		case ARGI_COMPLEXOBJ:
574
575			/* Need a buffer or package or (ACPI 2.0) String */
576
577			switch (obj_desc->common.type) {
578			case ACPI_TYPE_PACKAGE:
579			case ACPI_TYPE_STRING:
580			case ACPI_TYPE_BUFFER:
581
582				/* Valid operand */
583				break;
584
585			default:
586
587				ACPI_ERROR((AE_INFO,
588					    "Needed [Buffer/String/Package], found [%s] %p",
589					    acpi_ut_get_object_type_name
590					    (obj_desc), obj_desc));
591
592				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
593			}
594			goto next_operand;
595
596		case ARGI_REGION_OR_BUFFER:	/* Used by Load() only */
597
598			/* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */
599
600			switch (obj_desc->common.type) {
601			case ACPI_TYPE_BUFFER:
602			case ACPI_TYPE_REGION:
603
604				/* Valid operand */
605				break;
606
607			default:
608
609				ACPI_ERROR((AE_INFO,
610					    "Needed [Region/Buffer], found [%s] %p",
611					    acpi_ut_get_object_type_name
612					    (obj_desc), obj_desc));
613
614				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
615			}
616			goto next_operand;
617
618		case ARGI_DATAREFOBJ:
619
620			/* Used by the Store() operator only */
621
622			switch (obj_desc->common.type) {
623			case ACPI_TYPE_INTEGER:
624			case ACPI_TYPE_PACKAGE:
625			case ACPI_TYPE_STRING:
626			case ACPI_TYPE_BUFFER:
627			case ACPI_TYPE_BUFFER_FIELD:
628			case ACPI_TYPE_LOCAL_REFERENCE:
629			case ACPI_TYPE_LOCAL_REGION_FIELD:
630			case ACPI_TYPE_LOCAL_BANK_FIELD:
631			case ACPI_TYPE_LOCAL_INDEX_FIELD:
632			case ACPI_TYPE_DDB_HANDLE:
633
634				/* Valid operand */
635				break;
636
637			default:
638
639				if (acpi_gbl_enable_interpreter_slack) {
640					/*
641					 * Enable original behavior of Store(), allowing any and all
642					 * objects as the source operand. The ACPI spec does not
643					 * allow this, however.
644					 */
645					break;
646				}
647
648				if (target_op == AML_DEBUG_OP) {
649
650					/* Allow store of any object to the Debug object */
651
652					break;
653				}
654
655				ACPI_ERROR((AE_INFO,
656					    "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",
657					    acpi_ut_get_object_type_name
658					    (obj_desc), obj_desc));
659
660				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
661			}
662			goto next_operand;
663
664		default:
665
666			/* Unknown type */
667
668			ACPI_ERROR((AE_INFO,
669				    "Internal - Unknown ARGI (required operand) type 0x%X",
670				    this_arg_type));
671
672			return_ACPI_STATUS(AE_BAD_PARAMETER);
673		}
674
675		/*
676		 * Make sure that the original object was resolved to the
677		 * required object type (Simple cases only).
678		 */
679		status = acpi_ex_check_object_type(type_needed,
680						   (*stack_ptr)->common.type,
681						   *stack_ptr);
682		if (ACPI_FAILURE(status)) {
683			return_ACPI_STATUS(status);
684		}
685
686next_operand:
687		/*
688		 * If more operands needed, decrement stack_ptr to point
689		 * to next operand on stack
690		 */
691		if (GET_CURRENT_ARG_TYPE(arg_types)) {
692			stack_ptr--;
693		}
694	}
695
696	ACPI_DUMP_OPERANDS(walk_state->operands,
697			   acpi_ps_get_opcode_name(opcode),
698			   walk_state->num_operands);
699
700	return_ACPI_STATUS(status);
701}
702