1244971Sjkim/****************************************************************************** 2244971Sjkim * 3244971Sjkim * Module Name: aslnamesp - Namespace output file generation 4244971Sjkim * 5244971Sjkim *****************************************************************************/ 6244971Sjkim 7244971Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9244971Sjkim * All rights reserved. 10244971Sjkim * 11244971Sjkim * Redistribution and use in source and binary forms, with or without 12244971Sjkim * modification, are permitted provided that the following conditions 13244971Sjkim * are met: 14244971Sjkim * 1. Redistributions of source code must retain the above copyright 15244971Sjkim * notice, this list of conditions, and the following disclaimer, 16244971Sjkim * without modification. 17244971Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18244971Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19244971Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20244971Sjkim * including a substantially similar Disclaimer requirement for further 21244971Sjkim * binary redistribution. 22244971Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23244971Sjkim * of any contributors may be used to endorse or promote products derived 24244971Sjkim * from this software without specific prior written permission. 25244971Sjkim * 26244971Sjkim * Alternatively, this software may be distributed under the terms of the 27244971Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28244971Sjkim * Software Foundation. 29244971Sjkim * 30244971Sjkim * NO WARRANTY 31244971Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32244971Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33244971Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34244971Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35244971Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36244971Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37244971Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38244971Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39244971Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40244971Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41244971Sjkim * POSSIBILITY OF SUCH DAMAGES. 42244971Sjkim */ 43244971Sjkim 44245582Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45244971Sjkim#include "aslcompiler.y.h" 46245582Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 47244971Sjkim 48244971Sjkim 49244971Sjkim#define _COMPONENT ACPI_COMPILER 50244971Sjkim ACPI_MODULE_NAME ("aslnamesp") 51244971Sjkim 52244971Sjkim/* Local prototypes */ 53244971Sjkim 54244971Sjkimstatic ACPI_STATUS 55244971SjkimNsDoOneNamespaceObject ( 56244971Sjkim ACPI_HANDLE ObjHandle, 57244971Sjkim UINT32 Level, 58244971Sjkim void *Context, 59244971Sjkim void **ReturnValue); 60244971Sjkim 61244971Sjkimstatic ACPI_STATUS 62244971SjkimNsDoOnePathname ( 63244971Sjkim ACPI_HANDLE ObjHandle, 64244971Sjkim UINT32 Level, 65244971Sjkim void *Context, 66244971Sjkim void **ReturnValue); 67244971Sjkim 68244971Sjkim 69244971Sjkim/******************************************************************************* 70244971Sjkim * 71244971Sjkim * FUNCTION: NsSetupNamespaceListing 72244971Sjkim * 73244971Sjkim * PARAMETERS: Handle - local file handle 74244971Sjkim * 75244971Sjkim * RETURN: None 76244971Sjkim * 77244971Sjkim * DESCRIPTION: Set the namespace output file to the input handle 78244971Sjkim * 79244971Sjkim ******************************************************************************/ 80244971Sjkim 81244971Sjkimvoid 82244971SjkimNsSetupNamespaceListing ( 83244971Sjkim void *Handle) 84244971Sjkim{ 85244971Sjkim 86244971Sjkim Gbl_NsOutputFlag = TRUE; 87244971Sjkim Gbl_Files[ASL_FILE_NAMESPACE_OUTPUT].Handle = Handle; 88244971Sjkim} 89244971Sjkim 90244971Sjkim 91244971Sjkim/******************************************************************************* 92244971Sjkim * 93244971Sjkim * FUNCTION: NsDisplayNamespace 94244971Sjkim * 95244971Sjkim * PARAMETERS: None 96244971Sjkim * 97244971Sjkim * RETURN: Status 98244971Sjkim * 99244971Sjkim * DESCRIPTION: Walk the namespace an display information about each node 100244971Sjkim * in the tree. Information is written to the optional 101244971Sjkim * namespace output file. 102244971Sjkim * 103244971Sjkim ******************************************************************************/ 104244971Sjkim 105244971SjkimACPI_STATUS 106244971SjkimNsDisplayNamespace ( 107244971Sjkim void) 108244971Sjkim{ 109244971Sjkim ACPI_STATUS Status; 110244971Sjkim 111244971Sjkim 112244971Sjkim if (!Gbl_NsOutputFlag) 113244971Sjkim { 114244971Sjkim return (AE_OK); 115244971Sjkim } 116244971Sjkim 117244971Sjkim Gbl_NumNamespaceObjects = 0; 118244971Sjkim 119244971Sjkim /* File header */ 120244971Sjkim 121244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n"); 122244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count Depth Name - Type\n\n"); 123244971Sjkim 124244971Sjkim /* Walk entire namespace from the root */ 125244971Sjkim 126244971Sjkim Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 127306536Sjkim ACPI_UINT32_MAX, FALSE, NsDoOneNamespaceObject, NULL, 128306536Sjkim NULL, NULL); 129244971Sjkim 130244971Sjkim /* Print the full pathname for each namespace node */ 131244971Sjkim 132244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n"); 133244971Sjkim 134244971Sjkim Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 135306536Sjkim ACPI_UINT32_MAX, FALSE, NsDoOnePathname, NULL, 136306536Sjkim NULL, NULL); 137244971Sjkim 138244971Sjkim return (Status); 139244971Sjkim} 140244971Sjkim 141244971Sjkim 142244971Sjkim/******************************************************************************* 143244971Sjkim * 144244971Sjkim * FUNCTION: NsDoOneNamespaceObject 145244971Sjkim * 146244971Sjkim * PARAMETERS: ACPI_WALK_CALLBACK 147244971Sjkim * 148244971Sjkim * RETURN: Status 149244971Sjkim * 150244971Sjkim * DESCRIPTION: Dump a namespace object to the namespace output file. 151244971Sjkim * Called during the walk of the namespace to dump all objects. 152244971Sjkim * 153244971Sjkim ******************************************************************************/ 154244971Sjkim 155244971Sjkimstatic ACPI_STATUS 156244971SjkimNsDoOneNamespaceObject ( 157244971Sjkim ACPI_HANDLE ObjHandle, 158244971Sjkim UINT32 Level, 159244971Sjkim void *Context, 160244971Sjkim void **ReturnValue) 161244971Sjkim{ 162244971Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 163244971Sjkim ACPI_OPERAND_OBJECT *ObjDesc; 164244971Sjkim ACPI_PARSE_OBJECT *Op; 165244971Sjkim 166244971Sjkim 167244971Sjkim Gbl_NumNamespaceObjects++; 168244971Sjkim 169244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5u [%u] %*s %4.4s - %s", 170244971Sjkim Gbl_NumNamespaceObjects, Level, (Level * 3), " ", 171306536Sjkim &Node->Name, AcpiUtGetTypeName (Node->Type)); 172244971Sjkim 173244971Sjkim Op = Node->Op; 174244971Sjkim ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object); 175244971Sjkim 176244971Sjkim if (!Op) 177244971Sjkim { 178244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n"); 179244971Sjkim return (AE_OK); 180244971Sjkim } 181244971Sjkim 182244971Sjkim 183244971Sjkim if ((ObjDesc) && 184244971Sjkim (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)) 185244971Sjkim { 186244971Sjkim switch (Node->Type) 187244971Sjkim { 188244971Sjkim case ACPI_TYPE_INTEGER: 189244971Sjkim 190244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 191244971Sjkim " [Initial Value 0x%8.8X%8.8X]", 192244971Sjkim ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 193244971Sjkim break; 194244971Sjkim 195244971Sjkim case ACPI_TYPE_STRING: 196244971Sjkim 197244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 198244971Sjkim " [Initial Value \"%s\"]", 199244971Sjkim ObjDesc->String.Pointer); 200244971Sjkim break; 201244971Sjkim 202244971Sjkim default: 203250838Sjkim 204244971Sjkim /* Nothing to do for other types */ 205250838Sjkim 206244971Sjkim break; 207244971Sjkim } 208244971Sjkim 209244971Sjkim } 210244971Sjkim else 211244971Sjkim { 212244971Sjkim switch (Node->Type) 213244971Sjkim { 214244971Sjkim case ACPI_TYPE_INTEGER: 215244971Sjkim 216244971Sjkim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 217244971Sjkim { 218244971Sjkim Op = Op->Asl.Child; 219244971Sjkim } 220306536Sjkim 221244971Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 222244971Sjkim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 223244971Sjkim { 224244971Sjkim Op = Op->Asl.Next; 225244971Sjkim } 226306536Sjkim 227244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 228244971Sjkim " [Initial Value 0x%8.8X%8.8X]", 229244971Sjkim ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); 230244971Sjkim break; 231244971Sjkim 232244971Sjkim case ACPI_TYPE_STRING: 233244971Sjkim 234244971Sjkim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 235244971Sjkim { 236244971Sjkim Op = Op->Asl.Child; 237244971Sjkim } 238306536Sjkim 239244971Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 240244971Sjkim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 241244971Sjkim { 242244971Sjkim Op = Op->Asl.Next; 243244971Sjkim } 244306536Sjkim 245244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 246244971Sjkim " [Initial Value \"%s\"]", 247244971Sjkim Op->Asl.Value.String); 248244971Sjkim break; 249244971Sjkim 250244971Sjkim case ACPI_TYPE_LOCAL_REGION_FIELD: 251244971Sjkim 252244971Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 253244971Sjkim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 254244971Sjkim { 255244971Sjkim Op = Op->Asl.Child; 256244971Sjkim } 257306536Sjkim 258244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 259244971Sjkim " [Offset 0x%04X Length 0x%04X bits]", 260244971Sjkim Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer); 261244971Sjkim break; 262244971Sjkim 263244971Sjkim case ACPI_TYPE_BUFFER_FIELD: 264244971Sjkim 265244971Sjkim switch (Op->Asl.ParseOpcode) 266244971Sjkim { 267244971Sjkim case PARSEOP_CREATEBYTEFIELD: 268250838Sjkim 269244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BYTE ( 8 bit)]"); 270244971Sjkim break; 271244971Sjkim 272244971Sjkim case PARSEOP_CREATEDWORDFIELD: 273250838Sjkim 274244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [DWORD (32 bit)]"); 275244971Sjkim break; 276244971Sjkim 277244971Sjkim case PARSEOP_CREATEQWORDFIELD: 278250838Sjkim 279244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [QWORD (64 bit)]"); 280244971Sjkim break; 281244971Sjkim 282244971Sjkim case PARSEOP_CREATEWORDFIELD: 283250838Sjkim 284244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [WORD (16 bit)]"); 285244971Sjkim break; 286244971Sjkim 287244971Sjkim case PARSEOP_CREATEBITFIELD: 288250838Sjkim 289244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BIT ( 1 bit)]"); 290244971Sjkim break; 291244971Sjkim 292244971Sjkim case PARSEOP_CREATEFIELD: 293250838Sjkim 294244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [Arbitrary Bit Field]"); 295244971Sjkim break; 296244971Sjkim 297244971Sjkim default: 298250838Sjkim 299244971Sjkim break; 300244971Sjkim 301244971Sjkim } 302244971Sjkim break; 303244971Sjkim 304244971Sjkim case ACPI_TYPE_PACKAGE: 305244971Sjkim 306244971Sjkim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 307244971Sjkim { 308244971Sjkim Op = Op->Asl.Child; 309244971Sjkim } 310306536Sjkim 311244971Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 312244971Sjkim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 313244971Sjkim { 314244971Sjkim Op = Op->Asl.Next; 315244971Sjkim } 316306536Sjkim 317244971Sjkim Op = Op->Asl.Child; 318244971Sjkim 319244971Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) || 320244971Sjkim (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA)) 321244971Sjkim { 322244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 323244971Sjkim " [Initial Length 0x%.2X elements]", 324244971Sjkim Op->Asl.Value.Integer); 325244971Sjkim } 326244971Sjkim break; 327244971Sjkim 328244971Sjkim case ACPI_TYPE_BUFFER: 329244971Sjkim 330244971Sjkim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 331244971Sjkim { 332244971Sjkim Op = Op->Asl.Child; 333244971Sjkim } 334306536Sjkim 335244971Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 336244971Sjkim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 337244971Sjkim { 338244971Sjkim Op = Op->Asl.Next; 339244971Sjkim } 340306536Sjkim 341244971Sjkim Op = Op->Asl.Child; 342244971Sjkim 343244971Sjkim if (Op && (Op->Asl.ParseOpcode == PARSEOP_INTEGER)) 344244971Sjkim { 345244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 346244971Sjkim " [Initial Length 0x%.2X bytes]", 347244971Sjkim Op->Asl.Value.Integer); 348244971Sjkim } 349244971Sjkim break; 350244971Sjkim 351244971Sjkim case ACPI_TYPE_METHOD: 352244971Sjkim 353244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 354244971Sjkim " [Code Length 0x%.4X bytes]", 355244971Sjkim Op->Asl.AmlSubtreeLength); 356244971Sjkim break; 357244971Sjkim 358244971Sjkim case ACPI_TYPE_LOCAL_RESOURCE: 359244971Sjkim 360244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 361244971Sjkim " [Desc Offset 0x%.4X Bytes]", Node->Value); 362244971Sjkim break; 363244971Sjkim 364244971Sjkim case ACPI_TYPE_LOCAL_RESOURCE_FIELD: 365244971Sjkim 366244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 367244971Sjkim " [Field Offset 0x%.4X Bits 0x%.4X Bytes] ", 368244971Sjkim Node->Value, Node->Value / 8); 369244971Sjkim 370244971Sjkim if (Node->Flags & ANOBJ_IS_REFERENCED) 371244971Sjkim { 372244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 373244971Sjkim "Referenced"); 374244971Sjkim } 375244971Sjkim else 376244971Sjkim { 377244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 378244971Sjkim "Name not referenced"); 379244971Sjkim } 380244971Sjkim break; 381244971Sjkim 382250838Sjkim default: 383244971Sjkim 384244971Sjkim /* Nothing to do for other types */ 385250838Sjkim 386244971Sjkim break; 387244971Sjkim } 388244971Sjkim } 389244971Sjkim 390244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n"); 391244971Sjkim return (AE_OK); 392244971Sjkim} 393244971Sjkim 394244971Sjkim 395244971Sjkim/******************************************************************************* 396244971Sjkim * 397244971Sjkim * FUNCTION: NsDoOnePathname 398244971Sjkim * 399244971Sjkim * PARAMETERS: ACPI_WALK_CALLBACK 400244971Sjkim * 401244971Sjkim * RETURN: Status 402244971Sjkim * 403244971Sjkim * DESCRIPTION: Print the full pathname for a namespace node. 404244971Sjkim * 405244971Sjkim ******************************************************************************/ 406244971Sjkim 407244971Sjkimstatic ACPI_STATUS 408244971SjkimNsDoOnePathname ( 409244971Sjkim ACPI_HANDLE ObjHandle, 410244971Sjkim UINT32 Level, 411244971Sjkim void *Context, 412244971Sjkim void **ReturnValue) 413244971Sjkim{ 414244971Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 415244971Sjkim ACPI_STATUS Status; 416244971Sjkim ACPI_BUFFER TargetPath; 417244971Sjkim 418244971Sjkim 419244971Sjkim TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 420306536Sjkim Status = AcpiNsHandleToPathname (Node, &TargetPath, FALSE); 421244971Sjkim if (ACPI_FAILURE (Status)) 422244971Sjkim { 423244971Sjkim return (Status); 424244971Sjkim } 425244971Sjkim 426244971Sjkim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%s\n", TargetPath.Pointer); 427244971Sjkim ACPI_FREE (TargetPath.Pointer); 428244971Sjkim return (AE_OK); 429244971Sjkim} 430