diff options
Diffstat (limited to 'overlay/mgdb/gdb/amd64-winnt-regcache.c')
-rw-r--r-- | overlay/mgdb/gdb/amd64-winnt-regcache.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/overlay/mgdb/gdb/amd64-winnt-regcache.c b/overlay/mgdb/gdb/amd64-winnt-regcache.c index 7a1dab6..86a4b28 100644 --- a/overlay/mgdb/gdb/amd64-winnt-regcache.c +++ b/overlay/mgdb/gdb/amd64-winnt-regcache.c @@ -13,6 +13,8 @@ #include <signal.h> #include <sys/debug.h> +#define AMD64_KNOWN_REG_CAP AMD64_MXCSR_REGNUM + struct regcache; static unsigned regoffs[AMD64_NUM_REGS]; @@ -87,6 +89,43 @@ void amd64_winnt_fetch_registers( regctx->uc_context_flags = WINNT_THREAD_CONTEXT_READY; } +void amd64_winnt_store_registers( + const struct regcache * rcache, + int regnum, + struct winnt_thread * thread) +{ + int pfd; + pid_t tid; + int rmin; + int rmax; + char * mark; + mcontext_t * regctx; + + if (regnum > AMD64_KNOWN_REG_CAP) + return; + + if (regnum < 0) { + rmin = 0; + rmax = AMD64_KNOWN_REG_CAP; + } else { + rmin = regnum; + rmax = regnum; + } + + pfd = thread->process->pfd; + tid = thread->tid; + regctx = &thread->regctx; + mark = (char *)regctx; + + for (regnum=rmin; regnum<=rmax; regnum++) + regcache_raw_collect( + rcache,regnum, + mark + regoffs[regnum]); + + if (!__dbg_regs_store(pfd,tid,regctx)) + regctx->uc_context_flags = WINNT_THREAD_CONTEXT_READY; +} + #define AMD64_WINNT_INIT_REG_OFFSET(regnum,regmem) \ regoffs[regnum] = offsetof(mcontext_t,regmem) |