Use thread_info and inferior pointers more throughout
[deliverable/binutils-gdb.git] / gdb / proc-service.c
CommitLineData
fb0e1ba7 1/* <proc_service.h> implementation.
ca557f44 2
e2882c85 3 Copyright (C) 1999-2018 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
fb0e1ba7
MK
129/* Get the general registers of LWP LWPID within the target process PH
130 and store them in GREGSET. */
131
132ps_err_e
281c4447 133ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset)
fb0e1ba7 134{
00431a78 135 struct regcache *regcache = get_thread_regcache (ph->thread);
fb0e1ba7 136
594f7785
UW
137 target_fetch_registers (regcache, -1);
138 fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
fb0e1ba7 139
fb0e1ba7
MK
140 return PS_OK;
141}
142
143/* Set the general registers of LWP LWPID within the target process PH
144 from GREGSET. */
145
146ps_err_e
281c4447 147ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset)
fb0e1ba7 148{
00431a78 149 struct regcache *regcache = get_thread_regcache (ph->thread);
fb0e1ba7 150
594f7785
UW
151 supply_gregset (regcache, (const gdb_gregset_t *) gregset);
152 target_store_registers (regcache, -1);
fb0e1ba7 153
fb0e1ba7
MK
154 return PS_OK;
155}
156
157/* Get the floating-point registers of LWP LWPID within the target
158 process PH and store them in FPREGSET. */
159
160ps_err_e
281c4447 161ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, gdb_prfpregset_t *fpregset)
fb0e1ba7 162{
00431a78 163 struct regcache *regcache = get_thread_regcache (ph->thread);
fb0e1ba7 164
594f7785
UW
165 target_fetch_registers (regcache, -1);
166 fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
fb0e1ba7 167
fb0e1ba7
MK
168 return PS_OK;
169}
170
171/* Set the floating-point registers of LWP LWPID within the target
172 process PH from FPREGSET. */
173
174ps_err_e
281c4447 175ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
fb0e1ba7
MK
176 const gdb_prfpregset_t *fpregset)
177{
00431a78 178 struct regcache *regcache = get_thread_regcache (ph->thread);
fb0e1ba7 179
594f7785
UW
180 supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
181 target_store_registers (regcache, -1);
fb0e1ba7 182
fb0e1ba7
MK
183 return PS_OK;
184}
185
ca557f44
AC
186/* Return overall process id of the target PH. Special for GNU/Linux
187 -- not used on Solaris. */
fb0e1ba7
MK
188
189pid_t
281c4447 190ps_getpid (struct ps_prochandle *ph)
fb0e1ba7 191{
00431a78 192 return ptid_get_pid (ph->thread->ptid);
fb0e1ba7
MK
193}
194
195void
196_initialize_proc_service (void)
197{
198 /* This function solely exists to make sure this module is linked
199 into the final binary. */
200}
This page took 1.584778 seconds and 4 git commands to generate.