Linux Audio

Check our new training course

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