10d02842fSSascha Wildner /****************************************************************************** 20d02842fSSascha Wildner * 30d02842fSSascha Wildner * Module Name: dbhistry - debugger HISTORY command 40d02842fSSascha Wildner * 50d02842fSSascha Wildner *****************************************************************************/ 60d02842fSSascha Wildner 70d02842fSSascha Wildner /* 8*fe7b5cb4SSascha Wildner * Copyright (C) 2000 - 2015, Intel Corp. 90d02842fSSascha Wildner * All rights reserved. 100d02842fSSascha Wildner * 110d02842fSSascha Wildner * Redistribution and use in source and binary forms, with or without 120d02842fSSascha Wildner * modification, are permitted provided that the following conditions 130d02842fSSascha Wildner * are met: 140d02842fSSascha Wildner * 1. Redistributions of source code must retain the above copyright 150d02842fSSascha Wildner * notice, this list of conditions, and the following disclaimer, 160d02842fSSascha Wildner * without modification. 170d02842fSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer 180d02842fSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below 190d02842fSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon 200d02842fSSascha Wildner * including a substantially similar Disclaimer requirement for further 210d02842fSSascha Wildner * binary redistribution. 220d02842fSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names 230d02842fSSascha Wildner * of any contributors may be used to endorse or promote products derived 240d02842fSSascha Wildner * from this software without specific prior written permission. 250d02842fSSascha Wildner * 260d02842fSSascha Wildner * Alternatively, this software may be distributed under the terms of the 270d02842fSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free 280d02842fSSascha Wildner * Software Foundation. 290d02842fSSascha Wildner * 300d02842fSSascha Wildner * NO WARRANTY 310d02842fSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 320d02842fSSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 330d02842fSSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 340d02842fSSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 350d02842fSSascha Wildner * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 360d02842fSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 370d02842fSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 380d02842fSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 390d02842fSSascha Wildner * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 400d02842fSSascha Wildner * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 410d02842fSSascha Wildner * POSSIBILITY OF SUCH DAMAGES. 420d02842fSSascha Wildner */ 430d02842fSSascha Wildner 440d02842fSSascha Wildner #include "acpi.h" 450d02842fSSascha Wildner #include "accommon.h" 460d02842fSSascha Wildner #include "acdebug.h" 470d02842fSSascha Wildner 480d02842fSSascha Wildner #ifdef ACPI_DEBUGGER 490d02842fSSascha Wildner 500d02842fSSascha Wildner #define _COMPONENT ACPI_CA_DEBUGGER 510d02842fSSascha Wildner ACPI_MODULE_NAME ("dbhistry") 520d02842fSSascha Wildner 530d02842fSSascha Wildner 540d02842fSSascha Wildner #define HI_NO_HISTORY 0 550d02842fSSascha Wildner #define HI_RECORD_HISTORY 1 560d02842fSSascha Wildner #define HISTORY_SIZE 40 570d02842fSSascha Wildner 580d02842fSSascha Wildner 590d02842fSSascha Wildner typedef struct HistoryInfo 600d02842fSSascha Wildner { 610d02842fSSascha Wildner char *Command; 620d02842fSSascha Wildner UINT32 CmdNum; 630d02842fSSascha Wildner 640d02842fSSascha Wildner } HISTORY_INFO; 650d02842fSSascha Wildner 660d02842fSSascha Wildner 670d02842fSSascha Wildner static HISTORY_INFO AcpiGbl_HistoryBuffer[HISTORY_SIZE]; 680d02842fSSascha Wildner static UINT16 AcpiGbl_LoHistory = 0; 690d02842fSSascha Wildner static UINT16 AcpiGbl_NumHistory = 0; 700d02842fSSascha Wildner static UINT16 AcpiGbl_NextHistoryIndex = 0; 710d02842fSSascha Wildner UINT32 AcpiGbl_NextCmdNum = 1; 720d02842fSSascha Wildner 730d02842fSSascha Wildner 740d02842fSSascha Wildner /******************************************************************************* 750d02842fSSascha Wildner * 760d02842fSSascha Wildner * FUNCTION: AcpiDbAddToHistory 770d02842fSSascha Wildner * 780d02842fSSascha Wildner * PARAMETERS: CommandLine - Command to add 790d02842fSSascha Wildner * 800d02842fSSascha Wildner * RETURN: None 810d02842fSSascha Wildner * 820d02842fSSascha Wildner * DESCRIPTION: Add a command line to the history buffer. 830d02842fSSascha Wildner * 840d02842fSSascha Wildner ******************************************************************************/ 850d02842fSSascha Wildner 860d02842fSSascha Wildner void 870d02842fSSascha Wildner AcpiDbAddToHistory ( 880d02842fSSascha Wildner char *CommandLine) 890d02842fSSascha Wildner { 900d02842fSSascha Wildner UINT16 CmdLen; 910d02842fSSascha Wildner UINT16 BufferLen; 920d02842fSSascha Wildner 930d02842fSSascha Wildner /* Put command into the next available slot */ 940d02842fSSascha Wildner 950d02842fSSascha Wildner CmdLen = (UINT16) ACPI_STRLEN (CommandLine); 960d02842fSSascha Wildner if (!CmdLen) 970d02842fSSascha Wildner { 980d02842fSSascha Wildner return; 990d02842fSSascha Wildner } 1000d02842fSSascha Wildner 1010d02842fSSascha Wildner if (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command != NULL) 1020d02842fSSascha Wildner { 1030d02842fSSascha Wildner BufferLen = (UINT16) ACPI_STRLEN ( 1040d02842fSSascha Wildner AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command); 1050d02842fSSascha Wildner if (CmdLen > BufferLen) 1060d02842fSSascha Wildner { 1070d02842fSSascha Wildner AcpiOsFree (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex]. 1080d02842fSSascha Wildner Command); 1090d02842fSSascha Wildner AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command = 1100d02842fSSascha Wildner AcpiOsAllocate (CmdLen + 1); 1110d02842fSSascha Wildner } 1120d02842fSSascha Wildner } 1130d02842fSSascha Wildner else 1140d02842fSSascha Wildner { 1150d02842fSSascha Wildner AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command = 1160d02842fSSascha Wildner AcpiOsAllocate (CmdLen + 1); 1170d02842fSSascha Wildner } 1180d02842fSSascha Wildner 1190d02842fSSascha Wildner ACPI_STRCPY (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command, 1200d02842fSSascha Wildner CommandLine); 1210d02842fSSascha Wildner 1220d02842fSSascha Wildner AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].CmdNum = 1230d02842fSSascha Wildner AcpiGbl_NextCmdNum; 1240d02842fSSascha Wildner 1250d02842fSSascha Wildner /* Adjust indexes */ 1260d02842fSSascha Wildner 1270d02842fSSascha Wildner if ((AcpiGbl_NumHistory == HISTORY_SIZE) && 1280d02842fSSascha Wildner (AcpiGbl_NextHistoryIndex == AcpiGbl_LoHistory)) 1290d02842fSSascha Wildner { 1300d02842fSSascha Wildner AcpiGbl_LoHistory++; 1310d02842fSSascha Wildner if (AcpiGbl_LoHistory >= HISTORY_SIZE) 1320d02842fSSascha Wildner { 1330d02842fSSascha Wildner AcpiGbl_LoHistory = 0; 1340d02842fSSascha Wildner } 1350d02842fSSascha Wildner } 1360d02842fSSascha Wildner 1370d02842fSSascha Wildner AcpiGbl_NextHistoryIndex++; 1380d02842fSSascha Wildner if (AcpiGbl_NextHistoryIndex >= HISTORY_SIZE) 1390d02842fSSascha Wildner { 1400d02842fSSascha Wildner AcpiGbl_NextHistoryIndex = 0; 1410d02842fSSascha Wildner } 1420d02842fSSascha Wildner 1430d02842fSSascha Wildner AcpiGbl_NextCmdNum++; 1440d02842fSSascha Wildner if (AcpiGbl_NumHistory < HISTORY_SIZE) 1450d02842fSSascha Wildner { 1460d02842fSSascha Wildner AcpiGbl_NumHistory++; 1470d02842fSSascha Wildner } 1480d02842fSSascha Wildner } 1490d02842fSSascha Wildner 1500d02842fSSascha Wildner 1510d02842fSSascha Wildner /******************************************************************************* 1520d02842fSSascha Wildner * 1530d02842fSSascha Wildner * FUNCTION: AcpiDbDisplayHistory 1540d02842fSSascha Wildner * 1550d02842fSSascha Wildner * PARAMETERS: None 1560d02842fSSascha Wildner * 1570d02842fSSascha Wildner * RETURN: None 1580d02842fSSascha Wildner * 1590d02842fSSascha Wildner * DESCRIPTION: Display the contents of the history buffer 1600d02842fSSascha Wildner * 1610d02842fSSascha Wildner ******************************************************************************/ 1620d02842fSSascha Wildner 1630d02842fSSascha Wildner void 1640d02842fSSascha Wildner AcpiDbDisplayHistory ( 1650d02842fSSascha Wildner void) 1660d02842fSSascha Wildner { 1670d02842fSSascha Wildner UINT32 i; 1680d02842fSSascha Wildner UINT16 HistoryIndex; 1690d02842fSSascha Wildner 1700d02842fSSascha Wildner 1710d02842fSSascha Wildner HistoryIndex = AcpiGbl_LoHistory; 1720d02842fSSascha Wildner 1730d02842fSSascha Wildner /* Dump entire history buffer */ 1740d02842fSSascha Wildner 1750d02842fSSascha Wildner for (i = 0; i < AcpiGbl_NumHistory; i++) 1760d02842fSSascha Wildner { 1770d02842fSSascha Wildner if (AcpiGbl_HistoryBuffer[HistoryIndex].Command) 1780d02842fSSascha Wildner { 1790d02842fSSascha Wildner AcpiOsPrintf ("%3ld %s\n", 1800d02842fSSascha Wildner AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum, 1810d02842fSSascha Wildner AcpiGbl_HistoryBuffer[HistoryIndex].Command); 1820d02842fSSascha Wildner } 1830d02842fSSascha Wildner 1840d02842fSSascha Wildner HistoryIndex++; 1850d02842fSSascha Wildner if (HistoryIndex >= HISTORY_SIZE) 1860d02842fSSascha Wildner { 1870d02842fSSascha Wildner HistoryIndex = 0; 1880d02842fSSascha Wildner } 1890d02842fSSascha Wildner } 1900d02842fSSascha Wildner } 1910d02842fSSascha Wildner 1920d02842fSSascha Wildner 1930d02842fSSascha Wildner /******************************************************************************* 1940d02842fSSascha Wildner * 1950d02842fSSascha Wildner * FUNCTION: AcpiDbGetFromHistory 1960d02842fSSascha Wildner * 1970d02842fSSascha Wildner * PARAMETERS: CommandNumArg - String containing the number of the 1980d02842fSSascha Wildner * command to be retrieved 1990d02842fSSascha Wildner * 2000d02842fSSascha Wildner * RETURN: Pointer to the retrieved command. Null on error. 2010d02842fSSascha Wildner * 2020d02842fSSascha Wildner * DESCRIPTION: Get a command from the history buffer 2030d02842fSSascha Wildner * 2040d02842fSSascha Wildner ******************************************************************************/ 2050d02842fSSascha Wildner 2060d02842fSSascha Wildner char * 2070d02842fSSascha Wildner AcpiDbGetFromHistory ( 2080d02842fSSascha Wildner char *CommandNumArg) 2090d02842fSSascha Wildner { 2100d02842fSSascha Wildner UINT32 CmdNum; 2110d02842fSSascha Wildner 2120d02842fSSascha Wildner 2130d02842fSSascha Wildner if (CommandNumArg == NULL) 2140d02842fSSascha Wildner { 2150d02842fSSascha Wildner CmdNum = AcpiGbl_NextCmdNum - 1; 2160d02842fSSascha Wildner } 2170d02842fSSascha Wildner 2180d02842fSSascha Wildner else 2190d02842fSSascha Wildner { 2200d02842fSSascha Wildner CmdNum = ACPI_STRTOUL (CommandNumArg, NULL, 0); 2210d02842fSSascha Wildner } 2220d02842fSSascha Wildner 2230d02842fSSascha Wildner return (AcpiDbGetHistoryByIndex (CmdNum)); 2240d02842fSSascha Wildner } 2250d02842fSSascha Wildner 2260d02842fSSascha Wildner 2270d02842fSSascha Wildner /******************************************************************************* 2280d02842fSSascha Wildner * 2290d02842fSSascha Wildner * FUNCTION: AcpiDbGetHistoryByIndex 2300d02842fSSascha Wildner * 2310d02842fSSascha Wildner * PARAMETERS: CmdNum - Index of the desired history entry. 2320d02842fSSascha Wildner * Values are 0...(AcpiGbl_NextCmdNum - 1) 2330d02842fSSascha Wildner * 2340d02842fSSascha Wildner * RETURN: Pointer to the retrieved command. Null on error. 2350d02842fSSascha Wildner * 2360d02842fSSascha Wildner * DESCRIPTION: Get a command from the history buffer 2370d02842fSSascha Wildner * 2380d02842fSSascha Wildner ******************************************************************************/ 2390d02842fSSascha Wildner 2400d02842fSSascha Wildner char * 2410d02842fSSascha Wildner AcpiDbGetHistoryByIndex ( 2420d02842fSSascha Wildner UINT32 CmdNum) 2430d02842fSSascha Wildner { 2440d02842fSSascha Wildner UINT32 i; 2450d02842fSSascha Wildner UINT16 HistoryIndex; 2460d02842fSSascha Wildner 2470d02842fSSascha Wildner 2480d02842fSSascha Wildner /* Search history buffer */ 2490d02842fSSascha Wildner 2500d02842fSSascha Wildner HistoryIndex = AcpiGbl_LoHistory; 2510d02842fSSascha Wildner for (i = 0; i < AcpiGbl_NumHistory; i++) 2520d02842fSSascha Wildner { 2530d02842fSSascha Wildner if (AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum == CmdNum) 2540d02842fSSascha Wildner { 2550d02842fSSascha Wildner /* Found the command, return it */ 2560d02842fSSascha Wildner 2570d02842fSSascha Wildner return (AcpiGbl_HistoryBuffer[HistoryIndex].Command); 2580d02842fSSascha Wildner } 2590d02842fSSascha Wildner 2600d02842fSSascha Wildner /* History buffer is circular */ 2610d02842fSSascha Wildner 2620d02842fSSascha Wildner HistoryIndex++; 2630d02842fSSascha Wildner if (HistoryIndex >= HISTORY_SIZE) 2640d02842fSSascha Wildner { 2650d02842fSSascha Wildner HistoryIndex = 0; 2660d02842fSSascha Wildner } 2670d02842fSSascha Wildner } 2680d02842fSSascha Wildner 2690d02842fSSascha Wildner AcpiOsPrintf ("Invalid history number: %u\n", HistoryIndex); 2700d02842fSSascha Wildner return (NULL); 2710d02842fSSascha Wildner } 2720d02842fSSascha Wildner 2730d02842fSSascha Wildner #endif /* ACPI_DEBUGGER */ 274