Fix -Wmisleading-indentation warning in top.c
[deliverable/binutils-gdb.git] / gdb / proc-service.c
CommitLineData
fb0e1ba7 1/* <proc_service.h> implementation.
ca557f44 2
42a4f53d 3 Copyright (C) 1999-2019 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
132 differ from the inferior's "main" architecture. E.g., in the Cell
133 combined debugger, if GDB happens to interrupt SPU code, the
134 thread's architecture is SPU, and the main architecture is
135 PowerPC. */
136
137static struct regcache *
138get_ps_regcache (struct ps_prochandle *ph, lwpid_t lwpid)
139{
140 inferior *inf = ph->thread->inf;
141 return get_thread_arch_regcache (ptid_t (inf->pid, lwpid), inf->gdbarch);
142}
143
fb0e1ba7
MK
144/* Get the general registers of LWP LWPID within the target process PH
145 and store them in GREGSET. */
146
147ps_err_e
281c4447 148ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset)
fb0e1ba7 149{
4c4e7ad4 150 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 151
594f7785
UW
152 target_fetch_registers (regcache, -1);
153 fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
fb0e1ba7 154
fb0e1ba7
MK
155 return PS_OK;
156}
157
158/* Set the general registers of LWP LWPID within the target process PH
159 from GREGSET. */
160
161ps_err_e
281c4447 162ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset)
fb0e1ba7 163{
4c4e7ad4 164 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 165
594f7785
UW
166 supply_gregset (regcache, (const gdb_gregset_t *) gregset);
167 target_store_registers (regcache, -1);
fb0e1ba7 168
fb0e1ba7
MK
169 return PS_OK;
170}
171
172/* Get the floating-point registers of LWP LWPID within the target
173 process PH and store them in FPREGSET. */
174
175ps_err_e
12b164e9
GB
176ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
177 prfpregset_t *fpregset)
fb0e1ba7 178{
4c4e7ad4 179 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 180
594f7785
UW
181 target_fetch_registers (regcache, -1);
182 fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
fb0e1ba7 183
fb0e1ba7
MK
184 return PS_OK;
185}
186
187/* Set the floating-point registers of LWP LWPID within the target
188 process PH from FPREGSET. */
189
190ps_err_e
281c4447 191ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
12b164e9 192 const prfpregset_t *fpregset)
fb0e1ba7 193{
4c4e7ad4 194 struct regcache *regcache = get_ps_regcache (ph, lwpid);
fb0e1ba7 195
594f7785
UW
196 supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
197 target_store_registers (regcache, -1);
fb0e1ba7 198
fb0e1ba7
MK
199 return PS_OK;
200}
201
ca557f44
AC
202/* Return overall process id of the target PH. Special for GNU/Linux
203 -- not used on Solaris. */
fb0e1ba7
MK
204
205pid_t
281c4447 206ps_getpid (struct ps_prochandle *ph)
fb0e1ba7 207{
e99b03dc 208 return ph->thread->ptid.pid ();
fb0e1ba7
MK
209}
210
211void
212_initialize_proc_service (void)
213{
214 /* This function solely exists to make sure this module is linked
215 into the final binary. */
216}
This page took 1.778746 seconds and 4 git commands to generate.