162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: exnames - interpreter/scanner name load/execute
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci *****************************************************************************/
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <acpi/acpi.h>
1162306a36Sopenharmony_ci#include "accommon.h"
1262306a36Sopenharmony_ci#include "acinterp.h"
1362306a36Sopenharmony_ci#include "amlcode.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define _COMPONENT          ACPI_EXECUTER
1662306a36Sopenharmony_ciACPI_MODULE_NAME("exnames")
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* Local prototypes */
1962306a36Sopenharmony_cistatic char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic acpi_status acpi_ex_name_segment(u8 **in_aml_address, char *name_string);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/*******************************************************************************
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * FUNCTION:    acpi_ex_allocate_name_string
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci * PARAMETERS:  prefix_count        - Count of parent levels. Special cases:
2862306a36Sopenharmony_ci *                                    (-1)==root,  0==none
2962306a36Sopenharmony_ci *              num_name_segs       - count of 4-character name segments
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * RETURN:      A pointer to the allocated string segment. This segment must
3262306a36Sopenharmony_ci *              be deleted by the caller.
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
3562306a36Sopenharmony_ci *              string is long enough, and set up prefix if any.
3662306a36Sopenharmony_ci *
3762306a36Sopenharmony_ci ******************************************************************************/
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	char *temp_ptr;
4262306a36Sopenharmony_ci	char *name_string;
4362306a36Sopenharmony_ci	u32 size_needed;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE(ex_allocate_name_string);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	/*
4862306a36Sopenharmony_ci	 * Allow room for all \ and ^ prefixes, all segments and a multi_name_prefix.
4962306a36Sopenharmony_ci	 * Also, one byte for the null terminator.
5062306a36Sopenharmony_ci	 * This may actually be somewhat longer than needed.
5162306a36Sopenharmony_ci	 */
5262306a36Sopenharmony_ci	if (prefix_count == ACPI_UINT32_MAX) {
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci		/* Special case for root */
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci		size_needed = 1 + (ACPI_NAMESEG_SIZE * num_name_segs) + 2 + 1;
5762306a36Sopenharmony_ci	} else {
5862306a36Sopenharmony_ci		size_needed =
5962306a36Sopenharmony_ci		    prefix_count + (ACPI_NAMESEG_SIZE * num_name_segs) + 2 + 1;
6062306a36Sopenharmony_ci	}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	/*
6362306a36Sopenharmony_ci	 * Allocate a buffer for the name.
6462306a36Sopenharmony_ci	 * This buffer must be deleted by the caller!
6562306a36Sopenharmony_ci	 */
6662306a36Sopenharmony_ci	name_string = ACPI_ALLOCATE(size_needed);
6762306a36Sopenharmony_ci	if (!name_string) {
6862306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO,
6962306a36Sopenharmony_ci			    "Could not allocate size %u", size_needed));
7062306a36Sopenharmony_ci		return_PTR(NULL);
7162306a36Sopenharmony_ci	}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	temp_ptr = name_string;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	/* Set up Root or Parent prefixes if needed */
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	if (prefix_count == ACPI_UINT32_MAX) {
7862306a36Sopenharmony_ci		*temp_ptr++ = AML_ROOT_PREFIX;
7962306a36Sopenharmony_ci	} else {
8062306a36Sopenharmony_ci		while (prefix_count--) {
8162306a36Sopenharmony_ci			*temp_ptr++ = AML_PARENT_PREFIX;
8262306a36Sopenharmony_ci		}
8362306a36Sopenharmony_ci	}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	/* Set up Dual or Multi prefixes if needed */
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	if (num_name_segs > 2) {
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci		/* Set up multi prefixes   */
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci		*temp_ptr++ = AML_MULTI_NAME_PREFIX;
9262306a36Sopenharmony_ci		*temp_ptr++ = (char)num_name_segs;
9362306a36Sopenharmony_ci	} else if (2 == num_name_segs) {
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci		/* Set up dual prefixes */
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci		*temp_ptr++ = AML_DUAL_NAME_PREFIX;
9862306a36Sopenharmony_ci	}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	/*
10162306a36Sopenharmony_ci	 * Terminate string following prefixes. acpi_ex_name_segment() will
10262306a36Sopenharmony_ci	 * append the segment(s)
10362306a36Sopenharmony_ci	 */
10462306a36Sopenharmony_ci	*temp_ptr = 0;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	return_PTR(name_string);
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/*******************************************************************************
11062306a36Sopenharmony_ci *
11162306a36Sopenharmony_ci * FUNCTION:    acpi_ex_name_segment
11262306a36Sopenharmony_ci *
11362306a36Sopenharmony_ci * PARAMETERS:  in_aml_address  - Pointer to the name in the AML code
11462306a36Sopenharmony_ci *              name_string     - Where to return the name. The name is appended
11562306a36Sopenharmony_ci *                                to any existing string to form a namepath
11662306a36Sopenharmony_ci *
11762306a36Sopenharmony_ci * RETURN:      Status
11862306a36Sopenharmony_ci *
11962306a36Sopenharmony_ci * DESCRIPTION: Extract an ACPI name (4 bytes) from the AML byte stream
12062306a36Sopenharmony_ci *
12162306a36Sopenharmony_ci ******************************************************************************/
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
12462306a36Sopenharmony_ci{
12562306a36Sopenharmony_ci	char *aml_address = (void *)*in_aml_address;
12662306a36Sopenharmony_ci	acpi_status status = AE_OK;
12762306a36Sopenharmony_ci	u32 index;
12862306a36Sopenharmony_ci	char char_buf[5];
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE(ex_name_segment);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	/*
13362306a36Sopenharmony_ci	 * If first character is a digit, then we know that we aren't looking
13462306a36Sopenharmony_ci	 * at a valid name segment
13562306a36Sopenharmony_ci	 */
13662306a36Sopenharmony_ci	char_buf[0] = *aml_address;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	if ('0' <= char_buf[0] && char_buf[0] <= '9') {
13962306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO, "Invalid leading digit: %c", char_buf[0]));
14062306a36Sopenharmony_ci		return_ACPI_STATUS(AE_CTRL_PENDING);
14162306a36Sopenharmony_ci	}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	for (index = 0;
14462306a36Sopenharmony_ci	     (index < ACPI_NAMESEG_SIZE)
14562306a36Sopenharmony_ci	     && (acpi_ut_valid_name_char(*aml_address, 0)); index++) {
14662306a36Sopenharmony_ci		char_buf[index] = *aml_address++;
14762306a36Sopenharmony_ci	}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	/* Valid name segment  */
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	if (index == 4) {
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci		/* Found 4 valid characters */
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci		char_buf[4] = '\0';
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci		if (name_string) {
15862306a36Sopenharmony_ci			ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
15962306a36Sopenharmony_ci					  "Appending NameSeg %s\n", char_buf));
16062306a36Sopenharmony_ci			strcat(name_string, char_buf);
16162306a36Sopenharmony_ci		} else {
16262306a36Sopenharmony_ci			ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
16362306a36Sopenharmony_ci					  "No Name string - %s\n", char_buf));
16462306a36Sopenharmony_ci		}
16562306a36Sopenharmony_ci	} else if (index == 0) {
16662306a36Sopenharmony_ci		/*
16762306a36Sopenharmony_ci		 * First character was not a valid name character,
16862306a36Sopenharmony_ci		 * so we are looking at something other than a name.
16962306a36Sopenharmony_ci		 */
17062306a36Sopenharmony_ci		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
17162306a36Sopenharmony_ci				  "Leading character is not alpha: %02Xh (not a name)\n",
17262306a36Sopenharmony_ci				  char_buf[0]));
17362306a36Sopenharmony_ci		status = AE_CTRL_PENDING;
17462306a36Sopenharmony_ci	} else {
17562306a36Sopenharmony_ci		/*
17662306a36Sopenharmony_ci		 * Segment started with one or more valid characters, but fewer than
17762306a36Sopenharmony_ci		 * the required 4
17862306a36Sopenharmony_ci		 */
17962306a36Sopenharmony_ci		status = AE_AML_BAD_NAME;
18062306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO,
18162306a36Sopenharmony_ci			    "Bad character 0x%02x in name, at %p",
18262306a36Sopenharmony_ci			    *aml_address, aml_address));
18362306a36Sopenharmony_ci	}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	*in_aml_address = ACPI_CAST_PTR(u8, aml_address);
18662306a36Sopenharmony_ci	return_ACPI_STATUS(status);
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci/*******************************************************************************
19062306a36Sopenharmony_ci *
19162306a36Sopenharmony_ci * FUNCTION:    acpi_ex_get_name_string
19262306a36Sopenharmony_ci *
19362306a36Sopenharmony_ci * PARAMETERS:  data_type           - Object type to be associated with this
19462306a36Sopenharmony_ci *                                    name
19562306a36Sopenharmony_ci *              in_aml_address      - Pointer to the namestring in the AML code
19662306a36Sopenharmony_ci *              out_name_string     - Where the namestring is returned
19762306a36Sopenharmony_ci *              out_name_length     - Length of the returned string
19862306a36Sopenharmony_ci *
19962306a36Sopenharmony_ci * RETURN:      Status, namestring and length
20062306a36Sopenharmony_ci *
20162306a36Sopenharmony_ci * DESCRIPTION: Extract a full namepath from the AML byte stream,
20262306a36Sopenharmony_ci *              including any prefixes.
20362306a36Sopenharmony_ci *
20462306a36Sopenharmony_ci ******************************************************************************/
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ciacpi_status
20762306a36Sopenharmony_ciacpi_ex_get_name_string(acpi_object_type data_type,
20862306a36Sopenharmony_ci			u8 * in_aml_address,
20962306a36Sopenharmony_ci			char **out_name_string, u32 * out_name_length)
21062306a36Sopenharmony_ci{
21162306a36Sopenharmony_ci	acpi_status status = AE_OK;
21262306a36Sopenharmony_ci	u8 *aml_address = in_aml_address;
21362306a36Sopenharmony_ci	char *name_string = NULL;
21462306a36Sopenharmony_ci	u32 num_segments;
21562306a36Sopenharmony_ci	u32 prefix_count = 0;
21662306a36Sopenharmony_ci	u8 has_prefix = FALSE;
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ex_get_name_string, aml_address);
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	if (ACPI_TYPE_LOCAL_REGION_FIELD == data_type ||
22162306a36Sopenharmony_ci	    ACPI_TYPE_LOCAL_BANK_FIELD == data_type ||
22262306a36Sopenharmony_ci	    ACPI_TYPE_LOCAL_INDEX_FIELD == data_type) {
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci		/* Disallow prefixes for types associated with field_unit names */
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci		name_string = acpi_ex_allocate_name_string(0, 1);
22762306a36Sopenharmony_ci		if (!name_string) {
22862306a36Sopenharmony_ci			status = AE_NO_MEMORY;
22962306a36Sopenharmony_ci		} else {
23062306a36Sopenharmony_ci			status =
23162306a36Sopenharmony_ci			    acpi_ex_name_segment(&aml_address, name_string);
23262306a36Sopenharmony_ci		}
23362306a36Sopenharmony_ci	} else {
23462306a36Sopenharmony_ci		/*
23562306a36Sopenharmony_ci		 * data_type is not a field name.
23662306a36Sopenharmony_ci		 * Examine first character of name for root or parent prefix operators
23762306a36Sopenharmony_ci		 */
23862306a36Sopenharmony_ci		switch (*aml_address) {
23962306a36Sopenharmony_ci		case AML_ROOT_PREFIX:
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci			ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
24262306a36Sopenharmony_ci					  "RootPrefix(\\) at %p\n",
24362306a36Sopenharmony_ci					  aml_address));
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci			/*
24662306a36Sopenharmony_ci			 * Remember that we have a root_prefix --
24762306a36Sopenharmony_ci			 * see comment in acpi_ex_allocate_name_string()
24862306a36Sopenharmony_ci			 */
24962306a36Sopenharmony_ci			aml_address++;
25062306a36Sopenharmony_ci			prefix_count = ACPI_UINT32_MAX;
25162306a36Sopenharmony_ci			has_prefix = TRUE;
25262306a36Sopenharmony_ci			break;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci		case AML_PARENT_PREFIX:
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci			/* Increment past possibly multiple parent prefixes */
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci			do {
25962306a36Sopenharmony_ci				ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
26062306a36Sopenharmony_ci						  "ParentPrefix (^) at %p\n",
26162306a36Sopenharmony_ci						  aml_address));
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci				aml_address++;
26462306a36Sopenharmony_ci				prefix_count++;
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci			} while (*aml_address == AML_PARENT_PREFIX);
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci			has_prefix = TRUE;
26962306a36Sopenharmony_ci			break;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci		default:
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci			/* Not a prefix character */
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci			break;
27662306a36Sopenharmony_ci		}
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci		/* Examine first character of name for name segment prefix operator */
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci		switch (*aml_address) {
28162306a36Sopenharmony_ci		case AML_DUAL_NAME_PREFIX:
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci			ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
28462306a36Sopenharmony_ci					  "DualNamePrefix at %p\n",
28562306a36Sopenharmony_ci					  aml_address));
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci			aml_address++;
28862306a36Sopenharmony_ci			name_string =
28962306a36Sopenharmony_ci			    acpi_ex_allocate_name_string(prefix_count, 2);
29062306a36Sopenharmony_ci			if (!name_string) {
29162306a36Sopenharmony_ci				status = AE_NO_MEMORY;
29262306a36Sopenharmony_ci				break;
29362306a36Sopenharmony_ci			}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci			/* Indicate that we processed a prefix */
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci			has_prefix = TRUE;
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci			status =
30062306a36Sopenharmony_ci			    acpi_ex_name_segment(&aml_address, name_string);
30162306a36Sopenharmony_ci			if (ACPI_SUCCESS(status)) {
30262306a36Sopenharmony_ci				status =
30362306a36Sopenharmony_ci				    acpi_ex_name_segment(&aml_address,
30462306a36Sopenharmony_ci							 name_string);
30562306a36Sopenharmony_ci			}
30662306a36Sopenharmony_ci			break;
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci		case AML_MULTI_NAME_PREFIX:
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci			ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
31162306a36Sopenharmony_ci					  "MultiNamePrefix at %p\n",
31262306a36Sopenharmony_ci					  aml_address));
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci			/* Fetch count of segments remaining in name path */
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci			aml_address++;
31762306a36Sopenharmony_ci			num_segments = *aml_address;
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci			name_string =
32062306a36Sopenharmony_ci			    acpi_ex_allocate_name_string(prefix_count,
32162306a36Sopenharmony_ci							 num_segments);
32262306a36Sopenharmony_ci			if (!name_string) {
32362306a36Sopenharmony_ci				status = AE_NO_MEMORY;
32462306a36Sopenharmony_ci				break;
32562306a36Sopenharmony_ci			}
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci			/* Indicate that we processed a prefix */
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci			aml_address++;
33062306a36Sopenharmony_ci			has_prefix = TRUE;
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci			while (num_segments &&
33362306a36Sopenharmony_ci			       (status =
33462306a36Sopenharmony_ci				acpi_ex_name_segment(&aml_address,
33562306a36Sopenharmony_ci						     name_string)) == AE_OK) {
33662306a36Sopenharmony_ci				num_segments--;
33762306a36Sopenharmony_ci			}
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci			break;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci		case 0:
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci			/* null_name valid as of 8-12-98 ASL/AML Grammar Update */
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci			if (prefix_count == ACPI_UINT32_MAX) {
34662306a36Sopenharmony_ci				ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
34762306a36Sopenharmony_ci						  "NameSeg is \"\\\" followed by NULL\n"));
34862306a36Sopenharmony_ci			}
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci			/* Consume the NULL byte */
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci			aml_address++;
35362306a36Sopenharmony_ci			name_string =
35462306a36Sopenharmony_ci			    acpi_ex_allocate_name_string(prefix_count, 0);
35562306a36Sopenharmony_ci			if (!name_string) {
35662306a36Sopenharmony_ci				status = AE_NO_MEMORY;
35762306a36Sopenharmony_ci				break;
35862306a36Sopenharmony_ci			}
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci			break;
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci		default:
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci			/* Name segment string */
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci			name_string =
36762306a36Sopenharmony_ci			    acpi_ex_allocate_name_string(prefix_count, 1);
36862306a36Sopenharmony_ci			if (!name_string) {
36962306a36Sopenharmony_ci				status = AE_NO_MEMORY;
37062306a36Sopenharmony_ci				break;
37162306a36Sopenharmony_ci			}
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci			status =
37462306a36Sopenharmony_ci			    acpi_ex_name_segment(&aml_address, name_string);
37562306a36Sopenharmony_ci			break;
37662306a36Sopenharmony_ci		}
37762306a36Sopenharmony_ci	}
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	if (AE_CTRL_PENDING == status && has_prefix) {
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci		/* Ran out of segments after processing a prefix */
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO, "Malformed Name at %p", name_string));
38462306a36Sopenharmony_ci		status = AE_AML_BAD_NAME;
38562306a36Sopenharmony_ci	}
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
38862306a36Sopenharmony_ci		if (name_string) {
38962306a36Sopenharmony_ci			ACPI_FREE(name_string);
39062306a36Sopenharmony_ci		}
39162306a36Sopenharmony_ci		return_ACPI_STATUS(status);
39262306a36Sopenharmony_ci	}
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	*out_name_string = name_string;
39562306a36Sopenharmony_ci	*out_name_length = (u32) (aml_address - in_aml_address);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci	return_ACPI_STATUS(status);
39862306a36Sopenharmony_ci}
399