FreeBSD/sys/contrib/dev/acpica/components/executer/exdebug.c
/*******************************************************************************
 *
 * FUNCTION:    AcpiExDoDebugObject
 *
 * PARAMETERS:  SourceDesc          - Object to be output to "Debug Object"
 *              Level               - Indentation level (used for packages)
 *              Index               - Current package element, zero if not pkg
 *
 * RETURN:      None
 *
 * DESCRIPTION: Handles stores to the AML Debug Object. For example:
 *              Store(INT1, Debug)
 *
 * This function is not compiled if ACPI_NO_ERROR_MESSAGES is set.
 *
 * This function is only enabled if AcpiGbl_EnableAmlDebugObject is set, or
 * if ACPI_LV_DEBUG_OBJECT is set in the AcpiDbgLevel. Thus, in the normal
 * operational case, stores to the debug object are ignored but can be easily
 * enabled if necessary.
 *
 ******************************************************************************/
AcpiExDoDebugObject
PARAMETERS:  SourceDesc          - Object to be output to "Debug Object"
Level               - Indentation level (used for packages)
Index               - Current package element, zero if not pkg

None

Handles stores to the AML Debug Object.

This function is not compiled if ACPI_NO_ERROR_MESSAGES is set.

This function is only enabled if AcpiGbl_EnableAmlDebugObject is set, or
if ACPI_LV_DEBUG_OBJECT is set in the AcpiDbgLevel. Thus, in the normal
operational case, stores to the debug object are ignored but can be easily
enabled if necessary.
AcpiExDoDebugObject PARAMETERS : SourceDesc - Object to be output to " Debug Object " Level - Indentation level ( used for packages ) Index - Current package element zero if not pkg None Handles stores to the AML Debug Object . This function is not compiled if ACPI_NO_ERROR_MESSAGES is set . This function is only enabled if AcpiGbl_EnableAmlDebugObject is set or if ACPI_LV_DEBUG_OBJECT is set in the AcpiDbgLevel . Thus in the normal operational case stores to the debug object are ignored but can be easily enabled if necessary .
void
AcpiExDoDebugObject (
    ACPI_OPERAND_OBJECT     *SourceDesc,
    UINT32                  Level,
    UINT32                  Index)
{
    UINT32                  i;
    UINT32                  Timer;
    ACPI_OPERAND_OBJECT     *ObjectDesc;
    UINT32                  Value;
    ACPI_FUNCTION_TRACE_PTR (ExDoDebugObject, SourceDesc);
    if (!AcpiGbl_EnableAmlDebugObject &&
        !(AcpiDbgLevel & ACPI_LV_DEBUG_OBJECT))
    {
        return_VOID;
    }
    if (SourceDesc &&
        (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND) &&
        (SourceDesc->Common.Type == ACPI_TYPE_STRING))
    {
        if ((SourceDesc->String.Length == 0) ||
                ((SourceDesc->String.Length == 1) &&
                (*SourceDesc->String.Pointer == '\n')))
        {
            AcpiOsPrintf ("\n");
            return_VOID;
        }
    }
    if (!((Level > 0) && Index == 0))
    {
        if (AcpiGbl_DisplayDebugTimer)
        {
            Timer = ((UINT32) AcpiOsGetTimer () / 10);
            Timer &= 0x03FFFFFF;
            AcpiOsPrintf ("[ACPI Debug T=0x%8.8X] %*s", Timer, Level, " ");
        }
        else
        {
            AcpiOsPrintf ("[ACPI Debug] %*s", Level, " ");
        }
    }
    if (Index > 0)
    {
       AcpiOsPrintf ("(%.2u) ", Index - 1);
    }
    if (!SourceDesc)
    {
        AcpiOsPrintf ("[Null Object]\n");
        return_VOID;
    }
    if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
    {
        if ((SourceDesc->Common.Type != ACPI_TYPE_INTEGER) &&
            (SourceDesc->Common.Type != ACPI_TYPE_STRING))
        {
            AcpiOsPrintf ("%s  ", AcpiUtGetObjectTypeName (SourceDesc));
        }
        if (!AcpiUtValidInternalObject (SourceDesc))
        {
           AcpiOsPrintf ("%p, Invalid Internal Object!\n", SourceDesc);
           return_VOID;
        }
    }
    else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
    {
        AcpiOsPrintf ("%s  (Node %p)\n",
            AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
                SourceDesc);
        return_VOID;
    }
    else
    {
        return_VOID;
    }
    switch (SourceDesc->Common.Type)
    {
    case ACPI_TYPE_INTEGER:
        if (AcpiGbl_IntegerByteWidth == 4)
        {
            AcpiOsPrintf ("0x%8.8X\n",
                (UINT32) SourceDesc->Integer.Value);
        }
        else
        {
            AcpiOsPrintf ("0x%8.8X%8.8X\n",
                ACPI_FORMAT_UINT64 (SourceDesc->Integer.Value));
        }
        break;
    case ACPI_TYPE_BUFFER:
        AcpiOsPrintf ("[0x%.2X]\n", (UINT32) SourceDesc->Buffer.Length);
        AcpiUtDumpBuffer (SourceDesc->Buffer.Pointer,
            (SourceDesc->Buffer.Length < 256) ?
                SourceDesc->Buffer.Length : 256, DB_BYTE_DISPLAY, 0);
        break;
    case ACPI_TYPE_STRING:
        AcpiOsPrintf ("\"%s\"\n", SourceDesc->String.Pointer);
        break;
    case ACPI_TYPE_PACKAGE:
        AcpiOsPrintf ("(Contains 0x%.2X Elements):\n",
            SourceDesc->Package.Count);
        for (i = 0; i < SourceDesc->Package.Count; i++)
        {
            AcpiExDoDebugObject (SourceDesc->Package.Elements[i],
                Level + 4, i + 1);
        }
        break;
    case ACPI_TYPE_LOCAL_REFERENCE:
        AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (SourceDesc));
        switch (SourceDesc->Reference.Class)
        {
        case ACPI_REFCLASS_INDEX:
            AcpiOsPrintf ("0x%X\n", SourceDesc->Reference.Value);
            break;
        case ACPI_REFCLASS_TABLE:
            AcpiOsPrintf ("Table Index 0x%X\n", SourceDesc->Reference.Value);
            return_VOID;
        default:
            break;
        }
        AcpiOsPrintf ("  ");
        if (SourceDesc->Reference.Node)
        {
            if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Node) !=
                ACPI_DESC_TYPE_NAMED)
            {
                AcpiOsPrintf (" %p - Not a valid namespace node\n",
                    SourceDesc->Reference.Node);
            }
            else
            {
                AcpiOsPrintf ("Node %p [%4.4s] ", SourceDesc->Reference.Node,
                    (SourceDesc->Reference.Node)->Name.Ascii);
                switch ((SourceDesc->Reference.Node)->Type)
                {
                case ACPI_TYPE_DEVICE:
                    AcpiOsPrintf ("Device\n");
                    break;
                case ACPI_TYPE_THERMAL:
                    AcpiOsPrintf ("Thermal Zone\n");
                    break;
                default:
                    AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object,
                        Level + 4, 0);
                    break;
                }
            }
        }
        else if (SourceDesc->Reference.Object)
        {
            if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
                ACPI_DESC_TYPE_NAMED)
            {
                AcpiExDoDebugObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT,
                    SourceDesc->Reference.Object),
                    Level + 4, 0);
            }
            else
            {
                ObjectDesc = SourceDesc->Reference.Object;
                Value = SourceDesc->Reference.Value;
                switch (ObjectDesc->Common.Type)
                {
                case ACPI_TYPE_BUFFER:
                    AcpiOsPrintf ("Buffer[%u] = 0x%2.2X\n",
                        Value, *SourceDesc->Reference.IndexPointer);
                    break;
                case ACPI_TYPE_STRING:
                    AcpiOsPrintf ("String[%u] = \"%c\" (0x%2.2X)\n",
                        Value, *SourceDesc->Reference.IndexPointer,
                        *SourceDesc->Reference.IndexPointer);
                    break;
                case ACPI_TYPE_PACKAGE:
                    AcpiOsPrintf ("Package[%u] = ", Value);
                    if (!(*SourceDesc->Reference.Where))
                    {
                        AcpiOsPrintf ("[Uninitialized Package Element]\n");
                    }
                    else
                    {
                        AcpiExDoDebugObject (*SourceDesc->Reference.Where,
                            Level+4, 0);
                    }
                    break;
                default:
                    AcpiOsPrintf ("Unknown Reference object type %X\n",
                        ObjectDesc->Common.Type);
                    break;
                }
            }
        }
        break;
    default:
        AcpiOsPrintf ("(Descriptor %p)\n", SourceDesc);
        break;
    }
    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, "\n"));
    return_VOID;
}
void AcpiExDoDebugObject ( ACPI_OPERAND_OBJECT * SourceDesc , UINT32 Level , UINT32 Index ) { UINT32 i ; UINT32 Timer ; ACPI_OPERAND_OBJECT * ObjectDesc ; UINT32 Value ; ACPI_FUNCTION_TRACE_PTR ( ExDoDebugObject , SourceDesc ) ; if ( ! AcpiGbl_EnableAmlDebugObject && ! ( AcpiDbgLevel & ACPI_LV_DEBUG_OBJECT ) ) { return_VOID ; } if ( SourceDesc && ( ACPI_GET_DESCRIPTOR_TYPE ( SourceDesc ) == ACPI_DESC_TYPE_OPERAND ) && ( SourceDesc -> Common . Type == ACPI_TYPE_STRING ) ) { if ( ( SourceDesc -> String . Length == 0 ) || ( ( SourceDesc -> String . Length == 1 ) && ( * SourceDesc -> String . Pointer == ' \n ' ) ) ) { AcpiOsPrintf ( " \n " ) ; return_VOID ; } } if ( ! ( ( Level > 0 ) && Index == 0 ) ) { if ( AcpiGbl_DisplayDebugTimer ) { Timer = ( ( UINT32 ) AcpiOsGetTimer ( ) / 10 ) ; Timer &= 0x03FFFFFF ; AcpiOsPrintf ( " " , Timer , Level , " " ) ; } else { AcpiOsPrintf ( " " , Level , " " ) ; } } if ( Index > 0 ) { AcpiOsPrintf ( " " , Index - 1 ) ; } if ( ! SourceDesc ) { AcpiOsPrintf ( " \n " ) ; return_VOID ; } if ( ACPI_GET_DESCRIPTOR_TYPE ( SourceDesc ) == ACPI_DESC_TYPE_OPERAND ) { if ( ( SourceDesc -> Common . Type != ACPI_TYPE_INTEGER ) && ( SourceDesc -> Common . Type != ACPI_TYPE_STRING ) ) { AcpiOsPrintf ( " " , AcpiUtGetObjectTypeName ( SourceDesc ) ) ; } if ( ! AcpiUtValidInternalObject ( SourceDesc ) ) { AcpiOsPrintf ( " \n " , SourceDesc ) ; return_VOID ; } } else if ( ACPI_GET_DESCRIPTOR_TYPE ( SourceDesc ) == ACPI_DESC_TYPE_NAMED ) { AcpiOsPrintf ( " \n " , AcpiUtGetTypeName ( ( ( ACPI_NAMESPACE_NODE * ) SourceDesc ) -> Type ) , SourceDesc ) ; return_VOID ; } else { return_VOID ; } switch ( SourceDesc -> Common . Type ) { case ACPI_TYPE_INTEGER : if ( AcpiGbl_IntegerByteWidth == 4 ) { AcpiOsPrintf ( " \n " , ( UINT32 ) SourceDesc -> Integer . Value ) ; } else { AcpiOsPrintf ( " \n " , ACPI_FORMAT_UINT64 ( SourceDesc -> Integer . Value ) ) ; } break ; case ACPI_TYPE_BUFFER : AcpiOsPrintf ( " \n " , ( UINT32 ) SourceDesc -> Buffer . Length ) ; AcpiUtDumpBuffer ( SourceDesc -> Buffer . Pointer , ( SourceDesc -> Buffer . Length < 256 ) ? SourceDesc -> Buffer . Length : 256 , DB_BYTE_DISPLAY , 0 ) ; break ; case ACPI_TYPE_STRING : AcpiOsPrintf ( " \" \" \n " , SourceDesc -> String . Pointer ) ; break ; case ACPI_TYPE_PACKAGE : AcpiOsPrintf ( " \n " , SourceDesc -> Package . Count ) ; for ( i = 0 ; i < SourceDesc -> Package . Count ; i ++ ) { AcpiExDoDebugObject ( SourceDesc -> Package . Elements [ i ] , Level + 4 , i + 1 ) ; } break ; case ACPI_TYPE_LOCAL_REFERENCE : AcpiOsPrintf ( " " , AcpiUtGetReferenceName ( SourceDesc ) ) ; switch ( SourceDesc -> Reference . Class ) { case ACPI_REFCLASS_INDEX : AcpiOsPrintf ( " \n " , SourceDesc -> Reference . Value ) ; break ; case ACPI_REFCLASS_TABLE : AcpiOsPrintf ( " \n " , SourceDesc -> Reference . Value ) ; return_VOID ; default : break ; } AcpiOsPrintf ( " " ) ; if ( SourceDesc -> Reference . Node ) { if ( ACPI_GET_DESCRIPTOR_TYPE ( SourceDesc -> Reference . Node ) != ACPI_DESC_TYPE_NAMED ) { AcpiOsPrintf ( " \n " , SourceDesc -> Reference . Node ) ; } else { AcpiOsPrintf ( " " , SourceDesc -> Reference . Node , ( SourceDesc -> Reference . Node ) -> Name . Ascii ) ; switch ( ( SourceDesc -> Reference . Node ) -> Type ) { case ACPI_TYPE_DEVICE : AcpiOsPrintf ( " \n " ) ; break ; case ACPI_TYPE_THERMAL : AcpiOsPrintf ( " \n " ) ; break ; default : AcpiExDoDebugObject ( ( SourceDesc -> Reference . Node ) -> Object , Level + 4 , 0 ) ; break ; } } } else if ( SourceDesc -> Reference . Object ) { if ( ACPI_GET_DESCRIPTOR_TYPE ( SourceDesc -> Reference . Object ) == ACPI_DESC_TYPE_NAMED ) { AcpiExDoDebugObject ( ACPI_CAST_PTR ( ACPI_OPERAND_OBJECT , SourceDesc -> Reference . Object ) , Level + 4 , 0 ) ; } else { ObjectDesc = SourceDesc -> Reference . Object ; Value = SourceDesc -> Reference . Value ; switch ( ObjectDesc -> Common . Type ) { case ACPI_TYPE_BUFFER : AcpiOsPrintf ( " \n " , Value , * SourceDesc -> Reference . IndexPointer ) ; break ; case ACPI_TYPE_STRING : AcpiOsPrintf ( " \" \" \n " , Value , * SourceDesc -> Reference . IndexPointer , * SourceDesc -> Reference . IndexPointer ) ; break ; case ACPI_TYPE_PACKAGE : AcpiOsPrintf ( " " , Value ) ; if ( ! ( * SourceDesc -> Reference . Where ) ) { AcpiOsPrintf ( " \n " ) ; } else { AcpiExDoDebugObject ( * SourceDesc -> Reference . Where , Level + 4 , 0 ) ; } break ; default : AcpiOsPrintf ( " \n " , ObjectDesc -> Common . Type ) ; break ; } } } break ; default : AcpiOsPrintf ( " \n " , SourceDesc ) ; break ; } ACPI_DEBUG_PRINT_RAW ( ( ACPI_DB_EXEC , " \n " ) ) ; return_VOID ; }
FUNCTION:    AcpiExDoDebugObject
 PARAMETERS:  SourceDesc          - Object to be output to "Debug Object"
              Level               - Indentation level (used for packages)
              Index               - Current package element, zero if not pkg
FUNCTION : AcpiExDoDebugObject PARAMETERS : SourceDesc - Object to be output to " Debug Object " Level - Indentation level ( used for packages ) Index - Current package element zero if not pkg
/* Output must be enabled via the DebugObject global or the DbgLevel */ /* Null string or newline -- don't emit the line header */ /*
     * Print line header as long as we are not in the middle of an
     * object display
     */ /*
             * We will emit the current timer value (in microseconds) with each
             * debug output. Only need the lower 26 bits. This allows for 67
             * million microseconds or 67 seconds before rollover.
             *
             * Convert 100 nanosecond units to microseconds
             */ /* Display the index for package output only */ /* No object type prefix needed for integers and strings */ /* SourceDesc is of type ACPI_DESC_TYPE_OPERAND */ /* Output correct integer width */ /* Output the entire contents of the package */ /* Decode the reference */ /* Case for DdbHandle */ /* Check for valid node first, then valid object */ /* These types have no attached object */ /* Reference object is a namespace node */