xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/debugger/dbhistry.c (revision fe7b5cb4c90e398c6bb35082299e03f913b608d1)
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