VirtualBox

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

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

The Big Sun Rebranding Header Change

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