190075Sobrien/****************************************************************************** 2169689Skan * 3169689Skan * Module Name: utbuffer - Buffer dump routines 490075Sobrien * 590075Sobrien *****************************************************************************/ 690075Sobrien 790075Sobrien/* 890075Sobrien * Copyright (C) 2000 - 2015, Intel Corp. 990075Sobrien * All rights reserved. 1090075Sobrien * 1190075Sobrien * Redistribution and use in source and binary forms, with or without 1290075Sobrien * modification, are permitted provided that the following conditions 1390075Sobrien * are met: 1490075Sobrien * 1. Redistributions of source code must retain the above copyright 1590075Sobrien * notice, this list of conditions, and the following disclaimer, 1690075Sobrien * without modification. 17169689Skan * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1890075Sobrien * substantially similar to the "NO WARRANTY" disclaimer below 1990075Sobrien * ("Disclaimer") and any redistribution must be conditioned upon 2090075Sobrien * including a substantially similar Disclaimer requirement for further 2190075Sobrien * binary redistribution. 2290075Sobrien * 3. Neither the names of the above-listed copyright holders nor the names 2390075Sobrien * of any contributors may be used to endorse or promote products derived 2490075Sobrien * from this software without specific prior written permission. 2590075Sobrien * 2690075Sobrien * Alternatively, this software may be distributed under the terms of the 2790075Sobrien * GNU General Public License ("GPL") version 2 as published by the Free 2890075Sobrien * Software Foundation. 2990075Sobrien * 3090075Sobrien * NO WARRANTY 3190075Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3290075Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3390075Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34169689Skan * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3590075Sobrien * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36169689Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37169689Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3890075Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39169689Skan * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40169689Skan * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4190075Sobrien * POSSIBILITY OF SUCH DAMAGES. 4290075Sobrien */ 4390075Sobrien 4490075Sobrien#include <contrib/dev/acpica/include/acpi.h> 4590075Sobrien#include <contrib/dev/acpica/include/accommon.h> 4690075Sobrien 4790075Sobrien#define _COMPONENT ACPI_UTILITIES 4890075Sobrien ACPI_MODULE_NAME ("utbuffer") 49132718Skan 5090075Sobrien 5190075Sobrien/******************************************************************************* 5290075Sobrien * 5390075Sobrien * FUNCTION: AcpiUtDumpBuffer 5490075Sobrien * 5590075Sobrien * PARAMETERS: Buffer - Buffer to dump 5690075Sobrien * Count - Amount to dump, in bytes 5790075Sobrien * Display - BYTE, WORD, DWORD, or QWORD display: 5890075Sobrien * DB_BYTE_DISPLAY 59132718Skan * DB_WORD_DISPLAY 6090075Sobrien * DB_DWORD_DISPLAY 6190075Sobrien * DB_QWORD_DISPLAY 6290075Sobrien * BaseOffset - Beginning buffer offset (display only) 63117395Skan * 64117395Skan * RETURN: None 65117395Skan * 66169689Skan * DESCRIPTION: Generic dump buffer in both hex and ascii. 67169689Skan * 68169689Skan ******************************************************************************/ 69169689Skan 70169689Skanvoid 71169689SkanAcpiUtDumpBuffer ( 72169689Skan UINT8 *Buffer, 73169689Skan UINT32 Count, 74169689Skan UINT32 Display, 75169689Skan UINT32 BaseOffset) 76169689Skan{ 77169689Skan UINT32 i = 0; 78169689Skan UINT32 j; 79132718Skan UINT32 Temp32; 80132718Skan UINT8 BufChar; 81132718Skan 82117395Skan 83169689Skan if (!Buffer) 84169689Skan { 85169689Skan AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n"); 86169689Skan return; 87117395Skan } 88117395Skan 89117395Skan if ((Count < 4) || (Count & 0x01)) 90117395Skan { 9190075Sobrien Display = DB_BYTE_DISPLAY; 9290075Sobrien } 9390075Sobrien 9490075Sobrien /* Nasty little dump buffer routine! */ 9590075Sobrien 96169689Skan while (i < Count) 97169689Skan { 98169689Skan /* Print current offset */ 99169689Skan 100117395Skan AcpiOsPrintf ("%6.4X: ", (BaseOffset + i)); 101117395Skan 102117395Skan /* Print 16 hex chars */ 103117395Skan 104117395Skan for (j = 0; j < 16;) 105117395Skan { 106117395Skan if (i + j >= Count) 107117395Skan { 108169689Skan /* Dump fill spaces */ 109169689Skan 110169689Skan AcpiOsPrintf ("%*s", ((Display * 2) + 1), " "); 111169689Skan j += Display; 112117395Skan continue; 113117395Skan } 114117395Skan 115117395Skan switch (Display) 11690075Sobrien { 11790075Sobrien case DB_BYTE_DISPLAY: 11890075Sobrien default: /* Default is BYTE display */ 11990075Sobrien 12090075Sobrien AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]); 12190075Sobrien break; 12290075Sobrien 12390075Sobrien case DB_WORD_DISPLAY: 12490075Sobrien 12590075Sobrien ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 12690075Sobrien AcpiOsPrintf ("%04X ", Temp32); 12790075Sobrien break; 12890075Sobrien 12990075Sobrien case DB_DWORD_DISPLAY: 13090075Sobrien 13190075Sobrien ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 13290075Sobrien AcpiOsPrintf ("%08X ", Temp32); 13390075Sobrien break; 13490075Sobrien 13590075Sobrien case DB_QWORD_DISPLAY: 13690075Sobrien 13790075Sobrien ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 13890075Sobrien AcpiOsPrintf ("%08X", Temp32); 13990075Sobrien 140117395Skan ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 141117395Skan AcpiOsPrintf ("%08X ", Temp32); 142117395Skan break; 143169689Skan } 144169689Skan 145169689Skan j += Display; 146169689Skan } 147169689Skan 148169689Skan /* 149169689Skan * Print the ASCII equivalent characters but watch out for the bad 150169689Skan * unprintable ones (printable chars are 0x20 through 0x7E) 15190075Sobrien */ 15290075Sobrien AcpiOsPrintf (" "); 153169689Skan for (j = 0; j < 16; j++) 154169689Skan { 155169689Skan if (i + j >= Count) 156169689Skan { 157169689Skan AcpiOsPrintf ("\n"); 158169689Skan return; 159169689Skan } 160169689Skan 16190075Sobrien /* 16290075Sobrien * Add comment characters so rest of line is ignored when 16390075Sobrien * compiled 16490075Sobrien */ 16590075Sobrien if (j == 0) 16690075Sobrien { 16790075Sobrien AcpiOsPrintf ("// "); 168169689Skan } 169169689Skan 170169689Skan BufChar = Buffer[(ACPI_SIZE) i + j]; 171169689Skan if (ACPI_IS_PRINT (BufChar)) 172169689Skan { 173169689Skan AcpiOsPrintf ("%c", BufChar); 174169689Skan } 175169689Skan else 176117395Skan { 177117395Skan AcpiOsPrintf ("."); 178117395Skan } 179117395Skan } 180117395Skan 181117395Skan /* Done with that line. */ 182117395Skan 183117395Skan AcpiOsPrintf ("\n"); 184117395Skan i += 16; 185117395Skan } 186117395Skan 187117395Skan return; 188117395Skan} 189117395Skan 190117395Skan 191117395Skan/******************************************************************************* 192132718Skan * 193132718Skan * FUNCTION: AcpiUtDebugDumpBuffer 194132718Skan * 195132718Skan * PARAMETERS: Buffer - Buffer to dump 196132718Skan * Count - Amount to dump, in bytes 197132718Skan * Display - BYTE, WORD, DWORD, or QWORD display: 198132718Skan * DB_BYTE_DISPLAY 199132718Skan * DB_WORD_DISPLAY 200132718Skan * DB_DWORD_DISPLAY 201132718Skan * DB_QWORD_DISPLAY 202169689Skan * ComponentID - Caller's component ID 203169689Skan * 204169689Skan * RETURN: None 205169689Skan * 206132718Skan * DESCRIPTION: Generic dump buffer in both hex and ascii. 207132718Skan * 208132718Skan ******************************************************************************/ 209132718Skan 210132718Skanvoid 211132718SkanAcpiUtDebugDumpBuffer ( 212132718Skan UINT8 *Buffer, 213132718Skan UINT32 Count, 214132718Skan UINT32 Display, 215132718Skan UINT32 ComponentId) 216132718Skan{ 217132718Skan 218169689Skan /* Only dump the buffer if tracing is enabled */ 219169689Skan 220169689Skan if (!((ACPI_LV_TABLES & AcpiDbgLevel) && 221169689Skan (ComponentId & AcpiDbgLayer))) 222169689Skan { 223169689Skan return; 224169689Skan } 225169689Skan 226169689Skan AcpiUtDumpBuffer (Buffer, Count, Display, 0); 227169689Skan} 228169689Skan 229169689Skan 230169689Skan#ifdef ACPI_APPLICATION 231169689Skan/******************************************************************************* 232169689Skan * 233169689Skan * FUNCTION: AcpiUtDumpBufferToFile 23490075Sobrien * 23590075Sobrien * PARAMETERS: File - File descriptor 23690075Sobrien * Buffer - Buffer to dump 23790075Sobrien * Count - Amount to dump, in bytes 23890075Sobrien * Display - BYTE, WORD, DWORD, or QWORD display: 23990075Sobrien * DB_BYTE_DISPLAY 24090075Sobrien * DB_WORD_DISPLAY 24190075Sobrien * DB_DWORD_DISPLAY 24290075Sobrien * DB_QWORD_DISPLAY 24390075Sobrien * BaseOffset - Beginning buffer offset (display only) 24490075Sobrien * 24590075Sobrien * RETURN: None 24690075Sobrien * 24790075Sobrien * DESCRIPTION: Generic dump buffer in both hex and ascii to a file. 24890075Sobrien * 24990075Sobrien ******************************************************************************/ 25090075Sobrien 25190075Sobrienvoid 252117395SkanAcpiUtDumpBufferToFile ( 253169689Skan ACPI_FILE File, 254169689Skan UINT8 *Buffer, 255169689Skan UINT32 Count, 256132718Skan UINT32 Display, 257169689Skan UINT32 BaseOffset) 258117395Skan{ 25990075Sobrien UINT32 i = 0; 26090075Sobrien UINT32 j; 26190075Sobrien UINT32 Temp32; 26290075Sobrien UINT8 BufChar; 263169689Skan 26490075Sobrien 265169689Skan if (!Buffer) 266117395Skan { 267117395Skan AcpiUtFilePrintf (File, "Null Buffer Pointer in DumpBuffer!\n"); 268117395Skan return; 269169689Skan } 27090075Sobrien 271117395Skan if ((Count < 4) || (Count & 0x01)) 272117395Skan { 273132718Skan Display = DB_BYTE_DISPLAY; 274132718Skan } 275132718Skan 276169689Skan /* Nasty little dump buffer routine! */ 277169689Skan 278169689Skan while (i < Count) 279169689Skan { 28090075Sobrien /* Print current offset */ 28190075Sobrien 28290075Sobrien AcpiUtFilePrintf (File, "%6.4X: ", (BaseOffset + i)); 28390075Sobrien 28490075Sobrien /* Print 16 hex chars */ 28590075Sobrien 28690075Sobrien for (j = 0; j < 16;) 28790075Sobrien { 28890075Sobrien if (i + j >= Count) 289169689Skan { 290169689Skan /* Dump fill spaces */ 29190075Sobrien 29290075Sobrien AcpiUtFilePrintf (File, "%*s", ((Display * 2) + 1), " "); 293132718Skan j += Display; 294117395Skan continue; 295117395Skan } 296117395Skan 297117395Skan switch (Display) 298117395Skan { 299132718Skan case DB_BYTE_DISPLAY: 300132718Skan default: /* Default is BYTE display */ 301132718Skan 302169689Skan AcpiUtFilePrintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]); 303169689Skan break; 304169689Skan 305169689Skan case DB_WORD_DISPLAY: 306169689Skan 307169689Skan ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 308169689Skan AcpiUtFilePrintf (File, "%04X ", Temp32); 30990075Sobrien break; 310169689Skan 311117395Skan case DB_DWORD_DISPLAY: 312117395Skan 313117395Skan ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 314117395Skan AcpiUtFilePrintf (File, "%08X ", Temp32); 315117395Skan break; 316117395Skan 317117395Skan case DB_QWORD_DISPLAY: 318169689Skan 319169689Skan ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 320117395Skan AcpiUtFilePrintf (File, "%08X", Temp32); 321117395Skan 322132718Skan ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 323117395Skan AcpiUtFilePrintf (File, "%08X ", Temp32); 324117395Skan break; 325117395Skan } 326117395Skan 327117395Skan j += Display; 328132718Skan } 329132718Skan 330169689Skan /* 331169689Skan * Print the ASCII equivalent characters but watch out for the bad 332169689Skan * unprintable ones (printable chars are 0x20 through 0x7E) 333169689Skan */ 334169689Skan AcpiUtFilePrintf (File, " "); 335169689Skan for (j = 0; j < 16; j++) 336169689Skan { 337169689Skan if (i + j >= Count) 33890075Sobrien { 339169689Skan AcpiUtFilePrintf (File, "\n"); 340220150Smm return; 341220150Smm } 342169689Skan 343169689Skan BufChar = Buffer[(ACPI_SIZE) i + j]; 344220150Smm if (ACPI_IS_PRINT (BufChar)) 345220150Smm { 346169689Skan AcpiUtFilePrintf (File, "%c", BufChar); 347169689Skan } 348169689Skan else 349169689Skan { 350169689Skan AcpiUtFilePrintf (File, "."); 351169689Skan } 352169689Skan } 353169689Skan 354132718Skan /* Done with that line. */ 35590075Sobrien 35690075Sobrien AcpiUtFilePrintf (File, "\n"); 357117395Skan i += 16; 35890075Sobrien } 359132718Skan 360132718Skan return; 361132718Skan} 36290075Sobrien#endif 363132718Skan