VirtualBox

source: vbox/trunk/src/VBox/Debugger/DBGCInternal.h@ 57278

Last change on this file since 57278 was 55881, checked in by vboxsync, 10 years ago

DBGF,DBGC: Moved the plug-ins from DBGC to DBGF so we can make use of them via IMachineDebugger.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.0 KB
Line 
1/* $Id: DBGCInternal.h 55881 2015-05-16 01:02:51Z vboxsync $ */
2/** @file
3 * DBGC - Debugger Console, Internal Header File.
4 */
5
6/*
7 * Copyright (C) 2006-2015 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19#ifndef ___Debugger_DBGCInternal_h
20#define ___Debugger_DBGCInternal_h
21
22
23/*******************************************************************************
24* Header Files *
25*******************************************************************************/
26#include <VBox/dbg.h>
27#include <VBox/err.h>
28
29
30/*******************************************************************************
31* Structures and Typedefs *
32*******************************************************************************/
33
34/**
35 * Debugger console per breakpoint data.
36 */
37typedef struct DBGCBP
38{
39 /** Pointer to the next breakpoint in the list. */
40 struct DBGCBP *pNext;
41 /** The breakpoint identifier. */
42 uint32_t iBp;
43 /** The size of the command. */
44 size_t cchCmd;
45 /** The command to execute when the breakpoint is hit. */
46 char szCmd[1];
47} DBGCBP;
48/** Pointer to a breakpoint. */
49typedef DBGCBP *PDBGCBP;
50
51
52/**
53 * Named variable.
54 *
55 * Always allocated from heap in one single block.
56 */
57typedef struct DBGCNAMEDVAR
58{
59 /** The variable. */
60 DBGCVAR Var;
61 /** Its name. */
62 char szName[1];
63} DBGCNAMEDVAR;
64/** Pointer to named variable. */
65typedef DBGCNAMEDVAR *PDBGCNAMEDVAR;
66
67
68/**
69 * Debugger console status
70 */
71typedef enum DBGCSTATUS
72{
73 /** Normal status, .*/
74 DBGC_HALTED
75
76} DBGCSTATUS;
77
78
79/**
80 * Debugger console instance data.
81 */
82typedef struct DBGC
83{
84 /** Command helpers. */
85 DBGCCMDHLP CmdHlp;
86 /** Wrappers for DBGF output. */
87 DBGFINFOHLP DbgfOutputHlp;
88 /** Pointer to backend callback structure. */
89 PDBGCBACK pBack;
90
91 /** Pointer to the current VM. */
92 PVM pVM;
93 /** The user mode handle of the current VM. */
94 PUVM pUVM;
95 /** The ID of current virtual CPU. */
96 VMCPUID idCpu;
97 /** The current address space handle. */
98 RTDBGAS hDbgAs;
99 /** The current debugger emulation. */
100 const char *pszEmulation;
101 /** Pointer to the commands for the current debugger emulation. */
102 PCDBGCCMD paEmulationCmds;
103 /** The number of commands paEmulationCmds points to. */
104 unsigned cEmulationCmds;
105 /** Pointer to the functions for the current debugger emulation. */
106 PCDBGCFUNC paEmulationFuncs;
107 /** The number of functions paEmulationFuncs points to. */
108 uint32_t cEmulationFuncs;
109 /** Log indicator. (If set we're writing the log to the console.) */
110 bool fLog;
111
112 /** Indicates whether we're in guest (true) or hypervisor (false) register context. */
113 bool fRegCtxGuest;
114 /** Indicates whether the register are terse or sparse. */
115 bool fRegTerse;
116 /** Counter use to suppress the printing of the headers. */
117 uint8_t cPagingHierarchyDumps;
118
119 /** Current disassembler position. */
120 DBGCVAR DisasmPos;
121 /** The flags that goes with DisasmPos. */
122 uint32_t fDisasm;
123 /** Current source position. (flat GC) */
124 DBGCVAR SourcePos;
125 /** Current memory dump position. */
126 DBGCVAR DumpPos;
127 /** Size of the previous dump element. */
128 unsigned cbDumpElement;
129 /** Points to DisasmPos, SourcePos or DumpPos depending on which was
130 * used last. */
131 PCDBGCVAR pLastPos;
132
133 /** Number of variables in papVars. */
134 unsigned cVars;
135 /** Array of global variables.
136 * Global variables can be referenced using the $ operator and set
137 * and unset using command with those names. */
138 PDBGCNAMEDVAR *papVars;
139
140 /** The list of breakpoints. (singly linked) */
141 PDBGCBP pFirstBp;
142
143 /** Save search pattern. */
144 uint8_t abSearch[256];
145 /** The length of the search pattern. */
146 uint32_t cbSearch;
147 /** The search unit */
148 uint32_t cbSearchUnit;
149 /** The max hits. */
150 uint64_t cMaxSearchHits;
151 /** The address to resume searching from. */
152 DBGFADDRESS SearchAddr;
153 /** What's left of the original search range. */
154 RTGCUINTPTR cbSearchRange;
155
156 /** @name Parsing and Execution
157 * @{ */
158
159 /** Input buffer. */
160 char achInput[2048];
161 /** To ease debugging. */
162 unsigned uInputZero;
163 /** Write index in the input buffer. */
164 unsigned iWrite;
165 /** Read index in the input buffer. */
166 unsigned iRead;
167 /** The number of lines in the buffer. */
168 unsigned cInputLines;
169 /** Indicates that we have a buffer overflow condition.
170 * This means that input is ignored up to the next newline. */
171 bool fInputOverflow;
172 /** Indicates whether or we're ready for input. */
173 bool fReady;
174 /** Scratch buffer position. */
175 char *pszScratch;
176 /** Scratch buffer. */
177 char achScratch[16384];
178 /** Argument array position. */
179 unsigned iArg;
180 /** Array of argument variables. */
181 DBGCVAR aArgs[100];
182
183 /** rc from the last dbgcHlpPrintfV(). */
184 int rcOutput;
185 /** The last character we wrote. */
186 char chLastOutput;
187
188 /** rc from the last command. */
189 int rcCmd;
190 /** @} */
191} DBGC;
192/** Pointer to debugger console instance data. */
193typedef DBGC *PDBGC;
194
195/** Converts a Command Helper pointer to a pointer to DBGC instance data. */
196#define DBGC_CMDHLP2DBGC(pCmdHlp) ( (PDBGC)((uintptr_t)(pCmdHlp) - RT_OFFSETOF(DBGC, CmdHlp)) )
197
198
199/**
200 * Chunk of external commands.
201 */
202typedef struct DBGCEXTCMDS
203{
204 /** Number of commands descriptors. */
205 unsigned cCmds;
206 /** Pointer to array of command descriptors. */
207 PCDBGCCMD paCmds;
208 /** Pointer to the next chunk. */
209 struct DBGCEXTCMDS *pNext;
210} DBGCEXTCMDS;
211/** Pointer to chunk of external commands. */
212typedef DBGCEXTCMDS *PDBGCEXTCMDS;
213
214
215/**
216 * Chunk of external functions.
217 */
218typedef struct DBGCEXTFUNCS
219{
220 /** Number of functions descriptors. */
221 uint32_t cFuncs;
222 /** Pointer to array of functions descriptors. */
223 PCDBGCFUNC paFuncs;
224 /** Pointer to the next chunk. */
225 struct DBGCEXTFUNCS *pNext;
226} DBGCEXTFUNCS;
227/** Pointer to chunk of external functions. */
228typedef DBGCEXTFUNCS *PDBGCEXTFUNCS;
229
230
231
232/**
233 * Unary operator handler function.
234 *
235 * @returns 0 on success.
236 * @returns VBox evaluation / parsing error code on failure.
237 * The caller does the bitching.
238 * @param pDbgc Debugger console instance data.
239 * @param pArg The argument.
240 * @param enmCat The desired result category. Can be ignored.
241 * @param pResult Where to store the result.
242 */
243typedef DECLCALLBACK(int) FNDBGCOPUNARY(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
244/** Pointer to a unary operator handler function. */
245typedef FNDBGCOPUNARY *PFNDBGCOPUNARY;
246
247
248/**
249 * Binary operator handler function.
250 *
251 * @returns 0 on success.
252 * @returns VBox evaluation / parsing error code on failure.
253 * The caller does the bitching.
254 * @param pDbgc Debugger console instance data.
255 * @param pArg1 The first argument.
256 * @param pArg2 The 2nd argument.
257 * @param pResult Where to store the result.
258 */
259typedef DECLCALLBACK(int) FNDBGCOPBINARY(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
260/** Pointer to a binary operator handler function. */
261typedef FNDBGCOPBINARY *PFNDBGCOPBINARY;
262
263
264/**
265 * Operator descriptor.
266 */
267typedef struct DBGCOP
268{
269 /** Operator mnemonic. */
270 char szName[4];
271 /** Length of name. */
272 const unsigned cchName;
273 /** Whether or not this is a binary operator.
274 * Unary operators are evaluated right-to-left while binary are left-to-right. */
275 bool fBinary;
276 /** Precedence level. */
277 unsigned iPrecedence;
278 /** Unary operator handler. */
279 PFNDBGCOPUNARY pfnHandlerUnary;
280 /** Binary operator handler. */
281 PFNDBGCOPBINARY pfnHandlerBinary;
282 /** The category of the 1st argument.
283 * Set to DBGCVAR_CAT_ANY if anything goes. */
284 DBGCVARCAT enmCatArg1;
285 /** The category of the 2nd argument.
286 * Set to DBGCVAR_CAT_ANY if anything goes. */
287 DBGCVARCAT enmCatArg2;
288 /** Operator description. */
289 const char *pszDescription;
290} DBGCOP;
291/** Pointer to an operator descriptor. */
292typedef DBGCOP *PDBGCOP;
293/** Pointer to a const operator descriptor. */
294typedef const DBGCOP *PCDBGCOP;
295
296
297
298/** Pointer to symbol descriptor. */
299typedef struct DBGCSYM *PDBGCSYM;
300/** Pointer to const symbol descriptor. */
301typedef const struct DBGCSYM *PCDBGCSYM;
302
303/**
304 * Get builtin symbol.
305 *
306 * @returns 0 on success.
307 * @returns VBox evaluation / parsing error code on failure.
308 * The caller does the bitching.
309 * @param pSymDesc Pointer to the symbol descriptor.
310 * @param pCmdHlp Pointer to the command callback structure.
311 * @param enmType The result type.
312 * @param pResult Where to store the result.
313 */
314typedef DECLCALLBACK(int) FNDBGCSYMGET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult);
315/** Pointer to get function for a builtin symbol. */
316typedef FNDBGCSYMGET *PFNDBGCSYMGET;
317
318/**
319 * Set builtin symbol.
320 *
321 * @returns 0 on success.
322 * @returns VBox evaluation / parsing error code on failure.
323 * The caller does the bitching.
324 * @param pSymDesc Pointer to the symbol descriptor.
325 * @param pCmdHlp Pointer to the command callback structure.
326 * @param pValue The value to assign the symbol.
327 */
328typedef DECLCALLBACK(int) FNDBGCSYMSET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue);
329/** Pointer to set function for a builtin symbol. */
330typedef FNDBGCSYMSET *PFNDBGCSYMSET;
331
332
333/**
334 * Symbol description (for builtin symbols).
335 */
336typedef struct DBGCSYM
337{
338 /** Symbol name. */
339 const char *pszName;
340 /** Get function. */
341 PFNDBGCSYMGET pfnGet;
342 /** Set function. (NULL if readonly) */
343 PFNDBGCSYMSET pfnSet;
344 /** User data. */
345 unsigned uUser;
346} DBGCSYM;
347
348
349/*******************************************************************************
350* Internal Functions *
351*******************************************************************************/
352int dbgcBpAdd(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
353int dbgcBpUpdate(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
354int dbgcBpDelete(PDBGC pDbgc, RTUINT iBp);
355PDBGCBP dbgcBpGet(PDBGC pDbgc, RTUINT iBp);
356int dbgcBpExec(PDBGC pDbgc, RTUINT iBp);
357
358void dbgcEvalInit(void);
359int dbgcEvalSub(PDBGC pDbgc, char *pszExpr, size_t cchExpr, DBGCVARCAT enmCategory, PDBGCVAR pResult);
360int dbgcEvalCommand(PDBGC pDbgc, char *pszCmd, size_t cchCmd, bool fNoExecute);
361
362int dbgcSymbolGet(PDBGC pDbgc, const char *pszSymbol, DBGCVARTYPE enmType, PDBGCVAR pResult);
363PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol);
364PCDBGCOP dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev);
365PCDBGCCMD dbgcCommandLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
366PCDBGCFUNC dbgcFunctionLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
367
368DECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
369DECLCALLBACK(int) dbgcOpAddrFlat(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
370DECLCALLBACK(int) dbgcOpAddrHost(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
371DECLCALLBACK(int) dbgcOpAddrPhys(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
372DECLCALLBACK(int) dbgcOpAddrHostPhys(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
373
374void dbgcInitCmdHlp(PDBGC pDbgc);
375
376/* For tstDBGCParser: */
377int dbgcCreate(PDBGC *ppDbgc, PDBGCBACK pBack, unsigned fFlags);
378int dbgcRun(PDBGC pDbgc);
379int dbgcProcessInput(PDBGC pDbgc, bool fNoExecute);
380void dbgcDestroy(PDBGC pDbgc);
381
382
383/*******************************************************************************
384* Global Variables *
385*******************************************************************************/
386extern const DBGCCMD g_aDbgcCmds[];
387extern const uint32_t g_cDbgcCmds;
388extern const DBGCFUNC g_aDbgcFuncs[];
389extern const uint32_t g_cDbgcFuncs;
390extern const DBGCCMD g_aCmdsCodeView[];
391extern const uint32_t g_cCmdsCodeView;
392extern const DBGCFUNC g_aFuncsCodeView[];
393extern const uint32_t g_cFuncsCodeView;
394extern const DBGCOP g_aDbgcOps[];
395extern const uint32_t g_cDbgcOps;
396
397
398/*******************************************************************************
399* Defined Constants And Macros *
400*******************************************************************************/
401/** Locks the g_pExtCmdsHead and g_pExtFuncsHead lists for reading. */
402#define DBGCEXTLISTS_LOCK_RD() do { } while (0)
403/** Locks the g_pExtCmdsHead and g_pExtFuncsHead lists for writing. */
404#define DBGCEXTLISTS_LOCK_WR() do { } while (0)
405/** UnLocks the g_pExtCmdsHead and g_pExtFuncsHead lists after reading. */
406#define DBGCEXTLISTS_UNLOCK_RD() do { } while (0)
407/** UnLocks the g_pExtCmdsHead and g_pExtFuncsHead lists after writing. */
408#define DBGCEXTLISTS_UNLOCK_WR() do { } while (0)
409
410
411
412#endif
413
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette