Fix reconnecting to a gdbserver already debugging multiple processes, I
[deliverable/binutils-gdb.git] / gdb / proc-service.c
CommitLineData
fb0e1ba7 1/* <proc_service.h> implementation.
ca557f44 2
b811d2c2 3 Copyright (C) 1999-2020 Free Software Foundation, Inc.
fb0e1ba7
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
fb0e1ba7
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb0e1ba7
MK
19
20#include "defs.h"
21
76e1ee85 22#include "gdbcore.h"
fb0e1ba7 23#include "inferior.h"
00431a78 24#include "gdbthread.h"
fb0e1ba7
MK
25#include "symtab.h"
26#include "target.h"
7f7fe91e 27#include "regcache.h"
77e371c0 28#include "objfiles.h"
fb0e1ba7 29
76e1ee85 30#include "gdb_proc_service.h"
76e1ee85
DJ
31
32#include <sys/procfs.h>
33
fb0e1ba7
MK
34/* Prototypes for supply_gregset etc. */
35#include "gregset.h"
36\f
37
fb0e1ba7
MK
38/* Helper functions. */
39
76e1ee85
DJ
40/* Convert a psaddr_t to a CORE_ADDR. */
41
42static CORE_ADDR
43ps_addr_to_core_addr (psaddr_t addr)
44{
45 if (exec_bfd && bfd_get_sign_extend_vma (exec_bfd))
46 return (intptr_t) addr;
47 else
48 return (uintptr_t) addr;
49}
50
51/* Convert a CORE_ADDR to a psaddr_t. */
52
53static psaddr_t
54core_addr_to_ps_addr (CORE_ADDR addr)
55{
56 if (exec_bfd && bfd_get_sign_extend_vma (exec_bfd))
57 return (psaddr_t) (intptr_t) addr;
58 else
59 return (psaddr_t) (uintptr_t) addr;
60}
61
fb0e1ba7
MK
62/* Transfer LEN bytes of memory between BUF and address ADDR in the
63 process specified by PH. If WRITE, transfer them to the process,
64 else transfer them from the process. Returns PS_OK for success,
65 PS_ERR on failure.
66
9b11e3a7 67 This is a helper function for ps_pdread and ps_pdwrite. */
fb0e1ba7
MK
68
69static ps_err_e
76e1ee85 70ps_xfer_memory (const struct ps_prochandle *ph, psaddr_t addr,
47b667de 71 gdb_byte *buf, size_t len, int write)
fb0e1ba7 72{
2989a365 73 scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
fb0e1ba7 74 int ret;
76e1ee85 75 CORE_ADDR core_addr = ps_addr_to_core_addr (addr);
fb0e1ba7 76
00431a78 77 inferior_ptid = ph->thread->ptid;
fb0e1ba7
MK
78
79 if (write)
76e1ee85 80 ret = target_write_memory (core_addr, buf, len);
fb0e1ba7 81 else
76e1ee85 82 ret = target_read_memory (core_addr, buf, len);
fb0e1ba7 83
fb0e1ba7
MK
84 return (ret == 0 ? PS_OK : PS_ERR);
85}
86\f
87
fb0e1ba7
MK
88/* Search for the symbol named NAME within the object named OBJ within
89 the target process PH. If the symbol is found the address of the
90 symbol is stored in SYM_ADDR. */
91
92ps_err_e
281c4447 93ps_pglobal_lookup (struct ps_prochandle *ph, const char *obj,
76e1ee85 94 const char *name, psaddr_t *sym_addr)
fb0e1ba7 95{
00431a78 96 inferior *inf = ph->thread->inf;
5ed8105e
PA
97
98 scoped_restore_current_program_space restore_pspace;
c988ad87
TT
99
100 set_current_program_space (inf->pspace);
fb0e1ba7
MK
101
102 /* FIXME: kettenis/2000-09-03: What should we do with OBJ? */
5ed8105e 103 bound_minimal_symbol ms = lookup_minimal_symbol (name, NULL, NULL);
3b7344d5 104 if (ms.minsym == NULL)
5ed8105e 105 return PS_NOSYM;
fb0e1ba7 106
5ed8105e
PA
107 *sym_addr = core_addr_to_ps_addr (BMSYMBOL_VALUE_ADDRESS (ms));
108 return PS_OK;
fb0e1ba7
MK
109}
110
111/* Read SIZE bytes from the target process PH at address ADDR and copy
112 them into BUF. */
113
114ps_err_e
281c4447 115ps_pdread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t size)
fb0e1ba7 116{
49e66b4d 117 return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 0);
fb0e1ba7
MK
118}
119
120/* Write SIZE bytes from BUF into the target process PH at address ADDR. */
121
122ps_err_e
281c4447
RO
123ps_pdwrite (struct ps_prochandle *ph, psaddr_t addr,
124 const void *buf, size_t size)
fb0e1ba7 125{
47b667de 126 return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 1);
fb0e1ba7
MK
127}
128
4c4e7ad4
PA
129/* Get a regcache for LWPID using its inferior's "main" architecture,
130 which is the register set libthread_db expects to be using. In
131 multi-arch debugging scenarios, the thread's architecture may
8133c7dc 132 differ from the inferior's "main" architecture. */
4c4e7ad4
PA
133
134static struct regcache *
135get_ps_regcache (struct ps_prochandle *ph, lwpid_t lwpid)
136{
137 inferior *inf = ph->thread->inf;
138 return get_thread_arch_regcache (ptid_t (inf->pid, lwpid), inf->gdbarch);
139}
140
fb0e1ba7
MK
141/* Get the general registers of LWP LWPID within the target process PH
142 and store them in GREGSET. */
143
144ps_err_e
281c4447 145ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset)
fb0e1ba7 146{
4c4e7ad4 147 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 148
594f7785
UW
149 target_fetch_registers (regcache, -1);
150 fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
fb0e1ba7 151
fb0e1ba7
MK
152 return PS_OK;
153}
154
155/* Set the general registers of LWP LWPID within the target process PH
156 from GREGSET. */
157
158ps_err_e
281c4447 159ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset)
fb0e1ba7 160{
4c4e7ad4 161 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 162
594f7785
UW
163 supply_gregset (regcache, (const gdb_gregset_t *) gregset);
164 target_store_registers (regcache, -1);
fb0e1ba7 165
fb0e1ba7
MK
166 return PS_OK;
167}
168
169/* Get the floating-point registers of LWP LWPID within the target
170 process PH and store them in FPREGSET. */
171
172ps_err_e
12b164e9
GB
173ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
174 prfpregset_t *fpregset)
fb0e1ba7 175{
4c4e7ad4 176 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 177
594f7785
UW
178 target_fetch_registers (regcache, -1);
179 fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
fb0e1ba7 180
fb0e1ba7
MK
181 return PS_OK;
182}
183
184/* Set the floating-point registers of LWP LWPID within the target
185 process PH from FPREGSET. */
186
187ps_err_e
281c4447 188ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
12b164e9 189 const prfpregset_t *fpregset)
fb0e1ba7 190{
4c4e7ad4 191 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 192
594f7785
UW
193 supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
194 target_store_registers (regcache, -1);
fb0e1ba7 195
fb0e1ba7
MK
196 return PS_OK;
197}
198
ca557f44
AC
199/* Return overall process id of the target PH. Special for GNU/Linux
200 -- not used on Solaris. */
fb0e1ba7
MK
201
202pid_t
281c4447 203ps_getpid (struct ps_prochandle *ph)
fb0e1ba7 204{
e99b03dc 205 return ph->thread->ptid.pid ();
fb0e1ba7
MK
206}
207
208void
209_initialize_proc_service (void)
210{
211 /* This function solely exists to make sure this module is linked
212 into the final binary. */
213}
This page took 1.908903 seconds and 4 git commands to generate.