1 /****************************************************************************** 2 * 3 * Module Name: utdebug - Debug print routines 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2011, 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 46 #include "acpi.h" 47 #include "accommon.h" 48 49 #define _COMPONENT ACPI_UTILITIES 50 ACPI_MODULE_NAME ("utdebug") 51 52 53 #ifdef ACPI_DEBUG_OUTPUT 54 55 static ACPI_THREAD_ID AcpiGbl_PrevThreadId = (ACPI_THREAD_ID) 0xFFFFFFFF; 56 static char *AcpiGbl_FnEntryStr = "----Entry"; 57 static char *AcpiGbl_FnExitStr = "----Exit-"; 58 59 /* Local prototypes */ 60 61 static const char * 62 AcpiUtTrimFunctionName ( 63 const char *FunctionName); 64 65 66 /******************************************************************************* 67 * 68 * FUNCTION: AcpiUtInitStackPtrTrace 69 * 70 * PARAMETERS: None 71 * 72 * RETURN: None 73 * 74 * DESCRIPTION: Save the current CPU stack pointer at subsystem startup 75 * 76 ******************************************************************************/ 77 78 void 79 AcpiUtInitStackPtrTrace ( 80 void) 81 { 82 ACPI_SIZE CurrentSp; 83 84 85 AcpiGbl_EntryStackPointer = &CurrentSp; 86 } 87 88 89 /******************************************************************************* 90 * 91 * FUNCTION: AcpiUtTrackStackPtr 92 * 93 * PARAMETERS: None 94 * 95 * RETURN: None 96 * 97 * DESCRIPTION: Save the current CPU stack pointer 98 * 99 ******************************************************************************/ 100 101 void 102 AcpiUtTrackStackPtr ( 103 void) 104 { 105 ACPI_SIZE CurrentSp; 106 107 108 if (&CurrentSp < AcpiGbl_LowestStackPointer) 109 { 110 AcpiGbl_LowestStackPointer = &CurrentSp; 111 } 112 113 if (AcpiGbl_NestingLevel > AcpiGbl_DeepestNesting) 114 { 115 AcpiGbl_DeepestNesting = AcpiGbl_NestingLevel; 116 } 117 } 118 119 120 /******************************************************************************* 121 * 122 * FUNCTION: AcpiUtTrimFunctionName 123 * 124 * PARAMETERS: FunctionName - Ascii string containing a procedure name 125 * 126 * RETURN: Updated pointer to the function name 127 * 128 * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present. 129 * This allows compiler macros such as __FUNCTION__ to be used 130 * with no change to the debug output. 131 * 132 ******************************************************************************/ 133 134 static const char * 135 AcpiUtTrimFunctionName ( 136 const char *FunctionName) 137 { 138 139 /* All Function names are longer than 4 chars, check is safe */ 140 141 if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_MIXED) 142 { 143 /* This is the case where the original source has not been modified */ 144 145 return (FunctionName + 4); 146 } 147 148 if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_LOWER) 149 { 150 /* This is the case where the source has been 'linuxized' */ 151 152 return (FunctionName + 5); 153 } 154 155 return (FunctionName); 156 } 157 158 159 /******************************************************************************* 160 * 161 * FUNCTION: AcpiDebugPrint 162 * 163 * PARAMETERS: RequestedDebugLevel - Requested debug print level 164 * LineNumber - Caller's line number (for error output) 165 * FunctionName - Caller's procedure name 166 * ModuleName - Caller's module name 167 * ComponentId - Caller's component ID 168 * Format - Printf format field 169 * ... - Optional printf arguments 170 * 171 * RETURN: None 172 * 173 * DESCRIPTION: Print error message with prefix consisting of the module name, 174 * line number, and component ID. 175 * 176 ******************************************************************************/ 177 178 void ACPI_INTERNAL_VAR_XFACE 179 AcpiDebugPrint ( 180 UINT32 RequestedDebugLevel, 181 UINT32 LineNumber, 182 const char *FunctionName, 183 const char *ModuleName, 184 UINT32 ComponentId, 185 const char *Format, 186 ...) 187 { 188 ACPI_THREAD_ID ThreadId; 189 va_list args; 190 191 192 /* 193 * Stay silent if the debug level or component ID is disabled 194 */ 195 if (!(RequestedDebugLevel & AcpiDbgLevel) || 196 !(ComponentId & AcpiDbgLayer)) 197 { 198 return; 199 } 200 201 /* 202 * Thread tracking and context switch notification 203 */ 204 ThreadId = AcpiOsGetThreadId (); 205 if (ThreadId != AcpiGbl_PrevThreadId) 206 { 207 if (ACPI_LV_THREADS & AcpiDbgLevel) 208 { 209 AcpiOsPrintf ( 210 "\n**** Context Switch from TID %u to TID %u ****\n\n", 211 (UINT32) AcpiGbl_PrevThreadId, (UINT32) ThreadId); 212 } 213 214 AcpiGbl_PrevThreadId = ThreadId; 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 ("%8s-%04ld ", ModuleName, LineNumber); 222 223 if (ACPI_LV_THREADS & AcpiDbgLevel) 224 { 225 AcpiOsPrintf ("[%u] ", (UINT32) ThreadId); 226 } 227 228 AcpiOsPrintf ("[%02ld] %-22.22s: ", 229 AcpiGbl_NestingLevel, AcpiUtTrimFunctionName (FunctionName)); 230 231 va_start (args, Format); 232 AcpiOsVprintf (Format, args); 233 va_end (args); 234 } 235 236 ACPI_EXPORT_SYMBOL (AcpiDebugPrint) 237 238 239 /******************************************************************************* 240 * 241 * FUNCTION: AcpiDebugPrintRaw 242 * 243 * PARAMETERS: RequestedDebugLevel - Requested debug print level 244 * LineNumber - Caller's line number 245 * FunctionName - Caller's procedure name 246 * ModuleName - Caller's module name 247 * ComponentId - Caller's component ID 248 * Format - Printf format field 249 * ... - Optional printf arguments 250 * 251 * RETURN: None 252 * 253 * DESCRIPTION: Print message with no headers. Has same interface as 254 * DebugPrint so that the same macros can be used. 255 * 256 ******************************************************************************/ 257 258 void ACPI_INTERNAL_VAR_XFACE 259 AcpiDebugPrintRaw ( 260 UINT32 RequestedDebugLevel, 261 UINT32 LineNumber, 262 const char *FunctionName, 263 const char *ModuleName, 264 UINT32 ComponentId, 265 const char *Format, 266 ...) 267 { 268 va_list args; 269 270 271 if (!(RequestedDebugLevel & AcpiDbgLevel) || 272 !(ComponentId & AcpiDbgLayer)) 273 { 274 return; 275 } 276 277 va_start (args, Format); 278 AcpiOsVprintf (Format, args); 279 va_end (args); 280 } 281 282 ACPI_EXPORT_SYMBOL (AcpiDebugPrintRaw) 283 284 285 /******************************************************************************* 286 * 287 * FUNCTION: AcpiUtTrace 288 * 289 * PARAMETERS: LineNumber - Caller's line number 290 * FunctionName - Caller's procedure name 291 * ModuleName - Caller's module name 292 * ComponentId - Caller's component ID 293 * 294 * RETURN: None 295 * 296 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 297 * set in DebugLevel 298 * 299 ******************************************************************************/ 300 301 void 302 AcpiUtTrace ( 303 UINT32 LineNumber, 304 const char *FunctionName, 305 const char *ModuleName, 306 UINT32 ComponentId) 307 { 308 309 AcpiGbl_NestingLevel++; 310 AcpiUtTrackStackPtr (); 311 312 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 313 LineNumber, FunctionName, ModuleName, ComponentId, 314 "%s\n", AcpiGbl_FnEntryStr); 315 } 316 317 ACPI_EXPORT_SYMBOL (AcpiUtTrace) 318 319 320 /******************************************************************************* 321 * 322 * FUNCTION: AcpiUtTracePtr 323 * 324 * PARAMETERS: LineNumber - Caller's line number 325 * FunctionName - Caller's procedure name 326 * ModuleName - Caller's module name 327 * ComponentId - Caller's component ID 328 * Pointer - Pointer to display 329 * 330 * RETURN: None 331 * 332 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 333 * set in DebugLevel 334 * 335 ******************************************************************************/ 336 337 void 338 AcpiUtTracePtr ( 339 UINT32 LineNumber, 340 const char *FunctionName, 341 const char *ModuleName, 342 UINT32 ComponentId, 343 void *Pointer) 344 { 345 AcpiGbl_NestingLevel++; 346 AcpiUtTrackStackPtr (); 347 348 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 349 LineNumber, FunctionName, ModuleName, ComponentId, 350 "%s %p\n", AcpiGbl_FnEntryStr, Pointer); 351 } 352 353 354 /******************************************************************************* 355 * 356 * FUNCTION: AcpiUtTraceStr 357 * 358 * PARAMETERS: LineNumber - Caller's line number 359 * FunctionName - Caller's procedure name 360 * ModuleName - Caller's module name 361 * ComponentId - Caller's component ID 362 * String - Additional string to display 363 * 364 * RETURN: None 365 * 366 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 367 * set in DebugLevel 368 * 369 ******************************************************************************/ 370 371 void 372 AcpiUtTraceStr ( 373 UINT32 LineNumber, 374 const char *FunctionName, 375 const char *ModuleName, 376 UINT32 ComponentId, 377 char *String) 378 { 379 380 AcpiGbl_NestingLevel++; 381 AcpiUtTrackStackPtr (); 382 383 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 384 LineNumber, FunctionName, ModuleName, ComponentId, 385 "%s %s\n", AcpiGbl_FnEntryStr, String); 386 } 387 388 389 /******************************************************************************* 390 * 391 * FUNCTION: AcpiUtTraceU32 392 * 393 * PARAMETERS: LineNumber - Caller's line number 394 * FunctionName - Caller's procedure name 395 * ModuleName - Caller's module name 396 * ComponentId - Caller's component ID 397 * Integer - Integer to display 398 * 399 * RETURN: None 400 * 401 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is 402 * set in DebugLevel 403 * 404 ******************************************************************************/ 405 406 void 407 AcpiUtTraceU32 ( 408 UINT32 LineNumber, 409 const char *FunctionName, 410 const char *ModuleName, 411 UINT32 ComponentId, 412 UINT32 Integer) 413 { 414 415 AcpiGbl_NestingLevel++; 416 AcpiUtTrackStackPtr (); 417 418 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 419 LineNumber, FunctionName, ModuleName, ComponentId, 420 "%s %08X\n", AcpiGbl_FnEntryStr, Integer); 421 } 422 423 424 /******************************************************************************* 425 * 426 * FUNCTION: AcpiUtExit 427 * 428 * PARAMETERS: LineNumber - Caller's line number 429 * FunctionName - Caller's procedure name 430 * ModuleName - Caller's module name 431 * ComponentId - Caller's component ID 432 * 433 * RETURN: None 434 * 435 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 436 * set in DebugLevel 437 * 438 ******************************************************************************/ 439 440 void 441 AcpiUtExit ( 442 UINT32 LineNumber, 443 const char *FunctionName, 444 const char *ModuleName, 445 UINT32 ComponentId) 446 { 447 448 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 449 LineNumber, FunctionName, ModuleName, ComponentId, 450 "%s\n", AcpiGbl_FnExitStr); 451 452 AcpiGbl_NestingLevel--; 453 } 454 455 ACPI_EXPORT_SYMBOL (AcpiUtExit) 456 457 458 /******************************************************************************* 459 * 460 * FUNCTION: AcpiUtStatusExit 461 * 462 * PARAMETERS: LineNumber - Caller's line number 463 * FunctionName - Caller's procedure name 464 * ModuleName - Caller's module name 465 * ComponentId - Caller's component ID 466 * Status - Exit status code 467 * 468 * RETURN: None 469 * 470 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 471 * set in DebugLevel. Prints exit status also. 472 * 473 ******************************************************************************/ 474 475 void 476 AcpiUtStatusExit ( 477 UINT32 LineNumber, 478 const char *FunctionName, 479 const char *ModuleName, 480 UINT32 ComponentId, 481 ACPI_STATUS Status) 482 { 483 484 if (ACPI_SUCCESS (Status)) 485 { 486 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 487 LineNumber, FunctionName, ModuleName, ComponentId, 488 "%s %s\n", AcpiGbl_FnExitStr, 489 AcpiFormatException (Status)); 490 } 491 else 492 { 493 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 494 LineNumber, FunctionName, ModuleName, ComponentId, 495 "%s ****Exception****: %s\n", AcpiGbl_FnExitStr, 496 AcpiFormatException (Status)); 497 } 498 499 AcpiGbl_NestingLevel--; 500 } 501 502 ACPI_EXPORT_SYMBOL (AcpiUtStatusExit) 503 504 505 /******************************************************************************* 506 * 507 * FUNCTION: AcpiUtValueExit 508 * 509 * PARAMETERS: LineNumber - Caller's line number 510 * FunctionName - Caller's procedure name 511 * ModuleName - Caller's module name 512 * ComponentId - Caller's component ID 513 * Value - Value to be printed with exit msg 514 * 515 * RETURN: None 516 * 517 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 518 * set in DebugLevel. Prints exit value also. 519 * 520 ******************************************************************************/ 521 522 void 523 AcpiUtValueExit ( 524 UINT32 LineNumber, 525 const char *FunctionName, 526 const char *ModuleName, 527 UINT32 ComponentId, 528 UINT64 Value) 529 { 530 531 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 532 LineNumber, FunctionName, ModuleName, ComponentId, 533 "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr, 534 ACPI_FORMAT_UINT64 (Value)); 535 536 AcpiGbl_NestingLevel--; 537 } 538 539 ACPI_EXPORT_SYMBOL (AcpiUtValueExit) 540 541 542 /******************************************************************************* 543 * 544 * FUNCTION: AcpiUtPtrExit 545 * 546 * PARAMETERS: LineNumber - Caller's line number 547 * FunctionName - Caller's procedure name 548 * ModuleName - Caller's module name 549 * ComponentId - Caller's component ID 550 * Ptr - Pointer to display 551 * 552 * RETURN: None 553 * 554 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is 555 * set in DebugLevel. Prints exit value also. 556 * 557 ******************************************************************************/ 558 559 void 560 AcpiUtPtrExit ( 561 UINT32 LineNumber, 562 const char *FunctionName, 563 const char *ModuleName, 564 UINT32 ComponentId, 565 UINT8 *Ptr) 566 { 567 568 AcpiDebugPrint (ACPI_LV_FUNCTIONS, 569 LineNumber, FunctionName, ModuleName, ComponentId, 570 "%s %p\n", AcpiGbl_FnExitStr, Ptr); 571 572 AcpiGbl_NestingLevel--; 573 } 574 575 #endif 576 577 578 /******************************************************************************* 579 * 580 * FUNCTION: AcpiUtDumpBuffer 581 * 582 * PARAMETERS: Buffer - Buffer to dump 583 * Count - Amount to dump, in bytes 584 * Display - BYTE, WORD, DWORD, or QWORD display 585 * ComponentID - Caller's component ID 586 * 587 * RETURN: None 588 * 589 * DESCRIPTION: Generic dump buffer in both hex and ascii. 590 * 591 ******************************************************************************/ 592 593 void 594 AcpiUtDumpBuffer2 ( 595 UINT8 *Buffer, 596 UINT32 Count, 597 UINT32 Display) 598 { 599 UINT32 i = 0; 600 UINT32 j; 601 UINT32 Temp32; 602 UINT8 BufChar; 603 604 605 if (!Buffer) 606 { 607 AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n"); 608 return; 609 } 610 611 if ((Count < 4) || (Count & 0x01)) 612 { 613 Display = DB_BYTE_DISPLAY; 614 } 615 616 /* Nasty little dump buffer routine! */ 617 618 while (i < Count) 619 { 620 /* Print current offset */ 621 622 AcpiOsPrintf ("%6.4X: ", i); 623 624 /* Print 16 hex chars */ 625 626 for (j = 0; j < 16;) 627 { 628 if (i + j >= Count) 629 { 630 /* Dump fill spaces */ 631 632 AcpiOsPrintf ("%*s", ((Display * 2) + 1), " "); 633 j += Display; 634 continue; 635 } 636 637 switch (Display) 638 { 639 case DB_BYTE_DISPLAY: 640 default: /* Default is BYTE display */ 641 642 AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]); 643 break; 644 645 646 case DB_WORD_DISPLAY: 647 648 ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 649 AcpiOsPrintf ("%04X ", Temp32); 650 break; 651 652 653 case DB_DWORD_DISPLAY: 654 655 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 656 AcpiOsPrintf ("%08X ", Temp32); 657 break; 658 659 660 case DB_QWORD_DISPLAY: 661 662 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 663 AcpiOsPrintf ("%08X", Temp32); 664 665 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 666 AcpiOsPrintf ("%08X ", Temp32); 667 break; 668 } 669 670 j += Display; 671 } 672 673 /* 674 * Print the ASCII equivalent characters but watch out for the bad 675 * unprintable ones (printable chars are 0x20 through 0x7E) 676 */ 677 AcpiOsPrintf (" "); 678 for (j = 0; j < 16; j++) 679 { 680 if (i + j >= Count) 681 { 682 AcpiOsPrintf ("\n"); 683 return; 684 } 685 686 BufChar = Buffer[(ACPI_SIZE) i + j]; 687 if (ACPI_IS_PRINT (BufChar)) 688 { 689 AcpiOsPrintf ("%c", BufChar); 690 } 691 else 692 { 693 AcpiOsPrintf ("."); 694 } 695 } 696 697 /* Done with that line. */ 698 699 AcpiOsPrintf ("\n"); 700 i += 16; 701 } 702 703 return; 704 } 705 706 707 /******************************************************************************* 708 * 709 * FUNCTION: AcpiUtDumpBuffer 710 * 711 * PARAMETERS: Buffer - Buffer to dump 712 * Count - Amount to dump, in bytes 713 * Display - BYTE, WORD, DWORD, or QWORD display 714 * ComponentID - Caller's component ID 715 * 716 * RETURN: None 717 * 718 * DESCRIPTION: Generic dump buffer in both hex and ascii. 719 * 720 ******************************************************************************/ 721 722 void 723 AcpiUtDumpBuffer ( 724 UINT8 *Buffer, 725 UINT32 Count, 726 UINT32 Display, 727 UINT32 ComponentId) 728 { 729 730 /* Only dump the buffer if tracing is enabled */ 731 732 if (!((ACPI_LV_TABLES & AcpiDbgLevel) && 733 (ComponentId & AcpiDbgLayer))) 734 { 735 return; 736 } 737 738 AcpiUtDumpBuffer2 (Buffer, Count, Display); 739 } 740 741