utbuffer.c revision 281396
1250757Sjkim/****************************************************************************** 2250757Sjkim * 3250757Sjkim * Module Name: utbuffer - Buffer dump routines 4250757Sjkim * 5250757Sjkim *****************************************************************************/ 6250757Sjkim 7250757Sjkim/* 8278970Sjkim * Copyright (C) 2000 - 2015, Intel Corp. 9250757Sjkim * All rights reserved. 10250757Sjkim * 11250757Sjkim * Redistribution and use in source and binary forms, with or without 12250757Sjkim * modification, are permitted provided that the following conditions 13250757Sjkim * are met: 14250757Sjkim * 1. Redistributions of source code must retain the above copyright 15250757Sjkim * notice, this list of conditions, and the following disclaimer, 16250757Sjkim * without modification. 17250757Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18250757Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19250757Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20250757Sjkim * including a substantially similar Disclaimer requirement for further 21250757Sjkim * binary redistribution. 22250757Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23250757Sjkim * of any contributors may be used to endorse or promote products derived 24250757Sjkim * from this software without specific prior written permission. 25250757Sjkim * 26250757Sjkim * Alternatively, this software may be distributed under the terms of the 27250757Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28250757Sjkim * Software Foundation. 29250757Sjkim * 30250757Sjkim * NO WARRANTY 31250757Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32250757Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33250757Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34250757Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35250757Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36250757Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37250757Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38250757Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39250757Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40250757Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41250757Sjkim * POSSIBILITY OF SUCH DAMAGES. 42250757Sjkim */ 43250757Sjkim 44250838Sjkim#include <contrib/dev/acpica/include/acpi.h> 45250838Sjkim#include <contrib/dev/acpica/include/accommon.h> 46250757Sjkim 47250757Sjkim#define _COMPONENT ACPI_UTILITIES 48250757Sjkim ACPI_MODULE_NAME ("utbuffer") 49250757Sjkim 50250757Sjkim 51250757Sjkim/******************************************************************************* 52250757Sjkim * 53250757Sjkim * FUNCTION: AcpiUtDumpBuffer 54250757Sjkim * 55250757Sjkim * PARAMETERS: Buffer - Buffer to dump 56250757Sjkim * Count - Amount to dump, in bytes 57250757Sjkim * Display - BYTE, WORD, DWORD, or QWORD display: 58250757Sjkim * DB_BYTE_DISPLAY 59250757Sjkim * DB_WORD_DISPLAY 60250757Sjkim * DB_DWORD_DISPLAY 61250757Sjkim * DB_QWORD_DISPLAY 62250757Sjkim * BaseOffset - Beginning buffer offset (display only) 63250757Sjkim * 64250757Sjkim * RETURN: None 65250757Sjkim * 66250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii. 67250757Sjkim * 68250757Sjkim ******************************************************************************/ 69250757Sjkim 70250757Sjkimvoid 71250757SjkimAcpiUtDumpBuffer ( 72250757Sjkim UINT8 *Buffer, 73250757Sjkim UINT32 Count, 74250757Sjkim UINT32 Display, 75250757Sjkim UINT32 BaseOffset) 76250757Sjkim{ 77250757Sjkim UINT32 i = 0; 78250757Sjkim UINT32 j; 79250757Sjkim UINT32 Temp32; 80250757Sjkim UINT8 BufChar; 81250757Sjkim 82250757Sjkim 83250757Sjkim if (!Buffer) 84250757Sjkim { 85250757Sjkim AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n"); 86250757Sjkim return; 87250757Sjkim } 88250757Sjkim 89250757Sjkim if ((Count < 4) || (Count & 0x01)) 90250757Sjkim { 91250757Sjkim Display = DB_BYTE_DISPLAY; 92250757Sjkim } 93250757Sjkim 94250757Sjkim /* Nasty little dump buffer routine! */ 95250757Sjkim 96250757Sjkim while (i < Count) 97250757Sjkim { 98250757Sjkim /* Print current offset */ 99250757Sjkim 100250757Sjkim AcpiOsPrintf ("%6.4X: ", (BaseOffset + i)); 101250757Sjkim 102250757Sjkim /* Print 16 hex chars */ 103250757Sjkim 104250757Sjkim for (j = 0; j < 16;) 105250757Sjkim { 106250757Sjkim if (i + j >= Count) 107250757Sjkim { 108250757Sjkim /* Dump fill spaces */ 109250757Sjkim 110250757Sjkim AcpiOsPrintf ("%*s", ((Display * 2) + 1), " "); 111250757Sjkim j += Display; 112250757Sjkim continue; 113250757Sjkim } 114250757Sjkim 115250757Sjkim switch (Display) 116250757Sjkim { 117250757Sjkim case DB_BYTE_DISPLAY: 118250757Sjkim default: /* Default is BYTE display */ 119250757Sjkim 120250757Sjkim AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]); 121250757Sjkim break; 122250757Sjkim 123250757Sjkim case DB_WORD_DISPLAY: 124250757Sjkim 125250757Sjkim ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 126250757Sjkim AcpiOsPrintf ("%04X ", Temp32); 127250757Sjkim break; 128250757Sjkim 129250757Sjkim case DB_DWORD_DISPLAY: 130250757Sjkim 131250757Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 132250757Sjkim AcpiOsPrintf ("%08X ", Temp32); 133250757Sjkim break; 134250757Sjkim 135250757Sjkim case DB_QWORD_DISPLAY: 136250757Sjkim 137250757Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 138250757Sjkim AcpiOsPrintf ("%08X", Temp32); 139250757Sjkim 140250757Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 141250757Sjkim AcpiOsPrintf ("%08X ", Temp32); 142250757Sjkim break; 143250757Sjkim } 144250757Sjkim 145250757Sjkim j += Display; 146250757Sjkim } 147250757Sjkim 148250757Sjkim /* 149250757Sjkim * Print the ASCII equivalent characters but watch out for the bad 150250757Sjkim * unprintable ones (printable chars are 0x20 through 0x7E) 151250757Sjkim */ 152250757Sjkim AcpiOsPrintf (" "); 153250757Sjkim for (j = 0; j < 16; j++) 154250757Sjkim { 155250757Sjkim if (i + j >= Count) 156250757Sjkim { 157250757Sjkim AcpiOsPrintf ("\n"); 158250757Sjkim return; 159250757Sjkim } 160250757Sjkim 161281396Sjkim /* 162281396Sjkim * Add comment characters so rest of line is ignored when 163281396Sjkim * compiled 164281396Sjkim */ 165281396Sjkim if (j == 0) 166281396Sjkim { 167281396Sjkim AcpiOsPrintf ("// "); 168281396Sjkim } 169281396Sjkim 170250757Sjkim BufChar = Buffer[(ACPI_SIZE) i + j]; 171250757Sjkim if (ACPI_IS_PRINT (BufChar)) 172250757Sjkim { 173250757Sjkim AcpiOsPrintf ("%c", BufChar); 174250757Sjkim } 175250757Sjkim else 176250757Sjkim { 177250757Sjkim AcpiOsPrintf ("."); 178250757Sjkim } 179250757Sjkim } 180250757Sjkim 181250757Sjkim /* Done with that line. */ 182250757Sjkim 183250757Sjkim AcpiOsPrintf ("\n"); 184250757Sjkim i += 16; 185250757Sjkim } 186250757Sjkim 187250757Sjkim return; 188250757Sjkim} 189250757Sjkim 190250757Sjkim 191250757Sjkim/******************************************************************************* 192250757Sjkim * 193250757Sjkim * FUNCTION: AcpiUtDebugDumpBuffer 194250757Sjkim * 195250757Sjkim * PARAMETERS: Buffer - Buffer to dump 196250757Sjkim * Count - Amount to dump, in bytes 197250757Sjkim * Display - BYTE, WORD, DWORD, or QWORD display: 198250757Sjkim * DB_BYTE_DISPLAY 199250757Sjkim * DB_WORD_DISPLAY 200250757Sjkim * DB_DWORD_DISPLAY 201250757Sjkim * DB_QWORD_DISPLAY 202250757Sjkim * ComponentID - Caller's component ID 203250757Sjkim * 204250757Sjkim * RETURN: None 205250757Sjkim * 206250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii. 207250757Sjkim * 208250757Sjkim ******************************************************************************/ 209250757Sjkim 210250757Sjkimvoid 211250757SjkimAcpiUtDebugDumpBuffer ( 212250757Sjkim UINT8 *Buffer, 213250757Sjkim UINT32 Count, 214250757Sjkim UINT32 Display, 215250757Sjkim UINT32 ComponentId) 216250757Sjkim{ 217250757Sjkim 218250757Sjkim /* Only dump the buffer if tracing is enabled */ 219250757Sjkim 220250757Sjkim if (!((ACPI_LV_TABLES & AcpiDbgLevel) && 221250757Sjkim (ComponentId & AcpiDbgLayer))) 222250757Sjkim { 223250757Sjkim return; 224250757Sjkim } 225250757Sjkim 226250757Sjkim AcpiUtDumpBuffer (Buffer, Count, Display, 0); 227250757Sjkim} 228272444Sjkim 229272444Sjkim 230272444Sjkim#ifdef ACPI_APPLICATION 231272444Sjkim/******************************************************************************* 232272444Sjkim * 233272444Sjkim * FUNCTION: AcpiUtDumpBufferToFile 234272444Sjkim * 235272444Sjkim * PARAMETERS: File - File descriptor 236272444Sjkim * Buffer - Buffer to dump 237272444Sjkim * Count - Amount to dump, in bytes 238272444Sjkim * Display - BYTE, WORD, DWORD, or QWORD display: 239272444Sjkim * DB_BYTE_DISPLAY 240272444Sjkim * DB_WORD_DISPLAY 241272444Sjkim * DB_DWORD_DISPLAY 242272444Sjkim * DB_QWORD_DISPLAY 243272444Sjkim * BaseOffset - Beginning buffer offset (display only) 244272444Sjkim * 245272444Sjkim * RETURN: None 246272444Sjkim * 247272444Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii to a file. 248272444Sjkim * 249272444Sjkim ******************************************************************************/ 250272444Sjkim 251272444Sjkimvoid 252272444SjkimAcpiUtDumpBufferToFile ( 253272444Sjkim ACPI_FILE File, 254272444Sjkim UINT8 *Buffer, 255272444Sjkim UINT32 Count, 256272444Sjkim UINT32 Display, 257272444Sjkim UINT32 BaseOffset) 258272444Sjkim{ 259272444Sjkim UINT32 i = 0; 260272444Sjkim UINT32 j; 261272444Sjkim UINT32 Temp32; 262272444Sjkim UINT8 BufChar; 263272444Sjkim 264272444Sjkim 265272444Sjkim if (!Buffer) 266272444Sjkim { 267272444Sjkim AcpiUtFilePrintf (File, "Null Buffer Pointer in DumpBuffer!\n"); 268272444Sjkim return; 269272444Sjkim } 270272444Sjkim 271272444Sjkim if ((Count < 4) || (Count & 0x01)) 272272444Sjkim { 273272444Sjkim Display = DB_BYTE_DISPLAY; 274272444Sjkim } 275272444Sjkim 276272444Sjkim /* Nasty little dump buffer routine! */ 277272444Sjkim 278272444Sjkim while (i < Count) 279272444Sjkim { 280272444Sjkim /* Print current offset */ 281272444Sjkim 282272444Sjkim AcpiUtFilePrintf (File, "%6.4X: ", (BaseOffset + i)); 283272444Sjkim 284272444Sjkim /* Print 16 hex chars */ 285272444Sjkim 286272444Sjkim for (j = 0; j < 16;) 287272444Sjkim { 288272444Sjkim if (i + j >= Count) 289272444Sjkim { 290272444Sjkim /* Dump fill spaces */ 291272444Sjkim 292272444Sjkim AcpiUtFilePrintf (File, "%*s", ((Display * 2) + 1), " "); 293272444Sjkim j += Display; 294272444Sjkim continue; 295272444Sjkim } 296272444Sjkim 297272444Sjkim switch (Display) 298272444Sjkim { 299272444Sjkim case DB_BYTE_DISPLAY: 300272444Sjkim default: /* Default is BYTE display */ 301272444Sjkim 302272444Sjkim AcpiUtFilePrintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]); 303272444Sjkim break; 304272444Sjkim 305272444Sjkim case DB_WORD_DISPLAY: 306272444Sjkim 307272444Sjkim ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 308272444Sjkim AcpiUtFilePrintf (File, "%04X ", Temp32); 309272444Sjkim break; 310272444Sjkim 311272444Sjkim case DB_DWORD_DISPLAY: 312272444Sjkim 313272444Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 314272444Sjkim AcpiUtFilePrintf (File, "%08X ", Temp32); 315272444Sjkim break; 316272444Sjkim 317272444Sjkim case DB_QWORD_DISPLAY: 318272444Sjkim 319272444Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 320272444Sjkim AcpiUtFilePrintf (File, "%08X", Temp32); 321272444Sjkim 322272444Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 323272444Sjkim AcpiUtFilePrintf (File, "%08X ", Temp32); 324272444Sjkim break; 325272444Sjkim } 326272444Sjkim 327272444Sjkim j += Display; 328272444Sjkim } 329272444Sjkim 330272444Sjkim /* 331272444Sjkim * Print the ASCII equivalent characters but watch out for the bad 332272444Sjkim * unprintable ones (printable chars are 0x20 through 0x7E) 333272444Sjkim */ 334272444Sjkim AcpiUtFilePrintf (File, " "); 335272444Sjkim for (j = 0; j < 16; j++) 336272444Sjkim { 337272444Sjkim if (i + j >= Count) 338272444Sjkim { 339272444Sjkim AcpiUtFilePrintf (File, "\n"); 340272444Sjkim return; 341272444Sjkim } 342272444Sjkim 343272444Sjkim BufChar = Buffer[(ACPI_SIZE) i + j]; 344272444Sjkim if (ACPI_IS_PRINT (BufChar)) 345272444Sjkim { 346272444Sjkim AcpiUtFilePrintf (File, "%c", BufChar); 347272444Sjkim } 348272444Sjkim else 349272444Sjkim { 350272444Sjkim AcpiUtFilePrintf (File, "."); 351272444Sjkim } 352272444Sjkim } 353272444Sjkim 354272444Sjkim /* Done with that line. */ 355272444Sjkim 356272444Sjkim AcpiUtFilePrintf (File, "\n"); 357272444Sjkim i += 16; 358272444Sjkim } 359272444Sjkim 360272444Sjkim return; 361272444Sjkim} 362272444Sjkim#endif 363