VirtualBox

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

Last change on this file since 6290 was 6000, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change, fixes.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.1 KB
Line 
1/** $Id: DBGCInternal.h 6000 2007-12-07 15:12:49Z vboxsync $ */
2/** @file
3 * DBGC - Debugger Console, Internal Header File.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
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#ifndef ___DBGCInternal_h
19#define ___DBGCInternal_h
20
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#include <VBox/dbg.h>
26
27
28/*******************************************************************************
29* Defined Constants And Macros *
30*******************************************************************************/
31/* to err.h! */
32#define VERR_DBGC_QUIT (-11999)
33#define VERR_PARSE_FIRST (-11000)
34#define VERR_PARSE_TOO_FEW_ARGUMENTS (VERR_PARSE_FIRST - 0)
35#define VERR_PARSE_TOO_MANY_ARGUMENTS (VERR_PARSE_FIRST - 1)
36#define VERR_PARSE_ARGUMENT_OVERFLOW (VERR_PARSE_FIRST - 2)
37#define VERR_PARSE_ARGUMENT_TYPE_MISMATCH (VERR_PARSE_FIRST - 3)
38#define VERR_PARSE_NO_RANGE_ALLOWED (VERR_PARSE_FIRST - 4)
39#define VERR_PARSE_UNBALANCED_QUOTE (VERR_PARSE_FIRST - 5)
40#define VERR_PARSE_UNBALANCED_PARENTHESIS (VERR_PARSE_FIRST - 6)
41#define VERR_PARSE_EMPTY_ARGUMENT (VERR_PARSE_FIRST - 7)
42#define VERR_PARSE_UNEXPECTED_OPERATOR (VERR_PARSE_FIRST - 8)
43#define VERR_PARSE_INVALID_NUMBER (VERR_PARSE_FIRST - 9)
44#define VERR_PARSE_NUMBER_TOO_BIG (VERR_PARSE_FIRST - 10)
45#define VERR_PARSE_INVALID_OPERATION (VERR_PARSE_FIRST - 11)
46#define VERR_PARSE_FUNCTION_NOT_FOUND (VERR_PARSE_FIRST - 12)
47#define VERR_PARSE_NOT_A_FUNCTION (VERR_PARSE_FIRST - 13)
48#define VERR_PARSE_NO_MEMORY (VERR_PARSE_FIRST - 14)
49#define VERR_PARSE_INCORRECT_ARG_TYPE (VERR_PARSE_FIRST - 15)
50#define VERR_PARSE_VARIABLE_NOT_FOUND (VERR_PARSE_FIRST - 16)
51#define VERR_PARSE_CONVERSION_FAILED (VERR_PARSE_FIRST - 17)
52#define VERR_PARSE_NOT_IMPLEMENTED (VERR_PARSE_FIRST - 18)
53#define VERR_PARSE_BAD_RESULT_TYPE (VERR_PARSE_FIRST - 19)
54#define VERR_PARSE_WRITEONLY_SYMBOL (VERR_PARSE_FIRST - 20)
55#define VERR_PARSE_NO_ARGUMENT_MATCH (VERR_PARSE_FIRST - 21)
56#define VINF_PARSE_COMMAND_NOT_FOUND (VERR_PARSE_FIRST - 22)
57#define VINF_PARSE_INVALD_COMMAND_NAME (VERR_PARSE_FIRST - 23)
58#define VERR_PARSE_LAST (VERR_PARSE_FIRST - 30)
59
60#define VWRN_DBGC_CMD_PENDING 12000
61#define VWRN_DBGC_ALREADY_REGISTERED 12001
62#define VERR_DBGC_COMMANDS_NOT_REGISTERED (-12002)
63#define VERR_DBGC_BP_NOT_FOUND (-12003)
64#define VERR_DBGC_BP_EXISTS (-12004)
65#define VINF_DBGC_BP_NO_COMMAND 12005
66#define VERR_DBGC_COMMAND_FAILED (-12006)
67
68
69/*******************************************************************************
70* Structures and Typedefs *
71*******************************************************************************/
72
73/**
74 * Debugger console per breakpoint data.
75 */
76typedef struct DBGCBP
77{
78 /** Pointer to the next breakpoint in the list. */
79 struct DBGCBP *pNext;
80 /** The breakpoint identifier. */
81 RTUINT iBp;
82 /** The size of the command. */
83 size_t cchCmd;
84 /** The command to execute when the breakpoint is hit. */
85 char szCmd[1];
86} DBGCBP;
87/** Pointer to a breakpoint. */
88typedef DBGCBP *PDBGCBP;
89
90
91/**
92 * Named variable.
93 *
94 * Always allocated from heap in one signle block.
95 */
96typedef struct DBGCNAMEDVAR
97{
98 /** The variable. */
99 DBGCVAR Var;
100 /** It's name. */
101 char szName[1];
102} DBGCNAMEDVAR;
103/** Pointer to named variable. */
104typedef DBGCNAMEDVAR *PDBGCNAMEDVAR;
105
106
107/**
108 * Debugger console status
109 */
110typedef enum DBGCSTATUS
111{
112 /** Normal status, .*/
113 DBGC_HALTED
114
115} DBGCSTATUS;
116
117
118/**
119 * Debugger console instance data.
120 */
121typedef struct DBGC
122{
123 /** Command helpers. */
124 DBGCCMDHLP CmdHlp;
125 /** Pointer to backend callback structure. */
126 PDBGCBACK pBack;
127
128 /** Pointer to the current VM. */
129 PVM pVM;
130 /** The current debugger emulation. */
131 const char *pszEmulation;
132 /** Pointer to the command and functions for the current debugger emulation. */
133 PCDBGCCMD paEmulationCmds;
134 /** The number of commands paEmulationCmds points to. */
135 unsigned cEmulationCmds;
136 /** Log indicator. (If set we're writing the log to the console.) */
137 bool fLog;
138
139 /** Indicates whether we're in guest (true) or hypervisor (false) register context. */
140 bool fRegCtxGuest;
141 /** Indicates whether the register are terse or sparse. */
142 bool fRegTerse;
143
144 /** Current dissassembler position. */
145 DBGCVAR DisasmPos;
146 /** Current source position. (flat GC) */
147 DBGCVAR SourcePos;
148 /** Current memory dump position. */
149 DBGCVAR DumpPos;
150 /** Size of the previous dump element. */
151 unsigned cbDumpElement;
152
153 /** Number of variables in papVars. */
154 unsigned cVars;
155 /** Array of global variables.
156 * Global variables can be referenced using the $ operator and set
157 * and unset using command with those names. */
158 PDBGCNAMEDVAR *papVars;
159
160 /** The list of breakpoints. (singly linked) */
161 PDBGCBP pFirstBp;
162
163 /** Save search pattern. */
164 uint8_t abSearch[256];
165 /** The length of the search pattern. */
166 uint32_t cbSearch;
167 /** The search unit */
168 uint32_t cbSearchUnit;
169 /** The max hits. */
170 uint64_t cMaxSearchHits;
171 /** The address to resume searching from. */
172 DBGFADDRESS SearchAddr;
173 /** What's left of the original search range. */
174 RTGCUINTPTR cbSearchRange;
175
176 /** @name Parsing and Execution
177 * @{ */
178
179 /** Input buffer. */
180 char achInput[2048];
181 /** To ease debugging. */
182 unsigned uInputZero;
183 /** Write index in the input buffer. */
184 unsigned iWrite;
185 /** Read index in the input buffer. */
186 unsigned iRead;
187 /** The number of lines in the buffer. */
188 unsigned cInputLines;
189 /** Indicates that we have a buffer overflow condition.
190 * This means that input is ignored up to the next newline. */
191 bool fInputOverflow;
192 /** Indicates whether or we're ready for input. */
193 bool fReady;
194
195 /** Scratch buffer position. */
196 char *pszScratch;
197 /** Scratch buffer. */
198 char achScratch[16384];
199 /** Argument array position. */
200 unsigned iArg;
201 /** Array of argument variables. */
202 DBGCVAR aArgs[100];
203
204 /** rc from the last dbgcHlpPrintfV(). */
205 int rcOutput;
206 /** rc from the last command. */
207 int rcCmd;
208 /** @} */
209} DBGC;
210/** Pointer to debugger console instance data. */
211typedef DBGC *PDBGC;
212
213/** Converts a Command Helper pointer to a pointer to DBGC instance data. */
214#define DBGC_CMDHLP2DBGC(pCmdHlp) ( (PDBGC)((uintptr_t)(pCmdHlp) - RT_OFFSETOF(DBGC, CmdHlp)) )
215
216
217/**
218 * Chunk of external commands.
219 */
220typedef struct DBGCEXTCMDS
221{
222 /** Number of commands descriptors. */
223 unsigned cCmds;
224 /** Pointer to array of command descriptors. */
225 PCDBGCCMD paCmds;
226 /** Pointer to the next chunk. */
227 struct DBGCEXTCMDS *pNext;
228} DBGCEXTCMDS;
229/** Pointer to chunk of external commands. */
230typedef DBGCEXTCMDS *PDBGCEXTCMDS;
231
232
233
234/**
235 * Unary operator handler function.
236 *
237 * @returns 0 on success.
238 * @returns VBox evaluation / parsing error code on failure.
239 * The caller does the bitching.
240 * @param pDbgc Debugger console instance data.
241 * @param pArg The argument.
242 * @param pResult Where to store the result.
243 */
244typedef DECLCALLBACK(int) FNDBGCOPUNARY(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
245/** Pointer to a unary operator handler function. */
246typedef FNDBGCOPUNARY *PFNDBGCOPUNARY;
247
248
249/**
250 * Binary operator handler function.
251 *
252 * @returns 0 on success.
253 * @returns VBox evaluation / parsing error code on failure.
254 * The caller does the bitching.
255 * @param pDbgc Debugger console instance data.
256 * @param pArg1 The first argument.
257 * @param pArg2 The 2nd argument.
258 * @param pResult Where to store the result.
259 */
260typedef DECLCALLBACK(int) FNDBGCOPBINARY(PDBGC pDbgc, PCDBGCVAR pArg1, PCDBGCVAR pArg2, PDBGCVAR pResult);
261/** Pointer to a binary operator handler function. */
262typedef FNDBGCOPBINARY *PFNDBGCOPBINARY;
263
264
265/**
266 * Operator descriptor.
267 */
268typedef struct DBGCOP
269{
270 /** Operator mnemonic. */
271 char szName[4];
272 /** Length of name. */
273 const unsigned cchName;
274 /** Whether or not this is a binary operator.
275 * Unary operators are evaluated right-to-left while binary are left-to-right. */
276 bool fBinary;
277 /** Precedence level. */
278 unsigned iPrecedence;
279 /** Unary operator handler. */
280 PFNDBGCOPUNARY pfnHandlerUnary;
281 /** Binary operator handler. */
282 PFNDBGCOPBINARY pfnHandlerBinary;
283 /** Operator description. */
284 const char *pszDescription;
285} DBGCOP;
286/** Pointer to an operator descriptor. */
287typedef DBGCOP *PDBGCOP;
288/** Pointer to a const operator descriptor. */
289typedef const DBGCOP *PCDBGCOP;
290
291
292
293/** Pointer to symbol descriptor. */
294typedef struct DBGCSYM *PDBGCSYM;
295/** Pointer to const symbol descriptor. */
296typedef const struct DBGCSYM *PCDBGCSYM;
297
298/**
299 * Get builtin symbol.
300 *
301 * @returns 0 on success.
302 * @returns VBox evaluation / parsing error code on failure.
303 * The caller does the bitching.
304 * @param pSymDesc Pointer to the symbol descriptor.
305 * @param pCmdHlp Pointer to the command callback structure.
306 * @param enmType The result type.
307 * @param pResult Where to store the result.
308 */
309typedef DECLCALLBACK(int) FNDBGCSYMGET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult);
310/** Pointer to get function for a builtin symbol. */
311typedef FNDBGCSYMGET *PFNDBGCSYMGET;
312
313/**
314 * Set builtin symbol.
315 *
316 * @returns 0 on success.
317 * @returns VBox evaluation / parsing error code on failure.
318 * The caller does the bitching.
319 * @param pSymDesc Pointer to the symbol descriptor.
320 * @param pCmdHlp Pointer to the command callback structure.
321 * @param pValue The value to assign the symbol.
322 */
323typedef DECLCALLBACK(int) FNDBGCSYMSET(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue);
324/** Pointer to set function for a builtin symbol. */
325typedef FNDBGCSYMSET *PFNDBGCSYMSET;
326
327
328/**
329 * Symbol description (for builtin symbols).
330 */
331typedef struct DBGCSYM
332{
333 /** Symbol name. */
334 const char *pszName;
335 /** Get function. */
336 PFNDBGCSYMGET pfnGet;
337 /** Set function. (NULL if readonly) */
338 PFNDBGCSYMSET pfnSet;
339 /** User data. */
340 unsigned uUser;
341} DBGCSYM;
342
343
344/*******************************************************************************
345* Internal Functions *
346*******************************************************************************/
347int dbgcBpAdd(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
348int dbgcBpUpdate(PDBGC pDbgc, RTUINT iBp, const char *pszCmd);
349int dbgcBpDelete(PDBGC pDbgc, RTUINT iBp);
350PDBGCBP dbgcBpGet(PDBGC pDbgc, RTUINT iBp);
351int dbgcBpExec(PDBGC pDbgc, RTUINT iBp);
352
353void dbgcVarInit(PDBGCVAR pVar);
354void dbgcVarSetGCFlat(PDBGCVAR pVar, RTGCPTR GCFlat);
355void dbgcVarSetGCFlatByteRange(PDBGCVAR pVar, RTGCPTR GCFlat, uint64_t cb);
356void dbgcVarSetU64(PDBGCVAR pVar, uint64_t u64);
357void dbgcVarSetVar(PDBGCVAR pVar, PCDBGCVAR pVar2);
358void dbgcVarSetDbgfAddr(PDBGCVAR pVar, PCDBGFADDRESS pAddress);
359void dbgcVarSetNoRange(PDBGCVAR pVar);
360void dbgcVarSetByteRange(PDBGCVAR pVar, uint64_t cb);
361int dbgcVarToDbgfAddr(PDBGC pDbgc, PCDBGCVAR pVar, PDBGFADDRESS pAddress);
362
363int dbgcEvalSub(PDBGC pDbgc, char *pszExpr, size_t cchExpr, PDBGCVAR pResult);
364int dbgcProcessCommand(PDBGC pDbgc, char *pszCmd, size_t cchCmd, bool fNoExecute);
365
366int dbgcSymbolGet(PDBGC pDbgc, const char *pszSymbol, DBGCVARTYPE enmType, PDBGCVAR pResult);
367PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol);
368PCDBGCOP dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev);
369PCDBGCCMD dbgcRoutineLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
370
371DECLCALLBACK(int) dbgcOpAddrFlat(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
372DECLCALLBACK(int) dbgcOpAddrHost(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
373DECLCALLBACK(int) dbgcOpAddrPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
374DECLCALLBACK(int) dbgcOpAddrHostPhys(PDBGC pDbgc, PCDBGCVAR pArg, PDBGCVAR pResult);
375
376void dbgcInitCmdHlp(PDBGC pDbgc);
377
378/* For tstDBGCParser: */
379int dbgcCreate(PDBGC *ppDbgc, PDBGCBACK pBack, unsigned fFlags);
380int dbgcRun(PDBGC pDbgc);
381int dbgcProcessInput(PDBGC pDbgc, bool fNoExecute);
382void dbgcDestroy(PDBGC pDbgc);
383
384
385/*******************************************************************************
386* Global Variables *
387*******************************************************************************/
388extern const DBGCCMD g_aCmds[];
389extern const unsigned g_cCmds;
390extern const DBGCCMD g_aCmdsCodeView[];
391extern const unsigned g_cCmdsCodeView;
392extern const DBGCOP g_aOps[];
393extern const unsigned g_cOps;
394
395
396#endif
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