X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fproc-service.c;h=dc0544054f92b68c80e71ace8de7e9e728c1174f;hb=7feb7d068ae65557ede03c36468ebac61b0939ca;hp=74e81ae4b185e1ee47d314efc7bf1c0a6328f04a;hpb=39f770628a4eaf018fec8d55684bf2ec16ada9cc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/proc-service.c b/gdb/proc-service.c index 74e81ae4b1..dc0544054f 100644 --- a/gdb/proc-service.c +++ b/gdb/proc-service.c @@ -1,11 +1,13 @@ /* implementation. - Copyright 1999, 2000 Free Software Foundation, Inc. + + Copyright (C) 1999, 2000, 2002, 2007, 2008, 2009 + Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -14,18 +16,19 @@ GNU General Public License for more details. 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. */ + along with this program. If not, see . */ #include "defs.h" -#include "gdb_proc_service.h" -#include - +#include "gdbcore.h" #include "inferior.h" #include "symtab.h" #include "target.h" +#include "regcache.h" + +#include "gdb_proc_service.h" + +#include /* Prototypes for supply_gregset etc. */ #include "gregset.h" @@ -51,31 +54,31 @@ typedef size_t gdb_ps_size_t; /* 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) /* 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 @@ -87,18 +90,19 @@ save_inferior_ptid (void) 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); + inferior_ptid = ph->ptid; 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); @@ -193,7 +197,7 @@ ps_plog (const char *fmt, ...) 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; @@ -202,7 +206,7 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj, 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; } @@ -210,7 +214,7 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj, 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); @@ -219,29 +223,29 @@ ps_pdread (gdb_ps_prochandle_t ph, paddr_t addr, /* 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 @@ -251,11 +255,13 @@ ps_err_e 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); + inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid)); + 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; @@ -268,12 +274,13 @@ ps_err_e 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); + inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid)); + 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; @@ -287,11 +294,13 @@ ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, gdb_prfpregset_t *fpregset) { struct cleanup *old_chain = save_inferior_ptid (); + struct regcache *regcache; - inferior_ptid = BUILD_LWP (lwpid, ph->pid); + inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid)); + 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; @@ -305,26 +314,30 @@ ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const gdb_prfpregset_t *fpregset) { struct cleanup *old_chain = save_inferior_ptid (); + struct regcache *regcache; - inferior_ptid = BUILD_LWP (lwpid, ph->pid); + inferior_ptid = BUILD_LWP (lwpid, ptid_get_pid (ph->ptid)); + 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) { - return ph->pid; + return ptid_get_pid (ph->ptid); } +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_proc_service; + void _initialize_proc_service (void) {