VirtualBox

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

Last change on this file since 31966 was 31966, checked in by vboxsync, 14 years ago

DBGF,PGM,DBGC: dumping page tables - hacking still in progress (sigh, this takes for ever).

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