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