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

utstring.c (5079B)


      1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
      2/*******************************************************************************
      3 *
      4 * Module Name: utstring - Common functions for strings and characters
      5 *
      6 ******************************************************************************/
      7
      8#include <acpi/acpi.h>
      9#include "accommon.h"
     10#include "acnamesp.h"
     11
     12#define _COMPONENT          ACPI_UTILITIES
     13ACPI_MODULE_NAME("utstring")
     14
     15/*******************************************************************************
     16 *
     17 * FUNCTION:    acpi_ut_print_string
     18 *
     19 * PARAMETERS:  string          - Null terminated ASCII string
     20 *              max_length      - Maximum output length. Used to constrain the
     21 *                                length of strings during debug output only.
     22 *
     23 * RETURN:      None
     24 *
     25 * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
     26 *              sequences.
     27 *
     28 ******************************************************************************/
     29void acpi_ut_print_string(char *string, u16 max_length)
     30{
     31	u32 i;
     32
     33	if (!string) {
     34		acpi_os_printf("<\"NULL STRING PTR\">");
     35		return;
     36	}
     37
     38	acpi_os_printf("\"");
     39	for (i = 0; (i < max_length) && string[i]; i++) {
     40
     41		/* Escape sequences */
     42
     43		switch (string[i]) {
     44		case 0x07:
     45
     46			acpi_os_printf("\\a");	/* BELL */
     47			break;
     48
     49		case 0x08:
     50
     51			acpi_os_printf("\\b");	/* BACKSPACE */
     52			break;
     53
     54		case 0x0C:
     55
     56			acpi_os_printf("\\f");	/* FORMFEED */
     57			break;
     58
     59		case 0x0A:
     60
     61			acpi_os_printf("\\n");	/* LINEFEED */
     62			break;
     63
     64		case 0x0D:
     65
     66			acpi_os_printf("\\r");	/* CARRIAGE RETURN */
     67			break;
     68
     69		case 0x09:
     70
     71			acpi_os_printf("\\t");	/* HORIZONTAL TAB */
     72			break;
     73
     74		case 0x0B:
     75
     76			acpi_os_printf("\\v");	/* VERTICAL TAB */
     77			break;
     78
     79		case '\'':	/* Single Quote */
     80		case '\"':	/* Double Quote */
     81		case '\\':	/* Backslash */
     82
     83			acpi_os_printf("\\%c", (int)string[i]);
     84			break;
     85
     86		default:
     87
     88			/* Check for printable character or hex escape */
     89
     90			if (isprint((int)string[i])) {
     91				/* This is a normal character */
     92
     93				acpi_os_printf("%c", (int)string[i]);
     94			} else {
     95				/* All others will be Hex escapes */
     96
     97				acpi_os_printf("\\x%2.2X", (s32)string[i]);
     98			}
     99			break;
    100		}
    101	}
    102
    103	acpi_os_printf("\"");
    104
    105	if (i == max_length && string[i]) {
    106		acpi_os_printf("...");
    107	}
    108}
    109
    110/*******************************************************************************
    111 *
    112 * FUNCTION:    acpi_ut_repair_name
    113 *
    114 * PARAMETERS:  name            - The ACPI name to be repaired
    115 *
    116 * RETURN:      Repaired version of the name
    117 *
    118 * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
    119 *              return the new name. NOTE: the Name parameter must reside in
    120 *              read/write memory, cannot be a const.
    121 *
    122 * An ACPI Name must consist of valid ACPI characters. We will repair the name
    123 * if necessary because we don't want to abort because of this, but we want
    124 * all namespace names to be printable. A warning message is appropriate.
    125 *
    126 * This issue came up because there are in fact machines that exhibit
    127 * this problem, and we want to be able to enable ACPI support for them,
    128 * even though there are a few bad names.
    129 *
    130 ******************************************************************************/
    131
    132void acpi_ut_repair_name(char *name)
    133{
    134	u32 i;
    135	u8 found_bad_char = FALSE;
    136	u32 original_name;
    137
    138	ACPI_FUNCTION_NAME(ut_repair_name);
    139
    140	/*
    141	 * Special case for the root node. This can happen if we get an
    142	 * error during the execution of module-level code.
    143	 */
    144	if (ACPI_COMPARE_NAMESEG(name, ACPI_ROOT_PATHNAME)) {
    145		return;
    146	}
    147
    148	ACPI_COPY_NAMESEG(&original_name, name);
    149
    150	/* Check each character in the name */
    151
    152	for (i = 0; i < ACPI_NAMESEG_SIZE; i++) {
    153		if (acpi_ut_valid_name_char(name[i], i)) {
    154			continue;
    155		}
    156
    157		/*
    158		 * Replace a bad character with something printable, yet technically
    159		 * still invalid. This prevents any collisions with existing "good"
    160		 * names in the namespace.
    161		 */
    162		name[i] = '*';
    163		found_bad_char = TRUE;
    164	}
    165
    166	if (found_bad_char) {
    167
    168		/* Report warning only if in strict mode or debug mode */
    169
    170		if (!acpi_gbl_enable_interpreter_slack) {
    171			ACPI_WARNING((AE_INFO,
    172				      "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
    173				      original_name, name));
    174		} else {
    175			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
    176					  "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
    177					  original_name, name));
    178		}
    179	}
    180}
    181
    182#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
    183/*******************************************************************************
    184 *
    185 * FUNCTION:    ut_convert_backslashes
    186 *
    187 * PARAMETERS:  pathname        - File pathname string to be converted
    188 *
    189 * RETURN:      Modifies the input Pathname
    190 *
    191 * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
    192 *              the entire input file pathname string.
    193 *
    194 ******************************************************************************/
    195
    196void ut_convert_backslashes(char *pathname)
    197{
    198
    199	if (!pathname) {
    200		return;
    201	}
    202
    203	while (*pathname) {
    204		if (*pathname == '\\') {
    205			*pathname = '/';
    206		}
    207
    208		pathname++;
    209	}
    210}
    211#endif