char * AcpiNsGetNormalizedPathname ( ACPI_NAMESPACE_NODE *Node, BOOLEAN NoTrailing) { char *NameBuffer; ACPI_SIZE Size; ACPI_FUNCTION_TRACE_PTR (NsGetNormalizedPathname, Node); /* Calculate required buffer size based on depth below root */ Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); if (!Size) { return_PTR (NULL); } /* Allocate a buffer to be returned to caller */ NameBuffer = ACPI_ALLOCATE_ZEROED (Size); if (!NameBuffer) { ACPI_ERROR ((AE_INFO, "Could not allocate %u bytes", (UINT32) Size)); return_PTR (NULL); } /* Build the path in the allocated buffer */ (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing); return_PTR (NameBuffer); }
ACPI_STATUS AcpiNsHandleToPathname ( ACPI_HANDLE TargetHandle, ACPI_BUFFER *Buffer, BOOLEAN NoTrailing) { ACPI_STATUS Status; ACPI_NAMESPACE_NODE *Node; ACPI_SIZE RequiredSize; ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle); Node = AcpiNsValidateHandle (TargetHandle); if (!Node) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* Determine size required for the caller buffer */ RequiredSize = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); if (!RequiredSize) { return_ACPI_STATUS (AE_BAD_PARAMETER); } /* Validate/Allocate/Clear caller buffer */ Status = AcpiUtInitializeBuffer (Buffer, RequiredSize); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } /* Build the path in the caller buffer */ (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer, RequiredSize, NoTrailing); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n", (char *) Buffer->Pointer, (UINT32) RequiredSize)); return_ACPI_STATUS (AE_OK); }
ACPI_SIZE AcpiNsGetPathnameLength ( ACPI_NAMESPACE_NODE *Node) { ACPI_SIZE Size; ACPI_FUNCTION_ENTRY (); Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE); return (Size); }
ACPI_SIZE AcpiNsGetPathnameLength ( ACPI_NAMESPACE_NODE *Node) { ACPI_SIZE Size; /* Validate the Node */ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) { ACPI_ERROR ((AE_INFO, "Invalid/cached reference target node: %p, descriptor type %d", Node, ACPI_GET_DESCRIPTOR_TYPE (Node))); return (0); } Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE); return (Size); }
static char * AcpiGetTagPathname ( ACPI_PARSE_OBJECT *IndexOp, ACPI_NAMESPACE_NODE *BufferNode, ACPI_NAMESPACE_NODE *ResourceNode, UINT32 BitIndex) { ACPI_STATUS Status; UINT32 ResourceBitIndex; UINT8 ResourceTableIndex; ACPI_SIZE RequiredSize; char *Pathname; AML_RESOURCE *Aml; ACPI_PARSE_OBJECT *Op; char *InternalPath; char *Tag; /* Get the Op that contains the actual buffer data */ Op = BufferNode->Op->Common.Value.Arg; Op = Op->Common.Next; if (!Op) { return (NULL); } /* Get the individual resource descriptor and validate it */ Aml = ACPI_CAST_PTR ( AML_RESOURCE, &Op->Named.Data[ResourceNode->Value]); Status = AcpiUtValidateResource (NULL, Aml, &ResourceTableIndex); if (ACPI_FAILURE (Status)) { return (NULL); } /* Get offset into this descriptor (from offset into entire buffer) */ ResourceBitIndex = BitIndex - ACPI_MUL_8 (ResourceNode->Value); /* Get the tag associated with this resource descriptor and offset */ Tag = AcpiDmGetResourceTag (ResourceBitIndex, Aml, ResourceTableIndex); if (!Tag) { return (NULL); } /* * Now that we know that we have a reference that can be converted to a * symbol, change the name of the resource to a unique name. */ AcpiDmUpdateResourceName (ResourceNode); /* Get the full pathname to the parent buffer */ RequiredSize = AcpiNsBuildNormalizedPath (BufferNode, NULL, 0, FALSE); if (!RequiredSize) { return (NULL); } Pathname = ACPI_ALLOCATE_ZEROED (RequiredSize + ACPI_PATH_SEGMENT_LENGTH); if (!Pathname) { return (NULL); } (void) AcpiNsBuildNormalizedPath (BufferNode, Pathname, RequiredSize, FALSE); /* * Create the full path to the resource and tag by: remove the buffer name, * append the resource descriptor name, append a dot, append the tag name. * * TBD: Always using the full path is a bit brute force, the path can be * often be optimized with carats (if the original buffer namepath is a * single nameseg). This doesn't really matter, because these paths do not * end up in the final compiled AML, it's just an appearance issue for the * disassembled code. */ Pathname[strlen (Pathname) - ACPI_NAME_SIZE] = 0; strncat (Pathname, ResourceNode->Name.Ascii, ACPI_NAME_SIZE); strcat (Pathname, "."); strncat (Pathname, Tag, ACPI_NAME_SIZE); /* Internalize the namepath to AML format */ AcpiNsInternalizeName (Pathname, &InternalPath); ACPI_FREE (Pathname); /* Update the Op with the symbol */ AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP); IndexOp->Common.Value.String = InternalPath; /* We will need the tag later. Cheat by putting it in the Node field */ IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag); return (InternalPath); }