VirtualBox

source: vbox/trunk/include/VBox/dbg.h@ 41279

Last change on this file since 41279 was 39154, checked in by vboxsync, 13 years ago

IOM: Added flags for dropping into the vbox debugger on complicated MMIO accesses. DBGF: some namespace cleanups.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 35.1 KB
Line 
1/** @file
2 * Debugger Interfaces. (VBoxDbg)
3 *
4 * This header covers all external interfaces of the Debugger module.
5 * However, it does not cover the DBGF interface since that part of the
6 * VMM. Use dbgf.h for that.
7 */
8
9/*
10 * Copyright (C) 2006-2007 Oracle Corporation
11 *
12 * This file is part of VirtualBox Open Source Edition (OSE), as
13 * available from http://www.virtualbox.org. This file is free software;
14 * you can redistribute it and/or modify it under the terms of the GNU
15 * General Public License (GPL) as published by the Free Software
16 * Foundation, in version 2 as it comes in the "COPYING" file of the
17 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19 *
20 * The contents of this file may alternatively be used under the terms
21 * of the Common Development and Distribution License Version 1.0
22 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
23 * VirtualBox OSE distribution, in which case the provisions of the
24 * CDDL are applicable instead of those of the GPL.
25 *
26 * You may elect to license modified versions of this file under the
27 * terms and conditions of either the GPL or the CDDL or both.
28 */
29
30#ifndef ___VBox_dbg_h
31#define ___VBox_dbg_h
32
33#include <VBox/cdefs.h>
34#include <VBox/types.h>
35#include <VBox/vmm/dbgf.h>
36
37#include <iprt/stdarg.h>
38#ifdef IN_RING3
39# include <iprt/err.h>
40#endif
41
42RT_C_DECLS_BEGIN
43
44#ifdef IN_RING3 /* The debugger stuff is ring-3 only. */
45
46/** @def VBOX_WITH_DEBUGGER
47 * The build is with debugger module. Test if this is defined before registering
48 * external debugger commands. This is normally defined in Config.kmk.
49 */
50#ifdef DOXYGEN_RUNNING
51# define VBOX_WITH_DEBUGGER
52#endif
53
54
55/**
56 * DBGC variable category.
57 *
58 * Used to describe an argument to a command or function and a functions
59 * return value.
60 */
61typedef enum DBGCVARCAT
62{
63 /** Any type is fine. */
64 DBGCVAR_CAT_ANY = 0,
65 /** Any kind of pointer or number. */
66 DBGCVAR_CAT_POINTER_NUMBER,
67 /** Any kind of pointer or number, no range. */
68 DBGCVAR_CAT_POINTER_NUMBER_NO_RANGE,
69 /** Any kind of pointer. */
70 DBGCVAR_CAT_POINTER,
71 /** Any kind of pointer with no range option. */
72 DBGCVAR_CAT_POINTER_NO_RANGE,
73 /** GC pointer. */
74 DBGCVAR_CAT_GC_POINTER,
75 /** GC pointer with no range option. */
76 DBGCVAR_CAT_GC_POINTER_NO_RANGE,
77 /** Numeric argument. */
78 DBGCVAR_CAT_NUMBER,
79 /** Numeric argument with no range option. */
80 DBGCVAR_CAT_NUMBER_NO_RANGE,
81 /** String. */
82 DBGCVAR_CAT_STRING,
83 /** Symbol. */
84 DBGCVAR_CAT_SYMBOL,
85 /** Option. */
86 DBGCVAR_CAT_OPTION,
87 /** Option + string. */
88 DBGCVAR_CAT_OPTION_STRING,
89 /** Option + number. */
90 DBGCVAR_CAT_OPTION_NUMBER
91} DBGCVARCAT;
92
93
94/**
95 * DBGC variable type.
96 */
97typedef enum DBGCVARTYPE
98{
99 /** unknown... */
100 DBGCVAR_TYPE_UNKNOWN = 0,
101 /** Flat GC pointer. */
102 DBGCVAR_TYPE_GC_FLAT,
103 /** Segmented GC pointer. */
104 DBGCVAR_TYPE_GC_FAR,
105 /** Physical GC pointer. */
106 DBGCVAR_TYPE_GC_PHYS,
107 /** Flat HC pointer. */
108 DBGCVAR_TYPE_HC_FLAT,
109 /** Physical HC pointer. */
110 DBGCVAR_TYPE_HC_PHYS,
111 /** String. */
112 DBGCVAR_TYPE_STRING,
113 /** Number. */
114 DBGCVAR_TYPE_NUMBER,
115 /** Symbol.
116 * @todo drop this */
117 DBGCVAR_TYPE_SYMBOL,
118 /** Special type used when querying symbols. */
119 DBGCVAR_TYPE_ANY
120} DBGCVARTYPE;
121
122/** @todo Rename to DBGCVAR_IS_xyz. */
123
124/** Checks if the specified variable type is of a pointer persuasion. */
125#define DBGCVAR_ISPOINTER(enmType) ((enmType) >= DBGCVAR_TYPE_GC_FLAT && enmType <= DBGCVAR_TYPE_HC_PHYS)
126/** Checks if the specified variable type is of a pointer persuasion. */
127#define DBGCVAR_IS_FAR_PTR(enmType) ((enmType) == DBGCVAR_TYPE_GC_FAR)
128/** Checks if the specified variable type is of a pointer persuasion and of the guest context sort. */
129#define DBGCVAR_ISGCPOINTER(enmType) ((enmType) >= DBGCVAR_TYPE_GC_FLAT && (enmType) <= DBGCVAR_TYPE_GC_PHYS)
130/** Checks if the specified variable type is of a pointer persuasion and of the host context sort. */
131#define DBGCVAR_ISHCPOINTER(enmType) ((enmType) >= DBGCVAR_TYPE_HC_FLAT && (enmType) <= DBGCVAR_TYPE_HC_PHYS)
132
133
134/**
135 * DBGC variable range type.
136 */
137typedef enum DBGCVARRANGETYPE
138{
139 /** No range appliable or no range specified. */
140 DBGCVAR_RANGE_NONE = 0,
141 /** Number of elements. */
142 DBGCVAR_RANGE_ELEMENTS,
143 /** Number of bytes. */
144 DBGCVAR_RANGE_BYTES
145} DBGCVARRANGETYPE;
146
147
148/**
149 * Variable descriptor.
150 */
151typedef struct DBGCVARDESC
152{
153 /** The minimal number of times this argument may occur.
154 * Use 0 here to inidicate that the argument is optional. */
155 unsigned cTimesMin;
156 /** Maximum number of occurrences.
157 * Use ~0 here to indicate infinite. */
158 unsigned cTimesMax;
159 /** Argument category. */
160 DBGCVARCAT enmCategory;
161 /** Flags, DBGCVD_FLAGS_* */
162 unsigned fFlags;
163 /** Argument name. */
164 const char *pszName;
165 /** Argument name. */
166 const char *pszDescription;
167} DBGCVARDESC;
168/** Pointer to an argument descriptor. */
169typedef DBGCVARDESC *PDBGCVARDESC;
170/** Pointer to a const argument descriptor. */
171typedef const DBGCVARDESC *PCDBGCVARDESC;
172
173/** Variable descriptor flags.
174 * @{ */
175/** Indicates that the variable depends on the previous being present. */
176#define DBGCVD_FLAGS_DEP_PREV RT_BIT(1)
177/** @} */
178
179
180/**
181 * DBGC variable.
182 */
183typedef struct DBGCVAR
184{
185 /** Pointer to the argument descriptor. */
186 PCDBGCVARDESC pDesc;
187 /** Pointer to the next argument. */
188 struct DBGCVAR *pNext;
189
190 /** Argument type. */
191 DBGCVARTYPE enmType;
192 /** Type specific. */
193 union
194 {
195 /** Flat GC Address. (DBGCVAR_TYPE_GC_FLAT) */
196 RTGCPTR GCFlat;
197 /** Far (16:32) GC Address. (DBGCVAR_TYPE_GC_FAR) */
198 RTFAR32 GCFar;
199 /** Physical GC Address. (DBGCVAR_TYPE_GC_PHYS) */
200 RTGCPHYS GCPhys;
201 /** Flat HC Address. (DBGCVAR_TYPE_HC_FLAT) */
202 void *pvHCFlat;
203 /** Physical GC Address. (DBGCVAR_TYPE_HC_PHYS) */
204 RTHCPHYS HCPhys;
205 /** String. (DBGCVAR_TYPE_STRING)
206 * The basic idea is the the this is a pointer to the expression we're
207 * parsing, so no messing with freeing. */
208 const char *pszString;
209 /** Number. (DBGCVAR_TYPE_NUMBER) */
210 uint64_t u64Number;
211 } u;
212
213 /** Range type. */
214 DBGCVARRANGETYPE enmRangeType;
215 /** Range. The use of the content depends on the enmRangeType. */
216 uint64_t u64Range;
217} DBGCVAR;
218/** Pointer to a command argument. */
219typedef DBGCVAR *PDBGCVAR;
220/** Pointer to a const command argument. */
221typedef const DBGCVAR *PCDBGCVAR;
222
223
224/**
225 * Macro for initializing a DBGC variable with defaults.
226 * The result is an unknown variable type without any range.
227 */
228#define DBGCVAR_INIT(pVar) \
229 do { \
230 (pVar)->pDesc = NULL;\
231 (pVar)->pNext = NULL; \
232 (pVar)->enmType = DBGCVAR_TYPE_UNKNOWN; \
233 (pVar)->u.u64Number = 0; \
234 (pVar)->enmRangeType = DBGCVAR_RANGE_NONE; \
235 (pVar)->u64Range = 0; \
236 } while (0)
237
238/**
239 * Macro for initializing a DBGC variable with a HC physical address.
240 */
241#define DBGCVAR_INIT_HC_PHYS(pVar, Phys) \
242 do { \
243 DBGCVAR_INIT(pVar); \
244 (pVar)->enmType = DBGCVAR_TYPE_HC_PHYS; \
245 (pVar)->u.HCPhys = (Phys); \
246 } while (0)
247
248/**
249 * Macro for initializing a DBGC variable with a HC flat address.
250 */
251#define DBGCVAR_INIT_HC_FLAT(pVar, Flat) \
252 do { \
253 DBGCVAR_INIT(pVar); \
254 (pVar)->enmType = DBGCVAR_TYPE_HC_FLAT; \
255 (pVar)->u.pvHCFlat = (Flat); \
256 } while (0)
257
258/**
259 * Macro for initializing a DBGC variable with a GC physical address.
260 */
261#define DBGCVAR_INIT_GC_PHYS(pVar, Phys) \
262 do { \
263 DBGCVAR_INIT(pVar); \
264 (pVar)->enmType = DBGCVAR_TYPE_GC_PHYS; \
265 (pVar)->u.GCPhys = (Phys); \
266 } while (0)
267
268/**
269 * Macro for initializing a DBGC variable with a GC flat address.
270 */
271#define DBGCVAR_INIT_GC_FLAT(pVar, Flat) \
272 do { \
273 DBGCVAR_INIT(pVar); \
274 (pVar)->enmType = DBGCVAR_TYPE_GC_FLAT; \
275 (pVar)->u.GCFlat = (Flat); \
276 } while (0)
277
278/**
279 * Macro for initializing a DBGC variable with a GC flat address.
280 */
281#define DBGCVAR_INIT_GC_FLAT_BYTE_RANGE(pVar, Flat, cbRange) \
282 do { \
283 DBGCVAR_INIT(pVar); \
284 (pVar)->enmType = DBGCVAR_TYPE_GC_FLAT; \
285 (pVar)->u.GCFlat = (Flat); \
286 DBGCVAR_SET_RANGE(pVar, DBGCVAR_RANGE_BYTES, cbRange); \
287 } while (0)
288
289/**
290 * Macro for initializing a DBGC variable with a GC far address.
291 */
292#define DBGCVAR_INIT_GC_FAR(pVar, _sel, _off) \
293 do { \
294 DBGCVAR_INIT(pVar); \
295 (pVar)->enmType = DBGCVAR_TYPE_GC_FAR; \
296 (pVar)->u.GCFar.sel = (_sel); \
297 (pVar)->u.GCFar.off = (_off); \
298 } while (0)
299
300/**
301 * Macro for initializing a DBGC variable with a number.
302 */
303#define DBGCVAR_INIT_NUMBER(pVar, Value) \
304 do { \
305 DBGCVAR_INIT(pVar); \
306 (pVar)->enmType = DBGCVAR_TYPE_NUMBER; \
307 (pVar)->u.u64Number = (Value); \
308 } while (0)
309
310/**
311 * Macro for initializing a DBGC variable with a string.
312 */
313#define DBGCVAR_INIT_STRING(pVar, a_pszString) \
314 do { \
315 DBGCVAR_INIT(pVar); \
316 (pVar)->enmType = DBGCVAR_TYPE_STRING; \
317 (pVar)->enmRangeType = DBGCVAR_RANGE_BYTES; \
318 (pVar)->u.pszString = (a_pszString); \
319 (pVar)->u64Range = strlen(a_pszString); \
320 } while (0)
321
322
323/**
324 * Macro for setting the range of a DBGC variable.
325 * @param pVar The variable.
326 * @param _enmRangeType The range type.
327 * @param Value The range length value.
328 */
329#define DBGCVAR_SET_RANGE(pVar, _enmRangeType, Value) \
330 do { \
331 (pVar)->enmRangeType = (_enmRangeType); \
332 (pVar)->u64Range = (Value); \
333 } while (0)
334
335
336/**
337 * Macro for setting the range of a DBGC variable.
338 * @param a_pVar The variable.
339 * @param a_cbRange The range, in bytes.
340 */
341#define DBGCVAR_SET_BYTE_RANGE(a_pVar, a_cbRange) \
342 DBGCVAR_SET_RANGE(a_pVar, DBGCVAR_RANGE_BYTES, a_cbRange)
343
344
345/**
346 * Macro for resetting the range a DBGC variable.
347 * @param a_pVar The variable.
348 */
349#define DBGCVAR_ZAP_RANGE(a_pVar) \
350 do { \
351 (a_pVar)->enmRangeType = DBGCVAR_RANGE_NONE; \
352 (a_pVar)->u64Range = 0; \
353 } while (0)
354
355
356/**
357 * Macro for assigning one DBGC variable to another.
358 * @param a_pResult The result (target) variable.
359 * @param a_pVar The source variable.
360 */
361#define DBGCVAR_ASSIGN(a_pResult, a_pVar) \
362 do { \
363 *(a_pResult) = *(a_pVar); \
364 } while (0)
365
366
367/** Pointer to command descriptor. */
368typedef struct DBGCCMD *PDBGCCMD;
369/** Pointer to const command descriptor. */
370typedef const struct DBGCCMD *PCDBGCCMD;
371
372/** Pointer to helper functions for commands. */
373typedef struct DBGCCMDHLP *PDBGCCMDHLP;
374
375
376/**
377 * Helper functions for commands.
378 */
379typedef struct DBGCCMDHLP
380{
381 /** Magic value (DBGCCMDHLP_MAGIC). */
382 uint32_t u32Magic;
383
384 /**
385 * Command helper for writing formatted text to the debug console.
386 *
387 * @returns VBox status.
388 * @param pCmdHlp Pointer to the command callback structure.
389 * @param pcb Where to store the number of bytes written.
390 * @param pszFormat The format string.
391 * This is using the log formatter, so it's format extensions can be used.
392 * @param ... Arguments specified in the format string.
393 */
394 DECLCALLBACKMEMBER(int, pfnPrintf)(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, ...);
395
396 /**
397 * Command helper for writing formatted text to the debug console.
398 *
399 * @returns VBox status.
400 * @param pCmdHlp Pointer to the command callback structure.
401 * @param pcb Where to store the number of bytes written.
402 * @param pszFormat The format string.
403 * This is using the log formatter, so it's format extensions can be used.
404 * @param args Arguments specified in the format string.
405 */
406 DECLCALLBACKMEMBER(int, pfnPrintfV)(PDBGCCMDHLP pCmdHlp, size_t *pcbWritten, const char *pszFormat, va_list args);
407
408 /**
409 * Command helper for formatting and error message for a VBox status code.
410 *
411 * @returns VBox status code appropriate to return from a command.
412 * @param pCmdHlp Pointer to the command callback structure.
413 * @param rc The VBox status code.
414 * @param pszFormat Format string for additional messages. Can be NULL.
415 * @param ... Format arguments, optional.
416 */
417 DECLCALLBACKMEMBER(int, pfnVBoxError)(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, ...);
418
419 /**
420 * Command helper for formatting and error message for a VBox status code.
421 *
422 * @returns VBox status code appropriate to return from a command.
423 * @param pCmdHlp Pointer to the command callback structure.
424 * @param rc The VBox status code.
425 * @param pcb Where to store the number of bytes written.
426 * @param pszFormat Format string for additional messages. Can be NULL.
427 * @param args Format arguments, optional.
428 */
429 DECLCALLBACKMEMBER(int, pfnVBoxErrorV)(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, va_list args);
430
431 /**
432 * Command helper for reading memory specified by a DBGC variable.
433 *
434 * @returns VBox status code appropriate to return from a command.
435 * @param pCmdHlp Pointer to the command callback structure.
436 * @param pVM VM handle if GC or physical HC address.
437 * @param pvBuffer Where to store the read data.
438 * @param cbRead Number of bytes to read.
439 * @param pVarPointer DBGC variable specifying where to start reading.
440 * @param pcbRead Where to store the number of bytes actually read.
441 * This optional, but it's useful when read GC virtual memory where a
442 * page in the requested range might not be present.
443 * If not specified not-present failure or end of a HC physical page
444 * will cause failure.
445 */
446 DECLCALLBACKMEMBER(int, pfnMemRead)(PDBGCCMDHLP pCmdHlp, PVM pVM, void *pvBuffer, size_t cbRead, PCDBGCVAR pVarPointer, size_t *pcbRead);
447
448 /**
449 * Command helper for writing memory specified by a DBGC variable.
450 *
451 * @returns VBox status code appropriate to return from a command.
452 * @param pCmdHlp Pointer to the command callback structure.
453 * @param pVM VM handle if GC or physical HC address.
454 * @param pvBuffer What to write.
455 * @param cbWrite Number of bytes to write.
456 * @param pVarPointer DBGC variable specifying where to start reading.
457 * @param pcbWritten Where to store the number of bytes written.
458 * This is optional. If NULL be aware that some of the buffer
459 * might have been written to the specified address.
460 */
461 DECLCALLBACKMEMBER(int, pfnMemWrite)(PDBGCCMDHLP pCmdHlp, PVM pVM, const void *pvBuffer, size_t cbWrite, PCDBGCVAR pVarPointer, size_t *pcbWritten);
462
463 /**
464 * Executes command an expression.
465 * (Hopefully the parser and functions are fully reentrant.)
466 *
467 * @returns VBox status code appropriate to return from a command.
468 * @param pCmdHlp Pointer to the command callback structure.
469 * @param pszExpr The expression. Format string with the format DBGC extensions.
470 * @param ... Format arguments.
471 */
472 DECLCALLBACKMEMBER(int, pfnExec)(PDBGCCMDHLP pCmdHlp, const char *pszExpr, ...);
473
474 /**
475 * Evaluates an expression.
476 * (Hopefully the parser and functions are fully reentrant.)
477 *
478 * @returns VBox status code appropriate to return from a command.
479 * @param pCmdHlp Pointer to the command callback structure.
480 * @param pResult Where to store the result.
481 * @param pszExpr The expression. Format string with the format DBGC extensions.
482 * @param va Format arguments.
483 */
484 DECLCALLBACKMEMBER(int, pfnEvalV)(PDBGCCMDHLP pCmdHlp, PDBGCVAR pResult, const char *pszExpr, va_list va);
485
486 /**
487 * Print an error and fail the current command.
488 *
489 * @returns VBox status code to pass upwards.
490 *
491 * @param pCmdHlp Pointer to the command callback structure.
492 * @param pCmd The failing command.
493 * @param pszFormat The error message format string.
494 * @param va Format arguments.
495 */
496 DECLCALLBACKMEMBER(int, pfnFailV)(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, const char *pszFormat, va_list va);
497
498 /**
499 * Print an error and fail the current command.
500 *
501 * @returns VBox status code to pass upwards.
502 *
503 * @param pCmdHlp Pointer to the command callback structure.
504 * @param pCmd The failing command.
505 * @param rc The status code indicating the failure. This will
506 * be appended to the message after a colon (': ').
507 * @param pszFormat The error message format string.
508 * @param va Format arguments.
509 *
510 * @see DBGCCmdHlpFailRc
511 */
512 DECLCALLBACKMEMBER(int, pfnFailRcV)(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, int rc, const char *pszFormat, va_list va);
513
514 /**
515 * Parser error.
516 *
517 * @returns VBox status code to pass upwards.
518 *
519 * @param pCmdHlp Pointer to the command callback structure.
520 * @param pCmd The failing command, can be NULL but shouldn't.
521 * @param iArg The offending argument, -1 when lazy.
522 * @param pszExpr The expression.
523 * @param iLine The line number.
524 */
525 DECLCALLBACKMEMBER(int, pfnParserError)(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, int iArg, const char *pszExpr, unsigned iLine);
526
527 /**
528 * Converts a DBGC variable to a DBGF address structure.
529 *
530 * @returns VBox status code.
531 * @param pCmdHlp Pointer to the command callback structure.
532 * @param pVar The variable to convert.
533 * @param pAddress The target address.
534 */
535 DECLCALLBACKMEMBER(int, pfnVarToDbgfAddr)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PDBGFADDRESS pAddress);
536
537 /**
538 * Converts a DBGF address structure to a DBGC variable.
539 *
540 * @returns VBox status code.
541 * @param pCmdHlp Pointer to the command callback structure.
542 * @param pAddress The source address.
543 * @param pResult The result variable.
544 */
545 DECLCALLBACKMEMBER(int, pfnVarFromDbgfAddr)(PDBGCCMDHLP pCmdHlp, PCDBGFADDRESS pAddress, PDBGCVAR pResult);
546
547 /**
548 * Converts a DBGC variable to a 64-bit number.
549 *
550 * @returns VBox status code.
551 * @param pCmdHlp Pointer to the command callback structure.
552 * @param pVar The variable to convert.
553 * @param pu64Number Where to store the number.
554 */
555 DECLCALLBACKMEMBER(int, pfnVarToNumber)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t *pu64Number);
556
557 /**
558 * Converts a DBGC variable to a boolean.
559 *
560 * @returns VBox status code.
561 * @param pCmdHlp Pointer to the command callback structure.
562 * @param pVar The variable to convert.
563 * @param pf Where to store the boolean.
564 */
565 DECLCALLBACKMEMBER(int, pfnVarToBool)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, bool *pf);
566
567 /**
568 * Get the range of a variable in bytes, resolving symbols if necessary.
569 *
570 * @returns VBox status code.
571 * @param pCmdHlp Pointer to the command callback structure.
572 * @param pVar The variable to convert.
573 * @param cbElement Conversion factor for element ranges.
574 * @param cbDefault The default range.
575 * @param pcbRange The length of the range.
576 */
577 DECLCALLBACKMEMBER(int, pfnVarGetRange)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t cbElement, uint64_t cbDefault,
578 uint64_t *pcbRange);
579
580 /**
581 * Converts a variable to one with the specified type.
582 *
583 * This preserves the range.
584 *
585 * @returns VBox status code.
586 * @param pCmdHlp Pointer to the command callback structure.
587 * @param pVar The variable to convert.
588 * @param enmToType The target type.
589 * @param fConvSyms If @c true, then attempt to resolve symbols.
590 * @param pResult The output variable. Can be the same as @a pVar.
591 */
592 DECLCALLBACKMEMBER(int, pfnVarConvert)(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, DBGCVARTYPE enmToType, bool fConvSyms,
593 PDBGCVAR pResult);
594
595 /**
596 * Gets a DBGF output helper that directs the output to the debugger
597 * console.
598 *
599 * @returns Pointer to the helper structure.
600 * @param pCmdHlp Pointer to the command callback structure.
601 */
602 DECLCALLBACKMEMBER(PCDBGFINFOHLP, pfnGetDbgfOutputHlp)(PDBGCCMDHLP pCmdHlp);
603
604 /** End marker (DBGCCMDHLP_MAGIC). */
605 uint32_t u32EndMarker;
606} DBGCCMDHLP;
607
608/** Magic value for DBGCCMDHLP::u32Magic. (Fyodor Mikhaylovich Dostoyevsky) */
609#define DBGCCMDHLP_MAGIC UINT32_C(18211111)
610
611
612#ifdef IN_RING3
613
614/**
615 * Command helper for writing formatted text to the debug console.
616 *
617 * @returns VBox status.
618 * @param pCmdHlp Pointer to the command callback structure.
619 * @param pszFormat The format string.
620 * This is using the log formatter, so it's format extensions can be used.
621 * @param ... Arguments specified in the format string.
622 */
623DECLINLINE(int) DBGCCmdHlpPrintf(PDBGCCMDHLP pCmdHlp, const char *pszFormat, ...)
624{
625 va_list va;
626 int rc;
627
628 va_start(va, pszFormat);
629 rc = pCmdHlp->pfnPrintfV(pCmdHlp, NULL, pszFormat, va);
630 va_end(va);
631
632 return rc;
633}
634
635/**
636 * @copydoc FNDBGCHLPVBOXERROR
637 */
638DECLINLINE(int) DBGCCmdHlpVBoxError(PDBGCCMDHLP pCmdHlp, int rc, const char *pszFormat, ...)
639{
640 va_list va;
641
642 va_start(va, pszFormat);
643 rc = pCmdHlp->pfnVBoxErrorV(pCmdHlp, rc, pszFormat, va);
644 va_end(va);
645
646 return rc;
647}
648
649/**
650 * @copydoc FNDBGCHLPMEMREAD
651 */
652DECLINLINE(int) DBGCCmdHlpMemRead(PDBGCCMDHLP pCmdHlp, PVM pVM, void *pvBuffer, size_t cbRead, PCDBGCVAR pVarPointer, size_t *pcbRead)
653{
654 return pCmdHlp->pfnMemRead(pCmdHlp, pVM, pvBuffer, cbRead, pVarPointer, pcbRead);
655}
656
657/**
658 * Evaluates an expression.
659 * (Hopefully the parser and functions are fully reentrant.)
660 *
661 * @returns VBox status code appropriate to return from a command.
662 * @param pCmdHlp Pointer to the command callback structure.
663 * @param pResult Where to store the result.
664 * @param pszExpr The expression. Format string with the format DBGC extensions.
665 * @param ... Format arguments.
666 */
667DECLINLINE(int) DBGCCmdHlpEval(PDBGCCMDHLP pCmdHlp, PDBGCVAR pResult, const char *pszExpr, ...)
668{
669 va_list va;
670 int rc;
671
672 va_start(va, pszExpr);
673 rc = pCmdHlp->pfnEvalV(pCmdHlp, pResult, pszExpr, va);
674 va_end(va);
675
676 return rc;
677}
678
679/**
680 * Print an error and fail the current command.
681 *
682 * @returns VBox status code to pass upwards.
683 *
684 * @param pCmdHlp Pointer to the command callback structure.
685 * @param pCmd The failing command.
686 * @param pszFormat The error message format string.
687 * @param ... Format arguments.
688 */
689DECLINLINE(int) DBGCCmdHlpFail(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, const char *pszFormat, ...)
690{
691 va_list va;
692 int rc;
693
694 va_start(va, pszFormat);
695 rc = pCmdHlp->pfnFailV(pCmdHlp, pCmd, pszFormat, va);
696 va_end(va);
697
698 return rc;
699}
700
701/**
702 * Print an error and fail the current command.
703 *
704 * Usage example:
705 * @code
706 int rc = VMMR3Something(pVM);
707 if (RT_FAILURE(rc))
708 return DBGCCmdHlpFailRc(pCmdHlp, pCmd, rc, "VMMR3Something");
709 return VINF_SUCCESS;
710 * @endcode
711 *
712 * @returns VBox status code to pass upwards.
713 *
714 * @param pCmdHlp Pointer to the command callback structure.
715 * @param pCmd The failing command.
716 * @param rc The status code indicating the failure.
717 * @param pszFormat The error message format string.
718 * @param ... Format arguments.
719 */
720DECLINLINE(int) DBGCCmdHlpFailRc(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, int rc, const char *pszFormat, ...)
721{
722 va_list va;
723
724 va_start(va, pszFormat);
725 rc = pCmdHlp->pfnFailRcV(pCmdHlp, pCmd, rc, pszFormat, va);
726 va_end(va);
727
728 return rc;
729}
730
731/**
732 * @copydoc DBGCCMDHLP::pfnParserError
733 */
734DECLINLINE(int) DBGCCmdHlpParserError(PDBGCCMDHLP pCmdHlp, PCDBGCCMD pCmd, int iArg, const char *pszExpr, unsigned iLine)
735{
736 return pCmdHlp->pfnParserError(pCmdHlp, pCmd, iArg, pszExpr, iLine);
737}
738
739/** Assert+return like macro for checking parser sanity.
740 * Returns with failure if the precodition is not met. */
741#define DBGC_CMDHLP_ASSERT_PARSER_RET(pCmdHlp, pCmd, iArg, expr) \
742 do { \
743 if (!(expr)) \
744 return DBGCCmdHlpParserError(pCmdHlp, pCmd, iArg, #expr, __LINE__); \
745 } while (0)
746
747/** Assert+return like macro that the VM handle is present.
748 * Returns with failure if the VM handle is NIL. */
749#define DBGC_CMDHLP_REQ_VM_RET(pCmdHlp, pCmd, pVM) \
750 do { \
751 if (!(pVM)) \
752 return DBGCCmdHlpFail(pCmdHlp, pCmd, "No VM selected"); \
753 } while (0)
754
755/**
756 * @copydoc DBGCCMDHLP::pfnVarToDbgfAddr
757 */
758DECLINLINE(int) DBGCCmdHlpVarToDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PDBGFADDRESS pAddress)
759{
760 return pCmdHlp->pfnVarToDbgfAddr(pCmdHlp, pVar, pAddress);
761}
762
763/**
764 * @copydoc DBGCCMDHLP::pfnVarToDbgfAddr
765 */
766DECLINLINE(int) DBGCCmdHlpVarFromDbgfAddr(PDBGCCMDHLP pCmdHlp, PCDBGFADDRESS pAddress, PDBGCVAR pResult)
767{
768 return pCmdHlp->pfnVarFromDbgfAddr(pCmdHlp, pAddress, pResult);
769}
770
771/**
772 * Converts an variable to a flat address.
773 *
774 * @returns VBox status code.
775 * @param pCmdHlp Pointer to the command callback structure.
776 * @param pVar The variable to convert.
777 * @param pFlatPtr Where to store the flat address.
778 */
779DECLINLINE(int) DBGCCmdHlpVarToFlatAddr(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, PRTGCPTR pFlatPtr)
780{
781 DBGFADDRESS Addr;
782 int rc = pCmdHlp->pfnVarToDbgfAddr(pCmdHlp, pVar, &Addr);
783 if (RT_SUCCESS(rc))
784 *pFlatPtr = Addr.FlatPtr;
785 return rc;
786}
787
788/**
789 * @copydoc DBGCCMDHLP::pfnVarToNumber
790 */
791DECLINLINE(int) DBGCCmdHlpVarToNumber(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t *pu64Number)
792{
793 return pCmdHlp->pfnVarToNumber(pCmdHlp, pVar, pu64Number);
794}
795
796/**
797 * @copydoc DBGCCMDHLP::pfnVarToBool
798 */
799DECLINLINE(int) DBGCCmdHlpVarToBool(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, bool *pf)
800{
801 return pCmdHlp->pfnVarToBool(pCmdHlp, pVar, pf);
802}
803
804/**
805 * @copydoc DBGCCMDHLP::pfnVarGetRange
806 */
807DECLINLINE(int) DBGCCmdHlpVarGetRange(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t cbElement, uint64_t cbDefault, uint64_t *pcbRange)
808{
809 return pCmdHlp->pfnVarGetRange(pCmdHlp, pVar, cbElement, cbDefault, pcbRange);
810}
811
812/**
813 * @copydoc DBGCCMDHLP::pfnVarConvert
814 */
815DECLINLINE(int) DBGCCmdHlpConvert(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, DBGCVARTYPE enmToType, bool fConvSyms, PDBGCVAR pResult)
816{
817 return pCmdHlp->pfnVarConvert(pCmdHlp, pVar, enmToType, fConvSyms, pResult);
818}
819
820/**
821 * @copydoc DBGCCMDHLP::pfnGetDbgfOutputHlp
822 */
823DECLINLINE(PCDBGFINFOHLP) DBGCCmdHlpGetDbgfOutputHlp(PDBGCCMDHLP pCmdHlp)
824{
825 return pCmdHlp->pfnGetDbgfOutputHlp(pCmdHlp);
826}
827
828#endif /* IN_RING3 */
829
830
831
832/**
833 * Command handler.
834 *
835 * The console will call the handler for a command once it's finished
836 * parsing the user input. The command handler function is responsible
837 * for executing the command itself.
838 *
839 * @returns VBox status.
840 * @param pCmd Pointer to the command descriptor (as registered).
841 * @param pCmdHlp Pointer to command helper functions.
842 * @param pVM Pointer to the current VM (if any).
843 * @param paArgs Pointer to (readonly) array of arguments.
844 * @param cArgs Number of arguments in the array.
845 */
846typedef DECLCALLBACK(int) FNDBGCCMD(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
847/** Pointer to a FNDBGCCMD() function. */
848typedef FNDBGCCMD *PFNDBGCCMD;
849
850/**
851 * DBGC command descriptor.
852 *
853 * If a pResultDesc is specified the command can be called and used
854 * as a function too. If it's a pure function, set fFlags to
855 * DBGCCMD_FLAGS_FUNCTION.
856 */
857typedef struct DBGCCMD
858{
859 /** Command string. */
860 const char *pszCmd;
861 /** Minimum number of arguments. */
862 unsigned cArgsMin;
863 /** Max number of arguments. */
864 unsigned cArgsMax;
865 /** Argument descriptors (array). */
866 PCDBGCVARDESC paArgDescs;
867 /** Number of argument descriptors. */
868 unsigned cArgDescs;
869 /** flags. (reserved for now) */
870 unsigned fFlags;
871 /** Handler function. */
872 PFNDBGCCMD pfnHandler;
873 /** Command syntax. */
874 const char *pszSyntax;
875 /** Command description. */
876 const char *pszDescription;
877} DBGCCMD;
878
879/** DBGCCMD Flags.
880 * @{
881 */
882/** @} */
883
884
885
886/** Pointer to a DBGC backend. */
887typedef struct DBGCBACK *PDBGCBACK;
888
889/**
890 * Checks if there is input.
891 *
892 * @returns true if there is input ready.
893 * @returns false if there not input ready.
894 * @param pBack Pointer to the backend structure supplied by
895 * the backend. The backend can use this to find
896 * it's instance data.
897 * @param cMillies Number of milliseconds to wait on input data.
898 */
899typedef DECLCALLBACK(bool) FNDBGCBACKINPUT(PDBGCBACK pBack, uint32_t cMillies);
900/** Pointer to a FNDBGCBACKINPUT() callback. */
901typedef FNDBGCBACKINPUT *PFNDBGCBACKINPUT;
902
903/**
904 * Read input.
905 *
906 * @returns VBox status code.
907 * @param pBack Pointer to the backend structure supplied by
908 * the backend. The backend can use this to find
909 * it's instance data.
910 * @param pvBuf Where to put the bytes we read.
911 * @param cbBuf Maximum nymber of bytes to read.
912 * @param pcbRead Where to store the number of bytes actually read.
913 * If NULL the entire buffer must be filled for a
914 * successful return.
915 */
916typedef DECLCALLBACK(int) FNDBGCBACKREAD(PDBGCBACK pBack, void *pvBuf, size_t cbBuf, size_t *pcbRead);
917/** Pointer to a FNDBGCBACKREAD() callback. */
918typedef FNDBGCBACKREAD *PFNDBGCBACKREAD;
919
920/**
921 * Write (output).
922 *
923 * @returns VBox status code.
924 * @param pBack Pointer to the backend structure supplied by
925 * the backend. The backend can use this to find
926 * it's instance data.
927 * @param pvBuf What to write.
928 * @param cbBuf Number of bytes to write.
929 * @param pcbWritten Where to store the number of bytes actually written.
930 * If NULL the entire buffer must be successfully written.
931 */
932typedef DECLCALLBACK(int) FNDBGCBACKWRITE(PDBGCBACK pBack, const void *pvBuf, size_t cbBuf, size_t *pcbWritten);
933/** Pointer to a FNDBGCBACKWRITE() callback. */
934typedef FNDBGCBACKWRITE *PFNDBGCBACKWRITE;
935
936/**
937 * Ready / busy notification.
938 *
939 * @param pBack Pointer to the backend structure supplied by
940 * the backend. The backend can use this to find
941 * it's instance data.
942 * @param fReady Whether it's ready (true) or busy (false).
943 */
944typedef DECLCALLBACK(void) FNDBGCBACKSETREADY(PDBGCBACK pBack, bool fReady);
945/** Pointer to a FNDBGCBACKSETREADY() callback. */
946typedef FNDBGCBACKSETREADY *PFNDBGCBACKSETREADY;
947
948
949/**
950 * The communication backend provides the console with a number of callbacks
951 * which can be used
952 */
953typedef struct DBGCBACK
954{
955 /** Check for input. */
956 PFNDBGCBACKINPUT pfnInput;
957 /** Read input. */
958 PFNDBGCBACKREAD pfnRead;
959 /** Write output. */
960 PFNDBGCBACKWRITE pfnWrite;
961 /** Ready / busy notification. */
962 PFNDBGCBACKSETREADY pfnSetReady;
963} DBGCBACK;
964
965
966/**
967 * Make a console instance.
968 *
969 * This will not return until either an 'exit' command is issued or a error code
970 * indicating connection loss is encountered.
971 *
972 * @returns VINF_SUCCESS if console termination caused by the 'exit' command.
973 * @returns The VBox status code causing the console termination.
974 *
975 * @param pVM VM Handle.
976 * @param pBack Pointer to the backend structure. This must contain
977 * a full set of function pointers to service the console.
978 * @param fFlags Reserved, must be zero.
979 * @remark A forced termination of the console is easiest done by forcing the
980 * callbacks to return fatal failures.
981 */
982DBGDECL(int) DBGCCreate(PVM pVM, PDBGCBACK pBack, unsigned fFlags);
983
984
985/**
986 * Register one or more external commands.
987 *
988 * @returns VBox status.
989 * @param paCommands Pointer to an array of command descriptors.
990 * The commands must be unique. It's not possible
991 * to register the same commands more than once.
992 * @param cCommands Number of commands.
993 */
994DBGDECL(int) DBGCRegisterCommands(PCDBGCCMD paCommands, unsigned cCommands);
995
996
997/**
998 * Deregister one or more external commands previously registered by
999 * DBGCRegisterCommands().
1000 *
1001 * @returns VBox status.
1002 * @param paCommands Pointer to an array of command descriptors
1003 * as given to DBGCRegisterCommands().
1004 * @param cCommands Number of commands.
1005 */
1006DBGDECL(int) DBGCDeregisterCommands(PCDBGCCMD paCommands, unsigned cCommands);
1007
1008
1009/**
1010 * Spawns a new thread with a TCP based debugging console service.
1011 *
1012 * @returns VBox status.
1013 * @param pVM VM handle.
1014 * @param ppvData Where to store the pointer to instance data.
1015 */
1016DBGDECL(int) DBGCTcpCreate(PVM pVM, void **ppvUser);
1017
1018/**
1019 * Terminates any running TCP base debugger console service.
1020 *
1021 * @returns VBox status.
1022 * @param pVM VM handle.
1023 * @param pvData Instance data set by DBGCTcpCreate().
1024 */
1025DBGDECL(int) DBGCTcpTerminate(PVM pVM, void *pvData);
1026
1027
1028/** @defgroup grp_dbgc_plug_in The DBGC Plug-in Interface
1029 * @{
1030 */
1031
1032/** The plug-in module name prefix. */
1033#define DBGC_PLUG_IN_PREFIX "DBGCPlugIn"
1034
1035/** The name of the plug-in entry point (FNDBGCPLUGIN) */
1036#define DBGC_PLUG_IN_ENTRYPOINT "DBGCPlugInEntry"
1037
1038/**
1039 * DBGC plug-in operations.
1040 */
1041typedef enum DBGCPLUGINOP
1042{
1043 /** The usual invalid first value. */
1044 DBGCPLUGINOP_INVALID,
1045 /** Initialize the plug-in, register all the stuff.
1046 * The plug-in will be unloaded on failure.
1047 * uArg: The VirtualBox version (major+minor). */
1048 DBGCPLUGINOP_INIT,
1049 /** Terminate the plug-ing, deregister all the stuff.
1050 * The plug-in will be unloaded after this call regardless of the return
1051 * code. */
1052 DBGCPLUGINOP_TERM,
1053 /** The usual 32-bit hack. */
1054 DBGCPLUGINOP_32BIT_HACK = 0x7fffffff
1055} DBGCPLUGINOP;
1056
1057/**
1058 * DBGC plug-in main entry point.
1059 *
1060 * @returns VBox status code.
1061 *
1062 * @param enmOperation The operation.
1063 * @param pVM The VM handle. This may be NULL.
1064 * @param uArg Extra argument.
1065 */
1066typedef DECLCALLBACK(int) FNDBGCPLUGIN(DBGCPLUGINOP enmOperation, PVM pVM, uintptr_t uArg);
1067/** Pointer to a FNDBGCPLUGIN. */
1068typedef FNDBGCPLUGIN *PFNDBGCPLUGIN;
1069
1070/** @copydoc FNDBGCPLUGIN */
1071DECLEXPORT(int) DBGCPlugInEntry(DBGCPLUGINOP enmOperation, PVM pVM, uintptr_t uArg);
1072
1073#endif /* IN_RING3 */
1074
1075/** @} */
1076
1077
1078RT_C_DECLS_END
1079
1080#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