1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: nsnames - Name manipulation and search 4ae115bc7Smrj * 5ae115bc7Smrj ******************************************************************************/ 6ae115bc7Smrj 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9ae115bc7Smrj * All rights reserved. 10ae115bc7Smrj * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25ae115bc7Smrj * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29ae115bc7Smrj * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43ae115bc7Smrj 44ae115bc7Smrj #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46ae115bc7Smrj #include "amlcode.h" 47ae115bc7Smrj #include "acnamesp.h" 48ae115bc7Smrj 49ae115bc7Smrj 50ae115bc7Smrj #define _COMPONENT ACPI_NAMESPACE 51ae115bc7Smrj ACPI_MODULE_NAME ("nsnames") 52ae115bc7Smrj 53ae115bc7Smrj 54ae115bc7Smrj /******************************************************************************* 55ae115bc7Smrj * 56ae115bc7Smrj * FUNCTION: AcpiNsGetExternalPathname 57ae115bc7Smrj * 58ae115bc7Smrj * PARAMETERS: Node - Namespace node whose pathname is needed 59ae115bc7Smrj * 60ae115bc7Smrj * RETURN: Pointer to storage containing the fully qualified name of 61ae115bc7Smrj * the node, In external format (name segments separated by path 62ae115bc7Smrj * separators.) 63ae115bc7Smrj * 64aa2aa9a6SDana Myers * DESCRIPTION: Used to obtain the full pathname to a namespace node, usually 65aa2aa9a6SDana Myers * for error and debug statements. 66ae115bc7Smrj * 67ae115bc7Smrj ******************************************************************************/ 68ae115bc7Smrj 69ae115bc7Smrj char * 70ae115bc7Smrj AcpiNsGetExternalPathname ( 71ae115bc7Smrj ACPI_NAMESPACE_NODE *Node) 72ae115bc7Smrj { 73ae115bc7Smrj char *NameBuffer; 74ae115bc7Smrj 75ae115bc7Smrj 76ae115bc7Smrj ACPI_FUNCTION_TRACE_PTR (NsGetExternalPathname, Node); 77ae115bc7Smrj 78ae115bc7Smrj 79*385cc6b4SJerry Jelinek NameBuffer = AcpiNsGetNormalizedPathname (Node, FALSE); 80ae115bc7Smrj return_PTR (NameBuffer); 81ae115bc7Smrj } 82ae115bc7Smrj 83ae115bc7Smrj 84ae115bc7Smrj /******************************************************************************* 85ae115bc7Smrj * 86ae115bc7Smrj * FUNCTION: AcpiNsGetPathnameLength 87ae115bc7Smrj * 88ae115bc7Smrj * PARAMETERS: Node - Namespace node 89ae115bc7Smrj * 90ae115bc7Smrj * RETURN: Length of path, including prefix 91ae115bc7Smrj * 92ae115bc7Smrj * DESCRIPTION: Get the length of the pathname string for this node 93ae115bc7Smrj * 94ae115bc7Smrj ******************************************************************************/ 95ae115bc7Smrj 96ae115bc7Smrj ACPI_SIZE 97ae115bc7Smrj AcpiNsGetPathnameLength ( 98ae115bc7Smrj ACPI_NAMESPACE_NODE *Node) 99ae115bc7Smrj { 100ae115bc7Smrj ACPI_SIZE Size; 101ae115bc7Smrj 102ae115bc7Smrj 103ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 104ae115bc7Smrj 105ae115bc7Smrj 106*385cc6b4SJerry Jelinek Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE); 107*385cc6b4SJerry Jelinek return (Size); 108ae115bc7Smrj } 109ae115bc7Smrj 110ae115bc7Smrj 111ae115bc7Smrj /******************************************************************************* 112ae115bc7Smrj * 113ae115bc7Smrj * FUNCTION: AcpiNsHandleToPathname 114ae115bc7Smrj * 115ae115bc7Smrj * PARAMETERS: TargetHandle - Handle of named object whose name is 116ae115bc7Smrj * to be found 117ae115bc7Smrj * Buffer - Where the pathname is returned 118*385cc6b4SJerry Jelinek * NoTrailing - Remove trailing '_' for each name 119*385cc6b4SJerry Jelinek * segment 120ae115bc7Smrj * 121ae115bc7Smrj * RETURN: Status, Buffer is filled with pathname if status is AE_OK 122ae115bc7Smrj * 123ae115bc7Smrj * DESCRIPTION: Build and return a full namespace pathname 124ae115bc7Smrj * 125ae115bc7Smrj ******************************************************************************/ 126ae115bc7Smrj 127ae115bc7Smrj ACPI_STATUS 128ae115bc7Smrj AcpiNsHandleToPathname ( 129ae115bc7Smrj ACPI_HANDLE TargetHandle, 130*385cc6b4SJerry Jelinek ACPI_BUFFER *Buffer, 131*385cc6b4SJerry Jelinek BOOLEAN NoTrailing) 132ae115bc7Smrj { 133ae115bc7Smrj ACPI_STATUS Status; 134ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 135ae115bc7Smrj ACPI_SIZE RequiredSize; 136ae115bc7Smrj 137ae115bc7Smrj 138ae115bc7Smrj ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle); 139ae115bc7Smrj 140ae115bc7Smrj 14126f3cdf0SGordon Ross Node = AcpiNsValidateHandle (TargetHandle); 142ae115bc7Smrj if (!Node) 143ae115bc7Smrj { 144ae115bc7Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 145ae115bc7Smrj } 146ae115bc7Smrj 147ae115bc7Smrj /* Determine size required for the caller buffer */ 148ae115bc7Smrj 149*385cc6b4SJerry Jelinek RequiredSize = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 150db2bae30SDana Myers if (!RequiredSize) 151db2bae30SDana Myers { 152db2bae30SDana Myers return_ACPI_STATUS (AE_BAD_PARAMETER); 153db2bae30SDana Myers } 154ae115bc7Smrj 155ae115bc7Smrj /* Validate/Allocate/Clear caller buffer */ 156ae115bc7Smrj 157ae115bc7Smrj Status = AcpiUtInitializeBuffer (Buffer, RequiredSize); 158ae115bc7Smrj if (ACPI_FAILURE (Status)) 159ae115bc7Smrj { 160ae115bc7Smrj return_ACPI_STATUS (Status); 161ae115bc7Smrj } 162ae115bc7Smrj 163ae115bc7Smrj /* Build the path in the caller buffer */ 164ae115bc7Smrj 165*385cc6b4SJerry Jelinek (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer, 166*385cc6b4SJerry Jelinek RequiredSize, NoTrailing); 167db2bae30SDana Myers if (ACPI_FAILURE (Status)) 168db2bae30SDana Myers { 169db2bae30SDana Myers return_ACPI_STATUS (Status); 170db2bae30SDana Myers } 171ae115bc7Smrj 172ae115bc7Smrj ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n", 173ae115bc7Smrj (char *) Buffer->Pointer, (UINT32) RequiredSize)); 174ae115bc7Smrj return_ACPI_STATUS (AE_OK); 175ae115bc7Smrj } 176ae115bc7Smrj 177ae115bc7Smrj 178*385cc6b4SJerry Jelinek /******************************************************************************* 179*385cc6b4SJerry Jelinek * 180*385cc6b4SJerry Jelinek * FUNCTION: AcpiNsBuildNormalizedPath 181*385cc6b4SJerry Jelinek * 182*385cc6b4SJerry Jelinek * PARAMETERS: Node - Namespace node 183*385cc6b4SJerry Jelinek * FullPath - Where the path name is returned 184*385cc6b4SJerry Jelinek * PathSize - Size of returned path name buffer 185*385cc6b4SJerry Jelinek * NoTrailing - Remove trailing '_' from each name segment 186*385cc6b4SJerry Jelinek * 187*385cc6b4SJerry Jelinek * RETURN: Return 1 if the AML path is empty, otherwise returning (length 188*385cc6b4SJerry Jelinek * of pathname + 1) which means the 'FullPath' contains a trailing 189*385cc6b4SJerry Jelinek * null. 190*385cc6b4SJerry Jelinek * 191*385cc6b4SJerry Jelinek * DESCRIPTION: Build and return a full namespace pathname. 192*385cc6b4SJerry Jelinek * Note that if the size of 'FullPath' isn't large enough to 193*385cc6b4SJerry Jelinek * contain the namespace node's path name, the actual required 194*385cc6b4SJerry Jelinek * buffer length is returned, and it should be greater than 195*385cc6b4SJerry Jelinek * 'PathSize'. So callers are able to check the returning value 196*385cc6b4SJerry Jelinek * to determine the buffer size of 'FullPath'. 197*385cc6b4SJerry Jelinek * 198*385cc6b4SJerry Jelinek ******************************************************************************/ 199*385cc6b4SJerry Jelinek 200*385cc6b4SJerry Jelinek UINT32 201*385cc6b4SJerry Jelinek AcpiNsBuildNormalizedPath ( 202*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *Node, 203*385cc6b4SJerry Jelinek char *FullPath, 204*385cc6b4SJerry Jelinek UINT32 PathSize, 205*385cc6b4SJerry Jelinek BOOLEAN NoTrailing) 206*385cc6b4SJerry Jelinek { 207*385cc6b4SJerry Jelinek UINT32 Length = 0, i; 208*385cc6b4SJerry Jelinek char Name[ACPI_NAME_SIZE]; 209*385cc6b4SJerry Jelinek BOOLEAN DoNoTrailing; 210*385cc6b4SJerry Jelinek char c, *Left, *Right; 211*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *NextNode; 212*385cc6b4SJerry Jelinek 213*385cc6b4SJerry Jelinek 214*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (NsBuildNormalizedPath, Node); 215*385cc6b4SJerry Jelinek 216*385cc6b4SJerry Jelinek 217*385cc6b4SJerry Jelinek #define ACPI_PATH_PUT8(Path, Size, Byte, Length) \ 218*385cc6b4SJerry Jelinek do { \ 219*385cc6b4SJerry Jelinek if ((Length) < (Size)) \ 220*385cc6b4SJerry Jelinek { \ 221*385cc6b4SJerry Jelinek (Path)[(Length)] = (Byte); \ 222*385cc6b4SJerry Jelinek } \ 223*385cc6b4SJerry Jelinek (Length)++; \ 224*385cc6b4SJerry Jelinek } while (0) 225*385cc6b4SJerry Jelinek 226*385cc6b4SJerry Jelinek /* 227*385cc6b4SJerry Jelinek * Make sure the PathSize is correct, so that we don't need to 228*385cc6b4SJerry Jelinek * validate both FullPath and PathSize. 229*385cc6b4SJerry Jelinek */ 230*385cc6b4SJerry Jelinek if (!FullPath) 231*385cc6b4SJerry Jelinek { 232*385cc6b4SJerry Jelinek PathSize = 0; 233*385cc6b4SJerry Jelinek } 234*385cc6b4SJerry Jelinek 235*385cc6b4SJerry Jelinek if (!Node) 236*385cc6b4SJerry Jelinek { 237*385cc6b4SJerry Jelinek goto BuildTrailingNull; 238*385cc6b4SJerry Jelinek } 239*385cc6b4SJerry Jelinek 240*385cc6b4SJerry Jelinek NextNode = Node; 241*385cc6b4SJerry Jelinek while (NextNode && NextNode != AcpiGbl_RootNode) 242*385cc6b4SJerry Jelinek { 243*385cc6b4SJerry Jelinek if (NextNode != Node) 244*385cc6b4SJerry Jelinek { 245*385cc6b4SJerry Jelinek ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); 246*385cc6b4SJerry Jelinek } 247*385cc6b4SJerry Jelinek 248*385cc6b4SJerry Jelinek ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); 249*385cc6b4SJerry Jelinek DoNoTrailing = NoTrailing; 250*385cc6b4SJerry Jelinek for (i = 0; i < 4; i++) 251*385cc6b4SJerry Jelinek { 252*385cc6b4SJerry Jelinek c = Name[4-i-1]; 253*385cc6b4SJerry Jelinek if (DoNoTrailing && c != '_') 254*385cc6b4SJerry Jelinek { 255*385cc6b4SJerry Jelinek DoNoTrailing = FALSE; 256*385cc6b4SJerry Jelinek } 257*385cc6b4SJerry Jelinek if (!DoNoTrailing) 258*385cc6b4SJerry Jelinek { 259*385cc6b4SJerry Jelinek ACPI_PATH_PUT8(FullPath, PathSize, c, Length); 260*385cc6b4SJerry Jelinek } 261*385cc6b4SJerry Jelinek } 262*385cc6b4SJerry Jelinek 263*385cc6b4SJerry Jelinek NextNode = NextNode->Parent; 264*385cc6b4SJerry Jelinek } 265*385cc6b4SJerry Jelinek 266*385cc6b4SJerry Jelinek ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length); 267*385cc6b4SJerry Jelinek 268*385cc6b4SJerry Jelinek /* Reverse the path string */ 269*385cc6b4SJerry Jelinek 270*385cc6b4SJerry Jelinek if (Length <= PathSize) 271*385cc6b4SJerry Jelinek { 272*385cc6b4SJerry Jelinek Left = FullPath; 273*385cc6b4SJerry Jelinek Right = FullPath+Length - 1; 274*385cc6b4SJerry Jelinek 275*385cc6b4SJerry Jelinek while (Left < Right) 276*385cc6b4SJerry Jelinek { 277*385cc6b4SJerry Jelinek c = *Left; 278*385cc6b4SJerry Jelinek *Left++ = *Right; 279*385cc6b4SJerry Jelinek *Right-- = c; 280*385cc6b4SJerry Jelinek } 281*385cc6b4SJerry Jelinek } 282*385cc6b4SJerry Jelinek 283*385cc6b4SJerry Jelinek /* Append the trailing null */ 284*385cc6b4SJerry Jelinek 285*385cc6b4SJerry Jelinek BuildTrailingNull: 286*385cc6b4SJerry Jelinek ACPI_PATH_PUT8 (FullPath, PathSize, '\0', Length); 287*385cc6b4SJerry Jelinek 288*385cc6b4SJerry Jelinek #undef ACPI_PATH_PUT8 289*385cc6b4SJerry Jelinek 290*385cc6b4SJerry Jelinek return_UINT32 (Length); 291*385cc6b4SJerry Jelinek } 292*385cc6b4SJerry Jelinek 293*385cc6b4SJerry Jelinek 294*385cc6b4SJerry Jelinek /******************************************************************************* 295*385cc6b4SJerry Jelinek * 296*385cc6b4SJerry Jelinek * FUNCTION: AcpiNsGetNormalizedPathname 297*385cc6b4SJerry Jelinek * 298*385cc6b4SJerry Jelinek * PARAMETERS: Node - Namespace node whose pathname is needed 299*385cc6b4SJerry Jelinek * NoTrailing - Remove trailing '_' from each name segment 300*385cc6b4SJerry Jelinek * 301*385cc6b4SJerry Jelinek * RETURN: Pointer to storage containing the fully qualified name of 302*385cc6b4SJerry Jelinek * the node, In external format (name segments separated by path 303*385cc6b4SJerry Jelinek * separators.) 304*385cc6b4SJerry Jelinek * 305*385cc6b4SJerry Jelinek * DESCRIPTION: Used to obtain the full pathname to a namespace node, usually 306*385cc6b4SJerry Jelinek * for error and debug statements. All trailing '_' will be 307*385cc6b4SJerry Jelinek * removed from the full pathname if 'NoTrailing' is specified.. 308*385cc6b4SJerry Jelinek * 309*385cc6b4SJerry Jelinek ******************************************************************************/ 310*385cc6b4SJerry Jelinek 311*385cc6b4SJerry Jelinek char * 312*385cc6b4SJerry Jelinek AcpiNsGetNormalizedPathname ( 313*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *Node, 314*385cc6b4SJerry Jelinek BOOLEAN NoTrailing) 315*385cc6b4SJerry Jelinek { 316*385cc6b4SJerry Jelinek char *NameBuffer; 317*385cc6b4SJerry Jelinek ACPI_SIZE Size; 318*385cc6b4SJerry Jelinek 319*385cc6b4SJerry Jelinek 320*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (NsGetNormalizedPathname, Node); 321*385cc6b4SJerry Jelinek 322*385cc6b4SJerry Jelinek 323*385cc6b4SJerry Jelinek /* Calculate required buffer size based on depth below root */ 324*385cc6b4SJerry Jelinek 325*385cc6b4SJerry Jelinek Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 326*385cc6b4SJerry Jelinek if (!Size) 327*385cc6b4SJerry Jelinek { 328*385cc6b4SJerry Jelinek return_PTR (NULL); 329*385cc6b4SJerry Jelinek } 330*385cc6b4SJerry Jelinek 331*385cc6b4SJerry Jelinek /* Allocate a buffer to be returned to caller */ 332*385cc6b4SJerry Jelinek 333*385cc6b4SJerry Jelinek NameBuffer = ACPI_ALLOCATE_ZEROED (Size); 334*385cc6b4SJerry Jelinek if (!NameBuffer) 335*385cc6b4SJerry Jelinek { 336*385cc6b4SJerry Jelinek ACPI_ERROR ((AE_INFO, 337*385cc6b4SJerry Jelinek "Could not allocate %u bytes", (UINT32) Size)); 338*385cc6b4SJerry Jelinek return_PTR (NULL); 339*385cc6b4SJerry Jelinek } 340*385cc6b4SJerry Jelinek 341*385cc6b4SJerry Jelinek /* Build the path in the allocated buffer */ 342*385cc6b4SJerry Jelinek 343*385cc6b4SJerry Jelinek (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing); 344*385cc6b4SJerry Jelinek 345*385cc6b4SJerry Jelinek return_PTR (NameBuffer); 346*385cc6b4SJerry Jelinek } 347