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

utobject.c (18862B)


      1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
      2/******************************************************************************
      3 *
      4 * Module Name: utobject - ACPI object create/delete/size/cache routines
      5 *
      6 * Copyright (C) 2000 - 2022, Intel Corp.
      7 *
      8 *****************************************************************************/
      9
     10#include <acpi/acpi.h>
     11#include <linux/kmemleak.h>
     12#include "accommon.h"
     13#include "acnamesp.h"
     14
     15#define _COMPONENT          ACPI_UTILITIES
     16ACPI_MODULE_NAME("utobject")
     17
     18/* Local prototypes */
     19static acpi_status
     20acpi_ut_get_simple_object_size(union acpi_operand_object *obj,
     21			       acpi_size *obj_length);
     22
     23static acpi_status
     24acpi_ut_get_package_object_size(union acpi_operand_object *obj,
     25				acpi_size *obj_length);
     26
     27static acpi_status
     28acpi_ut_get_element_length(u8 object_type,
     29			   union acpi_operand_object *source_object,
     30			   union acpi_generic_state *state, void *context);
     31
     32/*******************************************************************************
     33 *
     34 * FUNCTION:    acpi_ut_create_internal_object_dbg
     35 *
     36 * PARAMETERS:  module_name         - Source file name of caller
     37 *              line_number         - Line number of caller
     38 *              component_id        - Component type of caller
     39 *              type                - ACPI Type of the new object
     40 *
     41 * RETURN:      A new internal object, null on failure
     42 *
     43 * DESCRIPTION: Create and initialize a new internal object.
     44 *
     45 * NOTE:        We always allocate the worst-case object descriptor because
     46 *              these objects are cached, and we want them to be
     47 *              one-size-satisfies-any-request. This in itself may not be
     48 *              the most memory efficient, but the efficiency of the object
     49 *              cache should more than make up for this!
     50 *
     51 ******************************************************************************/
     52
     53union acpi_operand_object *acpi_ut_create_internal_object_dbg(const char
     54							      *module_name,
     55							      u32 line_number,
     56							      u32 component_id,
     57							      acpi_object_type
     58							      type)
     59{
     60	union acpi_operand_object *object;
     61	union acpi_operand_object *second_object;
     62
     63	ACPI_FUNCTION_TRACE_STR(ut_create_internal_object_dbg,
     64				acpi_ut_get_type_name(type));
     65
     66	/* Allocate the raw object descriptor */
     67
     68	object =
     69	    acpi_ut_allocate_object_desc_dbg(module_name, line_number,
     70					     component_id);
     71	if (!object) {
     72		return_PTR(NULL);
     73	}
     74	kmemleak_not_leak(object);
     75
     76	switch (type) {
     77	case ACPI_TYPE_REGION:
     78	case ACPI_TYPE_BUFFER_FIELD:
     79	case ACPI_TYPE_LOCAL_BANK_FIELD:
     80
     81		/* These types require a secondary object */
     82
     83		second_object =
     84		    acpi_ut_allocate_object_desc_dbg(module_name, line_number,
     85						     component_id);
     86		if (!second_object) {
     87			acpi_ut_delete_object_desc(object);
     88			return_PTR(NULL);
     89		}
     90
     91		second_object->common.type = ACPI_TYPE_LOCAL_EXTRA;
     92		second_object->common.reference_count = 1;
     93
     94		/* Link the second object to the first */
     95
     96		object->common.next_object = second_object;
     97		break;
     98
     99	default:
    100
    101		/* All others have no secondary object */
    102		break;
    103	}
    104
    105	/* Save the object type in the object descriptor */
    106
    107	object->common.type = (u8) type;
    108
    109	/* Init the reference count */
    110
    111	object->common.reference_count = 1;
    112
    113	/* Any per-type initialization should go here */
    114
    115	return_PTR(object);
    116}
    117
    118/*******************************************************************************
    119 *
    120 * FUNCTION:    acpi_ut_create_package_object
    121 *
    122 * PARAMETERS:  count               - Number of package elements
    123 *
    124 * RETURN:      Pointer to a new Package object, null on failure
    125 *
    126 * DESCRIPTION: Create a fully initialized package object
    127 *
    128 ******************************************************************************/
    129
    130union acpi_operand_object *acpi_ut_create_package_object(u32 count)
    131{
    132	union acpi_operand_object *package_desc;
    133	union acpi_operand_object **package_elements;
    134
    135	ACPI_FUNCTION_TRACE_U32(ut_create_package_object, count);
    136
    137	/* Create a new Package object */
    138
    139	package_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
    140	if (!package_desc) {
    141		return_PTR(NULL);
    142	}
    143
    144	/*
    145	 * Create the element array. Count+1 allows the array to be null
    146	 * terminated.
    147	 */
    148	package_elements = ACPI_ALLOCATE_ZEROED(((acpi_size)count +
    149						 1) * sizeof(void *));
    150	if (!package_elements) {
    151		ACPI_FREE(package_desc);
    152		return_PTR(NULL);
    153	}
    154
    155	package_desc->package.count = count;
    156	package_desc->package.elements = package_elements;
    157	return_PTR(package_desc);
    158}
    159
    160/*******************************************************************************
    161 *
    162 * FUNCTION:    acpi_ut_create_integer_object
    163 *
    164 * PARAMETERS:  initial_value       - Initial value for the integer
    165 *
    166 * RETURN:      Pointer to a new Integer object, null on failure
    167 *
    168 * DESCRIPTION: Create an initialized integer object
    169 *
    170 ******************************************************************************/
    171
    172union acpi_operand_object *acpi_ut_create_integer_object(u64 initial_value)
    173{
    174	union acpi_operand_object *integer_desc;
    175
    176	ACPI_FUNCTION_TRACE(ut_create_integer_object);
    177
    178	/* Create and initialize a new integer object */
    179
    180	integer_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
    181	if (!integer_desc) {
    182		return_PTR(NULL);
    183	}
    184
    185	integer_desc->integer.value = initial_value;
    186	return_PTR(integer_desc);
    187}
    188
    189/*******************************************************************************
    190 *
    191 * FUNCTION:    acpi_ut_create_buffer_object
    192 *
    193 * PARAMETERS:  buffer_size            - Size of buffer to be created
    194 *
    195 * RETURN:      Pointer to a new Buffer object, null on failure
    196 *
    197 * DESCRIPTION: Create a fully initialized buffer object
    198 *
    199 ******************************************************************************/
    200
    201union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size)
    202{
    203	union acpi_operand_object *buffer_desc;
    204	u8 *buffer = NULL;
    205
    206	ACPI_FUNCTION_TRACE_U32(ut_create_buffer_object, buffer_size);
    207
    208	/* Create a new Buffer object */
    209
    210	buffer_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER);
    211	if (!buffer_desc) {
    212		return_PTR(NULL);
    213	}
    214
    215	/* Create an actual buffer only if size > 0 */
    216
    217	if (buffer_size > 0) {
    218
    219		/* Allocate the actual buffer */
    220
    221		buffer = ACPI_ALLOCATE_ZEROED(buffer_size);
    222		if (!buffer) {
    223			ACPI_ERROR((AE_INFO, "Could not allocate size %u",
    224				    (u32)buffer_size));
    225
    226			acpi_ut_remove_reference(buffer_desc);
    227			return_PTR(NULL);
    228		}
    229	}
    230
    231	/* Complete buffer object initialization */
    232
    233	buffer_desc->buffer.flags |= AOPOBJ_DATA_VALID;
    234	buffer_desc->buffer.pointer = buffer;
    235	buffer_desc->buffer.length = (u32) buffer_size;
    236
    237	/* Return the new buffer descriptor */
    238
    239	return_PTR(buffer_desc);
    240}
    241
    242/*******************************************************************************
    243 *
    244 * FUNCTION:    acpi_ut_create_string_object
    245 *
    246 * PARAMETERS:  string_size         - Size of string to be created. Does not
    247 *                                    include NULL terminator, this is added
    248 *                                    automatically.
    249 *
    250 * RETURN:      Pointer to a new String object
    251 *
    252 * DESCRIPTION: Create a fully initialized string object
    253 *
    254 ******************************************************************************/
    255
    256union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size)
    257{
    258	union acpi_operand_object *string_desc;
    259	char *string;
    260
    261	ACPI_FUNCTION_TRACE_U32(ut_create_string_object, string_size);
    262
    263	/* Create a new String object */
    264
    265	string_desc = acpi_ut_create_internal_object(ACPI_TYPE_STRING);
    266	if (!string_desc) {
    267		return_PTR(NULL);
    268	}
    269
    270	/*
    271	 * Allocate the actual string buffer -- (Size + 1) for NULL terminator.
    272	 * NOTE: Zero-length strings are NULL terminated
    273	 */
    274	string = ACPI_ALLOCATE_ZEROED(string_size + 1);
    275	if (!string) {
    276		ACPI_ERROR((AE_INFO, "Could not allocate size %u",
    277			    (u32)string_size));
    278
    279		acpi_ut_remove_reference(string_desc);
    280		return_PTR(NULL);
    281	}
    282
    283	/* Complete string object initialization */
    284
    285	string_desc->string.pointer = string;
    286	string_desc->string.length = (u32) string_size;
    287
    288	/* Return the new string descriptor */
    289
    290	return_PTR(string_desc);
    291}
    292
    293/*******************************************************************************
    294 *
    295 * FUNCTION:    acpi_ut_valid_internal_object
    296 *
    297 * PARAMETERS:  object              - Object to be validated
    298 *
    299 * RETURN:      TRUE if object is valid, FALSE otherwise
    300 *
    301 * DESCRIPTION: Validate a pointer to be of type union acpi_operand_object
    302 *
    303 ******************************************************************************/
    304
    305u8 acpi_ut_valid_internal_object(void *object)
    306{
    307
    308	ACPI_FUNCTION_NAME(ut_valid_internal_object);
    309
    310	/* Check for a null pointer */
    311
    312	if (!object) {
    313		ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "**** Null Object Ptr\n"));
    314		return (FALSE);
    315	}
    316
    317	/* Check the descriptor type field */
    318
    319	switch (ACPI_GET_DESCRIPTOR_TYPE(object)) {
    320	case ACPI_DESC_TYPE_OPERAND:
    321
    322		/* The object appears to be a valid union acpi_operand_object */
    323
    324		return (TRUE);
    325
    326	default:
    327
    328		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
    329				  "%p is not an ACPI operand obj [%s]\n",
    330				  object, acpi_ut_get_descriptor_name(object)));
    331		break;
    332	}
    333
    334	return (FALSE);
    335}
    336
    337/*******************************************************************************
    338 *
    339 * FUNCTION:    acpi_ut_allocate_object_desc_dbg
    340 *
    341 * PARAMETERS:  module_name         - Caller's module name (for error output)
    342 *              line_number         - Caller's line number (for error output)
    343 *              component_id        - Caller's component ID (for error output)
    344 *
    345 * RETURN:      Pointer to newly allocated object descriptor. Null on error
    346 *
    347 * DESCRIPTION: Allocate a new object descriptor. Gracefully handle
    348 *              error conditions.
    349 *
    350 ******************************************************************************/
    351
    352void *acpi_ut_allocate_object_desc_dbg(const char *module_name,
    353				       u32 line_number, u32 component_id)
    354{
    355	union acpi_operand_object *object;
    356
    357	ACPI_FUNCTION_TRACE(ut_allocate_object_desc_dbg);
    358
    359	object = acpi_os_acquire_object(acpi_gbl_operand_cache);
    360	if (!object) {
    361		ACPI_ERROR((module_name, line_number,
    362			    "Could not allocate an object descriptor"));
    363
    364		return_PTR(NULL);
    365	}
    366
    367	/* Mark the descriptor type */
    368
    369	ACPI_SET_DESCRIPTOR_TYPE(object, ACPI_DESC_TYPE_OPERAND);
    370
    371	ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p Size %X\n",
    372			  object, (u32) sizeof(union acpi_operand_object)));
    373
    374	return_PTR(object);
    375}
    376
    377/*******************************************************************************
    378 *
    379 * FUNCTION:    acpi_ut_delete_object_desc
    380 *
    381 * PARAMETERS:  object          - An Acpi internal object to be deleted
    382 *
    383 * RETURN:      None.
    384 *
    385 * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
    386 *
    387 ******************************************************************************/
    388
    389void acpi_ut_delete_object_desc(union acpi_operand_object *object)
    390{
    391	ACPI_FUNCTION_TRACE_PTR(ut_delete_object_desc, object);
    392
    393	/* Object must be of type union acpi_operand_object */
    394
    395	if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
    396		ACPI_ERROR((AE_INFO,
    397			    "%p is not an ACPI Operand object [%s]", object,
    398			    acpi_ut_get_descriptor_name(object)));
    399		return_VOID;
    400	}
    401
    402	(void)acpi_os_release_object(acpi_gbl_operand_cache, object);
    403	return_VOID;
    404}
    405
    406/*******************************************************************************
    407 *
    408 * FUNCTION:    acpi_ut_get_simple_object_size
    409 *
    410 * PARAMETERS:  internal_object    - An ACPI operand object
    411 *              obj_length         - Where the length is returned
    412 *
    413 * RETURN:      Status
    414 *
    415 * DESCRIPTION: This function is called to determine the space required to
    416 *              contain a simple object for return to an external user.
    417 *
    418 *              The length includes the object structure plus any additional
    419 *              needed space.
    420 *
    421 ******************************************************************************/
    422
    423static acpi_status
    424acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
    425			       acpi_size *obj_length)
    426{
    427	acpi_size length;
    428	acpi_size size;
    429	acpi_status status = AE_OK;
    430
    431	ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object);
    432
    433	/* Start with the length of the (external) Acpi object */
    434
    435	length = sizeof(union acpi_object);
    436
    437	/* A NULL object is allowed, can be a legal uninitialized package element */
    438
    439	if (!internal_object) {
    440	/*
    441		 * Object is NULL, just return the length of union acpi_object
    442		 * (A NULL union acpi_object is an object of all zeroes.)
    443	 */
    444		*obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length);
    445		return_ACPI_STATUS(AE_OK);
    446	}
    447
    448	/* A Namespace Node should never appear here */
    449
    450	if (ACPI_GET_DESCRIPTOR_TYPE(internal_object) == ACPI_DESC_TYPE_NAMED) {
    451
    452		/* A namespace node should never get here */
    453
    454		ACPI_ERROR((AE_INFO,
    455			    "Received a namespace node [%4.4s] "
    456			    "where an operand object is required",
    457			    ACPI_CAST_PTR(struct acpi_namespace_node,
    458					  internal_object)->name.ascii));
    459		return_ACPI_STATUS(AE_AML_INTERNAL);
    460	}
    461
    462	/*
    463	 * The final length depends on the object type
    464	 * Strings and Buffers are packed right up against the parent object and
    465	 * must be accessed bytewise or there may be alignment problems on
    466	 * certain processors
    467	 */
    468	switch (internal_object->common.type) {
    469	case ACPI_TYPE_STRING:
    470
    471		length += (acpi_size)internal_object->string.length + 1;
    472		break;
    473
    474	case ACPI_TYPE_BUFFER:
    475
    476		length += (acpi_size)internal_object->buffer.length;
    477		break;
    478
    479	case ACPI_TYPE_INTEGER:
    480	case ACPI_TYPE_PROCESSOR:
    481	case ACPI_TYPE_POWER:
    482
    483		/* No extra data for these types */
    484
    485		break;
    486
    487	case ACPI_TYPE_LOCAL_REFERENCE:
    488
    489		switch (internal_object->reference.class) {
    490		case ACPI_REFCLASS_NAME:
    491			/*
    492			 * Get the actual length of the full pathname to this object.
    493			 * The reference will be converted to the pathname to the object
    494			 */
    495			size =
    496			    acpi_ns_get_pathname_length(internal_object->
    497							reference.node);
    498			if (!size) {
    499				return_ACPI_STATUS(AE_BAD_PARAMETER);
    500			}
    501
    502			length += ACPI_ROUND_UP_TO_NATIVE_WORD(size);
    503			break;
    504
    505		default:
    506			/*
    507			 * No other reference opcodes are supported.
    508			 * Notably, Locals and Args are not supported, but this may be
    509			 * required eventually.
    510			 */
    511			ACPI_ERROR((AE_INFO,
    512				    "Cannot convert to external object - "
    513				    "unsupported Reference Class [%s] 0x%X in object %p",
    514				    acpi_ut_get_reference_name(internal_object),
    515				    internal_object->reference.class,
    516				    internal_object));
    517			status = AE_TYPE;
    518			break;
    519		}
    520		break;
    521
    522	default:
    523
    524		ACPI_ERROR((AE_INFO, "Cannot convert to external object - "
    525			    "unsupported type [%s] 0x%X in object %p",
    526			    acpi_ut_get_object_type_name(internal_object),
    527			    internal_object->common.type, internal_object));
    528		status = AE_TYPE;
    529		break;
    530	}
    531
    532	/*
    533	 * Account for the space required by the object rounded up to the next
    534	 * multiple of the machine word size. This keeps each object aligned
    535	 * on a machine word boundary. (preventing alignment faults on some
    536	 * machines.)
    537	 */
    538	*obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length);
    539	return_ACPI_STATUS(status);
    540}
    541
    542/*******************************************************************************
    543 *
    544 * FUNCTION:    acpi_ut_get_element_length
    545 *
    546 * PARAMETERS:  acpi_pkg_callback
    547 *
    548 * RETURN:      Status
    549 *
    550 * DESCRIPTION: Get the length of one package element.
    551 *
    552 ******************************************************************************/
    553
    554static acpi_status
    555acpi_ut_get_element_length(u8 object_type,
    556			   union acpi_operand_object *source_object,
    557			   union acpi_generic_state *state, void *context)
    558{
    559	acpi_status status = AE_OK;
    560	struct acpi_pkg_info *info = (struct acpi_pkg_info *)context;
    561	acpi_size object_space;
    562
    563	switch (object_type) {
    564	case ACPI_COPY_TYPE_SIMPLE:
    565		/*
    566		 * Simple object - just get the size (Null object/entry is handled
    567		 * here also) and sum it into the running package length
    568		 */
    569		status =
    570		    acpi_ut_get_simple_object_size(source_object,
    571						   &object_space);
    572		if (ACPI_FAILURE(status)) {
    573			return (status);
    574		}
    575
    576		info->length += object_space;
    577		break;
    578
    579	case ACPI_COPY_TYPE_PACKAGE:
    580
    581		/* Package object - nothing much to do here, let the walk handle it */
    582
    583		info->num_packages++;
    584		state->pkg.this_target_obj = NULL;
    585		break;
    586
    587	default:
    588
    589		/* No other types allowed */
    590
    591		return (AE_BAD_PARAMETER);
    592	}
    593
    594	return (status);
    595}
    596
    597/*******************************************************************************
    598 *
    599 * FUNCTION:    acpi_ut_get_package_object_size
    600 *
    601 * PARAMETERS:  internal_object     - An ACPI internal object
    602 *              obj_length          - Where the length is returned
    603 *
    604 * RETURN:      Status
    605 *
    606 * DESCRIPTION: This function is called to determine the space required to
    607 *              contain a package object for return to an external user.
    608 *
    609 *              This is moderately complex since a package contains other
    610 *              objects including packages.
    611 *
    612 ******************************************************************************/
    613
    614static acpi_status
    615acpi_ut_get_package_object_size(union acpi_operand_object *internal_object,
    616				acpi_size *obj_length)
    617{
    618	acpi_status status;
    619	struct acpi_pkg_info info;
    620
    621	ACPI_FUNCTION_TRACE_PTR(ut_get_package_object_size, internal_object);
    622
    623	info.length = 0;
    624	info.object_space = 0;
    625	info.num_packages = 1;
    626
    627	status =
    628	    acpi_ut_walk_package_tree(internal_object, NULL,
    629				      acpi_ut_get_element_length, &info);
    630	if (ACPI_FAILURE(status)) {
    631		return_ACPI_STATUS(status);
    632	}
    633
    634	/*
    635	 * We have handled all of the objects in all levels of the package.
    636	 * just add the length of the package objects themselves.
    637	 * Round up to the next machine word.
    638	 */
    639	info.length +=
    640	    ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)) *
    641	    (acpi_size)info.num_packages;
    642
    643	/* Return the total package length */
    644
    645	*obj_length = info.length;
    646	return_ACPI_STATUS(status);
    647}
    648
    649/*******************************************************************************
    650 *
    651 * FUNCTION:    acpi_ut_get_object_size
    652 *
    653 * PARAMETERS:  internal_object     - An ACPI internal object
    654 *              obj_length          - Where the length will be returned
    655 *
    656 * RETURN:      Status
    657 *
    658 * DESCRIPTION: This function is called to determine the space required to
    659 *              contain an object for return to an API user.
    660 *
    661 ******************************************************************************/
    662
    663acpi_status
    664acpi_ut_get_object_size(union acpi_operand_object *internal_object,
    665			acpi_size *obj_length)
    666{
    667	acpi_status status;
    668
    669	ACPI_FUNCTION_ENTRY();
    670
    671	if ((ACPI_GET_DESCRIPTOR_TYPE(internal_object) ==
    672	     ACPI_DESC_TYPE_OPERAND) &&
    673	    (internal_object->common.type == ACPI_TYPE_PACKAGE)) {
    674		status =
    675		    acpi_ut_get_package_object_size(internal_object,
    676						    obj_length);
    677	} else {
    678		status =
    679		    acpi_ut_get_simple_object_size(internal_object, obj_length);
    680	}
    681
    682	return (status);
    683}