linux/drivers/acpi/acpica/dbhistry.c
<<
>>
Prefs
   1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2/******************************************************************************
   3 *
   4 * Module Name: dbhistry - debugger HISTORY command
   5 *
   6 * Copyright (C) 2000 - 2021, Intel Corp.
   7 *
   8 *****************************************************************************/
   9
  10#include <acpi/acpi.h>
  11#include "accommon.h"
  12#include "acdebug.h"
  13
  14#define _COMPONENT          ACPI_CA_DEBUGGER
  15ACPI_MODULE_NAME("dbhistry")
  16
  17#define HI_NO_HISTORY       0
  18#define HI_RECORD_HISTORY   1
  19#define HISTORY_SIZE        40
  20typedef 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_history
  34 *
  35 * PARAMETERS:  command_line    - Command to add
  36 *
  37 * RETURN:      None
  38 *
  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_buffer
  64                                     [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_history
 103 *
 104 * PARAMETERS:  None
 105 *
 106 * RETURN:      None
 107 *
 108 * DESCRIPTION: Display the contents of the history buffer
 109 *
 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_history
 140 *
 141 * PARAMETERS:  command_num_arg         - String containing the number of the
 142 *                                        command to be retrieved
 143 *
 144 * RETURN:      Pointer to the retrieved command. Null on error.
 145 *
 146 * DESCRIPTION: Get a command from the history buffer
 147 *
 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_index
 168 *
 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 buffer
 175 *
 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