Akihiro Sagawa : winedbg: Improve the register conversion to support over 64-bit registers.
Alexandre Julliard
julliard at winehq.org
Wed May 8 15:48:20 CDT 2013
Module: wine
Branch: master
Commit: e06fd8d003ba700e08ecc2dccee808b9aaaff7a2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e06fd8d003ba700e08ecc2dccee808b9aaaff7a2
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Wed May 8 21:11:16 2013 +0900
winedbg: Improve the register conversion to support over 64-bit registers.
---
programs/winedbg/gdbproxy.c | 63 ++++++++++++++++++++++++++----------------
1 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 9c62b4d..47e3bbd 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -447,22 +447,27 @@ static inline DWORD64 cpu_register(CONTEXT* ctx, unsigned idx)
static inline void cpu_register_hex_from(CONTEXT* ctx, unsigned idx, const char** phex)
{
- DWORD64 val = 0;
- unsigned i;
- BYTE b;
-
- for (i = 0; i < cpu_register_map[idx].gdb_length; i++)
- {
- hex_from(&b, *phex, 1);
- *phex += 2;
- val += (DWORD64)b << (8 * i);
- }
- switch (cpu_register_map[idx].ctx_length)
+ if (cpu_register_map[idx].gdb_length == cpu_register_map[idx].ctx_length)
+ hex_from(cpu_register_ptr(ctx, idx), *phex, cpu_register_map[idx].gdb_length);
+ else
{
- case 2: *(WORD*)cpu_register_ptr(ctx, idx) = (WORD)val; break;
- case 4: *(DWORD*)cpu_register_ptr(ctx, idx) = (DWORD)val; break;
- case 8: *(DWORD64*)cpu_register_ptr(ctx, idx) = val; break;
- default: assert(0);
+ DWORD64 val = 0;
+ unsigned i;
+ BYTE b;
+
+ for (i = 0; i < cpu_register_map[idx].gdb_length; i++)
+ {
+ hex_from(&b, *phex, 1);
+ *phex += 2;
+ val += (DWORD64)b << (8 * i);
+ }
+ switch (cpu_register_map[idx].ctx_length)
+ {
+ case 2: *(WORD*)cpu_register_ptr(ctx, idx) = (WORD)val; break;
+ case 4: *(DWORD*)cpu_register_ptr(ctx, idx) = (DWORD)val; break;
+ case 8: *(DWORD64*)cpu_register_ptr(ctx, idx) = val; break;
+ default: assert(0);
+ }
}
}
@@ -1010,14 +1015,19 @@ static enum packet_return packet_reply_error(struct gdb_context* gdbctx, int err
static inline void packet_reply_register_hex_to(struct gdb_context* gdbctx, unsigned idx)
{
- DWORD64 val = cpu_register(&gdbctx->context, idx);
- unsigned i;
-
- for (i = 0; i < cpu_register_map[idx].gdb_length; i++)
+ if (cpu_register_map[idx].gdb_length == cpu_register_map[idx].ctx_length)
+ packet_reply_hex_to(gdbctx, cpu_register_ptr(&gdbctx->context, idx), cpu_register_map[idx].gdb_length);
+ else
{
- BYTE b = val;
- packet_reply_hex_to(gdbctx, &b, 1);
- val >>= 8;
+ DWORD64 val = cpu_register(&gdbctx->context, idx);
+ unsigned i;
+
+ for (i = 0; i < cpu_register_map[idx].gdb_length; i++)
+ {
+ BYTE b = val;
+ packet_reply_hex_to(gdbctx, &b, 1);
+ val >>= 8;
+ }
}
}
@@ -1573,8 +1583,13 @@ static enum packet_return packet_read_register(struct gdb_context* gdbctx)
return packet_error;
}
if (gdbctx->trace & GDBPXY_TRC_COMMAND)
- fprintf(stderr, "Read register %x => %08x%08x\n", reg,
- (unsigned)(cpu_register(pctx, reg) >> 32), (unsigned)cpu_register(pctx, reg));
+ {
+ if (cpu_register_map[reg].ctx_length <= sizeof(DWORD64))
+ fprintf(stderr, "Read register %x => %08x%08x\n", reg,
+ (unsigned)(cpu_register(pctx, reg) >> 32), (unsigned)cpu_register(pctx, reg));
+ else
+ fprintf(stderr, "Read register %x\n", reg);
+ }
packet_reply_open(gdbctx);
packet_reply_register_hex_to(gdbctx, reg);
packet_reply_close(gdbctx);
More information about the wine-cvs
mailing list