gdb/proc-service.c - gdb
Data types defined
Functions defined
Source code
- #include "defs.h"
- #include "gdbcore.h"
- #include "inferior.h"
- #include "symtab.h"
- #include "target.h"
- #include "regcache.h"
- #include "objfiles.h"
- #include "gdb_proc_service.h"
- #include <sys/procfs.h>
- #include "gregset.h"
- #ifdef PROC_SERVICE_IS_OLD
- typedef const struct ps_prochandle *gdb_ps_prochandle_t;
- typedef char *gdb_ps_read_buf_t;
- typedef char *gdb_ps_write_buf_t;
- typedef int gdb_ps_size_t;
- #else
- typedef struct ps_prochandle *gdb_ps_prochandle_t;
- typedef void *gdb_ps_read_buf_t;
- typedef const void *gdb_ps_write_buf_t;
- typedef size_t gdb_ps_size_t;
- #endif
- static CORE_ADDR
- ps_addr_to_core_addr (psaddr_t addr)
- {
- if (exec_bfd && bfd_get_sign_extend_vma (exec_bfd))
- return (intptr_t) addr;
- else
- return (uintptr_t) addr;
- }
- 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;
- }
- static ps_err_e
- 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 = ph->ptid;
- if (write)
- ret = target_write_memory (core_addr, buf, len);
- else
- ret = target_read_memory (core_addr, buf, len);
- do_cleanups (old_chain);
- return (ret == 0 ? PS_OK : PS_ERR);
- }
- ps_err_e
- ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
- const char *name, psaddr_t *sym_addr)
- {
- struct bound_minimal_symbol ms;
- struct cleanup *old_chain = save_current_program_space ();
- struct inferior *inf = find_inferior_ptid (ph->ptid);
- ps_err_e result;
- set_current_program_space (inf->pspace);
- FIXME
- ms = lookup_minimal_symbol (name, NULL, NULL);
- if (ms.minsym == NULL)
- result = PS_NOSYM;
- else
- {
- *sym_addr = core_addr_to_ps_addr (BMSYMBOL_VALUE_ADDRESS (ms));
- result = PS_OK;
- }
- do_cleanups (old_chain);
- return result;
- }
- ps_err_e
- 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);
- }
- ps_err_e
- 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, (gdb_byte *) buf, size, 1);
- }
- 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 = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0);
- regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ());
- target_fetch_registers (regcache, -1);
- fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
- do_cleanups (old_chain);
- return PS_OK;
- }
- 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 = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0);
- regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ());
- supply_gregset (regcache, (const gdb_gregset_t *) gregset);
- target_store_registers (regcache, -1);
- do_cleanups (old_chain);
- return PS_OK;
- }
- ps_err_e
- 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 = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0);
- regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ());
- target_fetch_registers (regcache, -1);
- fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
- do_cleanups (old_chain);
- return PS_OK;
- }
- ps_err_e
- 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 = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0);
- regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ());
- supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
- target_store_registers (regcache, -1);
- do_cleanups (old_chain);
- return PS_OK;
- }
- pid_t
- ps_getpid (gdb_ps_prochandle_t ph)
- {
- return ptid_get_pid (ph->ptid);
- }
- extern initialize_file_ftype _initialize_proc_service;
- void
- _initialize_proc_service (void)
- {
-
- }