summaryrefslogtreecommitdiff
path: root/overlay/mgdb/gdb/amd64-winnt-regcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'overlay/mgdb/gdb/amd64-winnt-regcache.c')
-rw-r--r--overlay/mgdb/gdb/amd64-winnt-regcache.c39
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)