summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2007-02-20 18:10:13 +0000
committeremaste <emaste@FreeBSD.org>2007-02-20 18:10:13 +0000
commit13b4da30e0802b2d9e53f43bb9a7f755162a3269 (patch)
tree56670ebc6562aa48e8fa29858c312d56c7e1056e /gnu/usr.bin/gdb/libgdb/fbsd-threads.c
parent46050eb5fbb7f6f21acca8fe9af047e7b4ffe377 (diff)
downloadFreeBSD-src-13b4da30e0802b2d9e53f43bb9a7f755162a3269.zip
FreeBSD-src-13b4da30e0802b2d9e53f43bb9a7f755162a3269.tar.gz
Avoid writing uninitialized stack data into a thread's MMX/SSE state by
first getting the current state with td_thr_getxmmregs_p. Without this, debugging a threaded app that uses libthr resulted in kernel panics or spurious SIGFPEs for me. (As of revision 1.6, sys/i386/i386/ptrace_machdep.c masks off the reserved bits in the mxcsr register, which prevents the kernel panics.) Architectures without PT_GETXMMREGS are not affected. MFC after: 1 week
Diffstat (limited to 'gnu/usr.bin/gdb/libgdb/fbsd-threads.c')
-rw-r--r--gnu/usr.bin/gdb/libgdb/fbsd-threads.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
index b88b73f..0000cb8 100644
--- a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
+++ b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
@@ -961,18 +961,21 @@ fbsd_thread_store_registers (int regno)
err = td_thr_getgregs_p (&th, gregset);
if (err != TD_OK)
error ("%s: td_thr_getgregs %s", __func__, thread_db_err_str (err));
- err = td_thr_getfpregs_p (&th, &fpregset);
+#ifdef PT_GETXMMREGS
+ err = td_thr_getxmmregs_p (&th, xmmregs);
if (err != TD_OK)
- error ("%s: td_thr_getfpgregs %s", __func__, thread_db_err_str (err));
+ {
+#endif
+ err = td_thr_getfpregs_p (&th, &fpregset);
+ if (err != TD_OK)
+ error ("%s: td_thr_getfpgregs %s", __func__, thread_db_err_str (err));
+#ifdef PT_GETXMMREGS
+ }
+#endif
supply_register (regno, old_value);
}
fill_gregset (gregset, regno);
- fill_fpregset (&fpregset, regno);
-#ifdef PT_GETXMMREGS
- i387_fill_fxsave (xmmregs, regno);
-#endif
-
err = td_thr_setgregs_p (&th, gregset);
if (err != TD_OK)
error ("Cannot store general-purpose registers for thread %d: Thread ID=%d, %s",
@@ -980,11 +983,13 @@ fbsd_thread_store_registers (int regno)
thread_db_err_str (err));
#ifdef PT_GETXMMREGS
+ i387_fill_fxsave (xmmregs, regno);
err = td_thr_setxmmregs_p (&th, xmmregs);
if (err == TD_OK)
return;
#endif
+ fill_fpregset (&fpregset, regno);
err = td_thr_setfpregs_p (&th, &fpregset);
if (err != TD_OK)
error ("Cannot store floating-point registers for thread %d: Thread ID=%d, %s",
OpenPOWER on IntegriCloud