Subversion Repositories Kolibri OS

Rev

Rev 1498 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dmnames - AML disassembler, names, namestrings, pathnames
  4.  *
  5.  ******************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116.  
  117. #include "acpi.h"
  118. #include "accommon.h"
  119. #include "acparser.h"
  120. #include "amlcode.h"
  121. #include "acnamesp.h"
  122. #include "acdisasm.h"
  123.  
  124.  
  125. #ifdef ACPI_DISASSEMBLER
  126.  
  127. #define _COMPONENT          ACPI_CA_DEBUGGER
  128.         ACPI_MODULE_NAME    ("dmnames")
  129.  
  130. /* Local prototypes */
  131.  
  132. #ifdef ACPI_OBSOLETE_FUNCTIONS
  133. void
  134. AcpiDmDisplayPath (
  135.     ACPI_PARSE_OBJECT       *Op);
  136. #endif
  137.  
  138.  
  139. /*******************************************************************************
  140.  *
  141.  * FUNCTION:    AcpiDmDumpName
  142.  *
  143.  * PARAMETERS:  Name            - 4 character ACPI name
  144.  *
  145.  * RETURN:      Final length of name
  146.  *
  147.  * DESCRIPTION: Dump an ACPI name, minus any trailing underscores.
  148.  *
  149.  ******************************************************************************/
  150.  
  151. UINT32
  152. AcpiDmDumpName (
  153.     UINT32                  Name)
  154. {
  155.     UINT32                  i;
  156.     UINT32                  Length;
  157.     char                    NewName[4];
  158.  
  159.  
  160.     /* Copy name locally in case the original name is not writeable */
  161.  
  162.     *ACPI_CAST_PTR (UINT32, &NewName[0]) = Name;
  163.  
  164.     /* Ensure that the name is printable, even if we have to fix it */
  165.  
  166.     AcpiUtRepairName (NewName);
  167.  
  168.     /* Remove all trailing underscores from the name */
  169.  
  170.     Length = ACPI_NAME_SIZE;
  171.     for (i = (ACPI_NAME_SIZE - 1); i != 0; i--)
  172.     {
  173.         if (NewName[i] == '_')
  174.         {
  175.             Length--;
  176.         }
  177.         else
  178.         {
  179.             break;
  180.         }
  181.     }
  182.  
  183.     /* Dump the name, up to the start of the trailing underscores */
  184.  
  185.     for (i = 0; i < Length; i++)
  186.     {
  187.         AcpiOsPrintf ("%c", NewName[i]);
  188.     }
  189.  
  190.     return (Length);
  191. }
  192.  
  193.  
  194. /*******************************************************************************
  195.  *
  196.  * FUNCTION:    AcpiPsDisplayObjectPathname
  197.  *
  198.  * PARAMETERS:  WalkState       - Current walk state
  199.  *              Op              - Object whose pathname is to be obtained
  200.  *
  201.  * RETURN:      Status
  202.  *
  203.  * DESCRIPTION: Diplay the pathname associated with a named object.  Two
  204.  *              versions. One searches the parse tree (for parser-only
  205.  *              applications suchas AcpiDump), and the other searches the
  206.  *              ACPI namespace (the parse tree is probably deleted)
  207.  *
  208.  ******************************************************************************/
  209.  
  210. ACPI_STATUS
  211. AcpiPsDisplayObjectPathname (
  212.     ACPI_WALK_STATE         *WalkState,
  213.     ACPI_PARSE_OBJECT       *Op)
  214. {
  215.     ACPI_STATUS             Status;
  216.     ACPI_NAMESPACE_NODE     *Node;
  217.     ACPI_BUFFER             Buffer;
  218.     UINT32                  DebugLevel;
  219.  
  220.  
  221.     /* Save current debug level so we don't get extraneous debug output */
  222.  
  223.     DebugLevel = AcpiDbgLevel;
  224.     AcpiDbgLevel = 0;
  225.  
  226.     /* Just get the Node out of the Op object */
  227.  
  228.     Node = Op->Common.Node;
  229.     if (!Node)
  230.     {
  231.         /* Node not defined in this scope, look it up */
  232.  
  233.         Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Common.Value.String,
  234.                     ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
  235.                     WalkState, &(Node));
  236.  
  237.         if (ACPI_FAILURE (Status))
  238.         {
  239.             /*
  240.              * We can't get the pathname since the object
  241.              * is not in the namespace.  This can happen during single
  242.              * stepping where a dynamic named object is *about* to be created.
  243.              */
  244.             AcpiOsPrintf ("  [Path not found]");
  245.             goto Exit;
  246.         }
  247.  
  248.         /* Save it for next time. */
  249.  
  250.         Op->Common.Node = Node;
  251.     }
  252.  
  253.     /* Convert NamedDesc/handle to a full pathname */
  254.  
  255.     Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
  256.     Status = AcpiNsHandleToPathname (Node, &Buffer);
  257.     if (ACPI_FAILURE (Status))
  258.     {
  259.         AcpiOsPrintf ("****Could not get pathname****)");
  260.         goto Exit;
  261.     }
  262.  
  263.     AcpiOsPrintf ("  (Path %s)", (char *) Buffer.Pointer);
  264.     ACPI_FREE (Buffer.Pointer);
  265.  
  266.  
  267. Exit:
  268.     /* Restore the debug level */
  269.  
  270.     AcpiDbgLevel = DebugLevel;
  271.     return (Status);
  272. }
  273.  
  274.  
  275. /*******************************************************************************
  276.  *
  277.  * FUNCTION:    AcpiDmNamestring
  278.  *
  279.  * PARAMETERS:  Name                - ACPI Name string to store
  280.  *
  281.  * RETURN:      None
  282.  *
  283.  * DESCRIPTION: Decode and dump an ACPI namestring. Handles prefix characters
  284.  *
  285.  ******************************************************************************/
  286.  
  287. void
  288. AcpiDmNamestring (
  289.     char                    *Name)
  290. {
  291.     UINT32                  SegCount;
  292.  
  293.  
  294.     if (!Name)
  295.     {
  296.         return;
  297.     }
  298.  
  299.     /* Handle all Scope Prefix operators */
  300.  
  301.     while (AcpiPsIsPrefixChar (ACPI_GET8 (Name)))
  302.     {
  303.         /* Append prefix character */
  304.  
  305.         AcpiOsPrintf ("%1c", ACPI_GET8 (Name));
  306.         Name++;
  307.     }
  308.  
  309.     switch (ACPI_GET8 (Name))
  310.     {
  311.     case 0:
  312.         SegCount = 0;
  313.         break;
  314.  
  315.     case AML_DUAL_NAME_PREFIX:
  316.         SegCount = 2;
  317.         Name++;
  318.         break;
  319.  
  320.     case AML_MULTI_NAME_PREFIX_OP:
  321.         SegCount = (UINT32) ACPI_GET8 (Name + 1);
  322.         Name += 2;
  323.         break;
  324.  
  325.     default:
  326.         SegCount = 1;
  327.         break;
  328.     }
  329.  
  330.     while (SegCount)
  331.     {
  332.         /* Append Name segment */
  333.  
  334.         AcpiDmDumpName (*ACPI_CAST_PTR (UINT32, Name));
  335.  
  336.         SegCount--;
  337.         if (SegCount)
  338.         {
  339.             /* Not last name, append dot separator */
  340.  
  341.             AcpiOsPrintf (".");
  342.         }
  343.         Name += ACPI_NAME_SIZE;
  344.     }
  345. }
  346.  
  347.  
  348. #ifdef ACPI_OBSOLETE_FUNCTIONS
  349. /*******************************************************************************
  350.  *
  351.  * FUNCTION:    AcpiDmDisplayPath
  352.  *
  353.  * PARAMETERS:  Op                  - Named Op whose path is to be constructed
  354.  *
  355.  * RETURN:      None
  356.  *
  357.  * DESCRIPTION: Walk backwards from current scope and display the name
  358.  *              of each previous level of scope up to the root scope
  359.  *              (like "pwd" does with file systems)
  360.  *
  361.  ******************************************************************************/
  362.  
  363. void
  364. AcpiDmDisplayPath (
  365.     ACPI_PARSE_OBJECT       *Op)
  366. {
  367.     ACPI_PARSE_OBJECT       *Prev;
  368.     ACPI_PARSE_OBJECT       *Search;
  369.     UINT32                  Name;
  370.     BOOLEAN                 DoDot = FALSE;
  371.     ACPI_PARSE_OBJECT       *NamePath;
  372.     const ACPI_OPCODE_INFO  *OpInfo;
  373.  
  374.  
  375.     /* We are only interested in named objects */
  376.  
  377.     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
  378.     if (!(OpInfo->Flags & AML_NSNODE))
  379.     {
  380.         return;
  381.     }
  382.  
  383.     if (OpInfo->Flags & AML_CREATE)
  384.     {
  385.         /* Field creation - check for a fully qualified namepath */
  386.  
  387.         if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
  388.         {
  389.             NamePath = AcpiPsGetArg (Op, 3);
  390.         }
  391.         else
  392.         {
  393.             NamePath = AcpiPsGetArg (Op, 2);
  394.         }
  395.  
  396.         if ((NamePath) &&
  397.             (NamePath->Common.Value.String) &&
  398.             (NamePath->Common.Value.String[0] == '\\'))
  399.         {
  400.             AcpiDmNamestring (NamePath->Common.Value.String);
  401.             return;
  402.         }
  403.     }
  404.  
  405.     Prev = NULL;            /* Start with Root Node */
  406.  
  407.     while (Prev != Op)
  408.     {
  409.         /* Search upwards in the tree to find scope with "prev" as its parent */
  410.  
  411.         Search = Op;
  412.         for (; ;)
  413.         {
  414.             if (Search->Common.Parent == Prev)
  415.             {
  416.                 break;
  417.             }
  418.  
  419.             /* Go up one level */
  420.  
  421.             Search = Search->Common.Parent;
  422.         }
  423.  
  424.         if (Prev)
  425.         {
  426.             OpInfo = AcpiPsGetOpcodeInfo (Search->Common.AmlOpcode);
  427.             if (!(OpInfo->Flags & AML_FIELD))
  428.             {
  429.                 /* Below root scope, append scope name */
  430.  
  431.                 if (DoDot)
  432.                 {
  433.                     /* Append dot */
  434.  
  435.                     AcpiOsPrintf (".");
  436.                 }
  437.  
  438.                 if (OpInfo->Flags & AML_CREATE)
  439.                 {
  440.                     if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
  441.                     {
  442.                         NamePath = AcpiPsGetArg (Op, 3);
  443.                     }
  444.                     else
  445.                     {
  446.                         NamePath = AcpiPsGetArg (Op, 2);
  447.                     }
  448.  
  449.                     if ((NamePath) &&
  450.                         (NamePath->Common.Value.String))
  451.                     {
  452.                         AcpiDmDumpName (NamePath->Common.Value.String);
  453.                     }
  454.                 }
  455.                 else
  456.                 {
  457.                     Name = AcpiPsGetName (Search);
  458.                     AcpiDmDumpName ((char *) &Name);
  459.                 }
  460.  
  461.                 DoDot = TRUE;
  462.             }
  463.         }
  464.         Prev = Search;
  465.     }
  466. }
  467.  
  468.  
  469. /*******************************************************************************
  470.  *
  471.  * FUNCTION:    AcpiDmValidateName
  472.  *
  473.  * PARAMETERS:  Name            - 4 character ACPI name
  474.  *
  475.  * RETURN:      None
  476.  *
  477.  * DESCRIPTION: Lookup the name
  478.  *
  479.  ******************************************************************************/
  480.  
  481. void
  482. AcpiDmValidateName (
  483.     char                    *Name,
  484.     ACPI_PARSE_OBJECT       *Op)
  485. {
  486.  
  487.     if ((!Name) ||
  488.         (!Op->Common.Parent))
  489.     {
  490.         return;
  491.     }
  492.  
  493.     if (!Op->Common.Node)
  494.     {
  495.         AcpiOsPrintf (
  496.             " /**** Name not found or not accessible from this scope ****/ ");
  497.     }
  498.  
  499.     ACPI_PARSE_OBJECT       *TargetOp;
  500.  
  501.  
  502.     if ((!Name) ||
  503.         (!Op->Common.Parent))
  504.     {
  505.         return;
  506.     }
  507.  
  508.     TargetOp = AcpiPsFind (Op, Name, 0, 0);
  509.     if (!TargetOp)
  510.     {
  511.         /*
  512.          * Didn't find the name in the parse tree.  This may be
  513.          * a problem, or it may simply be one of the predefined names
  514.          * (such as _OS_).  Rather than worry about looking up all
  515.          * the predefined names, just display the name as given
  516.          */
  517.         AcpiOsPrintf (
  518.             " /**** Name not found or not accessible from this scope ****/ ");
  519.     }
  520. }
  521. #endif
  522.  
  523. #endif
  524.  
  525.  
  526.