/* <proc_service.h> implementation.
- Copyright 1999, 2000 Free Software Foundation, Inc.
+
+ Copyright (C) 1999, 2000, 2002, 2007 Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
-#include "gdb_proc_service.h"
-#include <sys/procfs.h>
-
+#include "gdbcore.h"
#include "inferior.h"
#include "symtab.h"
#include "target.h"
+#include "regcache.h"
+
+#include "gdb_proc_service.h"
+#include "gdb_stdint.h"
+
+#include <sys/procfs.h>
/* Prototypes for supply_gregset etc. */
#include "gregset.h"
/* Building process ids. */
-#ifndef MERGEPID
-#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
-#endif
-
-#define BUILD_LWP(tid, pid) MERGEPID (pid, tid)
+#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
\f
/* Helper functions. */
-static void
-restore_inferior_ptid (void *arg)
+/* Convert a psaddr_t to a CORE_ADDR. */
+
+static CORE_ADDR
+ps_addr_to_core_addr (psaddr_t addr)
{
- ptid_t *saved_pid_ptr = arg;
- inferior_ptid = *saved_pid_ptr;
- xfree (arg);
+ if (exec_bfd && bfd_get_sign_extend_vma (exec_bfd))
+ return (intptr_t) addr;
+ else
+ return (uintptr_t) addr;
}
-static struct cleanup *
-save_inferior_ptid (void)
-{
- ptid_t *saved_ptid_ptr;
+/* Convert a CORE_ADDR to a psaddr_t. */
- saved_ptid_ptr = xmalloc (sizeof (ptid_t));
- *saved_ptid_ptr = inferior_ptid;
- return make_cleanup (restore_inferior_ptid, saved_ptid_ptr);
+static psaddr_t
+core_addr_to_ps_addr (CORE_ADDR addr)
+{
+ if (exec_bfd && bfd_get_sign_extend_vma (exec_bfd))
+ return (psaddr_t) (intptr_t) addr;
+ else
+ return (psaddr_t) (uintptr_t) addr;
}
/* Transfer LEN bytes of memory between BUF and address ADDR in the
ps_ptwrite. */
static ps_err_e
-ps_xfer_memory (const struct ps_prochandle *ph, paddr_t addr,
- char *buf, size_t len, int write)
+ps_xfer_memory (const struct ps_prochandle *ph, psaddr_t addr,
+ gdb_byte *buf, size_t len, int write)
{
struct cleanup *old_chain = save_inferior_ptid ();
int ret;
+ CORE_ADDR core_addr = ps_addr_to_core_addr (addr);
inferior_ptid = pid_to_ptid (ph->pid);
if (write)
- ret = target_write_memory (addr, buf, len);
+ ret = target_write_memory (core_addr, buf, len);
else
- ret = target_read_memory (addr, buf, len);
+ ret = target_read_memory (core_addr, buf, len);
do_cleanups (old_chain);
ps_err_e
ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
- const char *name, paddr_t *sym_addr)
+ const char *name, psaddr_t *sym_addr)
{
struct minimal_symbol *ms;
if (ms == NULL)
return PS_NOSYM;
- *sym_addr = SYMBOL_VALUE_ADDRESS (ms);
+ *sym_addr = core_addr_to_ps_addr (SYMBOL_VALUE_ADDRESS (ms));
return PS_OK;
}
them into BUF. */
ps_err_e
-ps_pdread (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_pdread (gdb_ps_prochandle_t ph, psaddr_t addr,
gdb_ps_read_buf_t buf, gdb_ps_size_t size)
{
return ps_xfer_memory (ph, addr, buf, size, 0);
/* Write SIZE bytes from BUF into the target process PH at address ADDR. */
ps_err_e
-ps_pdwrite (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_pdwrite (gdb_ps_prochandle_t ph, psaddr_t addr,
gdb_ps_write_buf_t buf, gdb_ps_size_t size)
{
- return ps_xfer_memory (ph, addr, (char *) buf, size, 1);
+ return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 1);
}
/* Read SIZE bytes from the target process PH at address ADDR and copy
them into BUF. */
ps_err_e
-ps_ptread (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_ptread (gdb_ps_prochandle_t ph, psaddr_t addr,
gdb_ps_read_buf_t buf, gdb_ps_size_t size)
{
- return ps_xfer_memory (ph, addr, buf, size, 0);
+ return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 0);
}
/* Write SIZE bytes from BUF into the target process PH at address ADDR. */
ps_err_e
-ps_ptwrite (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_ptwrite (gdb_ps_prochandle_t ph, psaddr_t addr,
gdb_ps_write_buf_t buf, gdb_ps_size_t size)
{
- return ps_xfer_memory (ph, addr, (char *) buf, size, 1);
+ return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 1);
}
/* Get the general registers of LWP LWPID within the target process PH
ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset)
{
struct cleanup *old_chain = save_inferior_ptid ();
+ struct regcache *regcache;
inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+ regcache = get_thread_regcache (inferior_ptid);
- target_fetch_registers (-1);
- fill_gregset ((gdb_gregset_t *) gregset, -1);
+ target_fetch_registers (regcache, -1);
+ fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
do_cleanups (old_chain);
return PS_OK;
ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prgregset_t gregset)
{
struct cleanup *old_chain = save_inferior_ptid ();
+ struct regcache *regcache;
inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+ regcache = get_thread_regcache (inferior_ptid);
- /* FIXME: We should really make supply_gregset const-correct. */
- supply_gregset ((gdb_gregset_t *) gregset);
- target_store_registers (-1);
+ supply_gregset (regcache, (const gdb_gregset_t *) gregset);
+ target_store_registers (regcache, -1);
do_cleanups (old_chain);
return PS_OK;
gdb_prfpregset_t *fpregset)
{
struct cleanup *old_chain = save_inferior_ptid ();
+ struct regcache *regcache;
inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+ regcache = get_thread_regcache (inferior_ptid);
- target_fetch_registers (-1);
- fill_fpregset ((gdb_fpregset_t *) fpregset, -1);
+ target_fetch_registers (regcache, -1);
+ fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
do_cleanups (old_chain);
return PS_OK;
const gdb_prfpregset_t *fpregset)
{
struct cleanup *old_chain = save_inferior_ptid ();
+ struct regcache *regcache;
inferior_ptid = BUILD_LWP (lwpid, ph->pid);
+ regcache = get_thread_regcache (inferior_ptid);
- /* FIXME: We should really make supply_fpregset const-correct. */
- supply_fpregset ((gdb_fpregset_t *) fpregset);
- target_store_registers (-1);
+ supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
+ target_store_registers (regcache, -1);
do_cleanups (old_chain);
return PS_OK;
}
-/* Return overall process id of the target PH.
- Special for Linux -- not used on Solaris. */
+/* Return overall process id of the target PH. Special for GNU/Linux
+ -- not used on Solaris. */
pid_t
ps_getpid (gdb_ps_prochandle_t ph)