1 /******************************************************************************
   2  *
   3  * Module Name: utdebug - Debug print/trace routines
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, Intel Corp.
   9  * All rights reserved.
  10  *
  11  * Redistribution and use in source and binary forms, with or without
  12  * modification, are permitted provided that the following conditions
  13  * are met:
  14  * 1. Redistributions of source code must retain the above copyright
  15  *    notice, this list of conditions, and the following disclaimer,
  16  *    without modification.
  17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  18  *    substantially similar to the "NO WARRANTY" disclaimer below
  19  *    ("Disclaimer") and any redistribution must be conditioned upon
  20  *    including a substantially similar Disclaimer requirement for further
  21  *    binary redistribution.
  22  * 3. Neither the names of the above-listed copyright holders nor the names
  23  *    of any contributors may be used to endorse or promote products derived
  24  *    from this software without specific prior written permission.
  25  *
  26  * Alternatively, this software may be distributed under the terms of the
  27  * GNU General Public License ("GPL") version 2 as published by the Free
  28  * Software Foundation.
  29  *
  30  * NO WARRANTY
  31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  41  * POSSIBILITY OF SUCH DAMAGES.
  42  */
  43 
  44 #define __UTDEBUG_C__
  45 #define EXPORT_ACPI_INTERFACES
  46 
  47 #include "acpi.h"
  48 #include "accommon.h"
  49 
  50 #define _COMPONENT          ACPI_UTILITIES
  51         ACPI_MODULE_NAME    ("utdebug")
  52 
  53 
  54 #ifdef ACPI_DEBUG_OUTPUT
  55 
  56 static ACPI_THREAD_ID       AcpiGbl_PrevThreadId = (ACPI_THREAD_ID) 0xFFFFFFFF;
  57 static char                 *AcpiGbl_FnEntryStr = "----Entry";
  58 static char                 *AcpiGbl_FnExitStr  = "----Exit-";
  59 
  60 /* Local prototypes */
  61 
  62 static const char *
  63 AcpiUtTrimFunctionName (
  64     const char              *FunctionName);
  65 
  66 
  67 /*******************************************************************************
  68  *
  69  * FUNCTION:    AcpiUtInitStackPtrTrace
  70  *
  71  * PARAMETERS:  None
  72  *
  73  * RETURN:      None
  74  *
  75  * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
  76  *
  77  ******************************************************************************/
  78 
  79 void
  80 AcpiUtInitStackPtrTrace (
  81     void)
  82 {
  83     ACPI_SIZE               CurrentSp;
  84 
  85 
  86     AcpiGbl_EntryStackPointer = &CurrentSp;
  87 }
  88 
  89 
  90 /*******************************************************************************
  91  *
  92  * FUNCTION:    AcpiUtTrackStackPtr
  93  *
  94  * PARAMETERS:  None
  95  *
  96  * RETURN:      None
  97  *
  98  * DESCRIPTION: Save the current CPU stack pointer
  99  *
 100  ******************************************************************************/
 101 
 102 void
 103 AcpiUtTrackStackPtr (
 104     void)
 105 {
 106     ACPI_SIZE               CurrentSp;
 107 
 108 
 109     if (&CurrentSp < AcpiGbl_LowestStackPointer)
 110     {
 111         AcpiGbl_LowestStackPointer = &CurrentSp;
 112     }
 113 
 114     if (AcpiGbl_NestingLevel > AcpiGbl_DeepestNesting)
 115     {
 116         AcpiGbl_DeepestNesting = AcpiGbl_NestingLevel;
 117     }
 118 }
 119 
 120 
 121 /*******************************************************************************
 122  *
 123  * FUNCTION:    AcpiUtTrimFunctionName
 124  *
 125  * PARAMETERS:  FunctionName        - Ascii string containing a procedure name
 126  *
 127  * RETURN:      Updated pointer to the function name
 128  *
 129  * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
 130  *              This allows compiler macros such as __FUNCTION__ to be used
 131  *              with no change to the debug output.
 132  *
 133  ******************************************************************************/
 134 
 135 static const char *
 136 AcpiUtTrimFunctionName (
 137     const char              *FunctionName)
 138 {
 139 
 140     /* All Function names are longer than 4 chars, check is safe */
 141 
 142     if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_MIXED)
 143     {
 144         /* This is the case where the original source has not been modified */
 145 
 146         return (FunctionName + 4);
 147     }
 148 
 149     if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_LOWER)
 150     {
 151         /* This is the case where the source has been 'linuxized' */
 152 
 153         return (FunctionName + 5);
 154     }
 155 
 156     return (FunctionName);
 157 }
 158 
 159 
 160 /*******************************************************************************
 161  *
 162  * FUNCTION:    AcpiDebugPrint
 163  *
 164  * PARAMETERS:  RequestedDebugLevel - Requested debug print level
 165  *              LineNumber          - Caller's line number (for error output)
 166  *              FunctionName        - Caller's procedure name
 167  *              ModuleName          - Caller's module name
 168  *              ComponentId         - Caller's component ID
 169  *              Format              - Printf format field
 170  *              ...                 - Optional printf arguments
 171  *
 172  * RETURN:      None
 173  *
 174  * DESCRIPTION: Print error message with prefix consisting of the module name,
 175  *              line number, and component ID.
 176  *
 177  ******************************************************************************/
 178 
 179 void  ACPI_INTERNAL_VAR_XFACE
 180 AcpiDebugPrint (
 181     UINT32                  RequestedDebugLevel,
 182     UINT32                  LineNumber,
 183     const char              *FunctionName,
 184     const char              *ModuleName,
 185     UINT32                  ComponentId,
 186     const char              *Format,
 187     ...)
 188 {
 189     ACPI_THREAD_ID          ThreadId;
 190     va_list                 args;
 191 
 192 
 193     /* Check if debug output enabled */
 194 
 195     if (!ACPI_IS_DEBUG_ENABLED (RequestedDebugLevel, ComponentId))
 196     {
 197         return;
 198     }
 199 
 200     /*
 201      * Thread tracking and context switch notification
 202      */
 203     ThreadId = AcpiOsGetThreadId ();
 204     if (ThreadId != AcpiGbl_PrevThreadId)
 205     {
 206         if (ACPI_LV_THREADS & AcpiDbgLevel)
 207         {
 208             AcpiOsPrintf (
 209                 "\n**** Context Switch from TID %u to TID %u ****\n\n",
 210                 (UINT32) AcpiGbl_PrevThreadId, (UINT32) ThreadId);
 211         }
 212 
 213         AcpiGbl_PrevThreadId = ThreadId;
 214         AcpiGbl_NestingLevel = 0;
 215     }
 216 
 217     /*
 218      * Display the module name, current line number, thread ID (if requested),
 219      * current procedure nesting level, and the current procedure name
 220      */
 221     AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);
 222 
 223 #ifdef ACPI_APPLICATION
 224     /*
 225      * For AcpiExec/iASL only, emit the thread ID and nesting level.
 226      * Note: nesting level is really only useful during a single-thread
 227      * execution. Otherwise, multiple threads will keep resetting the
 228      * level.
 229      */
 230     if (ACPI_LV_THREADS & AcpiDbgLevel)
 231     {
 232         AcpiOsPrintf ("[%u] ", (UINT32) ThreadId);
 233     }
 234 
 235     AcpiOsPrintf ("[%02ld] ", AcpiGbl_NestingLevel);
 236 #endif
 237 
 238     AcpiOsPrintf ("%-22.22s: ", AcpiUtTrimFunctionName (FunctionName));
 239 
 240     va_start (args, Format);
 241     AcpiOsVprintf (Format, args);
 242     va_end (args);
 243 }
 244 
 245 ACPI_EXPORT_SYMBOL (AcpiDebugPrint)
 246 
 247 
 248 /*******************************************************************************
 249  *
 250  * FUNCTION:    AcpiDebugPrintRaw
 251  *
 252  * PARAMETERS:  RequestedDebugLevel - Requested debug print level
 253  *              LineNumber          - Caller's line number
 254  *              FunctionName        - Caller's procedure name
 255  *              ModuleName          - Caller's module name
 256  *              ComponentId         - Caller's component ID
 257  *              Format              - Printf format field
 258  *              ...                 - Optional printf arguments
 259  *
 260  * RETURN:      None
 261  *
 262  * DESCRIPTION: Print message with no headers. Has same interface as
 263  *              DebugPrint so that the same macros can be used.
 264  *
 265  ******************************************************************************/
 266 
 267 void  ACPI_INTERNAL_VAR_XFACE
 268 AcpiDebugPrintRaw (
 269     UINT32                  RequestedDebugLevel,
 270     UINT32                  LineNumber,
 271     const char              *FunctionName,
 272     const char              *ModuleName,
 273     UINT32                  ComponentId,
 274     const char              *Format,
 275     ...)
 276 {
 277     va_list                 args;
 278 
 279 
 280     /* Check if debug output enabled */
 281 
 282     if (!ACPI_IS_DEBUG_ENABLED (RequestedDebugLevel, ComponentId))
 283     {
 284         return;
 285     }
 286 
 287     va_start (args, Format);
 288     AcpiOsVprintf (Format, args);
 289     va_end (args);
 290 }
 291 
 292 ACPI_EXPORT_SYMBOL (AcpiDebugPrintRaw)
 293 
 294 
 295 /*******************************************************************************
 296  *
 297  * FUNCTION:    AcpiUtTrace
 298  *
 299  * PARAMETERS:  LineNumber          - Caller's line number
 300  *              FunctionName        - Caller's procedure name
 301  *              ModuleName          - Caller's module name
 302  *              ComponentId         - Caller's component ID
 303  *
 304  * RETURN:      None
 305  *
 306  * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
 307  *              set in DebugLevel
 308  *
 309  ******************************************************************************/
 310 
 311 void
 312 AcpiUtTrace (
 313     UINT32                  LineNumber,
 314     const char              *FunctionName,
 315     const char              *ModuleName,
 316     UINT32                  ComponentId)
 317 {
 318 
 319     AcpiGbl_NestingLevel++;
 320     AcpiUtTrackStackPtr ();
 321 
 322     /* Check if enabled up-front for performance */
 323 
 324     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 325     {
 326         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 327             LineNumber, FunctionName, ModuleName, ComponentId,
 328             "%s\n", AcpiGbl_FnEntryStr);
 329     }
 330 }
 331 
 332 ACPI_EXPORT_SYMBOL (AcpiUtTrace)
 333 
 334 
 335 /*******************************************************************************
 336  *
 337  * FUNCTION:    AcpiUtTracePtr
 338  *
 339  * PARAMETERS:  LineNumber          - Caller's line number
 340  *              FunctionName        - Caller's procedure name
 341  *              ModuleName          - Caller's module name
 342  *              ComponentId         - Caller's component ID
 343  *              Pointer             - Pointer to display
 344  *
 345  * RETURN:      None
 346  *
 347  * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
 348  *              set in DebugLevel
 349  *
 350  ******************************************************************************/
 351 
 352 void
 353 AcpiUtTracePtr (
 354     UINT32                  LineNumber,
 355     const char              *FunctionName,
 356     const char              *ModuleName,
 357     UINT32                  ComponentId,
 358     void                    *Pointer)
 359 {
 360 
 361     AcpiGbl_NestingLevel++;
 362     AcpiUtTrackStackPtr ();
 363 
 364     /* Check if enabled up-front for performance */
 365 
 366     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 367     {
 368         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 369             LineNumber, FunctionName, ModuleName, ComponentId,
 370             "%s %p\n", AcpiGbl_FnEntryStr, Pointer);
 371     }
 372 }
 373 
 374 
 375 /*******************************************************************************
 376  *
 377  * FUNCTION:    AcpiUtTraceStr
 378  *
 379  * PARAMETERS:  LineNumber          - Caller's line number
 380  *              FunctionName        - Caller's procedure name
 381  *              ModuleName          - Caller's module name
 382  *              ComponentId         - Caller's component ID
 383  *              String              - Additional string to display
 384  *
 385  * RETURN:      None
 386  *
 387  * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
 388  *              set in DebugLevel
 389  *
 390  ******************************************************************************/
 391 
 392 void
 393 AcpiUtTraceStr (
 394     UINT32                  LineNumber,
 395     const char              *FunctionName,
 396     const char              *ModuleName,
 397     UINT32                  ComponentId,
 398     char                    *String)
 399 {
 400 
 401     AcpiGbl_NestingLevel++;
 402     AcpiUtTrackStackPtr ();
 403 
 404     /* Check if enabled up-front for performance */
 405 
 406     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 407     {
 408         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 409             LineNumber, FunctionName, ModuleName, ComponentId,
 410             "%s %s\n", AcpiGbl_FnEntryStr, String);
 411     }
 412 }
 413 
 414 
 415 /*******************************************************************************
 416  *
 417  * FUNCTION:    AcpiUtTraceU32
 418  *
 419  * PARAMETERS:  LineNumber          - Caller's line number
 420  *              FunctionName        - Caller's procedure name
 421  *              ModuleName          - Caller's module name
 422  *              ComponentId         - Caller's component ID
 423  *              Integer             - Integer to display
 424  *
 425  * RETURN:      None
 426  *
 427  * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
 428  *              set in DebugLevel
 429  *
 430  ******************************************************************************/
 431 
 432 void
 433 AcpiUtTraceU32 (
 434     UINT32                  LineNumber,
 435     const char              *FunctionName,
 436     const char              *ModuleName,
 437     UINT32                  ComponentId,
 438     UINT32                  Integer)
 439 {
 440 
 441     AcpiGbl_NestingLevel++;
 442     AcpiUtTrackStackPtr ();
 443 
 444     /* Check if enabled up-front for performance */
 445 
 446     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 447     {
 448         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 449             LineNumber, FunctionName, ModuleName, ComponentId,
 450             "%s %08X\n", AcpiGbl_FnEntryStr, Integer);
 451     }
 452 }
 453 
 454 
 455 /*******************************************************************************
 456  *
 457  * FUNCTION:    AcpiUtExit
 458  *
 459  * PARAMETERS:  LineNumber          - Caller's line number
 460  *              FunctionName        - Caller's procedure name
 461  *              ModuleName          - Caller's module name
 462  *              ComponentId         - Caller's component ID
 463  *
 464  * RETURN:      None
 465  *
 466  * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
 467  *              set in DebugLevel
 468  *
 469  ******************************************************************************/
 470 
 471 void
 472 AcpiUtExit (
 473     UINT32                  LineNumber,
 474     const char              *FunctionName,
 475     const char              *ModuleName,
 476     UINT32                  ComponentId)
 477 {
 478 
 479     /* Check if enabled up-front for performance */
 480 
 481     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 482     {
 483         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 484             LineNumber, FunctionName, ModuleName, ComponentId,
 485             "%s\n", AcpiGbl_FnExitStr);
 486     }
 487 
 488     if (AcpiGbl_NestingLevel)
 489     {
 490         AcpiGbl_NestingLevel--;
 491     }
 492 }
 493 
 494 ACPI_EXPORT_SYMBOL (AcpiUtExit)
 495 
 496 
 497 /*******************************************************************************
 498  *
 499  * FUNCTION:    AcpiUtStatusExit
 500  *
 501  * PARAMETERS:  LineNumber          - Caller's line number
 502  *              FunctionName        - Caller's procedure name
 503  *              ModuleName          - Caller's module name
 504  *              ComponentId         - Caller's component ID
 505  *              Status              - Exit status code
 506  *
 507  * RETURN:      None
 508  *
 509  * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
 510  *              set in DebugLevel. Prints exit status also.
 511  *
 512  ******************************************************************************/
 513 
 514 void
 515 AcpiUtStatusExit (
 516     UINT32                  LineNumber,
 517     const char              *FunctionName,
 518     const char              *ModuleName,
 519     UINT32                  ComponentId,
 520     ACPI_STATUS             Status)
 521 {
 522 
 523     /* Check if enabled up-front for performance */
 524 
 525     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 526     {
 527         if (ACPI_SUCCESS (Status))
 528         {
 529             AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 530                 LineNumber, FunctionName, ModuleName, ComponentId,
 531                 "%s %s\n", AcpiGbl_FnExitStr,
 532                 AcpiFormatException (Status));
 533         }
 534         else
 535         {
 536             AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 537                 LineNumber, FunctionName, ModuleName, ComponentId,
 538                 "%s ****Exception****: %s\n", AcpiGbl_FnExitStr,
 539                 AcpiFormatException (Status));
 540         }
 541     }
 542 
 543     if (AcpiGbl_NestingLevel)
 544     {
 545         AcpiGbl_NestingLevel--;
 546     }
 547 }
 548 
 549 ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
 550 
 551 
 552 /*******************************************************************************
 553  *
 554  * FUNCTION:    AcpiUtValueExit
 555  *
 556  * PARAMETERS:  LineNumber          - Caller's line number
 557  *              FunctionName        - Caller's procedure name
 558  *              ModuleName          - Caller's module name
 559  *              ComponentId         - Caller's component ID
 560  *              Value               - Value to be printed with exit msg
 561  *
 562  * RETURN:      None
 563  *
 564  * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
 565  *              set in DebugLevel. Prints exit value also.
 566  *
 567  ******************************************************************************/
 568 
 569 void
 570 AcpiUtValueExit (
 571     UINT32                  LineNumber,
 572     const char              *FunctionName,
 573     const char              *ModuleName,
 574     UINT32                  ComponentId,
 575     UINT64                  Value)
 576 {
 577 
 578     /* Check if enabled up-front for performance */
 579 
 580     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 581     {
 582         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 583             LineNumber, FunctionName, ModuleName, ComponentId,
 584             "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr,
 585             ACPI_FORMAT_UINT64 (Value));
 586     }
 587 
 588     if (AcpiGbl_NestingLevel)
 589     {
 590         AcpiGbl_NestingLevel--;
 591     }
 592 }
 593 
 594 ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
 595 
 596 
 597 /*******************************************************************************
 598  *
 599  * FUNCTION:    AcpiUtPtrExit
 600  *
 601  * PARAMETERS:  LineNumber          - Caller's line number
 602  *              FunctionName        - Caller's procedure name
 603  *              ModuleName          - Caller's module name
 604  *              ComponentId         - Caller's component ID
 605  *              Ptr                 - Pointer to display
 606  *
 607  * RETURN:      None
 608  *
 609  * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
 610  *              set in DebugLevel. Prints exit value also.
 611  *
 612  ******************************************************************************/
 613 
 614 void
 615 AcpiUtPtrExit (
 616     UINT32                  LineNumber,
 617     const char              *FunctionName,
 618     const char              *ModuleName,
 619     UINT32                  ComponentId,
 620     UINT8                   *Ptr)
 621 {
 622 
 623     /* Check if enabled up-front for performance */
 624 
 625     if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
 626     {
 627         AcpiDebugPrint (ACPI_LV_FUNCTIONS,
 628             LineNumber, FunctionName, ModuleName, ComponentId,
 629             "%s %p\n", AcpiGbl_FnExitStr, Ptr);
 630     }
 631 
 632     if (AcpiGbl_NestingLevel)
 633     {
 634         AcpiGbl_NestingLevel--;
 635     }
 636 }
 637 
 638 #endif