Multi-target support
[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{
5b6d1e4f
PA
73 scoped_restore_current_inferior restore_inferior;
74 set_current_inferior (ph->thread->inf);
fb0e1ba7 75
5b6d1e4f
PA
76 scoped_restore_current_program_space restore_current_progspace;
77 set_current_program_space (ph->thread->inf->pspace);
78
79 scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
00431a78 80 inferior_ptid = ph->thread->ptid;
fb0e1ba7 81
5b6d1e4f
PA
82 CORE_ADDR core_addr = ps_addr_to_core_addr (addr);
83
84 int ret;
fb0e1ba7 85 if (write)
76e1ee85 86 ret = target_write_memory (core_addr, buf, len);
fb0e1ba7 87 else
76e1ee85 88 ret = target_read_memory (core_addr, buf, len);
fb0e1ba7
MK
89 return (ret == 0 ? PS_OK : PS_ERR);
90}
91\f
92
fb0e1ba7
MK
93/* Search for the symbol named NAME within the object named OBJ within
94 the target process PH. If the symbol is found the address of the
95 symbol is stored in SYM_ADDR. */
96
97ps_err_e
281c4447 98ps_pglobal_lookup (struct ps_prochandle *ph, const char *obj,
76e1ee85 99 const char *name, psaddr_t *sym_addr)
fb0e1ba7 100{
00431a78 101 inferior *inf = ph->thread->inf;
5ed8105e
PA
102
103 scoped_restore_current_program_space restore_pspace;
c988ad87
TT
104
105 set_current_program_space (inf->pspace);
fb0e1ba7
MK
106
107 /* FIXME: kettenis/2000-09-03: What should we do with OBJ? */
5ed8105e 108 bound_minimal_symbol ms = lookup_minimal_symbol (name, NULL, NULL);
3b7344d5 109 if (ms.minsym == NULL)
5ed8105e 110 return PS_NOSYM;
fb0e1ba7 111
5ed8105e
PA
112 *sym_addr = core_addr_to_ps_addr (BMSYMBOL_VALUE_ADDRESS (ms));
113 return PS_OK;
fb0e1ba7
MK
114}
115
116/* Read SIZE bytes from the target process PH at address ADDR and copy
117 them into BUF. */
118
119ps_err_e
281c4447 120ps_pdread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t size)
fb0e1ba7 121{
49e66b4d 122 return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 0);
fb0e1ba7
MK
123}
124
125/* Write SIZE bytes from BUF into the target process PH at address ADDR. */
126
127ps_err_e
281c4447
RO
128ps_pdwrite (struct ps_prochandle *ph, psaddr_t addr,
129 const void *buf, size_t size)
fb0e1ba7 130{
47b667de 131 return ps_xfer_memory (ph, addr, (gdb_byte *) buf, size, 1);
fb0e1ba7
MK
132}
133
4c4e7ad4
PA
134/* Get a regcache for LWPID using its inferior's "main" architecture,
135 which is the register set libthread_db expects to be using. In
136 multi-arch debugging scenarios, the thread's architecture may
8133c7dc 137 differ from the inferior's "main" architecture. */
4c4e7ad4
PA
138
139static struct regcache *
140get_ps_regcache (struct ps_prochandle *ph, lwpid_t lwpid)
141{
142 inferior *inf = ph->thread->inf;
5b6d1e4f
PA
143 return get_thread_arch_regcache (inf->process_target (),
144 ptid_t (inf->pid, lwpid),
145 inf->gdbarch);
4c4e7ad4
PA
146}
147
fb0e1ba7
MK
148/* Get the general registers of LWP LWPID within the target process PH
149 and store them in GREGSET. */
150
151ps_err_e
281c4447 152ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset)
fb0e1ba7 153{
4c4e7ad4 154 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 155
594f7785
UW
156 target_fetch_registers (regcache, -1);
157 fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
fb0e1ba7 158
fb0e1ba7
MK
159 return PS_OK;
160}
161
162/* Set the general registers of LWP LWPID within the target process PH
163 from GREGSET. */
164
165ps_err_e
281c4447 166ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset)
fb0e1ba7 167{
4c4e7ad4 168 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 169
594f7785
UW
170 supply_gregset (regcache, (const gdb_gregset_t *) gregset);
171 target_store_registers (regcache, -1);
fb0e1ba7 172
fb0e1ba7
MK
173 return PS_OK;
174}
175
176/* Get the floating-point registers of LWP LWPID within the target
177 process PH and store them in FPREGSET. */
178
179ps_err_e
12b164e9
GB
180ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
181 prfpregset_t *fpregset)
fb0e1ba7 182{
4c4e7ad4 183 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 184
594f7785
UW
185 target_fetch_registers (regcache, -1);
186 fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
fb0e1ba7 187
fb0e1ba7
MK
188 return PS_OK;
189}
190
191/* Set the floating-point registers of LWP LWPID within the target
192 process PH from FPREGSET. */
193
194ps_err_e
281c4447 195ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
12b164e9 196 const prfpregset_t *fpregset)
fb0e1ba7 197{
4c4e7ad4 198 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 199
594f7785
UW
200 supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
201 target_store_registers (regcache, -1);
fb0e1ba7 202
fb0e1ba7
MK
203 return PS_OK;
204}
205
ca557f44
AC
206/* Return overall process id of the target PH. Special for GNU/Linux
207 -- not used on Solaris. */
fb0e1ba7
MK
208
209pid_t
281c4447 210ps_getpid (struct ps_prochandle *ph)
fb0e1ba7 211{
e99b03dc 212 return ph->thread->ptid.pid ();
fb0e1ba7
MK
213}
214
215void
216_initialize_proc_service (void)
217{
218 /* This function solely exists to make sure this module is linked
219 into the final binary. */
220}
This page took 1.83009 seconds and 4 git commands to generate.