]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdbserver/proc-service.c
Replace write_inferior_memory with target_write_memory
[thirdparty/binutils-gdb.git] / gdb / gdbserver / proc-service.c
CommitLineData
0d62e5e8 1/* libthread_db helper functions for the remote server for GDB.
42a4f53d 2 Copyright (C) 2002-2019 Free Software Foundation, Inc.
0d62e5e8
DJ
3
4 Contributed by MontaVista Software.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
0d62e5e8
DJ
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
0d62e5e8
DJ
20
21#include "server.h"
22
23/* This file is currently tied to GNU/Linux. It should scale well to
24 another libthread_db implementation, with the approriate gdbserver
25 hooks, but for now this means we can use GNU/Linux's target data. */
26
27#include "linux-low.h"
28
0050a760 29#include "gdb_proc_service.h"
0d62e5e8
DJ
30
31typedef struct ps_prochandle *gdb_ps_prochandle_t;
32typedef void *gdb_ps_read_buf_t;
33typedef const void *gdb_ps_write_buf_t;
34typedef size_t gdb_ps_size_t;
35
fd500816
DJ
36#ifdef HAVE_LINUX_REGSETS
37#define HAVE_REGSETS
38#endif
39
40#ifdef HAVE_REGSETS
0d62e5e8 41static struct regset_info *
3aee8918 42gregset_info (void)
0d62e5e8
DJ
43{
44 int i = 0;
3aee8918
PA
45 const struct regs_info *regs_info = (*the_low_target.regs_info) ();
46 struct regsets_info *regsets_info = regs_info->regsets_info;
0d62e5e8 47
3aee8918 48 while (regsets_info->regsets[i].size != -1)
0d62e5e8 49 {
3aee8918 50 if (regsets_info->regsets[i].type == GENERAL_REGS)
0d62e5e8
DJ
51 break;
52 i++;
53 }
54
3aee8918 55 return &regsets_info->regsets[i];
0d62e5e8 56}
0d62e5e8
DJ
57#endif
58
59/* Search for the symbol named NAME within the object named OBJ within
60 the target process PH. If the symbol is found the address of the
61 symbol is stored in SYM_ADDR. */
62
63ps_err_e
64ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj,
0050a760 65 const char *name, psaddr_t *sym_addr)
0d62e5e8
DJ
66{
67 CORE_ADDR addr;
68
9836d6ea 69 if (thread_db_look_up_one_symbol (name, &addr) == 0)
0d62e5e8
DJ
70 return PS_NOSYM;
71
0050a760 72 *sym_addr = (psaddr_t) (unsigned long) addr;
0d62e5e8
DJ
73 return PS_OK;
74}
75
76/* Read SIZE bytes from the target process PH at address ADDR and copy
77 them into BUF. */
78
79ps_err_e
0050a760 80ps_pdread (gdb_ps_prochandle_t ph, psaddr_t addr,
0d62e5e8
DJ
81 gdb_ps_read_buf_t buf, gdb_ps_size_t size)
82{
5b9ca4d4
PA
83 if (read_inferior_memory ((uintptr_t) addr, (gdb_byte *) buf, size) != 0)
84 return PS_ERR;
0d62e5e8
DJ
85 return PS_OK;
86}
87
88/* Write SIZE bytes from BUF into the target process PH at address ADDR. */
89
90ps_err_e
0050a760 91ps_pdwrite (gdb_ps_prochandle_t ph, psaddr_t addr,
0d62e5e8
DJ
92 gdb_ps_write_buf_t buf, gdb_ps_size_t size)
93{
4196ab2a 94 if (target_write_memory ((uintptr_t) addr, (const gdb_byte *) buf, size)
b42945fd 95 != 0)
ab290430
PA
96 return PS_ERR;
97 return PS_OK;
0d62e5e8
DJ
98}
99
100/* Get the general registers of LWP LWPID within the target process PH
101 and store them in GREGSET. */
102
103ps_err_e
104ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset)
105{
fd500816 106#ifdef HAVE_REGSETS
54a0b537 107 struct lwp_info *lwp;
0bfdf32f 108 struct thread_info *reg_thread, *saved_thread;
442ea881 109 struct regcache *regcache;
0d62e5e8 110
f2907e49 111 lwp = find_lwp_pid (ptid_t (lwpid));
54a0b537 112 if (lwp == NULL)
0d62e5e8
DJ
113 return PS_ERR;
114
0bfdf32f
GB
115 reg_thread = get_lwp_thread (lwp);
116 saved_thread = current_thread;
117 current_thread = reg_thread;
118 regcache = get_thread_regcache (current_thread, 1);
442ea881 119 gregset_info ()->fill_function (regcache, gregset);
0d62e5e8 120
0bfdf32f 121 current_thread = saved_thread;
0d62e5e8 122 return PS_OK;
fd500816 123#else
0d62e5e8 124 return PS_ERR;
fd500816 125#endif
0d62e5e8
DJ
126}
127
128/* Set the general registers of LWP LWPID within the target process PH
129 from GREGSET. */
130
131ps_err_e
132ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prgregset_t gregset)
133{
fd500816 134 /* Unneeded. */
0d62e5e8
DJ
135 return PS_ERR;
136}
137
138/* Get the floating-point registers of LWP LWPID within the target
139 process PH and store them in FPREGSET. */
140
141ps_err_e
749bab01 142ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prfpregset_t *fpregset)
0d62e5e8 143{
fd500816 144 /* Unneeded. */
0d62e5e8
DJ
145 return PS_ERR;
146}
147
148/* Set the floating-point registers of LWP LWPID within the target
149 process PH from FPREGSET. */
150
151ps_err_e
749bab01 152ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prfpregset_t *fpregset)
0d62e5e8 153{
fd500816 154 /* Unneeded. */
0d62e5e8
DJ
155 return PS_ERR;
156}
157
158/* Return overall process id of the target PH. Special for GNU/Linux
159 -- not used on Solaris. */
160
161pid_t
162ps_getpid (gdb_ps_prochandle_t ph)
163{
0bfdf32f 164 return pid_of (current_thread);
0d62e5e8 165}