summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gnu/usr.bin/binutils/gdb/freebsd-uthread.c72
1 files changed, 46 insertions, 26 deletions
diff --git a/gnu/usr.bin/binutils/gdb/freebsd-uthread.c b/gnu/usr.bin/binutils/gdb/freebsd-uthread.c
index 80e65fe..5e4bbe3 100644
--- a/gnu/usr.bin/binutils/gdb/freebsd-uthread.c
+++ b/gnu/usr.bin/binutils/gdb/freebsd-uthread.c
@@ -118,9 +118,11 @@ struct cached_pthread {
u_int64_t uniqueid;
int state;
CORE_ADDR name;
- int sig_saved;
- ucontext_t saved_sigcontext;
- jmp_buf saved_jmp_buf;
+ int ctxtype;
+ union {
+ ucontext_t uc;
+ jmp_buf jb;
+ } ctx;
};
static int cached_thread;
@@ -151,21 +153,29 @@ static CORE_ADDR P_thread_next_offset;
static CORE_ADDR P_thread_uniqueid_offset;
static CORE_ADDR P_thread_state_offset;
static CORE_ADDR P_thread_name_offset;
-static CORE_ADDR P_thread_sig_saved_offset;
-static CORE_ADDR P_thread_saved_sigcontext_offset;
-static CORE_ADDR P_thread_saved_jmp_buf_offset;
+static CORE_ADDR P_thread_curframe_offset;
+static CORE_ADDR P_thread_sigframe_ctxtype_offset;
+static CORE_ADDR P_thread_sigframe_ctx_offset;
static CORE_ADDR P_thread_PS_RUNNING_value;
static CORE_ADDR P_thread_PS_DEAD_value;
+static CORE_ADDR P_thread_CTX_JB_NOSIG_value;
+static CORE_ADDR P_thread_CTX_JB_value;
+static CORE_ADDR P_thread_CTX_SJB_value;
+static CORE_ADDR P_thread_CTX_UC_value;
static int next_offset;
static int uniqueid_offset;
static int state_offset;
static int name_offset;
-static int sig_saved_offset;
-static int saved_sigcontext_offset;
-static int saved_jmp_buf_offset;
+static int curframe_offset;
+static int sigframe_ctxtype_offset;
+static int sigframe_ctx_offset;
static int PS_RUNNING_value;
static int PS_DEAD_value;
+static int CTX_JB_NOSIG_value;
+static int CTX_JB_value;
+static int CTX_SJB_value;
+static int CTX_UC_value;
#define UNIQUEID_HASH(id) (id % MAPHASH_SIZE)
#define TID_ADD1(tid) (((tid) + 1) == TID_MAX + 1 \
@@ -256,12 +266,16 @@ read_thread_offsets ()
READ_OFFSET(uniqueid);
READ_OFFSET(state);
READ_OFFSET(name);
- READ_OFFSET(sig_saved);
- READ_OFFSET(saved_sigcontext);
- READ_OFFSET(saved_jmp_buf);
+ READ_OFFSET(curframe);
+ READ_OFFSET(sigframe_ctxtype);
+ READ_OFFSET(sigframe_ctx);
READ_VALUE(PS_RUNNING);
READ_VALUE(PS_DEAD);
+ READ_VALUE(CTX_JB_NOSIG);
+ READ_VALUE(CTX_JB);
+ READ_VALUE(CTX_SJB);
+ READ_VALUE(CTX_UC);
}
#define READ_FIELD(ptr, T, field, result) \
@@ -290,12 +304,14 @@ read_cached_pthread (ptr, cache)
CORE_ADDR ptr;
struct cached_pthread *cache;
{
+ CORE_ADDR curframe_ptr;
+
READ_FIELD(ptr, u_int64_t, uniqueid, cache->uniqueid);
READ_FIELD(ptr, int, state, cache->state);
READ_FIELD(ptr, CORE_ADDR, name, cache->name);
- READ_FIELD(ptr, int, sig_saved, cache->sig_saved);
- READ_FIELD(ptr, ucontext_t, saved_sigcontext,cache->saved_sigcontext);
- READ_FIELD(ptr, jmp_buf, saved_jmp_buf, cache->saved_jmp_buf);
+ READ_FIELD(ptr, CORE_ADDR, curframe, curframe_ptr);
+ READ_FIELD(curframe_ptr, int, sigframe_ctxtype, cache->ctxtype);
+ READ_FIELD(curframe_ptr, int, sigframe_ctx, cache->ctx);
}
static int
@@ -590,7 +606,6 @@ freebsd_uthread_fetch_registers (regno)
{
struct cached_pthread *thread;
struct cleanup *old_chain;
- int i;
int active;
int first_regno, last_regno;
register_t *regbase;
@@ -630,14 +645,14 @@ freebsd_uthread_fetch_registers (regno)
last_regno = regno;
}
- if (thread->sig_saved)
+ if (thread->ctxtype == CTX_UC_value)
{
- regbase = (register_t*) &thread->saved_sigcontext.uc_mcontext;
+ regbase = (register_t*) &thread->ctx.uc.uc_mcontext;
regmap = sigmap;
}
else
{
- regbase = (register_t*) &thread->saved_jmp_buf[0];
+ regbase = (register_t*) &thread->ctx.jb[0];
regmap = jmpmap;
}
@@ -659,7 +674,6 @@ freebsd_uthread_store_registers (regno)
struct cached_pthread *thread;
CORE_ADDR ptr;
struct cleanup *old_chain;
- int i;
int first_regno, last_regno;
u_int32_t *regbase;
char *regmap;
@@ -696,14 +710,14 @@ freebsd_uthread_store_registers (regno)
last_regno = regno;
}
- if (thread->sig_saved)
+ if (thread->ctxtype == CTX_UC_value)
{
- regbase = (u_int32_t*) &thread->saved_sigcontext;
+ regbase = (u_int32_t*) &thread->ctx.uc.uc_mcontext;
regmap = sigmap;
}
else
{
- regbase = (u_int32_t*) &thread->saved_jmp_buf[0];
+ regbase = (u_int32_t*) &thread->ctx.jb[0];
regmap = jmpmap;
}
@@ -889,12 +903,16 @@ freebsd_uthread_new_objfile (objfile)
LOOKUP_OFFSET(uniqueid);
LOOKUP_OFFSET(state);
LOOKUP_OFFSET(name);
- LOOKUP_OFFSET(sig_saved);
- LOOKUP_OFFSET(saved_sigcontext);
- LOOKUP_OFFSET(saved_jmp_buf);
+ LOOKUP_OFFSET(curframe);
+ LOOKUP_OFFSET(sigframe_ctxtype);
+ LOOKUP_OFFSET(sigframe_ctx);
LOOKUP_VALUE(PS_RUNNING);
LOOKUP_VALUE(PS_DEAD);
+ LOOKUP_VALUE(CTX_JB_NOSIG);
+ LOOKUP_VALUE(CTX_JB);
+ LOOKUP_VALUE(CTX_SJB);
+ LOOKUP_VALUE(CTX_UC);
freebsd_uthread_active = 1;
}
@@ -1016,6 +1034,7 @@ static const char *statenames[] = {
"FDLW_WAIT",
"FDR_WAIT",
"FDW_WAIT",
+ "POLL_WAIT",
"FILE_WAIT",
"SELECT_WAIT",
"SLEEP_WAIT",
@@ -1053,6 +1072,7 @@ freebsd_uthread_get_thread_info (ref, selection, info)
strcpy(info->shortname, "");
do_cleanups (old_chain);
+ return (0);
}
char *
OpenPOWER on IntegriCloud