cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

exresop.c (16560B)


      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 - 2022, 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					ACPI_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			ACPI_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}