Zebediah Figura : winedbg: Add a backend-specific vector for retrieving a thread's context.
Alexandre Julliard
julliard at winehq.org
Wed Jun 13 16:10:51 CDT 2018
Module: wine
Branch: master
Commit: 23261793122e6bce51374556d000a6387b91538b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=23261793122e6bce51374556d000a6387b91538b
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Tue Jun 12 19:01:50 2018 -0500
winedbg: Add a backend-specific vector for retrieving a thread's context.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/be_arm.c | 11 +++++++++++
programs/winedbg/be_arm64.c | 11 +++++++++++
programs/winedbg/be_cpu.h | 3 +++
programs/winedbg/be_i386.c | 7 +++++++
programs/winedbg/be_ppc.c | 11 +++++++++++
programs/winedbg/be_x86_64.c | 11 +++++++++++
programs/winedbg/gdbproxy.c | 2 +-
programs/winedbg/stack.c | 4 +---
programs/winedbg/tgt_active.c | 14 +-------------
9 files changed, 57 insertions(+), 17 deletions(-)
diff --git a/programs/winedbg/be_arm.c b/programs/winedbg/be_arm.c
index b7e42e1..a0e8027 100644
--- a/programs/winedbg/be_arm.c
+++ b/programs/winedbg/be_arm.c
@@ -1889,6 +1889,16 @@ static BOOL be_arm_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
return memory_write_value(lvalue, size, &val);
}
+static BOOL be_arm_get_context(HANDLE thread, dbg_ctx_t *ctx)
+{
+#ifdef __arm__
+ ctx->ctx.ContextFlags = CONTEXT_ALL;
+ return GetThreadContext(thread, &ctx->ctx);
+#else
+ WINE_FIXME("Cannot debug an ARM process on this architecture.\n");
+#endif
+}
+
struct backend_cpu be_arm =
{
IMAGE_FILE_MACHINE_ARMNT,
@@ -1915,5 +1925,6 @@ struct backend_cpu be_arm =
be_arm_fetch_integer,
be_arm_fetch_float,
be_arm_store_integer,
+ be_arm_get_context,
};
#endif
diff --git a/programs/winedbg/be_arm64.c b/programs/winedbg/be_arm64.c
index dfeb552..6aa26a6 100644
--- a/programs/winedbg/be_arm64.c
+++ b/programs/winedbg/be_arm64.c
@@ -278,6 +278,16 @@ void be_arm64_disasm_one_insn(ADDRESS64 *addr, int display)
dbg_printf("be_arm64_disasm_one_insn: not done\n");
}
+static BOOL be_arm64_get_context(HANDLE thread, dbg_ctx_t *ctx)
+{
+#ifdef __aarch64__
+ ctx->ctx.ContextFlags = CONTEXT_ALL;
+ return GetThreadContext(thread, &ctx->ctx);
+#else
+ WINE_FIXME("Cannot debug an ARM64 process on this architecture.\n");
+#endif
+}
+
struct backend_cpu be_arm64 =
{
IMAGE_FILE_MACHINE_ARM64,
@@ -304,5 +314,6 @@ struct backend_cpu be_arm64 =
be_arm64_fetch_integer,
be_arm64_fetch_float,
be_arm64_store_integer,
+ be_arm64_get_context,
};
#endif
diff --git a/programs/winedbg/be_cpu.h b/programs/winedbg/be_cpu.h
index 03776d0..aa7d9f0 100644
--- a/programs/winedbg/be_cpu.h
+++ b/programs/winedbg/be_cpu.h
@@ -21,6 +21,7 @@
enum be_cpu_addr {be_cpu_addr_pc, be_cpu_addr_stack, be_cpu_addr_frame};
enum be_xpoint_type {be_xpoint_break, be_xpoint_watch_exec, be_xpoint_watch_read,
be_xpoint_watch_write, be_xpoint_free=-1};
+
struct backend_cpu
{
const DWORD machine;
@@ -114,6 +115,8 @@ struct backend_cpu
BOOL (*fetch_float)(const struct dbg_lvalue* lvalue, unsigned size, long double*);
/* Writes an integer to memory */
BOOL (*store_integer)(const struct dbg_lvalue* lvalue, unsigned size, BOOL is_signed, LONGLONG);
+
+ BOOL (*get_context)(HANDLE thread, dbg_ctx_t *ctx);
};
/* some handy functions for non segmented CPUs */
diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c
index bdc2ece..c7f5ac1 100644
--- a/programs/winedbg/be_i386.c
+++ b/programs/winedbg/be_i386.c
@@ -853,6 +853,12 @@ static BOOL be_i386_store_integer(const struct dbg_lvalue* lvalue, unsigned size
return memory_write_value(lvalue, size, &val);
}
+static BOOL be_i386_get_context(HANDLE thread, dbg_ctx_t *ctx)
+{
+ ctx->x86.ContextFlags = WOW64_CONTEXT_ALL;
+ return Wow64GetThreadContext(thread, &ctx->x86);
+}
+
struct backend_cpu be_i386 =
{
IMAGE_FILE_MACHINE_I386,
@@ -879,5 +885,6 @@ struct backend_cpu be_i386 =
be_i386_fetch_integer,
be_i386_fetch_float,
be_i386_store_integer,
+ be_i386_get_context,
};
#endif
diff --git a/programs/winedbg/be_ppc.c b/programs/winedbg/be_ppc.c
index f1543bf..baf77dc 100644
--- a/programs/winedbg/be_ppc.c
+++ b/programs/winedbg/be_ppc.c
@@ -180,6 +180,16 @@ static BOOL be_ppc_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
return FALSE;
}
+static BOOL be_ppc_get_context(HANDLE thread, dbg_ctx_t *ctx)
+{
+#ifdef __powerpc__
+ ctx->ctx.ContextFlags = CONTEXT_ALL;
+ return GetThreadContext(thread, &ctx->ctx);
+#else
+ WINE_FIXME("Cannot debug a PowerPC process on this architecture.\n");
+#endif
+}
+
struct backend_cpu be_ppc =
{
IMAGE_FILE_MACHINE_POWERPC,
@@ -206,5 +216,6 @@ struct backend_cpu be_ppc =
be_ppc_fetch_integer,
be_ppc_fetch_float,
be_ppc_store_integer,
+ be_ppc_get_context,
};
#endif
diff --git a/programs/winedbg/be_x86_64.c b/programs/winedbg/be_x86_64.c
index 450cc87..434f007 100644
--- a/programs/winedbg/be_x86_64.c
+++ b/programs/winedbg/be_x86_64.c
@@ -674,6 +674,16 @@ static BOOL be_x86_64_store_integer(const struct dbg_lvalue* lvalue, unsigned si
return memory_write_value(lvalue, size, &val);
}
+static BOOL be_x86_64_get_context(HANDLE thread, dbg_ctx_t *ctx)
+{
+#ifdef __x86_64__
+ ctx->ctx.ContextFlags = CONTEXT_ALL;
+ return GetThreadContext(thread, &ctx->ctx);
+#else
+ WINE_FIXME("Cannot debug an x86-64 process on this architecture.\n");
+#endif
+}
+
struct backend_cpu be_x86_64 =
{
IMAGE_FILE_MACHINE_AMD64,
@@ -700,5 +710,6 @@ struct backend_cpu be_x86_64 =
be_x86_64_fetch_integer,
be_x86_64_fetch_float,
be_x86_64_store_integer,
+ be_x86_64_get_context,
};
#endif
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index d5786b2..b11a8b0 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -552,7 +552,7 @@ static inline void cpu_register_hex_from(dbg_ctx_t* ctx, unsigned idx, const cha
static BOOL fetch_context(struct gdb_context *gdbctx, HANDLE h, dbg_ctx_t *ctx)
{
- if (!GetThreadContext(h, &ctx->ctx))
+ if (!gdbctx->process->be_cpu->get_context(h, ctx))
{
if (gdbctx->trace & GDBPXY_TRC_WIN32_ERROR)
fprintf(stderr, "Can't get thread's context\n");
diff --git a/programs/winedbg/stack.c b/programs/winedbg/stack.c
index a036107..820200d 100644
--- a/programs/winedbg/stack.c
+++ b/programs/winedbg/stack.c
@@ -354,11 +354,9 @@ static void backtrace_tid(struct dbg_process* pcs, DWORD tid)
dbg_ctx_t ctx = {0};
dbg_curr_tid = dbg_curr_thread->tid;
-
- ctx.ctx.ContextFlags = CONTEXT_FULL;
if (SuspendThread(dbg_curr_thread->handle) != -1)
{
- if (!GetThreadContext(dbg_curr_thread->handle, &ctx.ctx))
+ if (!pcs->be_cpu->get_context(dbg_curr_thread->handle, &ctx))
{
dbg_printf("Can't get context for thread %04x in current process\n",
tid);
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index 8c94402..fccae0c 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -91,19 +91,7 @@ BOOL dbg_attach_debuggee(DWORD pid, BOOL cofe)
static unsigned dbg_fetch_context(void)
{
- dbg_context.ctx.ContextFlags = CONTEXT_CONTROL
- | CONTEXT_INTEGER
-#ifdef CONTEXT_FLOATING_POINT
- | CONTEXT_FLOATING_POINT
-#endif
-#ifdef CONTEXT_SEGMENTS
- | CONTEXT_SEGMENTS
-#endif
-#ifdef CONTEXT_DEBUG_REGISTERS
- | CONTEXT_DEBUG_REGISTERS
-#endif
- ;
- if (!GetThreadContext(dbg_curr_thread->handle, &dbg_context.ctx))
+ if (!dbg_curr_process->be_cpu->get_context(dbg_curr_thread->handle, &dbg_context))
{
WINE_WARN("Can't get thread's context\n");
return FALSE;
More information about the wine-cvs
mailing list