VirtualBox

source: vbox/trunk/include/VBox/dbgf.h@ 32287

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

VMM/DBGFCoreWrite: skeleton.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 47.7 KB
Line 
1/** @file
2 * DBGF - Debugger Facility. (VMM)
3 */
4
5/*
6 * Copyright (C) 2006-2007 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_dbgf_h
27#define ___VBox_dbgf_h
28
29#include <VBox/cdefs.h>
30#include <VBox/types.h>
31#include <VBox/vmm.h>
32#include <VBox/log.h> /* LOG_ENABLED */
33#include <VBox/dbgfsel.h>
34
35#include <iprt/stdarg.h>
36#include <iprt/dbg.h>
37
38RT_C_DECLS_BEGIN
39
40
41/** @defgroup grp_dbgf The Debugger Facility API
42 * @{
43 */
44
45#if defined(IN_RC)|| defined(IN_RING0)
46/** @addgroup grp_dbgf_rz The RZ DBGF API
47 * @ingroup grp_dbgf
48 * @{
49 */
50VMMRZDECL(int) DBGFRZTrap01Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCUINTREG uDr6);
51VMMRZDECL(int) DBGFRZTrap03Handler(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame);
52/** @} */
53#endif
54
55
56
57/**
58 * Mixed address.
59 */
60typedef struct DBGFADDRESS
61{
62 /** The flat address. */
63 RTGCUINTPTR FlatPtr;
64 /** The selector offset address. */
65 RTGCUINTPTR off;
66 /** The selector. DBGF_SEL_FLAT is a legal value. */
67 RTSEL Sel;
68 /** Flags describing further details about the address. */
69 uint16_t fFlags;
70} DBGFADDRESS;
71/** Pointer to a mixed address. */
72typedef DBGFADDRESS *PDBGFADDRESS;
73/** Pointer to a const mixed address. */
74typedef const DBGFADDRESS *PCDBGFADDRESS;
75
76/** @name DBGFADDRESS Flags.
77 * @{ */
78/** A 16:16 far address. */
79#define DBGFADDRESS_FLAGS_FAR16 0
80/** A 16:32 far address. */
81#define DBGFADDRESS_FLAGS_FAR32 1
82/** A 16:64 far address. */
83#define DBGFADDRESS_FLAGS_FAR64 2
84/** A flat address. */
85#define DBGFADDRESS_FLAGS_FLAT 3
86/** A physical address. */
87#define DBGFADDRESS_FLAGS_PHYS 4
88/** A physical address. */
89#define DBGFADDRESS_FLAGS_RING0 5
90/** The address type mask. */
91#define DBGFADDRESS_FLAGS_TYPE_MASK 7
92
93/** Set if the address is valid. */
94#define DBGFADDRESS_FLAGS_VALID RT_BIT(3)
95
96/** The address is within the hypervisor memoary area (HMA).
97 * If not set, the address can be assumed to be a guest address. */
98#define DBGFADDRESS_FLAGS_HMA RT_BIT(4)
99
100/** Checks if the mixed address is flat or not. */
101#define DBGFADDRESS_IS_FLAT(pAddress) ( ((pAddress)->fFlags & DBGFADDRESS_FLAGS_TYPE_MASK) == DBGFADDRESS_FLAGS_FLAT )
102/** Checks if the mixed address is flat or not. */
103#define DBGFADDRESS_IS_PHYS(pAddress) ( ((pAddress)->fFlags & DBGFADDRESS_FLAGS_TYPE_MASK) == DBGFADDRESS_FLAGS_PHYS )
104/** Checks if the mixed address is far 16:16 or not. */
105#define DBGFADDRESS_IS_FAR16(pAddress) ( ((pAddress)->fFlags & DBGFADDRESS_FLAGS_TYPE_MASK) == DBGFADDRESS_FLAGS_FAR16 )
106/** Checks if the mixed address is far 16:32 or not. */
107#define DBGFADDRESS_IS_FAR32(pAddress) ( ((pAddress)->fFlags & DBGFADDRESS_FLAGS_TYPE_MASK) == DBGFADDRESS_FLAGS_FAR32 )
108/** Checks if the mixed address is far 16:64 or not. */
109#define DBGFADDRESS_IS_FAR64(pAddress) ( ((pAddress)->fFlags & DBGFADDRESS_FLAGS_TYPE_MASK) == DBGFADDRESS_FLAGS_FAR64 )
110/** Checks if the mixed address is valid. */
111#define DBGFADDRESS_IS_VALID(pAddress) ( !!((pAddress)->fFlags & DBGFADDRESS_FLAGS_VALID) )
112/** Checks if the address is flagged as within the HMA. */
113#define DBGFADDRESS_IS_HMA(pAddress) ( !!((pAddress)->fFlags & DBGFADDRESS_FLAGS_HMA) )
114/** @} */
115
116VMMR3DECL(int) DBGFR3AddrFromSelOff(PVM pVM, VMCPUID idCpu, PDBGFADDRESS pAddress, RTSEL Sel, RTUINTPTR off);
117VMMR3DECL(int) DBGFR3AddrFromSelInfoOff(PVM pVM, PDBGFADDRESS pAddress, PCDBGFSELINFO pSelInfo, RTUINTPTR off);
118VMMR3DECL(PDBGFADDRESS) DBGFR3AddrFromFlat(PVM pVM, PDBGFADDRESS pAddress, RTGCUINTPTR FlatPtr);
119VMMR3DECL(PDBGFADDRESS) DBGFR3AddrFromPhys(PVM pVM, PDBGFADDRESS pAddress, RTGCPHYS PhysAddr);
120VMMR3DECL(bool) DBGFR3AddrIsValid(PVM pVM, PCDBGFADDRESS pAddress);
121VMMR3DECL(int) DBGFR3AddrToPhys(PVM pVM, VMCPUID idCpu, PDBGFADDRESS pAddress, PRTGCPHYS pGCPhys);
122VMMR3DECL(int) DBGFR3AddrToHostPhys(PVM pVM, VMCPUID idCpu, PDBGFADDRESS pAddress, PRTHCPHYS pHCPhys);
123VMMR3DECL(int) DBGFR3AddrToVolatileR3Ptr(PVM pVM, VMCPUID idCpu, PDBGFADDRESS pAddress, bool fReadOnly, void **ppvR3Ptr);
124VMMR3DECL(PDBGFADDRESS) DBGFR3AddrAdd(PDBGFADDRESS pAddress, RTGCUINTPTR uAddend);
125VMMR3DECL(PDBGFADDRESS) DBGFR3AddrSub(PDBGFADDRESS pAddress, RTGCUINTPTR uSubtrahend);
126
127
128
129
130/**
131 * VMM Debug Event Type.
132 */
133typedef enum DBGFEVENTTYPE
134{
135 /** Halt completed.
136 * This notifies that a halt command have been successfully completed.
137 */
138 DBGFEVENT_HALT_DONE = 0,
139 /** Detach completed.
140 * This notifies that the detach command have been successfully completed.
141 */
142 DBGFEVENT_DETACH_DONE,
143 /** The command from the debugger is not recognized.
144 * This means internal error or half implemented features.
145 */
146 DBGFEVENT_INVALID_COMMAND,
147
148
149 /** Fatal error.
150 * This notifies a fatal error in the VMM and that the debugger get's a
151 * chance to first hand information about the the problem.
152 */
153 DBGFEVENT_FATAL_ERROR = 100,
154 /** Breakpoint Hit.
155 * This notifies that a breakpoint installed by the debugger was hit. The
156 * identifier of the breakpoint can be found in the DBGFEVENT::u::Bp::iBp member.
157 */
158 DBGFEVENT_BREAKPOINT,
159 /** Breakpoint Hit in the Hypervisor.
160 * This notifies that a breakpoint installed by the debugger was hit. The
161 * identifier of the breakpoint can be found in the DBGFEVENT::u::Bp::iBp member.
162 */
163 DBGFEVENT_BREAKPOINT_HYPER,
164 /** Assertion in the Hypervisor (breakpoint instruction).
165 * This notifies that a breakpoint instruction was hit in the hypervisor context.
166 */
167 DBGFEVENT_ASSERTION_HYPER,
168 /** Single Stepped.
169 * This notifies that a single step operation was completed.
170 */
171 DBGFEVENT_STEPPED,
172 /** Single Stepped.
173 * This notifies that a hypervisor single step operation was completed.
174 */
175 DBGFEVENT_STEPPED_HYPER,
176 /** The developer have used the DBGFSTOP macro or the PDMDeviceDBGFSTOP function
177 * to bring up the debugger at a specific place.
178 */
179 DBGFEVENT_DEV_STOP,
180 /** The VM is terminating.
181 * When this notification is received, the debugger thread should detach ASAP.
182 */
183 DBGFEVENT_TERMINATING,
184
185 /** The usual 32-bit hack. */
186 DBGFEVENT_32BIT_HACK = 0x7fffffff
187} DBGFEVENTTYPE;
188
189
190/**
191 * The context of an event.
192 */
193typedef enum DBGFEVENTCTX
194{
195 /** The usual invalid entry. */
196 DBGFEVENTCTX_INVALID = 0,
197 /** Raw mode. */
198 DBGFEVENTCTX_RAW,
199 /** Recompiled mode. */
200 DBGFEVENTCTX_REM,
201 /** VMX / AVT mode. */
202 DBGFEVENTCTX_HWACCL,
203 /** Hypervisor context. */
204 DBGFEVENTCTX_HYPER,
205 /** Other mode */
206 DBGFEVENTCTX_OTHER,
207
208 /** The usual 32-bit hack */
209 DBGFEVENTCTX_32BIT_HACK = 0x7fffffff
210} DBGFEVENTCTX;
211
212/**
213 * VMM Debug Event.
214 */
215typedef struct DBGFEVENT
216{
217 /** Type. */
218 DBGFEVENTTYPE enmType;
219 /** Context */
220 DBGFEVENTCTX enmCtx;
221 /** Type specific data. */
222 union
223 {
224 /** Fatal error details. */
225 struct
226 {
227 /** The GC return code. */
228 int rc;
229 } FatalError;
230
231 /** Source location. */
232 struct
233 {
234 /** File name. */
235 R3PTRTYPE(const char *) pszFile;
236 /** Function name. */
237 R3PTRTYPE(const char *) pszFunction;
238 /** Message. */
239 R3PTRTYPE(const char *) pszMessage;
240 /** Line number. */
241 unsigned uLine;
242 } Src;
243
244 /** Assertion messages. */
245 struct
246 {
247 /** The first message. */
248 R3PTRTYPE(const char *) pszMsg1;
249 /** The second message. */
250 R3PTRTYPE(const char *) pszMsg2;
251 } Assert;
252
253 /** Breakpoint. */
254 struct DBGFEVENTBP
255 {
256 /** The identifier of the breakpoint which was hit. */
257 RTUINT iBp;
258 } Bp;
259 /** Padding for ensuring that the structure is 8 byte aligned. */
260 uint64_t au64Padding[4];
261 } u;
262} DBGFEVENT;
263/** Pointer to VMM Debug Event. */
264typedef DBGFEVENT *PDBGFEVENT;
265/** Pointer to const VMM Debug Event. */
266typedef const DBGFEVENT *PCDBGFEVENT;
267
268
269/** @def DBGFSTOP
270 * Stops the debugger raising a DBGFEVENT_DEVELOPER_STOP event.
271 *
272 * @returns VBox status code which must be propagated up to EM if not VINF_SUCCESS.
273 * @param pVM VM Handle.
274 */
275#ifdef VBOX_STRICT
276# define DBGFSTOP(pVM) DBGFR3EventSrc(pVM, DBGFEVENT_DEV_STOP, __FILE__, __LINE__, __PRETTY_FUNCTION__, NULL)
277#else
278# define DBGFSTOP(pVM) VINF_SUCCESS
279#endif
280
281VMMR3DECL(int) DBGFR3Init(PVM pVM);
282VMMR3DECL(int) DBGFR3Term(PVM pVM);
283VMMR3DECL(void) DBGFR3Relocate(PVM pVM, RTGCINTPTR offDelta);
284VMMR3DECL(int) DBGFR3VMMForcedAction(PVM pVM);
285VMMR3DECL(int) DBGFR3Event(PVM pVM, DBGFEVENTTYPE enmEvent);
286VMMR3DECL(int) DBGFR3EventSrc(PVM pVM, DBGFEVENTTYPE enmEvent, const char *pszFile, unsigned uLine, const char *pszFunction, const char *pszFormat, ...);
287VMMR3DECL(int) DBGFR3EventSrcV(PVM pVM, DBGFEVENTTYPE enmEvent, const char *pszFile, unsigned uLine, const char *pszFunction, const char *pszFormat, va_list args);
288VMMR3DECL(int) DBGFR3EventAssertion(PVM pVM, DBGFEVENTTYPE enmEvent, const char *pszMsg1, const char *pszMsg2);
289VMMR3DECL(int) DBGFR3EventBreakpoint(PVM pVM, DBGFEVENTTYPE enmEvent);
290VMMR3DECL(int) DBGFR3Attach(PVM pVM);
291VMMR3DECL(int) DBGFR3Detach(PVM pVM);
292VMMR3DECL(int) DBGFR3EventWait(PVM pVM, RTMSINTERVAL cMillies, PCDBGFEVENT *ppEvent);
293VMMR3DECL(int) DBGFR3Halt(PVM pVM);
294VMMR3DECL(bool) DBGFR3IsHalted(PVM pVM);
295VMMR3DECL(bool) DBGFR3CanWait(PVM pVM);
296VMMR3DECL(int) DBGFR3Resume(PVM pVM);
297VMMR3DECL(int) DBGFR3Step(PVM pVM, VMCPUID idCpu);
298VMMR3DECL(int) DBGFR3PrgStep(PVMCPU pVCpu);
299
300
301/** Breakpoint type. */
302typedef enum DBGFBPTYPE
303{
304 /** Free breakpoint entry. */
305 DBGFBPTYPE_FREE = 0,
306 /** Debug register. */
307 DBGFBPTYPE_REG,
308 /** INT 3 instruction. */
309 DBGFBPTYPE_INT3,
310 /** Recompiler. */
311 DBGFBPTYPE_REM,
312 /** ensure 32-bit size. */
313 DBGFBPTYPE_32BIT_HACK = 0x7fffffff
314} DBGFBPTYPE;
315
316
317/**
318 * A Breakpoint.
319 */
320typedef struct DBGFBP
321{
322 /** The number of breakpoint hits. */
323 uint64_t cHits;
324 /** The hit number which starts to trigger the breakpoint. */
325 uint64_t iHitTrigger;
326 /** The hit number which stops triggering the breakpoint (disables it).
327 * Use ~(uint64_t)0 if it should never stop. */
328 uint64_t iHitDisable;
329 /** The Flat GC address of the breakpoint.
330 * (PC register value if REM type?) */
331 RTGCUINTPTR GCPtr;
332 /** The breakpoint id. */
333 RTUINT iBp;
334 /** The breakpoint status - enabled or disabled. */
335 bool fEnabled;
336
337 /** The breakpoint type. */
338 DBGFBPTYPE enmType;
339
340#if GC_ARCH_BITS == 64
341 uint32_t u32Padding;
342#endif
343
344 /** Union of type specific data. */
345 union
346 {
347 /** Debug register data. */
348 struct DBGFBPREG
349 {
350 /** The debug register number. */
351 uint8_t iReg;
352 /** The access type (one of the X86_DR7_RW_* value). */
353 uint8_t fType;
354 /** The access size. */
355 uint8_t cb;
356 } Reg;
357 /** Recompiler breakpoint data. */
358 struct DBGFBPINT3
359 {
360 /** The byte value we replaced by the INT 3 instruction. */
361 uint8_t bOrg;
362 } Int3;
363
364 /** Recompiler breakpoint data. */
365 struct DBGFBPREM
366 {
367 /** nothing yet */
368 uint8_t fDummy;
369 } Rem;
370 /** Paddind to ensure that the size is identical on win32 and linux. */
371 uint64_t u64Padding;
372 } u;
373} DBGFBP;
374
375/** Pointer to a breakpoint. */
376typedef DBGFBP *PDBGFBP;
377/** Pointer to a const breakpoint. */
378typedef const DBGFBP *PCDBGFBP;
379
380
381VMMR3DECL(int) DBGFR3BpSet(PVM pVM, PCDBGFADDRESS pAddress, uint64_t iHitTrigger, uint64_t iHitDisable, PRTUINT piBp);
382VMMR3DECL(int) DBGFR3BpSetReg(PVM pVM, PCDBGFADDRESS pAddress, uint64_t iHitTrigger, uint64_t iHitDisable,
383 uint8_t fType, uint8_t cb, PRTUINT piBp);
384VMMR3DECL(int) DBGFR3BpSetREM(PVM pVM, PCDBGFADDRESS pAddress, uint64_t iHitTrigger, uint64_t iHitDisable, PRTUINT piBp);
385VMMR3DECL(int) DBGFR3BpClear(PVM pVM, RTUINT iBp);
386VMMR3DECL(int) DBGFR3BpEnable(PVM pVM, RTUINT iBp);
387VMMR3DECL(int) DBGFR3BpDisable(PVM pVM, RTUINT iBp);
388
389/**
390 * Breakpoint enumeration callback function.
391 *
392 * @returns VBox status code. Any failure will stop the enumeration.
393 * @param pVM The VM handle.
394 * @param pvUser The user argument.
395 * @param pBp Pointer to the breakpoint information. (readonly)
396 */
397typedef DECLCALLBACK(int) FNDBGFBPENUM(PVM pVM, void *pvUser, PCDBGFBP pBp);
398/** Pointer to a breakpoint enumeration callback function. */
399typedef FNDBGFBPENUM *PFNDBGFBPENUM;
400
401VMMR3DECL(int) DBGFR3BpEnum(PVM pVM, PFNDBGFBPENUM pfnCallback, void *pvUser);
402VMMDECL(RTGCUINTREG) DBGFBpGetDR7(PVM pVM);
403VMMDECL(RTGCUINTREG) DBGFBpGetDR0(PVM pVM);
404VMMDECL(RTGCUINTREG) DBGFBpGetDR1(PVM pVM);
405VMMDECL(RTGCUINTREG) DBGFBpGetDR2(PVM pVM);
406VMMDECL(RTGCUINTREG) DBGFBpGetDR3(PVM pVM);
407VMMDECL(bool) DBGFIsStepping(PVMCPU pVCpu);
408
409
410
411VMMR3DECL(CPUMMODE) DBGFR3CpuGetMode(PVM pVM, VMCPUID idCpu);
412
413
414
415
416/**
417 * Info helper callback structure.
418 */
419typedef struct DBGFINFOHLP
420{
421 /**
422 * Print formatted string.
423 *
424 * @param pHlp Pointer to this structure.
425 * @param pszFormat The format string.
426 * @param ... Arguments.
427 */
428 DECLCALLBACKMEMBER(void, pfnPrintf)(PCDBGFINFOHLP pHlp, const char *pszFormat, ...);
429
430 /**
431 * Print formatted string.
432 *
433 * @param pHlp Pointer to this structure.
434 * @param pszFormat The format string.
435 * @param args Argument list.
436 */
437 DECLCALLBACKMEMBER(void, pfnPrintfV)(PCDBGFINFOHLP pHlp, const char *pszFormat, va_list args);
438} DBGFINFOHLP;
439
440
441/**
442 * Info handler, device version.
443 *
444 * @param pDevIns The device instance which registered the info.
445 * @param pHlp Callback functions for doing output.
446 * @param pszArgs Argument string. Optional and specific to the handler.
447 */
448typedef DECLCALLBACK(void) FNDBGFHANDLERDEV(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs);
449/** Pointer to a FNDBGFHANDLERDEV function. */
450typedef FNDBGFHANDLERDEV *PFNDBGFHANDLERDEV;
451
452/**
453 * Info handler, USB device version.
454 *
455 * @param pUsbIns The USB device instance which registered the info.
456 * @param pHlp Callback functions for doing output.
457 * @param pszArgs Argument string. Optional and specific to the handler.
458 */
459typedef DECLCALLBACK(void) FNDBGFHANDLERUSB(PPDMUSBINS pUsbIns, PCDBGFINFOHLP pHlp, const char *pszArgs);
460/** Pointer to a FNDBGFHANDLERUSB function. */
461typedef FNDBGFHANDLERUSB *PFNDBGFHANDLERUSB;
462
463/**
464 * Info handler, driver version.
465 *
466 * @param pDrvIns The driver instance which registered the info.
467 * @param pHlp Callback functions for doing output.
468 * @param pszArgs Argument string. Optional and specific to the handler.
469 */
470typedef DECLCALLBACK(void) FNDBGFHANDLERDRV(PPDMDRVINS pDrvIns, PCDBGFINFOHLP pHlp, const char *pszArgs);
471/** Pointer to a FNDBGFHANDLERDRV function. */
472typedef FNDBGFHANDLERDRV *PFNDBGFHANDLERDRV;
473
474/**
475 * Info handler, internal version.
476 *
477 * @param pVM The VM handle.
478 * @param pHlp Callback functions for doing output.
479 * @param pszArgs Argument string. Optional and specific to the handler.
480 */
481typedef DECLCALLBACK(void) FNDBGFHANDLERINT(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
482/** Pointer to a FNDBGFHANDLERINT function. */
483typedef FNDBGFHANDLERINT *PFNDBGFHANDLERINT;
484
485/**
486 * Info handler, external version.
487 *
488 * @param pvUser User argument.
489 * @param pHlp Callback functions for doing output.
490 * @param pszArgs Argument string. Optional and specific to the handler.
491 */
492typedef DECLCALLBACK(void) FNDBGFHANDLEREXT(void *pvUser, PCDBGFINFOHLP pHlp, const char *pszArgs);
493/** Pointer to a FNDBGFHANDLEREXT function. */
494typedef FNDBGFHANDLEREXT *PFNDBGFHANDLEREXT;
495
496
497/** @name Flags for the info registration functions.
498 * @{ */
499/** The handler must run on the EMT. */
500#define DBGFINFO_FLAGS_RUN_ON_EMT RT_BIT(0)
501/** @} */
502
503VMMR3DECL(int) DBGFR3InfoRegisterDevice(PVM pVM, const char *pszName, const char *pszDesc, PFNDBGFHANDLERDEV pfnHandler, PPDMDEVINS pDevIns);
504VMMR3DECL(int) DBGFR3InfoRegisterDriver(PVM pVM, const char *pszName, const char *pszDesc, PFNDBGFHANDLERDRV pfnHandler, PPDMDRVINS pDrvIns);
505VMMR3DECL(int) DBGFR3InfoRegisterInternal(PVM pVM, const char *pszName, const char *pszDesc, PFNDBGFHANDLERINT pfnHandler);
506VMMR3DECL(int) DBGFR3InfoRegisterInternalEx(PVM pVM, const char *pszName, const char *pszDesc, PFNDBGFHANDLERINT pfnHandler, uint32_t fFlags);
507VMMR3DECL(int) DBGFR3InfoRegisterExternal(PVM pVM, const char *pszName, const char *pszDesc, PFNDBGFHANDLEREXT pfnHandler, void *pvUser);
508VMMR3DECL(int) DBGFR3InfoDeregisterDevice(PVM pVM, PPDMDEVINS pDevIns, const char *pszName);
509VMMR3DECL(int) DBGFR3InfoDeregisterDriver(PVM pVM, PPDMDRVINS pDrvIns, const char *pszName);
510VMMR3DECL(int) DBGFR3InfoDeregisterInternal(PVM pVM, const char *pszName);
511VMMR3DECL(int) DBGFR3InfoDeregisterExternal(PVM pVM, const char *pszName);
512VMMR3DECL(int) DBGFR3Info(PVM pVM, const char *pszName, const char *pszArgs, PCDBGFINFOHLP pHlp);
513VMMR3DECL(int) DBGFR3InfoLogRel(PVM pVM, const char *pszName, const char *pszArgs);
514VMMR3DECL(int) DBGFR3InfoStdErr(PVM pVM, const char *pszName, const char *pszArgs);
515VMMR3DECL(int) DBGFR3InfoMulti(PVM pVM, const char *pszIncludePat, const char *pszExcludePat,
516 const char *pszSepFmt, PCDBGFINFOHLP pHlp);
517
518/** @def DBGFR3InfoLog
519 * Display a piece of info writing to the log if enabled.
520 *
521 * @param pVM VM handle.
522 * @param pszName The identifier of the info to display.
523 * @param pszArgs Arguments to the info handler.
524 */
525#ifdef LOG_ENABLED
526#define DBGFR3InfoLog(pVM, pszName, pszArgs) \
527 do { \
528 if (LogIsEnabled()) \
529 DBGFR3Info(pVM, pszName, pszArgs, NULL); \
530 } while (0)
531#else
532#define DBGFR3InfoLog(pVM, pszName, pszArgs) do { } while (0)
533#endif
534
535/**
536 * Enumeration callback for use with DBGFR3InfoEnum.
537 *
538 * @returns VBox status code.
539 * A status code indicating failure will end the enumeration
540 * and DBGFR3InfoEnum will return with that status code.
541 * @param pVM VM handle.
542 * @param pszName Info identifier name.
543 * @param pszDesc The description.
544 */
545typedef DECLCALLBACK(int) FNDBGFINFOENUM(PVM pVM, const char *pszName, const char *pszDesc, void *pvUser);
546/** Pointer to a FNDBGFINFOENUM function. */
547typedef FNDBGFINFOENUM *PFNDBGFINFOENUM;
548
549VMMR3DECL(int) DBGFR3InfoEnum(PVM pVM, PFNDBGFINFOENUM pfnCallback, void *pvUser);
550VMMR3DECL(PCDBGFINFOHLP) DBGFR3InfoLogHlp(void);
551VMMR3DECL(PCDBGFINFOHLP) DBGFR3InfoLogRelHlp(void);
552
553
554
555VMMR3DECL(int) DBGFR3LogModifyGroups(PVM pVM, const char *pszGroupSettings);
556VMMR3DECL(int) DBGFR3LogModifyFlags(PVM pVM, const char *pszFlagSettings);
557VMMR3DECL(int) DBGFR3LogModifyDestinations(PVM pVM, const char *pszDestSettings);
558
559
560
561/** Max length (including '\\0') of a symbol name. */
562#define DBGF_SYMBOL_NAME_LENGTH 512
563
564/**
565 * Debug symbol.
566 */
567typedef struct DBGFSYMBOL
568{
569 /** Symbol value (address). */
570 RTGCUINTPTR Value;
571 /** Symbol size. */
572 uint32_t cb;
573 /** Symbol Flags. (reserved). */
574 uint32_t fFlags;
575 /** Symbol name. */
576 char szName[DBGF_SYMBOL_NAME_LENGTH];
577} DBGFSYMBOL;
578/** Pointer to debug symbol. */
579typedef DBGFSYMBOL *PDBGFSYMBOL;
580/** Pointer to const debug symbol. */
581typedef const DBGFSYMBOL *PCDBGFSYMBOL;
582
583/**
584 * Debug line number information.
585 */
586typedef struct DBGFLINE
587{
588 /** Address. */
589 RTGCUINTPTR Address;
590 /** Line number. */
591 uint32_t uLineNo;
592 /** Filename. */
593 char szFilename[260];
594} DBGFLINE;
595/** Pointer to debug line number. */
596typedef DBGFLINE *PDBGFLINE;
597/** Pointer to const debug line number. */
598typedef const DBGFLINE *PCDBGFLINE;
599
600/** @name Address spaces aliases.
601 * @{ */
602/** The guest global address space. */
603#define DBGF_AS_GLOBAL ((RTDBGAS)-1)
604/** The guest kernel address space.
605 * This is usually resolves to the same as DBGF_AS_GLOBAL. */
606#define DBGF_AS_KERNEL ((RTDBGAS)-2)
607/** The physical address space. */
608#define DBGF_AS_PHYS ((RTDBGAS)-3)
609/** Raw-mode context. */
610#define DBGF_AS_RC ((RTDBGAS)-4)
611/** Ring-0 context. */
612#define DBGF_AS_R0 ((RTDBGAS)-5)
613/** Raw-mode context and then global guest context.
614 * When used for looking up information, it works as if the call was first made
615 * with DBGF_AS_RC and then on failure with DBGF_AS_GLOBAL. When called for
616 * making address space changes, it works as if DBGF_AS_RC was used. */
617#define DBGF_AS_RC_AND_GC_GLOBAL ((RTDBGAS)-6)
618
619/** The first special one. */
620#define DBGF_AS_FIRST DBGF_AS_RC_AND_GC_GLOBAL
621/** The last special one. */
622#define DBGF_AS_LAST DBGF_AS_GLOBAL
623/** The number of special address space handles. */
624#define DBGF_AS_COUNT (6U)
625/** Converts an alias handle to an array index. */
626#define DBGF_AS_ALIAS_2_INDEX(hAlias) \
627 ( (uintptr_t)(hAlias) - (uintptr_t)DBGF_AS_FIRST )
628/** Predicat macro that check if the specified handle is an alias. */
629#define DBGF_AS_IS_ALIAS(hAlias) \
630 ( DBGF_AS_ALIAS_2_INDEX(hAlias) < DBGF_AS_COUNT )
631/** Predicat macro that check if the specified alias is a fixed one or not. */
632#define DBGF_AS_IS_FIXED_ALIAS(hAlias) \
633 ( DBGF_AS_ALIAS_2_INDEX(hAlias) < (uintptr_t)DBGF_AS_PHYS - (uintptr_t)DBGF_AS_FIRST + 1U )
634
635/** @} */
636
637VMMR3DECL(int) DBGFR3AsAdd(PVM pVM, RTDBGAS hDbgAs, RTPROCESS ProcId);
638VMMR3DECL(int) DBGFR3AsDelete(PVM pVM, RTDBGAS hDbgAs);
639VMMR3DECL(int) DBGFR3AsSetAlias(PVM pVM, RTDBGAS hAlias, RTDBGAS hAliasFor);
640VMMR3DECL(RTDBGAS) DBGFR3AsResolve(PVM pVM, RTDBGAS hAlias);
641VMMR3DECL(RTDBGAS) DBGFR3AsResolveAndRetain(PVM pVM, RTDBGAS hAlias);
642VMMR3DECL(RTDBGAS) DBGFR3AsQueryByName(PVM pVM, const char *pszName);
643VMMR3DECL(RTDBGAS) DBGFR3AsQueryByPid(PVM pVM, RTPROCESS ProcId);
644
645VMMR3DECL(int) DBGFR3AsLoadImage(PVM pVM, RTDBGAS hDbgAs, const char *pszFilename, const char *pszModName, PCDBGFADDRESS pModAddress, RTDBGSEGIDX iModSeg, uint32_t fFlags);
646VMMR3DECL(int) DBGFR3AsLoadMap(PVM pVM, RTDBGAS hDbgAs, const char *pszFilename, const char *pszModName, PCDBGFADDRESS pModAddress, RTDBGSEGIDX iModSeg, RTGCUINTPTR uSubtrahend, uint32_t fFlags);
647VMMR3DECL(int) DBGFR3AsLinkModule(PVM pVM, RTDBGAS hDbgAs, RTDBGMOD hMod, PCDBGFADDRESS pModAddress, RTDBGSEGIDX iModSeg, uint32_t fFlags);
648
649VMMR3DECL(int) DBGFR3AsSymbolByAddr(PVM pVM, RTDBGAS hDbgAs, PCDBGFADDRESS pAddress, PRTGCINTPTR poffDisp, PRTDBGSYMBOL pSymbol, PRTDBGMOD phMod);
650VMMR3DECL(PRTDBGSYMBOL) DBGFR3AsSymbolByAddrA(PVM pVM, RTDBGAS hDbgAs, PCDBGFADDRESS pAddress, PRTGCINTPTR poffDisp, PRTDBGMOD phMod);
651VMMR3DECL(int) DBGFR3AsSymbolByName(PVM pVM, RTDBGAS hDbgAs, const char *pszSymbol, PRTDBGSYMBOL pSymbol, PRTDBGMOD phMod);
652
653/* The following are soon to be obsoleted: */
654VMMR3DECL(int) DBGFR3ModuleLoad(PVM pVM, const char *pszFilename, RTGCUINTPTR AddressDelta, const char *pszName, RTGCUINTPTR ModuleAddress, unsigned cbImage);
655VMMR3DECL(void) DBGFR3ModuleRelocate(PVM pVM, RTGCUINTPTR OldImageBase, RTGCUINTPTR NewImageBase, RTGCUINTPTR cbImage,
656 const char *pszFilename, const char *pszName);
657VMMR3DECL(int) DBGFR3SymbolAdd(PVM pVM, RTGCUINTPTR ModuleAddress, RTGCUINTPTR SymbolAddress, RTUINT cbSymbol, const char *pszSymbol);
658VMMR3DECL(int) DBGFR3SymbolByAddr(PVM pVM, RTGCUINTPTR Address, PRTGCINTPTR poffDisplacement, PDBGFSYMBOL pSymbol);
659VMMR3DECL(int) DBGFR3SymbolByName(PVM pVM, const char *pszSymbol, PDBGFSYMBOL pSymbol);
660
661VMMR3DECL(int) DBGFR3LineByAddr(PVM pVM, RTGCUINTPTR Address, PRTGCINTPTR poffDisplacement, PDBGFLINE pLine);
662VMMR3DECL(PDBGFLINE) DBGFR3LineByAddrAlloc(PVM pVM, RTGCUINTPTR Address, PRTGCINTPTR poffDisplacement);
663VMMR3DECL(void) DBGFR3LineFree(PDBGFLINE pLine);
664
665
666/**
667 * Return type.
668 */
669typedef enum DBGFRETRUNTYPE
670{
671 /** The usual invalid 0 value. */
672 DBGFRETURNTYPE_INVALID = 0,
673 /** Near 16-bit return. */
674 DBGFRETURNTYPE_NEAR16,
675 /** Near 32-bit return. */
676 DBGFRETURNTYPE_NEAR32,
677 /** Near 64-bit return. */
678 DBGFRETURNTYPE_NEAR64,
679 /** Far 16:16 return. */
680 DBGFRETURNTYPE_FAR16,
681 /** Far 16:32 return. */
682 DBGFRETURNTYPE_FAR32,
683 /** Far 16:64 return. */
684 DBGFRETURNTYPE_FAR64,
685 /** 16-bit iret return (e.g. real or 286 protect mode). */
686 DBGFRETURNTYPE_IRET16,
687 /** 32-bit iret return. */
688 DBGFRETURNTYPE_IRET32,
689 /** 32-bit iret return. */
690 DBGFRETURNTYPE_IRET32_PRIV,
691 /** 32-bit iret return to V86 mode. */
692 DBGFRETURNTYPE_IRET32_V86,
693 /** @todo 64-bit iret return. */
694 DBGFRETURNTYPE_IRET64,
695 /** The end of the valid return types. */
696 DBGFRETURNTYPE_END,
697 /** The usual 32-bit blowup. */
698 DBGFRETURNTYPE_32BIT_HACK = 0x7fffffff
699} DBGFRETURNTYPE;
700
701/**
702 * Figures the size of the return state on the stack.
703 *
704 * @returns number of bytes. 0 if invalid parameter.
705 * @param enmRetType The type of return.
706 */
707DECLINLINE(unsigned) DBGFReturnTypeSize(DBGFRETURNTYPE enmRetType)
708{
709 switch (enmRetType)
710 {
711 case DBGFRETURNTYPE_NEAR16: return 2;
712 case DBGFRETURNTYPE_NEAR32: return 4;
713 case DBGFRETURNTYPE_NEAR64: return 8;
714 case DBGFRETURNTYPE_FAR16: return 4;
715 case DBGFRETURNTYPE_FAR32: return 4;
716 case DBGFRETURNTYPE_FAR64: return 8;
717 case DBGFRETURNTYPE_IRET16: return 6;
718 case DBGFRETURNTYPE_IRET32: return 4*3;
719 case DBGFRETURNTYPE_IRET32_PRIV: return 4*5;
720 case DBGFRETURNTYPE_IRET32_V86: return 4*9;
721 case DBGFRETURNTYPE_IRET64:
722 default:
723 return 0;
724 }
725}
726
727
728/** Pointer to stack frame info. */
729typedef struct DBGFSTACKFRAME *PDBGFSTACKFRAME;
730/** Pointer to const stack frame info. */
731typedef struct DBGFSTACKFRAME const *PCDBGFSTACKFRAME;
732/**
733 * Info about a stack frame.
734 */
735typedef struct DBGFSTACKFRAME
736{
737 /** Frame number. */
738 uint32_t iFrame;
739 /** Frame flags. */
740 uint32_t fFlags;
741 /** The frame address.
742 * The off member is [e|r]bp and the Sel member is ss. */
743 DBGFADDRESS AddrFrame;
744 /** The stack address of the frame.
745 * The off member is [e|r]sp and the Sel member is ss. */
746 DBGFADDRESS AddrStack;
747 /** The program counter (PC) address of the frame.
748 * The off member is [e|r]ip and the Sel member is cs. */
749 DBGFADDRESS AddrPC;
750 /** Pointer to the symbol nearest the program counter (PC). NULL if not found. */
751 PRTDBGSYMBOL pSymPC;
752 /** Pointer to the linnumber nearest the program counter (PC). NULL if not found. */
753 PDBGFLINE pLinePC;
754
755 /** The return frame address.
756 * The off member is [e|r]bp and the Sel member is ss. */
757 DBGFADDRESS AddrReturnFrame;
758 /** The return stack address.
759 * The off member is [e|r]sp and the Sel member is ss. */
760 DBGFADDRESS AddrReturnStack;
761 /** The way this frame returns to the next one. */
762 DBGFRETURNTYPE enmReturnType;
763
764 /** The program counter (PC) address which the frame returns to.
765 * The off member is [e|r]ip and the Sel member is cs. */
766 DBGFADDRESS AddrReturnPC;
767 /** Pointer to the symbol nearest the return PC. NULL if not found. */
768 PRTDBGSYMBOL pSymReturnPC;
769 /** Pointer to the linnumber nearest the return PC. NULL if not found. */
770 PDBGFLINE pLineReturnPC;
771
772 /** 32-bytes of stack arguments. */
773 union
774 {
775 /** 64-bit view */
776 uint64_t au64[4];
777 /** 32-bit view */
778 uint32_t au32[8];
779 /** 16-bit view */
780 uint16_t au16[16];
781 /** 8-bit view */
782 uint8_t au8[32];
783 } Args;
784
785 /** Pointer to the next frame.
786 * Might not be used in some cases, so consider it internal. */
787 PCDBGFSTACKFRAME pNextInternal;
788 /** Pointer to the first frame.
789 * Might not be used in some cases, so consider it internal. */
790 PCDBGFSTACKFRAME pFirstInternal;
791} DBGFSTACKFRAME;
792
793/** @name DBGFSTACKFRAME Flags.
794 * @{ */
795/** Set if the content of the frame is filled in by DBGFR3StackWalk() and can be used
796 * to construct the next frame. */
797#define DBGFSTACKFRAME_FLAGS_ALL_VALID RT_BIT(0)
798/** This is the last stack frame we can read.
799 * This flag is not set if the walk stop because of max dept or recursion. */
800#define DBGFSTACKFRAME_FLAGS_LAST RT_BIT(1)
801/** This is the last record because we detected a loop. */
802#define DBGFSTACKFRAME_FLAGS_LOOP RT_BIT(2)
803/** This is the last record because we reached the maximum depth. */
804#define DBGFSTACKFRAME_FLAGS_MAX_DEPTH RT_BIT(3)
805/** 16-bit frame. */
806#define DBGFSTACKFRAME_FLAGS_16BIT RT_BIT(4)
807/** 32-bit frame. */
808#define DBGFSTACKFRAME_FLAGS_32BIT RT_BIT(5)
809/** 64-bit frame. */
810#define DBGFSTACKFRAME_FLAGS_64BIT RT_BIT(6)
811/** @} */
812
813/** @name DBGFCODETYPE
814 * @{ */
815typedef enum DBGFCODETYPE
816{
817 /** The usual invalid 0 value. */
818 DBGFCODETYPE_INVALID = 0,
819 /** Stack walk for guest code. */
820 DBGFCODETYPE_GUEST,
821 /** Stack walk for hypervisor code. */
822 DBGFCODETYPE_HYPER,
823 /** Stack walk for ring 0 code. */
824 DBGFCODETYPE_RING0,
825 /** The usual 32-bit blowup. */
826 DBGFCODETYPE_32BIT_HACK = 0x7fffffff
827} DBGFCODETYPE;
828/** @} */
829
830VMMR3DECL(int) DBGFR3StackWalkBegin(PVM pVM, VMCPUID idCpu, DBGFCODETYPE enmCodeType, PCDBGFSTACKFRAME *ppFirstFrame);
831VMMR3DECL(int) DBGFR3StackWalkBeginEx(PVM pVM, VMCPUID idCpu, DBGFCODETYPE enmCodeType, PCDBGFADDRESS pAddrFrame,
832 PCDBGFADDRESS pAddrStack,PCDBGFADDRESS pAddrPC,
833 DBGFRETURNTYPE enmReturnType, PCDBGFSTACKFRAME *ppFirstFrame);
834VMMR3DECL(PCDBGFSTACKFRAME) DBGFR3StackWalkNext(PCDBGFSTACKFRAME pCurrent);
835VMMR3DECL(void) DBGFR3StackWalkEnd(PCDBGFSTACKFRAME pFirstFrame);
836
837
838
839
840/** Flags to pass to DBGFR3DisasInstrEx().
841 * @{ */
842/** Disassemble the current guest instruction, with annotations. */
843#define DBGF_DISAS_FLAGS_CURRENT_GUEST RT_BIT(0)
844/** Disassemble the current hypervisor instruction, with annotations. */
845#define DBGF_DISAS_FLAGS_CURRENT_HYPER RT_BIT(1)
846/** No annotations for current context. */
847#define DBGF_DISAS_FLAGS_NO_ANNOTATION RT_BIT(2)
848/** No symbol lookup. */
849#define DBGF_DISAS_FLAGS_NO_SYMBOLS RT_BIT(3)
850/** No instruction bytes. */
851#define DBGF_DISAS_FLAGS_NO_BYTES RT_BIT(4)
852/** No address in the output. */
853#define DBGF_DISAS_FLAGS_NO_ADDRESS RT_BIT(5)
854/** Set if the hidden selector registers are known to be valid. (REM hack to
855 * avoid assertions.) */
856#define DBGF_DISAS_FLAGS_HID_SEL_REGS_VALID RT_BIT(6)
857/** Disassemble in the default mode of the specific context. */
858#define DBGF_DISAS_FLAGS_DEFAULT_MODE UINT32_C(0x00000000)
859/** Disassemble in 16-bit mode. */
860#define DBGF_DISAS_FLAGS_16BIT_MODE UINT32_C(0x10000000)
861/** Disassemble in 16-bit mode with real mode address translation. */
862#define DBGF_DISAS_FLAGS_16BIT_REAL_MODE UINT32_C(0x20000000)
863/** Disassemble in 32-bit mode. */
864#define DBGF_DISAS_FLAGS_32BIT_MODE UINT32_C(0x30000000)
865/** Disassemble in 64-bit mode. */
866#define DBGF_DISAS_FLAGS_64BIT_MODE UINT32_C(0x40000000)
867/** The dissassembly mode mask. */
868#define DBGF_DISAS_FLAGS_MODE_MASK UINT32_C(0x70000000)
869/** Mask containing the valid flags. */
870#define DBGF_DISAS_FLAGS_VALID_MASK UINT32_C(0x7000007f)
871/** @} */
872
873/** Special flat selector. */
874#define DBGF_SEL_FLAT 1
875
876VMMR3DECL(int) DBGFR3DisasInstrEx(PVM pVM, VMCPUID idCpu, RTSEL Sel, RTGCPTR GCPtr, uint32_t fFlags,
877 char *pszOutput, uint32_t cbOutput, uint32_t *pcbInstr);
878VMMR3DECL(int) DBGFR3DisasInstrCurrent(PVMCPU pVCpu, char *pszOutput, uint32_t cbOutput);
879VMMR3DECL(int) DBGFR3DisasInstrCurrentLogInternal(PVMCPU pVCpu, const char *pszPrefix);
880
881/** @def DBGFR3DisasInstrCurrentLog
882 * Disassembles the current guest context instruction and writes it to the log.
883 * All registers and data will be displayed. Addresses will be attempted resolved to symbols.
884 */
885#ifdef LOG_ENABLED
886# define DBGFR3DisasInstrCurrentLog(pVCpu, pszPrefix) \
887 do { \
888 if (LogIsEnabled()) \
889 DBGFR3DisasInstrCurrentLogInternal(pVCpu, pszPrefix); \
890 } while (0)
891#else
892# define DBGFR3DisasInstrCurrentLog(pVCpu, pszPrefix) do { } while (0)
893#endif
894
895VMMR3DECL(int) DBGFR3DisasInstrLogInternal(PVMCPU pVCpu, RTSEL Sel, RTGCPTR GCPtr);
896
897/** @def DBGFR3DisasInstrLog
898 * Disassembles the specified guest context instruction and writes it to the log.
899 * Addresses will be attempted resolved to symbols.
900 * @thread Any EMT.
901 */
902#ifdef LOG_ENABLED
903# define DBGFR3DisasInstrLog(pVCpu, Sel, GCPtr) \
904 do { \
905 if (LogIsEnabled()) \
906 DBGFR3DisasInstrLogInternal(pVCpu, Sel, GCPtr); \
907 } while (0)
908#else
909# define DBGFR3DisasInstrLog(pVCpu, Sel, GCPtr) do { } while (0)
910#endif
911
912
913VMMR3DECL(int) DBGFR3MemScan(PVM pVM, VMCPUID idCpu, PCDBGFADDRESS pAddress, RTGCUINTPTR cbRange, RTGCUINTPTR uAlign,
914 const void *pvNeedle, size_t cbNeedle, PDBGFADDRESS pHitAddress);
915VMMR3DECL(int) DBGFR3MemRead(PVM pVM, VMCPUID idCpu, PCDBGFADDRESS pAddress, void *pvBuf, size_t cbRead);
916VMMR3DECL(int) DBGFR3MemReadString(PVM pVM, VMCPUID idCpu, PCDBGFADDRESS pAddress, char *pszBuf, size_t cbBuf);
917VMMR3DECL(int) DBGFR3MemWrite(PVM pVM, VMCPUID idCpu, PCDBGFADDRESS pAddress, void const *pvBuf, size_t cbRead);
918
919
920/** @name Flags for DBGFR3PagingDumpEx, PGMR3DumpHierarchyHCEx and
921 * PGMR3DumpHierarchyGCEx
922 * @{ */
923/** The CR3 from the current CPU state. */
924#define DBGFPGDMP_FLAGS_CURRENT_CR3 RT_BIT_32(0)
925/** The current CPU paging mode (PSE, PAE, LM, EPT, NX). */
926#define DBGFPGDMP_FLAGS_CURRENT_MODE RT_BIT_32(1)
927/** Whether PSE is enabled (!DBGFPGDMP_FLAGS_CURRENT_STATE).
928 * Same value as X86_CR4_PSE. */
929#define DBGFPGDMP_FLAGS_PSE RT_BIT_32(4) /* */
930/** Whether PAE is enabled (!DBGFPGDMP_FLAGS_CURRENT_STATE).
931 * Same value as X86_CR4_PAE. */
932#define DBGFPGDMP_FLAGS_PAE RT_BIT_32(5) /* */
933/** Whether LME is enabled (!DBGFPGDMP_FLAGS_CURRENT_STATE).
934 * Same value as MSR_K6_EFER_LME. */
935#define DBGFPGDMP_FLAGS_LME RT_BIT_32(8)
936/** Whether nested paging is enabled (!DBGFPGDMP_FLAGS_CURRENT_STATE). */
937#define DBGFPGDMP_FLAGS_NP RT_BIT_32(9)
938/** Whether extended nested page tables are enabled
939 * (!DBGFPGDMP_FLAGS_CURRENT_STATE). */
940#define DBGFPGDMP_FLAGS_EPT RT_BIT_32(10)
941/** Whether no-execution is enabled (!DBGFPGDMP_FLAGS_CURRENT_STATE).
942 * Same value as MSR_K6_EFER_NXE. */
943#define DBGFPGDMP_FLAGS_NXE RT_BIT_32(11)
944/** Whether to print the CR3. */
945#define DBGFPGDMP_FLAGS_PRINT_CR3 RT_BIT_32(27)
946/** Whether to print the header. */
947#define DBGFPGDMP_FLAGS_HEADER RT_BIT_32(28)
948/** Whether to dump additional page information. */
949#define DBGFPGDMP_FLAGS_PAGE_INFO RT_BIT_32(29)
950/** Dump the shadow tables if set.
951 * Cannot be used together with DBGFPGDMP_FLAGS_GUEST. */
952#define DBGFPGDMP_FLAGS_SHADOW RT_BIT_32(30)
953/** Dump the guest tables if set.
954 * Cannot be used together with DBGFPGDMP_FLAGS_SHADOW. */
955#define DBGFPGDMP_FLAGS_GUEST RT_BIT_32(31)
956/** Mask of valid bits. */
957#define DBGFPGDMP_FLAGS_VALID_MASK UINT32_C(0xf8000f33)
958/** The mask of bits controlling the paging mode. */
959#define DBGFPGDMP_FLAGS_MODE_MASK UINT32_C(0x00000f32)
960/** @} */
961VMMDECL(int) DBGFR3PagingDumpEx(PVM pVM, VMCPUID idCpu, uint32_t fFlags, uint64_t cr3, uint64_t u64FirstAddr,
962 uint64_t u64LastAddr, uint32_t cMaxDepth, PCDBGFINFOHLP pHlp);
963
964
965/** @name DBGFR3SelQueryInfo flags.
966 * @{ */
967/** Get the info from the guest descriptor table. */
968#define DBGFSELQI_FLAGS_DT_GUEST UINT32_C(0)
969/** Get the info from the shadow descriptor table.
970 * Only works in raw-mode. */
971#define DBGFSELQI_FLAGS_DT_SHADOW UINT32_C(1)
972/** If currently executing in in 64-bit mode, blow up data selectors. */
973#define DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE UINT32_C(2)
974/** @} */
975VMMR3DECL(int) DBGFR3SelQueryInfo(PVM pVM, VMCPUID idCpu, RTSEL Sel, uint32_t fFlags, PDBGFSELINFO pSelInfo);
976
977
978/**
979 * Register identifiers.
980 */
981typedef enum DBGFREG
982{
983 /* General purpose registers: */
984 DBGFREG_AL = 0,
985 DBGFREG_AX = DBGFREG_AL,
986 DBGFREG_EAX = DBGFREG_AL,
987 DBGFREG_RAX = DBGFREG_AL,
988
989 DBGFREG_CL,
990 DBGFREG_CX = DBGFREG_CL,
991 DBGFREG_ECX = DBGFREG_CL,
992 DBGFREG_RCX = DBGFREG_CL,
993
994 DBGFREG_DL,
995 DBGFREG_DX = DBGFREG_DL,
996 DBGFREG_EDX = DBGFREG_DL,
997 DBGFREG_RDX = DBGFREG_DL,
998
999 DBGFREG_BL,
1000 DBGFREG_BX = DBGFREG_BL,
1001 DBGFREG_EBX = DBGFREG_BL,
1002 DBGFREG_RBX = DBGFREG_BL,
1003
1004 DBGFREG_SPL,
1005 DBGFREG_SP = DBGFREG_SPL,
1006 DBGFREG_ESP = DBGFREG_SPL,
1007 DBGFREG_RSP = DBGFREG_SPL,
1008
1009 DBGFREG_BPL,
1010 DBGFREG_BP = DBGFREG_BPL,
1011 DBGFREG_EBP = DBGFREG_BPL,
1012 DBGFREG_RBP = DBGFREG_BPL,
1013
1014 DBGFREG_SIL,
1015 DBGFREG_SI = DBGFREG_SIL,
1016 DBGFREG_ESI = DBGFREG_SIL,
1017 DBGFREG_RSI = DBGFREG_SIL,
1018
1019 DBGFREG_DIL,
1020 DBGFREG_DI = DBGFREG_DIL,
1021 DBGFREG_EDI = DBGFREG_DIL,
1022 DBGFREG_RDI = DBGFREG_DIL,
1023
1024 DBGFREG_R8,
1025 DBGFREG_R8B = DBGFREG_R8,
1026 DBGFREG_R8W = DBGFREG_R8,
1027 DBGFREG_R8D = DBGFREG_R8,
1028
1029 DBGFREG_R9,
1030 DBGFREG_R9B = DBGFREG_R9,
1031 DBGFREG_R9W = DBGFREG_R9,
1032 DBGFREG_R9D = DBGFREG_R9,
1033
1034 DBGFREG_R10,
1035 DBGFREG_R10B = DBGFREG_R10,
1036 DBGFREG_R10W = DBGFREG_R10,
1037 DBGFREG_R10D = DBGFREG_R10,
1038
1039 DBGFREG_R11,
1040 DBGFREG_R11B = DBGFREG_R11,
1041 DBGFREG_R11W = DBGFREG_R11,
1042 DBGFREG_R11D = DBGFREG_R11,
1043
1044 DBGFREG_R12,
1045 DBGFREG_R12B = DBGFREG_R12,
1046 DBGFREG_R12W = DBGFREG_R12,
1047 DBGFREG_R12D = DBGFREG_R12,
1048
1049 DBGFREG_R13,
1050 DBGFREG_R13B = DBGFREG_R13,
1051 DBGFREG_R13W = DBGFREG_R13,
1052 DBGFREG_R13D = DBGFREG_R13,
1053
1054 DBGFREG_R14,
1055 DBGFREG_R14B = DBGFREG_R14,
1056 DBGFREG_R14W = DBGFREG_R14,
1057 DBGFREG_R14D = DBGFREG_R14,
1058
1059 DBGFREG_R15,
1060 DBGFREG_R15B = DBGFREG_R15,
1061 DBGFREG_R15W = DBGFREG_R15,
1062 DBGFREG_R15D = DBGFREG_R15,
1063
1064 DBGFREG_AH,
1065 DBGFREG_CH,
1066 DBGFREG_DH,
1067 DBGFREG_BH,
1068
1069 /* Segments and other special registers: */
1070 DBGFREG_CS,
1071 DBGFREG_DS,
1072 DBGFREG_ES,
1073 DBGFREG_FS,
1074 DBGFREG_GS,
1075 DBGFREG_SS,
1076
1077 DBGFREG_CS_ATTR,
1078 DBGFREG_DS_ATTR,
1079 DBGFREG_ES_ATTR,
1080 DBGFREG_FS_ATTR,
1081 DBGFREG_GS_ATTR,
1082 DBGFREG_SS_ATTR,
1083
1084 DBGFREG_CS_BASE,
1085 DBGFREG_DS_BASE,
1086 DBGFREG_ES_BASE,
1087 DBGFREG_FS_BASE,
1088 DBGFREG_GS_BASE,
1089 DBGFREG_SS_BASE,
1090
1091 DBGFREG_CS_LIMIT,
1092 DBGFREG_DS_LIMIT,
1093 DBGFREG_ES_LIMIT,
1094 DBGFREG_FS_LIMIT,
1095 DBGFREG_GS_LIMIT,
1096 DBGFREG_SS_LIMIT,
1097
1098 DBGFREG_IP,
1099 DBGFREG_EIP = DBGFREG_IP,
1100 DBGFREG_RIP = DBGFREG_IP,
1101
1102 DBGFREG_FLAGS,
1103 DBGFREG_EFLAGS = DBGFREG_FLAGS,
1104 DBGFREG_RFLAGS = DBGFREG_FLAGS,
1105
1106 /* FPU: */
1107 DBGFREG_ST0,
1108 DBGFREG_ST1,
1109 DBGFREG_ST2,
1110 DBGFREG_ST3,
1111 DBGFREG_ST4,
1112 DBGFREG_ST5,
1113 DBGFREG_ST6,
1114 DBGFREG_ST7,
1115
1116 DBGFREG_MM0,
1117 DBGFREG_MM1,
1118 DBGFREG_MM2,
1119 DBGFREG_MM3,
1120 DBGFREG_MM4,
1121 DBGFREG_MM5,
1122 DBGFREG_MM6,
1123 DBGFREG_MM7,
1124
1125 DBGFREG_FCW,
1126 DBGFREG_FSW,
1127 DBGFREG_FTW,
1128 DBGFREG_FOP,
1129 DBGFREG_FPUIP,
1130 DBGFREG_FPUCS,
1131 DBGFREG_FPUDP,
1132 DBGFREG_FPUDS,
1133 DBGFREG_MXCSR,
1134 DBGFREG_MXCSR_MASK,
1135
1136 /* SSE: */
1137 DBGFREG_XMM0,
1138 DBGFREG_XMM1,
1139 DBGFREG_XMM2,
1140 DBGFREG_XMM3,
1141 DBGFREG_XMM4,
1142 DBGFREG_XMM5,
1143 DBGFREG_XMM6,
1144 DBGFREG_XMM7,
1145 DBGFREG_XMM8,
1146 DBGFREG_XMM9,
1147 DBGFREG_XMM10,
1148 DBGFREG_XMM11,
1149 DBGFREG_XMM12,
1150 DBGFREG_XMM13,
1151 DBGFREG_XMM14,
1152 DBGFREG_XMM15,
1153 /** @todo add XMM aliases. */
1154
1155 /* System registers: */
1156 DBGFREG_GDTR,
1157 DBGFREG_GDTR_BASE,
1158 DBGFREG_GDTR_LIMIT,
1159 DBGFREG_IDTR,
1160 DBGFREG_IDTR_BASE,
1161 DBGFREG_IDTR_LIMIT,
1162 DBGFREG_LDTR,
1163 DBGFREG_LDTR_ATTR,
1164 DBGFREG_LDTR_BASE,
1165 DBGFREG_LDTR_LIMIT,
1166 DBGFREG_TR,
1167 DBGFREG_TR_ATTR,
1168 DBGFREG_TR_BASE,
1169 DBGFREG_TR_LIMIT,
1170
1171 DBGFREG_CR0,
1172 DBGFREG_CR2,
1173 DBGFREG_CR3,
1174 DBGFREG_CR4,
1175 DBGFREG_CR8,
1176
1177 DBGFREG_DR0,
1178 DBGFREG_DR1,
1179 DBGFREG_DR2,
1180 DBGFREG_DR3,
1181 DBGFREG_DR6,
1182 DBGFREG_DR7,
1183
1184 /* MSRs: */
1185 DBGFREG_MSR_IA32_APICBASE,
1186 DBGFREG_MSR_IA32_CR_PAT,
1187 DBGFREG_MSR_IA32_PERF_STATUS,
1188 DBGFREG_MSR_IA32_SYSENTER_CS,
1189 DBGFREG_MSR_IA32_SYSENTER_EIP,
1190 DBGFREG_MSR_IA32_SYSENTER_ESP,
1191 DBGFREG_MSR_IA32_TSC,
1192 DBGFREG_MSR_K6_EFER,
1193 DBGFREG_MSR_K6_STAR,
1194 DBGFREG_MSR_K8_CSTAR,
1195 DBGFREG_MSR_K8_FS_BASE,
1196 DBGFREG_MSR_K8_GS_BASE,
1197 DBGFREG_MSR_K8_KERNEL_GS_BASE,
1198 DBGFREG_MSR_K8_LSTAR,
1199 DBGFREG_MSR_K8_SF_MASK,
1200 DBGFREG_MSR_K8_TSC_AUX,
1201
1202 /** The end of the registers. */
1203 DBGFREG_END,
1204 /** The usual 32-bit type hack. */
1205 DBGFREG_32BIT_HACK = 0x7fffffff
1206} DBGFREG;
1207
1208VMMR3DECL(int) DBGFR3RegQueryU8( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint8_t *pu8);
1209VMMR3DECL(int) DBGFR3RegQueryU16( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint16_t *pu16);
1210VMMR3DECL(int) DBGFR3RegQueryU32( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint32_t *pu32);
1211VMMR3DECL(int) DBGFR3RegQueryU64( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint64_t *pu64);
1212VMMR3DECL(int) DBGFR3RegQueryU128(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint128_t *pu128);
1213VMMR3DECL(int) DBGFR3RegQueryLrd( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, long double *plrd);
1214VMMR3DECL(int) DBGFR3RegQueryXdtr( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint64_t *pu64Base, uint16_t *pu16Limit);
1215
1216VMMR3DECL(int) DBGFR3RegSetU8( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint8_t u8);
1217VMMR3DECL(int) DBGFR3RegSetU16( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint16_t u16);
1218VMMR3DECL(int) DBGFR3RegSetU32( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint32_t u32);
1219VMMR3DECL(int) DBGFR3RegSetU64( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint64_t u64);
1220VMMR3DECL(int) DBGFR3RegSetU128(PVM pVM, VMCPUID idCpu, DBGFREG enmReg, uint128_t u128);
1221VMMR3DECL(int) DBGFR3RegSetLrd( PVM pVM, VMCPUID idCpu, DBGFREG enmReg, long double lrd);
1222
1223
1224/**
1225 * Guest OS digger interface identifier.
1226 *
1227 * This is for use together with PDBGFR3QueryInterface and is used to
1228 * obtain access to optional interfaces.
1229 */
1230typedef enum DBGFOSINTERFACE
1231{
1232 /** The usual invalid entry. */
1233 DBGFOSINTERFACE_INVALID = 0,
1234 /** Process info. */
1235 DBGFOSINTERFACE_PROCESS,
1236 /** Thread info. */
1237 DBGFOSINTERFACE_THREAD,
1238 /** The end of the valid entries. */
1239 DBGFOSINTERFACE_END,
1240 /** The usual 32-bit type blowup. */
1241 DBGFOSINTERFACE_32BIT_HACK = 0x7fffffff
1242} DBGFOSINTERFACE;
1243/** Pointer to a Guest OS digger interface identifier. */
1244typedef DBGFOSINTERFACE *PDBGFOSINTERFACE;
1245/** Pointer to a const Guest OS digger interface identifier. */
1246typedef DBGFOSINTERFACE const *PCDBGFOSINTERFACE;
1247
1248
1249/**
1250 * Guest OS Digger Registration Record.
1251 *
1252 * This is used with the DBGFR3OSRegister() API.
1253 */
1254typedef struct DBGFOSREG
1255{
1256 /** Magic value (DBGFOSREG_MAGIC). */
1257 uint32_t u32Magic;
1258 /** Flags. Reserved. */
1259 uint32_t fFlags;
1260 /** The size of the instance data. */
1261 uint32_t cbData;
1262 /** Operative System name. */
1263 char szName[24];
1264
1265 /**
1266 * Constructs the instance.
1267 *
1268 * @returns VBox status code.
1269 * @param pVM Pointer to the shared VM structure.
1270 * @param pvData Pointer to the instance data.
1271 */
1272 DECLCALLBACKMEMBER(int, pfnConstruct)(PVM pVM, void *pvData);
1273
1274 /**
1275 * Destroys the instance.
1276 *
1277 * @param pVM Pointer to the shared VM structure.
1278 * @param pvData Pointer to the instance data.
1279 */
1280 DECLCALLBACKMEMBER(void, pfnDestruct)(PVM pVM, void *pvData);
1281
1282 /**
1283 * Probes the guest memory for OS finger prints.
1284 *
1285 * No setup or so is performed, it will be followed by a call to pfnInit
1286 * or pfnRefresh that should take care of that.
1287 *
1288 * @returns true if is an OS handled by this module, otherwise false.
1289 * @param pVM Pointer to the shared VM structure.
1290 * @param pvData Pointer to the instance data.
1291 */
1292 DECLCALLBACKMEMBER(bool, pfnProbe)(PVM pVM, void *pvData);
1293
1294 /**
1295 * Initializes a fresly detected guest, loading symbols and such useful stuff.
1296 *
1297 * This is called after pfnProbe.
1298 *
1299 * @returns VBox status code.
1300 * @param pVM Pointer to the shared VM structure.
1301 * @param pvData Pointer to the instance data.
1302 */
1303 DECLCALLBACKMEMBER(int, pfnInit)(PVM pVM, void *pvData);
1304
1305 /**
1306 * Refreshes symbols and stuff following a redetection of the same OS.
1307 *
1308 * This is called after pfnProbe.
1309 *
1310 * @returns VBox status code.
1311 * @param pVM Pointer to the shared VM structure.
1312 * @param pvData Pointer to the instance data.
1313 */
1314 DECLCALLBACKMEMBER(int, pfnRefresh)(PVM pVM, void *pvData);
1315
1316 /**
1317 * Terminates an OS when a new (or none) OS has been detected,
1318 * and before destruction.
1319 *
1320 * This is called after pfnProbe and if needed before pfnDestruct.
1321 *
1322 * @param pVM Pointer to the shared VM structure.
1323 * @param pvData Pointer to the instance data.
1324 */
1325 DECLCALLBACKMEMBER(void, pfnTerm)(PVM pVM, void *pvData);
1326
1327 /**
1328 * Queries the version of the running OS.
1329 *
1330 * This is only called after pfnInit().
1331 *
1332 * @returns VBox status code.
1333 * @param pVM Pointer to the shared VM structure.
1334 * @param pvData Pointer to the instance data.
1335 * @param pszVersion Where to store the version string.
1336 * @param cchVersion The size of the version string buffer.
1337 */
1338 DECLCALLBACKMEMBER(int, pfnQueryVersion)(PVM pVM, void *pvData, char *pszVersion, size_t cchVersion);
1339
1340 /**
1341 * Queries the pointer to a interface.
1342 *
1343 * This is called after pfnProbe.
1344 *
1345 * @returns Pointer to the interface if available, NULL if not available.
1346 * @param pVM Pointer to the shared VM structure.
1347 * @param pvData Pointer to the instance data.
1348 * @param enmIf The interface identifier.
1349 */
1350 DECLCALLBACKMEMBER(void *, pfnQueryInterface)(PVM pVM, void *pvData, DBGFOSINTERFACE enmIf);
1351
1352 /** Trailing magic (DBGFOSREG_MAGIC). */
1353 uint32_t u32EndMagic;
1354} DBGFOSREG;
1355/** Pointer to a Guest OS digger registration record. */
1356typedef DBGFOSREG *PDBGFOSREG;
1357/** Pointer to a const Guest OS digger registration record. */
1358typedef DBGFOSREG const *PCDBGFOSREG;
1359
1360/** Magic value for DBGFOSREG::u32Magic and DBGFOSREG::u32EndMagic. (Hitomi Kanehara) */
1361#define DBGFOSREG_MAGIC 0x19830808
1362
1363VMMR3DECL(int) DBGFR3OSRegister(PVM pVM, PCDBGFOSREG pReg);
1364VMMR3DECL(int) DBGFR3OSDeregister(PVM pVM, PCDBGFOSREG pReg);
1365VMMR3DECL(int) DBGFR3OSDetect(PVM pVM, char *pszName, size_t cchName);
1366VMMR3DECL(int) DBGFR3OSQueryNameAndVersion(PVM pVM, char *pszName, size_t cchName, char *pszVersion, size_t cchVersion);
1367VMMR3DECL(void *) DBGFR3OSQueryInterface(PVM pVM, DBGFOSINTERFACE enmIf);
1368VMMR3DECL(int) DBGFR3CoreWrite(PVM pVM, VMCPUID idCpu, const char *pszDumpPath);
1369
1370/** @} */
1371
1372
1373RT_C_DECLS_END
1374
1375#endif
1376
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