cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

utbuffer.c (7252B)


      1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
      2/******************************************************************************
      3 *
      4 * Module Name: utbuffer - Buffer dump routines
      5 *
      6 * Copyright (C) 2000 - 2022, Intel Corp.
      7 *
      8 *****************************************************************************/
      9
     10#include <acpi/acpi.h>
     11#include "accommon.h"
     12
     13#define _COMPONENT          ACPI_UTILITIES
     14ACPI_MODULE_NAME("utbuffer")
     15
     16/*******************************************************************************
     17 *
     18 * FUNCTION:    acpi_ut_dump_buffer
     19 *
     20 * PARAMETERS:  buffer              - Buffer to dump
     21 *              count               - Amount to dump, in bytes
     22 *              display             - BYTE, WORD, DWORD, or QWORD display:
     23 *                                      DB_BYTE_DISPLAY
     24 *                                      DB_WORD_DISPLAY
     25 *                                      DB_DWORD_DISPLAY
     26 *                                      DB_QWORD_DISPLAY
     27 *              base_offset         - Beginning buffer offset (display only)
     28 *
     29 * RETURN:      None
     30 *
     31 * DESCRIPTION: Generic dump buffer in both hex and ascii.
     32 *
     33 ******************************************************************************/
     34void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
     35{
     36	u32 i = 0;
     37	u32 j;
     38	u32 temp32;
     39	u8 buf_char;
     40	u32 display_data_only = display & DB_DISPLAY_DATA_ONLY;
     41
     42	display &= ~DB_DISPLAY_DATA_ONLY;
     43	if (!buffer) {
     44		acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
     45		return;
     46	}
     47
     48	if ((count < 4) || (count & 0x01)) {
     49		display = DB_BYTE_DISPLAY;
     50	}
     51
     52	/* Nasty little dump buffer routine! */
     53
     54	while (i < count) {
     55
     56		/* Print current offset */
     57
     58		if (!display_data_only) {
     59			acpi_os_printf("%8.4X: ", (base_offset + i));
     60		}
     61
     62		/* Print 16 hex chars */
     63
     64		for (j = 0; j < 16;) {
     65			if (i + j >= count) {
     66
     67				/* Dump fill spaces */
     68
     69				acpi_os_printf("%*s", ((display * 2) + 1), " ");
     70				j += display;
     71				continue;
     72			}
     73
     74			switch (display) {
     75			case DB_BYTE_DISPLAY:
     76			default:	/* Default is BYTE display */
     77
     78				acpi_os_printf("%02X ",
     79					       buffer[(acpi_size)i + j]);
     80				break;
     81
     82			case DB_WORD_DISPLAY:
     83
     84				ACPI_MOVE_16_TO_32(&temp32,
     85						   &buffer[(acpi_size)i + j]);
     86				acpi_os_printf("%04X ", temp32);
     87				break;
     88
     89			case DB_DWORD_DISPLAY:
     90
     91				ACPI_MOVE_32_TO_32(&temp32,
     92						   &buffer[(acpi_size)i + j]);
     93				acpi_os_printf("%08X ", temp32);
     94				break;
     95
     96			case DB_QWORD_DISPLAY:
     97
     98				ACPI_MOVE_32_TO_32(&temp32,
     99						   &buffer[(acpi_size)i + j]);
    100				acpi_os_printf("%08X", temp32);
    101
    102				ACPI_MOVE_32_TO_32(&temp32,
    103						   &buffer[(acpi_size)i + j +
    104							   4]);
    105				acpi_os_printf("%08X ", temp32);
    106				break;
    107			}
    108
    109			j += display;
    110		}
    111
    112		/*
    113		 * Print the ASCII equivalent characters but watch out for the bad
    114		 * unprintable ones (printable chars are 0x20 through 0x7E)
    115		 */
    116		if (!display_data_only) {
    117			acpi_os_printf(" ");
    118			for (j = 0; j < 16; j++) {
    119				if (i + j >= count) {
    120					acpi_os_printf("\n");
    121					return;
    122				}
    123
    124				/*
    125				 * Add comment characters so rest of line is ignored when
    126				 * compiled
    127				 */
    128				if (j == 0) {
    129					acpi_os_printf("// ");
    130				}
    131
    132				buf_char = buffer[(acpi_size)i + j];
    133				if (isprint(buf_char)) {
    134					acpi_os_printf("%c", buf_char);
    135				} else {
    136					acpi_os_printf(".");
    137				}
    138			}
    139
    140			/* Done with that line. */
    141
    142			acpi_os_printf("\n");
    143		}
    144		i += 16;
    145	}
    146
    147	return;
    148}
    149
    150/*******************************************************************************
    151 *
    152 * FUNCTION:    acpi_ut_debug_dump_buffer
    153 *
    154 * PARAMETERS:  buffer              - Buffer to dump
    155 *              count               - Amount to dump, in bytes
    156 *              display             - BYTE, WORD, DWORD, or QWORD display:
    157 *                                      DB_BYTE_DISPLAY
    158 *                                      DB_WORD_DISPLAY
    159 *                                      DB_DWORD_DISPLAY
    160 *                                      DB_QWORD_DISPLAY
    161 *              component_ID        - Caller's component ID
    162 *
    163 * RETURN:      None
    164 *
    165 * DESCRIPTION: Generic dump buffer in both hex and ascii.
    166 *
    167 ******************************************************************************/
    168
    169void
    170acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
    171{
    172
    173	/* Only dump the buffer if tracing is enabled */
    174
    175	if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
    176	      (component_id & acpi_dbg_layer))) {
    177		return;
    178	}
    179
    180	acpi_ut_dump_buffer(buffer, count, display, 0);
    181}
    182
    183#ifdef ACPI_APPLICATION
    184/*******************************************************************************
    185 *
    186 * FUNCTION:    acpi_ut_dump_buffer_to_file
    187 *
    188 * PARAMETERS:  file                - File descriptor
    189 *              buffer              - Buffer to dump
    190 *              count               - Amount to dump, in bytes
    191 *              display             - BYTE, WORD, DWORD, or QWORD display:
    192 *                                      DB_BYTE_DISPLAY
    193 *                                      DB_WORD_DISPLAY
    194 *                                      DB_DWORD_DISPLAY
    195 *                                      DB_QWORD_DISPLAY
    196 *              base_offset         - Beginning buffer offset (display only)
    197 *
    198 * RETURN:      None
    199 *
    200 * DESCRIPTION: Generic dump buffer in both hex and ascii to a file.
    201 *
    202 ******************************************************************************/
    203
    204void
    205acpi_ut_dump_buffer_to_file(ACPI_FILE file,
    206			    u8 *buffer, u32 count, u32 display, u32 base_offset)
    207{
    208	u32 i = 0;
    209	u32 j;
    210	u32 temp32;
    211	u8 buf_char;
    212
    213	if (!buffer) {
    214		fprintf(file, "Null Buffer Pointer in DumpBuffer!\n");
    215		return;
    216	}
    217
    218	if ((count < 4) || (count & 0x01)) {
    219		display = DB_BYTE_DISPLAY;
    220	}
    221
    222	/* Nasty little dump buffer routine! */
    223
    224	while (i < count) {
    225
    226		/* Print current offset */
    227
    228		fprintf(file, "%8.4X: ", (base_offset + i));
    229
    230		/* Print 16 hex chars */
    231
    232		for (j = 0; j < 16;) {
    233			if (i + j >= count) {
    234
    235				/* Dump fill spaces */
    236
    237				fprintf(file, "%*s", ((display * 2) + 1), " ");
    238				j += display;
    239				continue;
    240			}
    241
    242			switch (display) {
    243			case DB_BYTE_DISPLAY:
    244			default:	/* Default is BYTE display */
    245
    246				fprintf(file, "%02X ",
    247					buffer[(acpi_size)i + j]);
    248				break;
    249
    250			case DB_WORD_DISPLAY:
    251
    252				ACPI_MOVE_16_TO_32(&temp32,
    253						   &buffer[(acpi_size)i + j]);
    254				fprintf(file, "%04X ", temp32);
    255				break;
    256
    257			case DB_DWORD_DISPLAY:
    258
    259				ACPI_MOVE_32_TO_32(&temp32,
    260						   &buffer[(acpi_size)i + j]);
    261				fprintf(file, "%08X ", temp32);
    262				break;
    263
    264			case DB_QWORD_DISPLAY:
    265
    266				ACPI_MOVE_32_TO_32(&temp32,
    267						   &buffer[(acpi_size)i + j]);
    268				fprintf(file, "%08X", temp32);
    269
    270				ACPI_MOVE_32_TO_32(&temp32,
    271						   &buffer[(acpi_size)i + j +
    272							   4]);
    273				fprintf(file, "%08X ", temp32);
    274				break;
    275			}
    276
    277			j += display;
    278		}
    279
    280		/*
    281		 * Print the ASCII equivalent characters but watch out for the bad
    282		 * unprintable ones (printable chars are 0x20 through 0x7E)
    283		 */
    284		fprintf(file, " ");
    285		for (j = 0; j < 16; j++) {
    286			if (i + j >= count) {
    287				fprintf(file, "\n");
    288				return;
    289			}
    290
    291			buf_char = buffer[(acpi_size)i + j];
    292			if (isprint(buf_char)) {
    293				fprintf(file, "%c", buf_char);
    294			} else {
    295				fprintf(file, ".");
    296			}
    297		}
    298
    299		/* Done with that line. */
    300
    301		fprintf(file, "\n");
    302		i += 16;
    303	}
    304
    305	return;
    306}
    307#endif