
1: /* Set a thread's general register set. 2: Copyright (C) 1999, 2001, 2002, 2003, 2007 Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: Contributed by Ulrich Drepper <drepper@redhat.com>, 1999. 5: 6: The GNU C Library is free software; you can redistribute it and/or 7: modify it under the terms of the GNU Lesser General Public 8: License as published by the Free Software Foundation; either 9: version 2.1 of the License, or (at your option) any later version. 10: 11: The GNU C Library is distributed in the hope that it will be useful, 12: but WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: Lesser General Public License for more details. 15: 16: You should have received a copy of the GNU Lesser General Public 17: License along with the GNU C Library; if not, write to the Free 18: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19: 02111-1307 USA. */ 20: 21: #include "thread_dbP.h" 22: 23: 24: td_err_e 25: td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs) 26: { 27: psaddr_t cancelhandling, tid; 28: td_err_e err; 29: 30: LOG ("td_thr_setgregs"); 31: 32: if (th->th_unique == 0) 33: /* Special case for the main thread before initialization. */ 34: return ps_lsetregs (th->th_ta_p->ph, ps_getpid (th->th_ta_p->ph), 35: gregs) != PS_OK ? TD_ERR : TD_OK; 36: 37: /* We have to get the state and the PID for this thread. */ 38: err = DB_GET_FIELD (cancelhandling, th->th_ta_p, th->th_unique, pthread, 39: cancelhandling, 0); 40: if (err != TD_OK) 41: return err; 42: 43: /* Only set the registers if the thread hasn't yet terminated. */ 44: if ((((int) (uintptr_t) cancelhandling) & TERMINATED_BITMASK) == 0) 45: { 46: err = DB_GET_FIELD (tid, th->th_ta_p, th->th_unique, pthread, tid, 0); 47: if (err != TD_OK) 48: return err; 49: 50: if (ps_lsetregs (th->th_ta_p->ph, tid - (psaddr_t) 0, gregs) != PS_OK) 51: return TD_ERR; 52: } 53: 54: return TD_OK; 55: }