]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdbserver/proc-service.c
mdebugread.c: Address class -> address class index
[thirdparty/binutils-gdb.git] / gdb / gdbserver / proc-service.c
CommitLineData
0d62e5e8 1/* libthread_db helper functions for the remote server for GDB.
32d0add0 2 Copyright (C) 2002-2015 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{
0050a760 83 read_inferior_memory ((unsigned long) addr, buf, size);
0d62e5e8
DJ
84 return PS_OK;
85}
86
87/* Write SIZE bytes from BUF into the target process PH at address ADDR. */
88
89ps_err_e
0050a760 90ps_pdwrite (gdb_ps_prochandle_t ph, psaddr_t addr,
0d62e5e8
DJ
91 gdb_ps_write_buf_t buf, gdb_ps_size_t size)
92{
ab290430
PA
93 if (write_inferior_memory ((unsigned long) addr, buf, size) != 0)
94 return PS_ERR;
95 return PS_OK;
0d62e5e8
DJ
96}
97
98/* Get the general registers of LWP LWPID within the target process PH
99 and store them in GREGSET. */
100
101ps_err_e
102ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset)
103{
fd500816 104#ifdef HAVE_REGSETS
54a0b537 105 struct lwp_info *lwp;
0bfdf32f 106 struct thread_info *reg_thread, *saved_thread;
442ea881 107 struct regcache *regcache;
0d62e5e8 108
95954743 109 lwp = find_lwp_pid (pid_to_ptid (lwpid));
54a0b537 110 if (lwp == NULL)
0d62e5e8
DJ
111 return PS_ERR;
112
0bfdf32f
GB
113 reg_thread = get_lwp_thread (lwp);
114 saved_thread = current_thread;
115 current_thread = reg_thread;
116 regcache = get_thread_regcache (current_thread, 1);
442ea881 117 gregset_info ()->fill_function (regcache, gregset);
0d62e5e8 118
0bfdf32f 119 current_thread = saved_thread;
0d62e5e8 120 return PS_OK;
fd500816 121#else
0d62e5e8 122 return PS_ERR;
fd500816 123#endif
0d62e5e8
DJ
124}
125
126/* Set the general registers of LWP LWPID within the target process PH
127 from GREGSET. */
128
129ps_err_e
130ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prgregset_t gregset)
131{
fd500816 132 /* Unneeded. */
0d62e5e8
DJ
133 return PS_ERR;
134}
135
136/* Get the floating-point registers of LWP LWPID within the target
137 process PH and store them in FPREGSET. */
138
139ps_err_e
749bab01 140ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prfpregset_t *fpregset)
0d62e5e8 141{
fd500816 142 /* Unneeded. */
0d62e5e8
DJ
143 return PS_ERR;
144}
145
146/* Set the floating-point registers of LWP LWPID within the target
147 process PH from FPREGSET. */
148
149ps_err_e
749bab01 150ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prfpregset_t *fpregset)
0d62e5e8 151{
fd500816 152 /* Unneeded. */
0d62e5e8
DJ
153 return PS_ERR;
154}
155
156/* Return overall process id of the target PH. Special for GNU/Linux
157 -- not used on Solaris. */
158
159pid_t
160ps_getpid (gdb_ps_prochandle_t ph)
161{
0bfdf32f 162 return pid_of (current_thread);
0d62e5e8 163}