From 5da18e19030103b0c8fba67762b9eb5cf621d172 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 18 Nov 2005 06:03:31 +0000 Subject: import new linuxthreads_db from glibc HEAD --- libpthread/linuxthreads_db/td_thr_setgregs.c | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 libpthread/linuxthreads_db/td_thr_setgregs.c (limited to 'libpthread/linuxthreads_db/td_thr_setgregs.c') diff --git a/libpthread/linuxthreads_db/td_thr_setgregs.c b/libpthread/linuxthreads_db/td_thr_setgregs.c new file mode 100644 index 000000000..8c021a473 --- /dev/null +++ b/libpthread/linuxthreads_db/td_thr_setgregs.c @@ -0,0 +1,47 @@ +/* Set a thread's general register set. + Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1999. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include "thread_dbP.h" + + +td_err_e +td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs) +{ + struct _pthread_descr_struct pds = { .p_terminated = 0, .p_pid = 0 }; + + LOG ("td_thr_setgregs"); + + /* We have to get the state and the PID for this thread. */ + if (th->th_unique != NULL + && ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, + sizeof (struct _pthread_descr_struct)) != PS_OK) + return TD_ERR; + + /* Only set the registers if the thread hasn't yet terminated. */ + if (pds.p_terminated == 0) + { + pid_t pid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph); + + if (ps_lsetregs (th->th_ta_p->ph, pid, gregs) != PS_OK) + return TD_ERR; + } + + return TD_OK; +} -- cgit v1.2.3