2004-01-28 Roland McGrath <roland@redhat.com>

* sol-thread.c (sol_thread_xfer_partial): New function.
	(init_sol_thread_ops): Use that for to_xfer_partial hook.
	(init_sol_core_ops): Likewise.
This commit is contained in:
Roland McGrath
2004-02-01 22:35:28 +00:00
parent 14ed0a8b1b
commit 6034ae49ff

View File

@ -111,7 +111,7 @@ static void sol_core_close (int quitting);
static void init_sol_thread_ops (void); static void init_sol_thread_ops (void);
static void init_sol_core_ops (void); static void init_sol_core_ops (void);
/* Default definitions: These must be defined in tm.h /* Default definitions: These must be defined in tm.h
if they are to be shared with a process module such as procfs. */ if they are to be shared with a process module such as procfs. */
#define GET_PID(ptid) ptid_get_pid (ptid) #define GET_PID(ptid) ptid_get_pid (ptid)
@ -127,56 +127,56 @@ static void init_sol_core_ops (void);
/* Pointers to routines from lithread_db resolved by dlopen() */ /* Pointers to routines from lithread_db resolved by dlopen() */
static void (*p_td_log) (const int on_off); static void (*p_td_log) (const int on_off);
static td_err_e (*p_td_ta_new) (const struct ps_prochandle * ph_p, static td_err_e (*p_td_ta_new) (const struct ps_prochandle * ph_p,
td_thragent_t ** ta_pp); td_thragent_t ** ta_pp);
static td_err_e (*p_td_ta_delete) (td_thragent_t * ta_p); static td_err_e (*p_td_ta_delete) (td_thragent_t * ta_p);
static td_err_e (*p_td_init) (void); static td_err_e (*p_td_init) (void);
static td_err_e (*p_td_ta_get_ph) (const td_thragent_t * ta_p, static td_err_e (*p_td_ta_get_ph) (const td_thragent_t * ta_p,
struct ps_prochandle ** ph_pp); struct ps_prochandle ** ph_pp);
static td_err_e (*p_td_ta_get_nthreads) (const td_thragent_t * ta_p, static td_err_e (*p_td_ta_get_nthreads) (const td_thragent_t * ta_p,
int *nthread_p); int *nthread_p);
static td_err_e (*p_td_ta_tsd_iter) (const td_thragent_t * ta_p, static td_err_e (*p_td_ta_tsd_iter) (const td_thragent_t * ta_p,
td_key_iter_f * cb, td_key_iter_f * cb,
void *cbdata_p); void *cbdata_p);
static td_err_e (*p_td_ta_thr_iter) (const td_thragent_t * ta_p, static td_err_e (*p_td_ta_thr_iter) (const td_thragent_t * ta_p,
td_thr_iter_f * cb, td_thr_iter_f * cb,
void *cbdata_p, void *cbdata_p,
td_thr_state_e state, td_thr_state_e state,
int ti_pri, int ti_pri,
sigset_t * ti_sigmask_p, sigset_t * ti_sigmask_p,
unsigned ti_user_flags); unsigned ti_user_flags);
static td_err_e (*p_td_thr_validate) (const td_thrhandle_t * th_p); static td_err_e (*p_td_thr_validate) (const td_thrhandle_t * th_p);
static td_err_e (*p_td_thr_tsd) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_tsd) (const td_thrhandle_t * th_p,
const thread_key_t key, const thread_key_t key,
void **data_pp); void **data_pp);
static td_err_e (*p_td_thr_get_info) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_get_info) (const td_thrhandle_t * th_p,
td_thrinfo_t * ti_p); td_thrinfo_t * ti_p);
static td_err_e (*p_td_thr_getfpregs) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_getfpregs) (const td_thrhandle_t * th_p,
prfpregset_t * fpregset); prfpregset_t * fpregset);
static td_err_e (*p_td_thr_getxregsize) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_getxregsize) (const td_thrhandle_t * th_p,
int *xregsize); int *xregsize);
static td_err_e (*p_td_thr_getxregs) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_getxregs) (const td_thrhandle_t * th_p,
const caddr_t xregset); const caddr_t xregset);
static td_err_e (*p_td_thr_sigsetmask) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_sigsetmask) (const td_thrhandle_t * th_p,
const sigset_t ti_sigmask); const sigset_t ti_sigmask);
static td_err_e (*p_td_thr_setprio) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_setprio) (const td_thrhandle_t * th_p,
const int ti_pri); const int ti_pri);
static td_err_e (*p_td_thr_setsigpending) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_setsigpending) (const td_thrhandle_t * th_p,
const uchar_t ti_pending_flag, const uchar_t ti_pending_flag,
const sigset_t ti_pending); const sigset_t ti_pending);
static td_err_e (*p_td_thr_setfpregs) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_setfpregs) (const td_thrhandle_t * th_p,
const prfpregset_t * fpregset); const prfpregset_t * fpregset);
static td_err_e (*p_td_thr_setxregs) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_setxregs) (const td_thrhandle_t * th_p,
const caddr_t xregset); const caddr_t xregset);
static td_err_e (*p_td_ta_map_id2thr) (const td_thragent_t * ta_p, static td_err_e (*p_td_ta_map_id2thr) (const td_thragent_t * ta_p,
thread_t tid, thread_t tid,
td_thrhandle_t * th_p); td_thrhandle_t * th_p);
static td_err_e (*p_td_ta_map_lwp2thr) (const td_thragent_t * ta_p, static td_err_e (*p_td_ta_map_lwp2thr) (const td_thragent_t * ta_p,
lwpid_t lwpid, lwpid_t lwpid,
td_thrhandle_t * th_p); td_thrhandle_t * th_p);
static td_err_e (*p_td_thr_getgregs) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_getgregs) (const td_thrhandle_t * th_p,
prgregset_t regset); prgregset_t regset);
static td_err_e (*p_td_thr_setgregs) (const td_thrhandle_t * th_p, static td_err_e (*p_td_thr_setgregs) (const td_thrhandle_t * th_p,
const prgregset_t regset); const prgregset_t regset);
/* /*
@ -647,7 +647,7 @@ sol_thread_store_registers (int regno)
if (regno != -1) if (regno != -1)
{ /* Not writing all the regs */ { /* Not writing all the regs */
char old_value[MAX_REGISTER_SIZE]; char old_value[MAX_REGISTER_SIZE];
/* Save new register value. */ /* Save new register value. */
regcache_collect (regno, old_value); regcache_collect (regno, old_value);
@ -739,7 +739,7 @@ sol_thread_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int dowrite,
/* Note: don't need to call switch_to_thread; we're just reading memory. */ /* Note: don't need to call switch_to_thread; we're just reading memory. */
if (target_has_execution) if (target_has_execution)
retval = procfs_ops.to_xfer_memory (memaddr, myaddr, len, retval = procfs_ops.to_xfer_memory (memaddr, myaddr, len,
dowrite, attrib, target); dowrite, attrib, target);
else else
retval = orig_core_ops.to_xfer_memory (memaddr, myaddr, len, retval = orig_core_ops.to_xfer_memory (memaddr, myaddr, len,
@ -750,6 +750,37 @@ sol_thread_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int dowrite,
return retval; return retval;
} }
/* Perform partial transfers on OBJECT. See target_read_partial
and target_write_partial for details of each variant. One, and
only one, of readbuf or writebuf must be non-NULL. */
static LONGEST
sol_thread_xfer_partial (struct target_ops *ops, enum target_object object,
const char *annex, void *readbuf,
const void *writebuf, ULONGEST offset, LONGEST len)
{
int retval;
struct cleanup *old_chain;
old_chain = save_inferior_ptid ();
if (is_thread (inferior_ptid) || /* A thread */
!target_thread_alive (inferior_ptid)) /* An lwp, but not alive */
inferior_ptid = procfs_first_available (); /* Find any live lwp. */
/* Note: don't need to call switch_to_thread; we're just reading memory. */
if (target_has_execution)
retval = procfs_ops.to_xfer_partial (ops, object, annex,
readbuf, writebuf, offset, len);
else
retval = orig_core_ops.to_xfer_partial (ops, object, annex,
readbuf, writebuf, offset, len);
do_cleanups (old_chain);
return retval;
}
/* Print status information about what we're accessing. */ /* Print status information about what we're accessing. */
static void static void
@ -798,7 +829,7 @@ sol_thread_create_inferior (char *exec_file, char *allargs, char **env)
those variables don't show up until the library gets mapped and the symbol those variables don't show up until the library gets mapped and the symbol
table is read in. */ table is read in. */
/* This new_objfile event is now managed by a chained function pointer. /* This new_objfile event is now managed by a chained function pointer.
* It is the callee's responsability to call the next client on the chain. * It is the callee's responsability to call the next client on the chain.
*/ */
@ -864,7 +895,7 @@ sol_thread_can_run (void)
return procfs_suppress_run; return procfs_suppress_run;
} }
/* /*
LOCAL FUNCTION LOCAL FUNCTION
@ -1028,10 +1059,10 @@ rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr,
/* FIXME: passing 0 as attrib argument. */ /* FIXME: passing 0 as attrib argument. */
if (target_has_execution) if (target_has_execution)
cc = procfs_ops.to_xfer_memory (addr, buf, size, cc = procfs_ops.to_xfer_memory (addr, buf, size,
dowrite, 0, &procfs_ops); dowrite, 0, &procfs_ops);
else else
cc = orig_core_ops.to_xfer_memory (addr, buf, size, cc = orig_core_ops.to_xfer_memory (addr, buf, size,
dowrite, 0, &core_ops); dowrite, 0, &core_ops);
if (cc < 0) if (cc < 0)
@ -1048,10 +1079,10 @@ rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr,
else if (cc == 0) else if (cc == 0)
{ {
if (dowrite == 0) if (dowrite == 0)
warning ("rw_common (): unable to read at addr 0x%lx", warning ("rw_common (): unable to read at addr 0x%lx",
(long) addr); (long) addr);
else else
warning ("rw_common (): unable to write at addr 0x%lx", warning ("rw_common (): unable to write at addr 0x%lx",
(long) addr); (long) addr);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1430,7 +1461,7 @@ sol_core_files_info (struct target_ops *t)
} }
/* Worker bee for info sol-thread command. This is a callback function that /* Worker bee for info sol-thread command. This is a callback function that
gets called once for each Solaris thread (ie. not kernel thread) in the gets called once for each Solaris thread (ie. not kernel thread) in the
inferior. Print anything interesting that we can think of. */ inferior. Print anything interesting that we can think of. */
static int static int
@ -1512,10 +1543,10 @@ info_solthreads (char *args, int from_tty)
} }
static int static int
sol_find_memory_regions (int (*func) (CORE_ADDR, sol_find_memory_regions (int (*func) (CORE_ADDR,
unsigned long, unsigned long,
int, int, int, int, int, int,
void *), void *),
void *data) void *data)
{ {
return procfs_ops.to_find_memory_regions (func, data); return procfs_ops.to_find_memory_regions (func, data);
@ -1549,6 +1580,7 @@ init_sol_thread_ops (void)
sol_thread_ops.to_store_registers = sol_thread_store_registers; sol_thread_ops.to_store_registers = sol_thread_store_registers;
sol_thread_ops.to_prepare_to_store = sol_thread_prepare_to_store; sol_thread_ops.to_prepare_to_store = sol_thread_prepare_to_store;
sol_thread_ops.to_xfer_memory = sol_thread_xfer_memory; sol_thread_ops.to_xfer_memory = sol_thread_xfer_memory;
sol_thread_ops.to_xfer_partial = sol_thread_xfer_partial;
sol_thread_ops.to_files_info = sol_thread_files_info; sol_thread_ops.to_files_info = sol_thread_files_info;
sol_thread_ops.to_insert_breakpoint = memory_insert_breakpoint; sol_thread_ops.to_insert_breakpoint = memory_insert_breakpoint;
sol_thread_ops.to_remove_breakpoint = memory_remove_breakpoint; sol_thread_ops.to_remove_breakpoint = memory_remove_breakpoint;
@ -1592,6 +1624,7 @@ init_sol_core_ops (void)
sol_core_ops.to_detach = sol_core_detach; sol_core_ops.to_detach = sol_core_detach;
sol_core_ops.to_fetch_registers = sol_thread_fetch_registers; sol_core_ops.to_fetch_registers = sol_thread_fetch_registers;
sol_core_ops.to_xfer_memory = sol_thread_xfer_memory; sol_core_ops.to_xfer_memory = sol_thread_xfer_memory;
sol_core_ops.to_xfer_partial = sol_thread_xfer_partial;
sol_core_ops.to_files_info = sol_core_files_info; sol_core_ops.to_files_info = sol_core_files_info;
sol_core_ops.to_insert_breakpoint = ignore; sol_core_ops.to_insert_breakpoint = ignore;
sol_core_ops.to_remove_breakpoint = ignore; sol_core_ops.to_remove_breakpoint = ignore;