X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fproc-service.c;h=e0383700a1d711b682904d01dea2be6246c2f195;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=8afa667a06af8776938f3daa626bb6637c6370f5;hpb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/proc-service.c b/gdb/proc-service.c index 8afa667a06..e0383700a1 100644 --- a/gdb/proc-service.c +++ b/gdb/proc-service.c @@ -1,6 +1,6 @@ /* implementation. - Copyright (C) 1999-2018 Free Software Foundation, Inc. + Copyright (C) 1999-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -21,6 +21,7 @@ #include "gdbcore.h" #include "inferior.h" +#include "gdbthread.h" #include "symtab.h" #include "target.h" #include "regcache.h" @@ -69,17 +70,22 @@ static ps_err_e ps_xfer_memory (const struct ps_prochandle *ph, psaddr_t addr, gdb_byte *buf, size_t len, int write) { + scoped_restore_current_inferior restore_inferior; + set_current_inferior (ph->thread->inf); + + scoped_restore_current_program_space restore_current_progspace; + set_current_program_space (ph->thread->inf->pspace); + scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid); - int ret; - CORE_ADDR core_addr = ps_addr_to_core_addr (addr); + inferior_ptid = ph->thread->ptid; - inferior_ptid = ph->ptid; + CORE_ADDR core_addr = ps_addr_to_core_addr (addr); + int ret; if (write) ret = target_write_memory (core_addr, buf, len); else ret = target_read_memory (core_addr, buf, len); - return (ret == 0 ? PS_OK : PS_ERR); } @@ -92,7 +98,7 @@ ps_err_e ps_pglobal_lookup (struct ps_prochandle *ph, const char *obj, const char *name, psaddr_t *sym_addr) { - struct inferior *inf = find_inferior_ptid (ph->ptid); + inferior *inf = ph->thread->inf; scoped_restore_current_program_space restore_pspace; @@ -125,15 +131,27 @@ ps_pdwrite (struct ps_prochandle *ph, psaddr_t addr, return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 1); } +/* Get a regcache for LWPID using its inferior's "main" architecture, + which is the register set libthread_db expects to be using. In + multi-arch debugging scenarios, the thread's architecture may + differ from the inferior's "main" architecture. */ + +static struct regcache * +get_ps_regcache (struct ps_prochandle *ph, lwpid_t lwpid) +{ + inferior *inf = ph->thread->inf; + return get_thread_arch_regcache (inf->process_target (), + ptid_t (inf->pid, lwpid), + inf->gdbarch); +} + /* Get the general registers of LWP LWPID within the target process PH and store them in GREGSET. */ ps_err_e ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset) { - ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - struct regcache *regcache - = get_thread_arch_regcache (ptid, target_gdbarch ()); + struct regcache *regcache = get_ps_regcache (ph, lwpid); target_fetch_registers (regcache, -1); fill_gregset (regcache, (gdb_gregset_t *) gregset, -1); @@ -147,9 +165,7 @@ ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset) ps_err_e ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset) { - ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - struct regcache *regcache - = get_thread_arch_regcache (ptid, target_gdbarch ()); + struct regcache *regcache = get_ps_regcache (ph, lwpid); supply_gregset (regcache, (const gdb_gregset_t *) gregset); target_store_registers (regcache, -1); @@ -161,11 +177,10 @@ ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset) process PH and store them in FPREGSET. */ ps_err_e -ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, gdb_prfpregset_t *fpregset) +ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, + prfpregset_t *fpregset) { - ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - struct regcache *regcache - = get_thread_arch_regcache (ptid, target_gdbarch ()); + struct regcache *regcache = get_ps_regcache (ph, lwpid); target_fetch_registers (regcache, -1); fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1); @@ -178,11 +193,9 @@ ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, gdb_prfpregset_t *fpregs ps_err_e ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, - const gdb_prfpregset_t *fpregset) + const prfpregset_t *fpregset) { - ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - struct regcache *regcache - = get_thread_arch_regcache (ptid, target_gdbarch ()); + struct regcache *regcache = get_ps_regcache (ph, lwpid); supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset); target_store_registers (regcache, -1); @@ -196,11 +209,12 @@ ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, pid_t ps_getpid (struct ps_prochandle *ph) { - return ptid_get_pid (ph->ptid); + return ph->thread->ptid.pid (); } +void _initialize_proc_service (); void -_initialize_proc_service (void) +_initialize_proc_service () { /* This function solely exists to make sure this module is linked into the final binary. */