Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 77b2555b52a894a2e39a42e43d993df875c46a6a 247 lines 7.7 kB view raw
1/******************************************************************************* 2 * 3 * Module Name: nsnames - Name manipulation and search 4 * 5 ******************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44#include <acpi/acpi.h> 45#include <acpi/amlcode.h> 46#include <acpi/acnamesp.h> 47 48#define _COMPONENT ACPI_NAMESPACE 49ACPI_MODULE_NAME("nsnames") 50 51/* Local prototypes */ 52static void 53acpi_ns_build_external_path(struct acpi_namespace_node *node, 54 acpi_size size, char *name_buffer); 55 56/******************************************************************************* 57 * 58 * FUNCTION: acpi_ns_build_external_path 59 * 60 * PARAMETERS: Node - NS node whose pathname is needed 61 * Size - Size of the pathname 62 * *name_buffer - Where to return the pathname 63 * 64 * RETURN: Places the pathname into the name_buffer, in external format 65 * (name segments separated by path separators) 66 * 67 * DESCRIPTION: Generate a full pathaname 68 * 69 ******************************************************************************/ 70 71static void 72acpi_ns_build_external_path(struct acpi_namespace_node *node, 73 acpi_size size, char *name_buffer) 74{ 75 acpi_size index; 76 struct acpi_namespace_node *parent_node; 77 78 ACPI_FUNCTION_NAME("ns_build_external_path"); 79 80 /* Special case for root */ 81 82 index = size - 1; 83 if (index < ACPI_NAME_SIZE) { 84 name_buffer[0] = AML_ROOT_PREFIX; 85 name_buffer[1] = 0; 86 return; 87 } 88 89 /* Store terminator byte, then build name backwards */ 90 91 parent_node = node; 92 name_buffer[index] = 0; 93 94 while ((index > ACPI_NAME_SIZE) && (parent_node != acpi_gbl_root_node)) { 95 index -= ACPI_NAME_SIZE; 96 97 /* Put the name into the buffer */ 98 99 ACPI_MOVE_32_TO_32((name_buffer + index), &parent_node->name); 100 parent_node = acpi_ns_get_parent_node(parent_node); 101 102 /* Prefix name with the path separator */ 103 104 index--; 105 name_buffer[index] = ACPI_PATH_SEPARATOR; 106 } 107 108 /* Overwrite final separator with the root prefix character */ 109 110 name_buffer[index] = AML_ROOT_PREFIX; 111 112 if (index != 0) { 113 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 114 "Could not construct pathname; index=%X, size=%X, Path=%s\n", 115 (u32) index, (u32) size, &name_buffer[size])); 116 } 117 118 return; 119} 120 121#ifdef ACPI_DEBUG_OUTPUT 122/******************************************************************************* 123 * 124 * FUNCTION: acpi_ns_get_external_pathname 125 * 126 * PARAMETERS: Node - Namespace node whose pathname is needed 127 * 128 * RETURN: Pointer to storage containing the fully qualified name of 129 * the node, In external format (name segments separated by path 130 * separators.) 131 * 132 * DESCRIPTION: Used for debug printing in acpi_ns_search_table(). 133 * 134 ******************************************************************************/ 135 136char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) 137{ 138 char *name_buffer; 139 acpi_size size; 140 141 ACPI_FUNCTION_TRACE_PTR("ns_get_external_pathname", node); 142 143 /* Calculate required buffer size based on depth below root */ 144 145 size = acpi_ns_get_pathname_length(node); 146 147 /* Allocate a buffer to be returned to caller */ 148 149 name_buffer = ACPI_MEM_CALLOCATE(size); 150 if (!name_buffer) { 151 ACPI_REPORT_ERROR(("ns_get_table_pathname: allocation failure\n")); 152 return_PTR(NULL); 153 } 154 155 /* Build the path in the allocated buffer */ 156 157 acpi_ns_build_external_path(node, size, name_buffer); 158 return_PTR(name_buffer); 159} 160#endif 161 162/******************************************************************************* 163 * 164 * FUNCTION: acpi_ns_get_pathname_length 165 * 166 * PARAMETERS: Node - Namespace node 167 * 168 * RETURN: Length of path, including prefix 169 * 170 * DESCRIPTION: Get the length of the pathname string for this node 171 * 172 ******************************************************************************/ 173 174acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node) 175{ 176 acpi_size size; 177 struct acpi_namespace_node *next_node; 178 179 ACPI_FUNCTION_ENTRY(); 180 181 /* 182 * Compute length of pathname as 5 * number of name segments. 183 * Go back up the parent tree to the root 184 */ 185 size = 0; 186 next_node = node; 187 188 while (next_node && (next_node != acpi_gbl_root_node)) { 189 size += ACPI_PATH_SEGMENT_LENGTH; 190 next_node = acpi_ns_get_parent_node(next_node); 191 } 192 193 if (!size) { 194 size = 1; /* Root node case */ 195 } 196 197 return (size + 1); /* +1 for null string terminator */ 198} 199 200/******************************************************************************* 201 * 202 * FUNCTION: acpi_ns_handle_to_pathname 203 * 204 * PARAMETERS: target_handle - Handle of named object whose name is 205 * to be found 206 * Buffer - Where the pathname is returned 207 * 208 * RETURN: Status, Buffer is filled with pathname if status is AE_OK 209 * 210 * DESCRIPTION: Build and return a full namespace pathname 211 * 212 ******************************************************************************/ 213 214acpi_status 215acpi_ns_handle_to_pathname(acpi_handle target_handle, 216 struct acpi_buffer * buffer) 217{ 218 acpi_status status; 219 struct acpi_namespace_node *node; 220 acpi_size required_size; 221 222 ACPI_FUNCTION_TRACE_PTR("ns_handle_to_pathname", target_handle); 223 224 node = acpi_ns_map_handle_to_node(target_handle); 225 if (!node) { 226 return_ACPI_STATUS(AE_BAD_PARAMETER); 227 } 228 229 /* Determine size required for the caller buffer */ 230 231 required_size = acpi_ns_get_pathname_length(node); 232 233 /* Validate/Allocate/Clear caller buffer */ 234 235 status = acpi_ut_initialize_buffer(buffer, required_size); 236 if (ACPI_FAILURE(status)) { 237 return_ACPI_STATUS(status); 238 } 239 240 /* Build the path in the caller buffer */ 241 242 acpi_ns_build_external_path(node, required_size, buffer->pointer); 243 244 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X] \n", 245 (char *)buffer->pointer, (u32) required_size)); 246 return_ACPI_STATUS(AE_OK); 247}