VirtualBox

source: vbox/trunk/src/VBox/Debugger/DBGCBuiltInSymbols.cpp@ 5999

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

The Giant CDDL Dual-License Header Change.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 21.3 KB
Line 
1/** $Id: DBGCBuiltInSymbols.cpp 5999 2007-12-07 15:05:06Z vboxsync $ */
2/** @file
3 * DBGC - Debugger Console, Built-In Symbols.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * innotek GmbH confidential
10 * All rights reserved
11 */
12
13
14/*******************************************************************************
15* Header Files *
16*******************************************************************************/
17#define LOG_GROUP LOG_GROUP_DBGC
18#include <VBox/dbg.h>
19#include <VBox/dbgf.h>
20#include <VBox/vm.h>
21#include <VBox/vmm.h>
22#include <VBox/mm.h>
23#include <VBox/pgm.h>
24#include <VBox/selm.h>
25#include <VBox/dis.h>
26#include <VBox/param.h>
27#include <VBox/err.h>
28#include <VBox/log.h>
29
30#include <iprt/alloc.h>
31#include <iprt/alloca.h>
32#include <iprt/string.h>
33#include <iprt/assert.h>
34#include <iprt/ctype.h>
35
36#include <stdlib.h>
37#include <stdio.h>
38
39#include "DBGCInternal.h"
40
41
42/*******************************************************************************
43* Internal Functions *
44*******************************************************************************/
45static DECLCALLBACK(int) dbgcSymGetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult);
46static DECLCALLBACK(int) dbgcSymSetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue);
47
48
49/*******************************************************************************
50* Global Variables *
51*******************************************************************************/
52/** Register symbol uUser value.
53 * @{
54 */
55/** If set the register set is the hypervisor and not the guest one. */
56#define SYMREG_FLAGS_HYPER RT_BIT(20)
57/** If set a far conversion of the value will use the high 16 bit for the selector.
58 * If clear the low 16 bit will be used. */
59#define SYMREG_FLAGS_HIGH_SEL RT_BIT(21)
60/** The shift value to calc the size of a register symbol from the uUser value. */
61#define SYMREG_SIZE_SHIFT (24)
62/** Get the offset */
63#define SYMREG_OFFSET(uUser) (uUser & ((1 << 20) - 1))
64/** Get the size. */
65#define SYMREG_SIZE(uUser) ((uUser >> SYMREG_SIZE_SHIFT) & 0xff)
66/** 1 byte. */
67#define SYMREG_SIZE_1 ( 1 << SYMREG_SIZE_SHIFT)
68/** 2 byte. */
69#define SYMREG_SIZE_2 ( 2 << SYMREG_SIZE_SHIFT)
70/** 4 byte. */
71#define SYMREG_SIZE_4 ( 4 << SYMREG_SIZE_SHIFT)
72/** 6 byte. */
73#define SYMREG_SIZE_6 ( 6 << SYMREG_SIZE_SHIFT)
74/** 8 byte. */
75#define SYMREG_SIZE_8 ( 8 << SYMREG_SIZE_SHIFT)
76/** 12 byte. */
77#define SYMREG_SIZE_12 (12 << SYMREG_SIZE_SHIFT)
78/** 16 byte. */
79#define SYMREG_SIZE_16 (16 << SYMREG_SIZE_SHIFT)
80/** @} */
81
82/** Builtin Symbols.
83 * ASSUMES little endian register representation!
84 */
85static const DBGCSYM g_aSyms[] =
86{
87 { "eax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_4 },
88 { "ax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_2 },
89 { "al", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_1 },
90 { "ah", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, eax) + 1)| SYMREG_SIZE_1 },
91
92 { "ebx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_4 },
93 { "bx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_2 },
94 { "bl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_1 },
95 { "bh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ebx) + 1)| SYMREG_SIZE_1 },
96
97 { "ecx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_4 },
98 { "cx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_2 },
99 { "cl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_1 },
100 { "ch", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ecx) + 1)| SYMREG_SIZE_1 },
101
102 { "edx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_4 },
103 { "dx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_2 },
104 { "dl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_1 },
105 { "dh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, edx) + 1)| SYMREG_SIZE_1 },
106
107 { "edi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_4 },
108 { "di", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_2 },
109
110 { "esi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_4 },
111 { "si", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_2 },
112
113 { "ebp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_4 },
114 { "bp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_2 },
115
116 { "esp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_4 },
117 { "sp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_2 },
118
119 { "eip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_4 },
120 { "ip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_2 },
121
122 { "efl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 },
123 { "eflags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 },
124 { "fl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 },
125 { "flags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 },
126
127 { "cs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cs) | SYMREG_SIZE_2 },
128 { "ds", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ds) | SYMREG_SIZE_2 },
129 { "es", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, es) | SYMREG_SIZE_2 },
130 { "fs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, fs) | SYMREG_SIZE_2 },
131 { "gs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gs) | SYMREG_SIZE_2 },
132 { "ss", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ss) | SYMREG_SIZE_2 },
133
134 { "cr0", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr0) | SYMREG_SIZE_4 },
135 { "cr2", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr2) | SYMREG_SIZE_4 },
136 { "cr3", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr3) | SYMREG_SIZE_4 },
137 { "cr4", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr4) | SYMREG_SIZE_4 },
138
139 { "tr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, tr) | SYMREG_SIZE_2 },
140 { "ldtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ldtr) | SYMREG_SIZE_2 },
141
142 { "gdtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr) | SYMREG_SIZE_6 },
143 { "gdtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.cbGdt)| SYMREG_SIZE_2 },
144 { "gdtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.pGdt)| SYMREG_SIZE_4 },
145
146 { "idtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr) | SYMREG_SIZE_6 },
147 { "idtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.cbIdt)| SYMREG_SIZE_2 },
148 { "idtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.pIdt)| SYMREG_SIZE_4 },
149
150 /* hypervisor */
151
152 {".eax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
153 {".ax", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
154 {".al", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eax) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
155 {".ah", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, eax) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
156
157 {".ebx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
158 {".bx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
159 {".bl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebx) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
160 {".bh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ebx) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
161
162 {".ecx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
163 {".cx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
164 {".cl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ecx) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
165 {".ch", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, ecx) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
166
167 {".edx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
168 {".dx", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
169 {".dl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edx) | SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
170 {".dh", dbgcSymGetReg, dbgcSymSetReg, (offsetof(CPUMCTX, edx) + 1)| SYMREG_SIZE_1 | SYMREG_FLAGS_HYPER },
171
172 {".edi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
173 {".di", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, edi) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
174
175 {".esi", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
176 {".si", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esi) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
177
178 {".ebp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
179 {".bp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ebp) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
180
181 {".esp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
182 {".sp", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, esp) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
183
184 {".eip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
185 {".ip", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eip) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
186
187 {".efl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
188 {".eflags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
189 {".fl", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
190 {".flags", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, eflags) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
191
192 {".cs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cs) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
193 {".ds", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ds) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
194 {".es", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, es) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
195 {".fs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, fs) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
196 {".gs", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gs) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
197 {".ss", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ss) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
198
199 {".cr0", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr0) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
200 {".cr2", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr2) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
201 {".cr3", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr3) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
202 {".cr4", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, cr4) | SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
203
204 {".tr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, tr) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
205 {".ldtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, ldtr) | SYMREG_SIZE_2 | SYMREG_FLAGS_HYPER },
206
207 {".gdtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr) | SYMREG_SIZE_6 | SYMREG_FLAGS_HYPER },
208 {".gdtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.cbGdt)| SYMREG_SIZE_2| SYMREG_FLAGS_HYPER },
209 {".gdtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, gdtr.pGdt)| SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
210
211 {".idtr", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr) | SYMREG_SIZE_6 | SYMREG_FLAGS_HYPER },
212 {".idtr.limit", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.cbIdt)| SYMREG_SIZE_2| SYMREG_FLAGS_HYPER },
213 {".idtr.base", dbgcSymGetReg, dbgcSymSetReg, offsetof(CPUMCTX, idtr.pIdt)| SYMREG_SIZE_4 | SYMREG_FLAGS_HYPER },
214
215};
216
217
218
219/**
220 * Get builtin register symbol.
221 *
222 * The uUser is special for these symbol descriptors. See the SYMREG_* \#defines.
223 *
224 * @returns 0 on success.
225 * @returns VBox evaluation / parsing error code on failure.
226 * The caller does the bitching.
227 * @param pSymDesc Pointer to the symbol descriptor.
228 * @param pCmdHlp Pointer to the command callback structure.
229 * @param enmType The result type.
230 * @param pResult Where to store the result.
231 */
232static DECLCALLBACK(int) dbgcSymGetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, DBGCVARTYPE enmType, PDBGCVAR pResult)
233{
234 LogFlow(("dbgcSymSetReg: pSymDesc->pszName=%d\n", pSymDesc->pszName));
235
236 /*
237 * pVM is required.
238 */
239 PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
240 Assert(pDbgc->pVM);
241
242 /*
243 * Get the right CPU context.
244 */
245 PCPUMCTX pCtx;
246 int rc;
247 if (!(pSymDesc->uUser & SYMREG_FLAGS_HYPER))
248 rc = CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);
249 else
250 rc = CPUMQueryHyperCtxPtr(pDbgc->pVM, &pCtx);
251 if (VBOX_FAILURE(rc))
252 return rc;
253
254 /*
255 * Get the value.
256 */
257 void *pvValue = (char *)pCtx + SYMREG_OFFSET(pSymDesc->uUser);
258 uint64_t u64;
259 switch (SYMREG_SIZE(pSymDesc->uUser))
260 {
261 case 1: u64 = *(uint8_t *)pvValue; break;
262 case 2: u64 = *(uint16_t *)pvValue; break;
263 case 4: u64 = *(uint32_t *)pvValue; break;
264 case 6: u64 = *(uint32_t *)pvValue | ((uint64_t)*(uint16_t *)((char *)pvValue + sizeof(uint32_t)) << 32); break;
265 case 8: u64 = *(uint64_t *)pvValue; break;
266 default:
267 return VERR_PARSE_NOT_IMPLEMENTED;
268 }
269
270 /*
271 * Construct the desired result.
272 */
273 if (enmType == DBGCVAR_TYPE_ANY)
274 enmType = DBGCVAR_TYPE_NUMBER;
275 pResult->pDesc = NULL;
276 pResult->pNext = NULL;
277 pResult->enmType = enmType;
278 pResult->enmRangeType = DBGCVAR_RANGE_NONE;
279 pResult->u64Range = 0;
280
281 switch (enmType)
282 {
283 case DBGCVAR_TYPE_GC_FLAT:
284 pResult->u.GCFlat = (RTGCPTR)u64;
285 break;
286
287 case DBGCVAR_TYPE_GC_FAR:
288 switch (SYMREG_SIZE(pSymDesc->uUser))
289 {
290 case 4:
291 if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL))
292 {
293 pResult->u.GCFar.off = (uint16_t)u64;
294 pResult->u.GCFar.sel = (uint16_t)(u64 >> 16);
295 }
296 else
297 {
298 pResult->u.GCFar.sel = (uint16_t)u64;
299 pResult->u.GCFar.off = (uint16_t)(u64 >> 16);
300 }
301 break;
302 case 6:
303 if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL))
304 {
305 pResult->u.GCFar.off = (uint32_t)u64;
306 pResult->u.GCFar.sel = (uint16_t)(u64 >> 32);
307 }
308 else
309 {
310 pResult->u.GCFar.sel = (uint32_t)u64;
311 pResult->u.GCFar.off = (uint16_t)(u64 >> 32);
312 }
313 break;
314
315 default:
316 return VERR_PARSE_BAD_RESULT_TYPE;
317 }
318 break;
319
320 case DBGCVAR_TYPE_GC_PHYS:
321 pResult->u.GCPhys = (RTGCPHYS)u64;
322 break;
323
324 case DBGCVAR_TYPE_HC_FLAT:
325 pResult->u.pvHCFlat = (void *)(uintptr_t)u64;
326 break;
327
328 case DBGCVAR_TYPE_HC_FAR:
329 switch (SYMREG_SIZE(pSymDesc->uUser))
330 {
331 case 4:
332 if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL))
333 {
334 pResult->u.HCFar.off = (uint16_t)u64;
335 pResult->u.HCFar.sel = (uint16_t)(u64 >> 16);
336 }
337 else
338 {
339 pResult->u.HCFar.sel = (uint16_t)u64;
340 pResult->u.HCFar.off = (uint16_t)(u64 >> 16);
341 }
342 break;
343 case 6:
344 if (!(pSymDesc->uUser & SYMREG_FLAGS_HIGH_SEL))
345 {
346 pResult->u.HCFar.off = (uint32_t)u64;
347 pResult->u.HCFar.sel = (uint16_t)(u64 >> 32);
348 }
349 else
350 {
351 pResult->u.HCFar.sel = (uint32_t)u64;
352 pResult->u.HCFar.off = (uint16_t)(u64 >> 32);
353 }
354 break;
355
356 default:
357 return VERR_PARSE_BAD_RESULT_TYPE;
358 }
359 break;
360
361 case DBGCVAR_TYPE_HC_PHYS:
362 pResult->u.GCPhys = (RTGCPHYS)u64;
363 break;
364
365 case DBGCVAR_TYPE_NUMBER:
366 pResult->u.u64Number = u64;
367 break;
368
369 case DBGCVAR_TYPE_STRING:
370 case DBGCVAR_TYPE_UNKNOWN:
371 default:
372 return VERR_PARSE_BAD_RESULT_TYPE;
373
374 }
375
376 return 0;
377}
378
379
380/**
381 * Set builtin register symbol.
382 *
383 * The uUser is special for these symbol descriptors. See the SYMREG_* #defines.
384 *
385 * @returns 0 on success.
386 * @returns VBox evaluation / parsing error code on failure.
387 * The caller does the bitching.
388 * @param pSymDesc Pointer to the symbol descriptor.
389 * @param pCmdHlp Pointer to the command callback structure.
390 * @param pValue The value to assign the symbol.
391 */
392static DECLCALLBACK(int) dbgcSymSetReg(PCDBGCSYM pSymDesc, PDBGCCMDHLP pCmdHlp, PCDBGCVAR pValue)
393{
394 LogFlow(("dbgcSymSetReg: pSymDesc->pszName=%d\n", pSymDesc->pszName));
395
396 /*
397 * pVM is required.
398 */
399 PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp);
400 Assert(pDbgc->pVM);
401
402 /*
403 * Get the right CPU context.
404 */
405 PCPUMCTX pCtx;
406 int rc;
407 if (!(pSymDesc->uUser & SYMREG_FLAGS_HYPER))
408 rc = CPUMQueryGuestCtxPtr(pDbgc->pVM, &pCtx);
409 else
410 rc = CPUMQueryHyperCtxPtr(pDbgc->pVM, &pCtx);
411 if (VBOX_FAILURE(rc))
412 return rc;
413
414 /*
415 * Check the new value.
416 */
417 if (pValue->enmType != DBGCVAR_TYPE_NUMBER)
418 return VERR_PARSE_ARGUMENT_TYPE_MISMATCH;
419
420 /*
421 * Set the value.
422 */
423 void *pvValue = (char *)pCtx + SYMREG_OFFSET(pSymDesc->uUser);
424 switch (SYMREG_SIZE(pSymDesc->uUser))
425 {
426 case 1:
427 *(uint8_t *)pvValue = (uint8_t)pValue->u.u64Number;
428 break;
429 case 2:
430 *(uint16_t *)pvValue = (uint16_t)pValue->u.u64Number;
431 break;
432 case 4:
433 *(uint32_t *)pvValue = (uint32_t)pValue->u.u64Number;
434 break;
435 case 6:
436 *(uint32_t *)pvValue = (uint32_t)pValue->u.u64Number;
437 ((uint16_t *)pvValue)[3] = (uint16_t)(pValue->u.u64Number >> 32);
438 break;
439 case 8:
440 *(uint64_t *)pvValue = pValue->u.u64Number;
441 break;
442 default:
443 return VERR_PARSE_NOT_IMPLEMENTED;
444 }
445
446 return VINF_SUCCESS;
447}
448
449
450/**
451 * Finds a builtin symbol.
452 * @returns Pointer to symbol descriptor on success.
453 * @returns NULL on failure.
454 * @param pDbgc The debug console instance.
455 * @param pszSymbol The symbol name.
456 */
457PCDBGCSYM dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol)
458{
459 for (unsigned iSym = 0; iSym < ELEMENTS(g_aSyms); iSym++)
460 if (!strcmp(pszSymbol, g_aSyms[iSym].pszName))
461 return &g_aSyms[iSym];
462
463 /** @todo externally registered symbols. */
464 NOREF(pDbgc);
465 return NULL;
466}
467
Note: See TracBrowser for help on using the repository browser.

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