^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Module Name: exnames - interpreter/scanner name load/execute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "acinterp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "amlcode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define _COMPONENT ACPI_EXECUTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ACPI_MODULE_NAME("exnames")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) static char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) static acpi_status acpi_ex_name_segment(u8 **in_aml_address, char *name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * FUNCTION: acpi_ex_allocate_name_string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * PARAMETERS: prefix_count - Count of parent levels. Special cases:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * (-1)==root, 0==none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * num_name_segs - count of 4-character name segments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * RETURN: A pointer to the allocated string segment. This segment must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * be deleted by the caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * string is long enough, and set up prefix if any.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) static char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) char *temp_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) char *name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u32 size_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ACPI_FUNCTION_TRACE(ex_allocate_name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * Allow room for all \ and ^ prefixes, all segments and a multi_name_prefix.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * Also, one byte for the null terminator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * This may actually be somewhat longer than needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if (prefix_count == ACPI_UINT32_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* Special case for root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) size_needed = 1 + (ACPI_NAMESEG_SIZE * num_name_segs) + 2 + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) size_needed =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) prefix_count + (ACPI_NAMESEG_SIZE * num_name_segs) + 2 + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Allocate a buffer for the name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * This buffer must be deleted by the caller!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) name_string = ACPI_ALLOCATE(size_needed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) "Could not allocate size %u", size_needed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) temp_ptr = name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* Set up Root or Parent prefixes if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (prefix_count == ACPI_UINT32_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *temp_ptr++ = AML_ROOT_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) while (prefix_count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *temp_ptr++ = AML_PARENT_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Set up Dual or Multi prefixes if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if (num_name_segs > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* Set up multi prefixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) *temp_ptr++ = AML_MULTI_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) *temp_ptr++ = (char)num_name_segs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) } else if (2 == num_name_segs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* Set up dual prefixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *temp_ptr++ = AML_DUAL_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * Terminate string following prefixes. acpi_ex_name_segment() will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * append the segment(s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) *temp_ptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) return_PTR(name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * FUNCTION: acpi_ex_name_segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * PARAMETERS: in_aml_address - Pointer to the name in the AML code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * name_string - Where to return the name. The name is appended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * to any existing string to form a namepath
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * DESCRIPTION: Extract an ACPI name (4 bytes) from the AML byte stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) char *aml_address = (void *)*in_aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) acpi_status status = AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u32 index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) char char_buf[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) ACPI_FUNCTION_TRACE(ex_name_segment);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * If first character is a digit, then we know that we aren't looking
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * at a valid name segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) char_buf[0] = *aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if ('0' <= char_buf[0] && char_buf[0] <= '9') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) ACPI_ERROR((AE_INFO, "Invalid leading digit: %c", char_buf[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return_ACPI_STATUS(AE_CTRL_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) for (index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) (index < ACPI_NAMESEG_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) && (acpi_ut_valid_name_char(*aml_address, 0)); index++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) char_buf[index] = *aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /* Valid name segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) if (index == 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* Found 4 valid characters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) char_buf[4] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) if (name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) "Appending NameSeg %s\n", char_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) strcat(name_string, char_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) "No Name string - %s\n", char_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) } else if (index == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * First character was not a valid name character,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * so we are looking at something other than a name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) "Leading character is not alpha: %02Xh (not a name)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) char_buf[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) status = AE_CTRL_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * Segment started with one or more valid characters, but fewer than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * the required 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) status = AE_AML_BAD_NAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) "Bad character 0x%02x in name, at %p",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) *aml_address, aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) *in_aml_address = ACPI_CAST_PTR(u8, aml_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * FUNCTION: acpi_ex_get_name_string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * PARAMETERS: data_type - Object type to be associated with this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * in_aml_address - Pointer to the namestring in the AML code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * out_name_string - Where the namestring is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * out_name_length - Length of the returned string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * RETURN: Status, namestring and length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * DESCRIPTION: Extract a full namepath from the AML byte stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) * including any prefixes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) acpi_ex_get_name_string(acpi_object_type data_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) u8 * in_aml_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) char **out_name_string, u32 * out_name_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) acpi_status status = AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) u8 *aml_address = in_aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) char *name_string = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) u32 num_segments;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) u32 prefix_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) u8 has_prefix = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) ACPI_FUNCTION_TRACE_PTR(ex_get_name_string, aml_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (ACPI_TYPE_LOCAL_REGION_FIELD == data_type ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) ACPI_TYPE_LOCAL_BANK_FIELD == data_type ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) ACPI_TYPE_LOCAL_INDEX_FIELD == data_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* Disallow prefixes for types associated with field_unit names */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) name_string = acpi_ex_allocate_name_string(0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) acpi_ex_name_segment(&aml_address, name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * data_type is not a field name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * Examine first character of name for root or parent prefix operators
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) switch (*aml_address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) case AML_ROOT_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) "RootPrefix(\\) at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * Remember that we have a root_prefix --
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * see comment in acpi_ex_allocate_name_string()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) prefix_count = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) case AML_PARENT_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* Increment past possibly multiple parent prefixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) "ParentPrefix (^) at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) prefix_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) } while (*aml_address == AML_PARENT_PREFIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /* Not a prefix character */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* Examine first character of name for name segment prefix operator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) switch (*aml_address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) case AML_DUAL_NAME_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) "DualNamePrefix at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) acpi_ex_allocate_name_string(prefix_count, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /* Indicate that we processed a prefix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) acpi_ex_name_segment(&aml_address, name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (ACPI_SUCCESS(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) acpi_ex_name_segment(&aml_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) case AML_MULTI_NAME_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) "MultiNamePrefix at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* Fetch count of segments remaining in name path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) num_segments = *aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) acpi_ex_allocate_name_string(prefix_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) num_segments);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /* Indicate that we processed a prefix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) while (num_segments &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) (status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) acpi_ex_name_segment(&aml_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) name_string)) == AE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) num_segments--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /* null_name valid as of 8-12-98 ASL/AML Grammar Update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) if (prefix_count == ACPI_UINT32_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) "NameSeg is \"\\\" followed by NULL\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* Consume the NULL byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) acpi_ex_allocate_name_string(prefix_count, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* Name segment string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) acpi_ex_allocate_name_string(prefix_count, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) acpi_ex_name_segment(&aml_address, name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (AE_CTRL_PENDING == status && has_prefix) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* Ran out of segments after processing a prefix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) ACPI_ERROR((AE_INFO, "Malformed Name at %p", name_string));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) status = AE_AML_BAD_NAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) ACPI_FREE(name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) *out_name_string = name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) *out_name_length = (u32) (aml_address - in_aml_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }