utbuffer.c revision 272444
1250757Sjkim/****************************************************************************** 2250757Sjkim * 3250757Sjkim * Module Name: utbuffer - Buffer dump routines 4250757Sjkim * 5250757Sjkim *****************************************************************************/ 6250757Sjkim 7250757Sjkim/* 8272444Sjkim * Copyright (C) 2000 - 2014, 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 44250757Sjkim#define __UTBUFFER_C__ 45250757Sjkim 46250838Sjkim#include <contrib/dev/acpica/include/acpi.h> 47250838Sjkim#include <contrib/dev/acpica/include/accommon.h> 48250757Sjkim 49250757Sjkim#define _COMPONENT ACPI_UTILITIES 50250757Sjkim ACPI_MODULE_NAME ("utbuffer") 51250757Sjkim 52250757Sjkim 53250757Sjkim/******************************************************************************* 54250757Sjkim * 55250757Sjkim * FUNCTION: AcpiUtDumpBuffer 56250757Sjkim * 57250757Sjkim * PARAMETERS: Buffer - Buffer to dump 58250757Sjkim * Count - Amount to dump, in bytes 59250757Sjkim * Display - BYTE, WORD, DWORD, or QWORD display: 60250757Sjkim * DB_BYTE_DISPLAY 61250757Sjkim * DB_WORD_DISPLAY 62250757Sjkim * DB_DWORD_DISPLAY 63250757Sjkim * DB_QWORD_DISPLAY 64250757Sjkim * BaseOffset - Beginning buffer offset (display only) 65250757Sjkim * 66250757Sjkim * RETURN: None 67250757Sjkim * 68250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii. 69250757Sjkim * 70250757Sjkim ******************************************************************************/ 71250757Sjkim 72250757Sjkimvoid 73250757SjkimAcpiUtDumpBuffer ( 74250757Sjkim UINT8 *Buffer, 75250757Sjkim UINT32 Count, 76250757Sjkim UINT32 Display, 77250757Sjkim UINT32 BaseOffset) 78250757Sjkim{ 79250757Sjkim UINT32 i = 0; 80250757Sjkim UINT32 j; 81250757Sjkim UINT32 Temp32; 82250757Sjkim UINT8 BufChar; 83250757Sjkim 84250757Sjkim 85250757Sjkim if (!Buffer) 86250757Sjkim { 87250757Sjkim AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n"); 88250757Sjkim return; 89250757Sjkim } 90250757Sjkim 91250757Sjkim if ((Count < 4) || (Count & 0x01)) 92250757Sjkim { 93250757Sjkim Display = DB_BYTE_DISPLAY; 94250757Sjkim } 95250757Sjkim 96250757Sjkim /* Nasty little dump buffer routine! */ 97250757Sjkim 98250757Sjkim while (i < Count) 99250757Sjkim { 100250757Sjkim /* Print current offset */ 101250757Sjkim 102250757Sjkim AcpiOsPrintf ("%6.4X: ", (BaseOffset + i)); 103250757Sjkim 104250757Sjkim /* Print 16 hex chars */ 105250757Sjkim 106250757Sjkim for (j = 0; j < 16;) 107250757Sjkim { 108250757Sjkim if (i + j >= Count) 109250757Sjkim { 110250757Sjkim /* Dump fill spaces */ 111250757Sjkim 112250757Sjkim AcpiOsPrintf ("%*s", ((Display * 2) + 1), " "); 113250757Sjkim j += Display; 114250757Sjkim continue; 115250757Sjkim } 116250757Sjkim 117250757Sjkim switch (Display) 118250757Sjkim { 119250757Sjkim case DB_BYTE_DISPLAY: 120250757Sjkim default: /* Default is BYTE display */ 121250757Sjkim 122250757Sjkim AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]); 123250757Sjkim break; 124250757Sjkim 125250757Sjkim case DB_WORD_DISPLAY: 126250757Sjkim 127250757Sjkim ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 128250757Sjkim AcpiOsPrintf ("%04X ", Temp32); 129250757Sjkim break; 130250757Sjkim 131250757Sjkim case DB_DWORD_DISPLAY: 132250757Sjkim 133250757Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 134250757Sjkim AcpiOsPrintf ("%08X ", Temp32); 135250757Sjkim break; 136250757Sjkim 137250757Sjkim case DB_QWORD_DISPLAY: 138250757Sjkim 139250757Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 140250757Sjkim AcpiOsPrintf ("%08X", Temp32); 141250757Sjkim 142250757Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 143250757Sjkim AcpiOsPrintf ("%08X ", Temp32); 144250757Sjkim break; 145250757Sjkim } 146250757Sjkim 147250757Sjkim j += Display; 148250757Sjkim } 149250757Sjkim 150250757Sjkim /* 151250757Sjkim * Print the ASCII equivalent characters but watch out for the bad 152250757Sjkim * unprintable ones (printable chars are 0x20 through 0x7E) 153250757Sjkim */ 154250757Sjkim AcpiOsPrintf (" "); 155250757Sjkim for (j = 0; j < 16; j++) 156250757Sjkim { 157250757Sjkim if (i + j >= Count) 158250757Sjkim { 159250757Sjkim AcpiOsPrintf ("\n"); 160250757Sjkim return; 161250757Sjkim } 162250757Sjkim 163250757Sjkim BufChar = Buffer[(ACPI_SIZE) i + j]; 164250757Sjkim if (ACPI_IS_PRINT (BufChar)) 165250757Sjkim { 166250757Sjkim AcpiOsPrintf ("%c", BufChar); 167250757Sjkim } 168250757Sjkim else 169250757Sjkim { 170250757Sjkim AcpiOsPrintf ("."); 171250757Sjkim } 172250757Sjkim } 173250757Sjkim 174250757Sjkim /* Done with that line. */ 175250757Sjkim 176250757Sjkim AcpiOsPrintf ("\n"); 177250757Sjkim i += 16; 178250757Sjkim } 179250757Sjkim 180250757Sjkim return; 181250757Sjkim} 182250757Sjkim 183250757Sjkim 184250757Sjkim/******************************************************************************* 185250757Sjkim * 186250757Sjkim * FUNCTION: AcpiUtDebugDumpBuffer 187250757Sjkim * 188250757Sjkim * PARAMETERS: Buffer - Buffer to dump 189250757Sjkim * Count - Amount to dump, in bytes 190250757Sjkim * Display - BYTE, WORD, DWORD, or QWORD display: 191250757Sjkim * DB_BYTE_DISPLAY 192250757Sjkim * DB_WORD_DISPLAY 193250757Sjkim * DB_DWORD_DISPLAY 194250757Sjkim * DB_QWORD_DISPLAY 195250757Sjkim * ComponentID - Caller's component ID 196250757Sjkim * 197250757Sjkim * RETURN: None 198250757Sjkim * 199250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii. 200250757Sjkim * 201250757Sjkim ******************************************************************************/ 202250757Sjkim 203250757Sjkimvoid 204250757SjkimAcpiUtDebugDumpBuffer ( 205250757Sjkim UINT8 *Buffer, 206250757Sjkim UINT32 Count, 207250757Sjkim UINT32 Display, 208250757Sjkim UINT32 ComponentId) 209250757Sjkim{ 210250757Sjkim 211250757Sjkim /* Only dump the buffer if tracing is enabled */ 212250757Sjkim 213250757Sjkim if (!((ACPI_LV_TABLES & AcpiDbgLevel) && 214250757Sjkim (ComponentId & AcpiDbgLayer))) 215250757Sjkim { 216250757Sjkim return; 217250757Sjkim } 218250757Sjkim 219250757Sjkim AcpiUtDumpBuffer (Buffer, Count, Display, 0); 220250757Sjkim} 221272444Sjkim 222272444Sjkim 223272444Sjkim#ifdef ACPI_APPLICATION 224272444Sjkim/******************************************************************************* 225272444Sjkim * 226272444Sjkim * FUNCTION: AcpiUtDumpBufferToFile 227272444Sjkim * 228272444Sjkim * PARAMETERS: File - File descriptor 229272444Sjkim * Buffer - Buffer to dump 230272444Sjkim * Count - Amount to dump, in bytes 231272444Sjkim * Display - BYTE, WORD, DWORD, or QWORD display: 232272444Sjkim * DB_BYTE_DISPLAY 233272444Sjkim * DB_WORD_DISPLAY 234272444Sjkim * DB_DWORD_DISPLAY 235272444Sjkim * DB_QWORD_DISPLAY 236272444Sjkim * BaseOffset - Beginning buffer offset (display only) 237272444Sjkim * 238272444Sjkim * RETURN: None 239272444Sjkim * 240272444Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii to a file. 241272444Sjkim * 242272444Sjkim ******************************************************************************/ 243272444Sjkim 244272444Sjkimvoid 245272444SjkimAcpiUtDumpBufferToFile ( 246272444Sjkim ACPI_FILE File, 247272444Sjkim UINT8 *Buffer, 248272444Sjkim UINT32 Count, 249272444Sjkim UINT32 Display, 250272444Sjkim UINT32 BaseOffset) 251272444Sjkim{ 252272444Sjkim UINT32 i = 0; 253272444Sjkim UINT32 j; 254272444Sjkim UINT32 Temp32; 255272444Sjkim UINT8 BufChar; 256272444Sjkim 257272444Sjkim 258272444Sjkim if (!Buffer) 259272444Sjkim { 260272444Sjkim AcpiUtFilePrintf (File, "Null Buffer Pointer in DumpBuffer!\n"); 261272444Sjkim return; 262272444Sjkim } 263272444Sjkim 264272444Sjkim if ((Count < 4) || (Count & 0x01)) 265272444Sjkim { 266272444Sjkim Display = DB_BYTE_DISPLAY; 267272444Sjkim } 268272444Sjkim 269272444Sjkim /* Nasty little dump buffer routine! */ 270272444Sjkim 271272444Sjkim while (i < Count) 272272444Sjkim { 273272444Sjkim /* Print current offset */ 274272444Sjkim 275272444Sjkim AcpiUtFilePrintf (File, "%6.4X: ", (BaseOffset + i)); 276272444Sjkim 277272444Sjkim /* Print 16 hex chars */ 278272444Sjkim 279272444Sjkim for (j = 0; j < 16;) 280272444Sjkim { 281272444Sjkim if (i + j >= Count) 282272444Sjkim { 283272444Sjkim /* Dump fill spaces */ 284272444Sjkim 285272444Sjkim AcpiUtFilePrintf (File, "%*s", ((Display * 2) + 1), " "); 286272444Sjkim j += Display; 287272444Sjkim continue; 288272444Sjkim } 289272444Sjkim 290272444Sjkim switch (Display) 291272444Sjkim { 292272444Sjkim case DB_BYTE_DISPLAY: 293272444Sjkim default: /* Default is BYTE display */ 294272444Sjkim 295272444Sjkim AcpiUtFilePrintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]); 296272444Sjkim break; 297272444Sjkim 298272444Sjkim case DB_WORD_DISPLAY: 299272444Sjkim 300272444Sjkim ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 301272444Sjkim AcpiUtFilePrintf (File, "%04X ", Temp32); 302272444Sjkim break; 303272444Sjkim 304272444Sjkim case DB_DWORD_DISPLAY: 305272444Sjkim 306272444Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 307272444Sjkim AcpiUtFilePrintf (File, "%08X ", Temp32); 308272444Sjkim break; 309272444Sjkim 310272444Sjkim case DB_QWORD_DISPLAY: 311272444Sjkim 312272444Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); 313272444Sjkim AcpiUtFilePrintf (File, "%08X", Temp32); 314272444Sjkim 315272444Sjkim ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); 316272444Sjkim AcpiUtFilePrintf (File, "%08X ", Temp32); 317272444Sjkim break; 318272444Sjkim } 319272444Sjkim 320272444Sjkim j += Display; 321272444Sjkim } 322272444Sjkim 323272444Sjkim /* 324272444Sjkim * Print the ASCII equivalent characters but watch out for the bad 325272444Sjkim * unprintable ones (printable chars are 0x20 through 0x7E) 326272444Sjkim */ 327272444Sjkim AcpiUtFilePrintf (File, " "); 328272444Sjkim for (j = 0; j < 16; j++) 329272444Sjkim { 330272444Sjkim if (i + j >= Count) 331272444Sjkim { 332272444Sjkim AcpiUtFilePrintf (File, "\n"); 333272444Sjkim return; 334272444Sjkim } 335272444Sjkim 336272444Sjkim BufChar = Buffer[(ACPI_SIZE) i + j]; 337272444Sjkim if (ACPI_IS_PRINT (BufChar)) 338272444Sjkim { 339272444Sjkim AcpiUtFilePrintf (File, "%c", BufChar); 340272444Sjkim } 341272444Sjkim else 342272444Sjkim { 343272444Sjkim AcpiUtFilePrintf (File, "."); 344272444Sjkim } 345272444Sjkim } 346272444Sjkim 347272444Sjkim /* Done with that line. */ 348272444Sjkim 349272444Sjkim AcpiUtFilePrintf (File, "\n"); 350272444Sjkim i += 16; 351272444Sjkim } 352272444Sjkim 353272444Sjkim return; 354272444Sjkim} 355272444Sjkim#endif 356