205 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/******************************************************************************3 *4 * Module Name: dbhistry - debugger HISTORY command5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#include <acpi/acpi.h>11#include "accommon.h"12#include "acdebug.h"13 14#define _COMPONENT ACPI_CA_DEBUGGER15ACPI_MODULE_NAME("dbhistry")16 17#define HI_NO_HISTORY 018#define HI_RECORD_HISTORY 119#define HISTORY_SIZE 4020typedef struct history_info {21 char *command;22 u32 cmd_num;23 24} HISTORY_INFO;25 26static HISTORY_INFO acpi_gbl_history_buffer[HISTORY_SIZE];27static u16 acpi_gbl_lo_history = 0;28static u16 acpi_gbl_num_history = 0;29static u16 acpi_gbl_next_history_index = 0;30 31/*******************************************************************************32 *33 * FUNCTION: acpi_db_add_to_history34 *35 * PARAMETERS: command_line - Command to add36 *37 * RETURN: None38 *39 * DESCRIPTION: Add a command line to the history buffer.40 *41 ******************************************************************************/42 43void acpi_db_add_to_history(char *command_line)44{45 u16 cmd_len;46 u16 buffer_len;47 48 /* Put command into the next available slot */49 50 cmd_len = (u16)strlen(command_line);51 if (!cmd_len) {52 return;53 }54 55 if (acpi_gbl_history_buffer[acpi_gbl_next_history_index].command !=56 NULL) {57 buffer_len =58 (u16)59 strlen(acpi_gbl_history_buffer[acpi_gbl_next_history_index].60 command);61 62 if (cmd_len > buffer_len) {63 acpi_os_free(acpi_gbl_history_buffer64 [acpi_gbl_next_history_index].command);65 acpi_gbl_history_buffer[acpi_gbl_next_history_index].66 command = acpi_os_allocate(cmd_len + 1);67 }68 } else {69 acpi_gbl_history_buffer[acpi_gbl_next_history_index].command =70 acpi_os_allocate(cmd_len + 1);71 }72 73 strcpy(acpi_gbl_history_buffer[acpi_gbl_next_history_index].command,74 command_line);75 76 acpi_gbl_history_buffer[acpi_gbl_next_history_index].cmd_num =77 acpi_gbl_next_cmd_num;78 79 /* Adjust indexes */80 81 if ((acpi_gbl_num_history == HISTORY_SIZE) &&82 (acpi_gbl_next_history_index == acpi_gbl_lo_history)) {83 acpi_gbl_lo_history++;84 if (acpi_gbl_lo_history >= HISTORY_SIZE) {85 acpi_gbl_lo_history = 0;86 }87 }88 89 acpi_gbl_next_history_index++;90 if (acpi_gbl_next_history_index >= HISTORY_SIZE) {91 acpi_gbl_next_history_index = 0;92 }93 94 acpi_gbl_next_cmd_num++;95 if (acpi_gbl_num_history < HISTORY_SIZE) {96 acpi_gbl_num_history++;97 }98}99 100/*******************************************************************************101 *102 * FUNCTION: acpi_db_display_history103 *104 * PARAMETERS: None105 *106 * RETURN: None107 *108 * DESCRIPTION: Display the contents of the history buffer109 *110 ******************************************************************************/111 112void acpi_db_display_history(void)113{114 u32 i;115 u16 history_index;116 117 history_index = acpi_gbl_lo_history;118 119 /* Dump entire history buffer */120 121 for (i = 0; i < acpi_gbl_num_history; i++) {122 if (acpi_gbl_history_buffer[history_index].command) {123 acpi_os_printf("%3u %s\n",124 acpi_gbl_history_buffer[history_index].125 cmd_num,126 acpi_gbl_history_buffer[history_index].127 command);128 }129 130 history_index++;131 if (history_index >= HISTORY_SIZE) {132 history_index = 0;133 }134 }135}136 137/*******************************************************************************138 *139 * FUNCTION: acpi_db_get_from_history140 *141 * PARAMETERS: command_num_arg - String containing the number of the142 * command to be retrieved143 *144 * RETURN: Pointer to the retrieved command. Null on error.145 *146 * DESCRIPTION: Get a command from the history buffer147 *148 ******************************************************************************/149 150char *acpi_db_get_from_history(char *command_num_arg)151{152 u32 cmd_num;153 154 if (command_num_arg == NULL) {155 cmd_num = acpi_gbl_next_cmd_num - 1;156 }157 158 else {159 cmd_num = strtoul(command_num_arg, NULL, 0);160 }161 162 return (acpi_db_get_history_by_index(cmd_num));163}164 165/*******************************************************************************166 *167 * FUNCTION: acpi_db_get_history_by_index168 *169 * PARAMETERS: cmd_num - Index of the desired history entry.170 * Values are 0...(acpi_gbl_next_cmd_num - 1)171 *172 * RETURN: Pointer to the retrieved command. Null on error.173 *174 * DESCRIPTION: Get a command from the history buffer175 *176 ******************************************************************************/177 178char *acpi_db_get_history_by_index(u32 cmd_num)179{180 u32 i;181 u16 history_index;182 183 /* Search history buffer */184 185 history_index = acpi_gbl_lo_history;186 for (i = 0; i < acpi_gbl_num_history; i++) {187 if (acpi_gbl_history_buffer[history_index].cmd_num == cmd_num) {188 189 /* Found the command, return it */190 191 return (acpi_gbl_history_buffer[history_index].command);192 }193 194 /* History buffer is circular */195 196 history_index++;197 if (history_index >= HISTORY_SIZE) {198 history_index = 0;199 }200 }201 202 acpi_os_printf("Invalid history number: %u\n", history_index);203 return (NULL);204}205