]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdbserver/target.cc
gdbserver: turn target op 'qxfer_osdata' into a method
[thirdparty/binutils-gdb.git] / gdbserver / target.cc
CommitLineData
ce3a066d 1/* Target operations for the remote server for GDB.
b811d2c2 2 Copyright (C) 2002-2020 Free Software Foundation, Inc.
ce3a066d
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
ce3a066d
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/>. */
ce3a066d
DJ
20
21#include "server.h"
c144c7a0 22#include "tracepoint.h"
d59b55f0 23#include "gdbsupport/byte-vector.h"
ea06bbaa 24#include "hostio.h"
ce3a066d 25
5b6d1e4f 26process_stratum_target *the_target;
ce3a066d 27
f0db101d 28int
f557a88a 29set_desired_thread ()
0d62e5e8 30{
c12a5089
SC
31 client_state &cs = get_client_state ();
32 thread_info *found = find_thread_ptid (cs.general_thread);
0d62e5e8 33
f0db101d
PA
34 current_thread = found;
35 return (current_thread != NULL);
0d62e5e8
DJ
36}
37
a67a9fae
PA
38/* The thread that was current before prepare_to_access_memory was
39 called. done_accessing_memory uses this to restore the previous
40 selected thread. */
41static ptid_t prev_general_thread;
42
43/* See target.h. */
44
45int
46prepare_to_access_memory (void)
47{
c12a5089
SC
48 client_state &cs = get_client_state ();
49
bac608e7
SM
50 /* The first thread found. */
51 struct thread_info *first = NULL;
52 /* The first stopped thread found. */
53 struct thread_info *stopped = NULL;
54 /* The current general thread, if found. */
55 struct thread_info *current = NULL;
a67a9fae 56
bac608e7
SM
57 /* Save the general thread value, since prepare_to_access_memory could change
58 it. */
c12a5089 59 prev_general_thread = cs.general_thread;
a67a9fae 60
79b44087
TBA
61 int res = the_target->pt->prepare_to_access_memory ();
62 if (res != 0)
63 return res;
a67a9fae 64
bac608e7
SM
65 for_each_thread (prev_general_thread.pid (), [&] (thread_info *thread)
66 {
67 if (mythread_alive (thread->id))
68 {
69 if (stopped == NULL && the_target->thread_stopped != NULL
70 && thread_stopped (thread))
71 stopped = thread;
72
73 if (first == NULL)
74 first = thread;
75
76 if (current == NULL && prev_general_thread == thread->id)
77 current = thread;
78 }
79 });
80
81 /* The thread we end up choosing. */
82 struct thread_info *thread;
a67a9fae
PA
83
84 /* Prefer a stopped thread. If none is found, try the current
85 thread. Otherwise, take the first thread in the process. If
86 none is found, undo the effects of
87 target->prepare_to_access_memory() and return error. */
bac608e7
SM
88 if (stopped != NULL)
89 thread = stopped;
90 else if (current != NULL)
91 thread = current;
92 else if (first != NULL)
93 thread = first;
a67a9fae
PA
94 else
95 {
96 done_accessing_memory ();
97 return 1;
98 }
99
100 current_thread = thread;
c12a5089 101 cs.general_thread = ptid_of (thread);
a67a9fae
PA
102
103 return 0;
104}
105
106/* See target.h. */
107
108void
109done_accessing_memory (void)
110{
c12a5089
SC
111 client_state &cs = get_client_state ();
112
79b44087 113 the_target->pt->done_accessing_memory ();
a67a9fae
PA
114
115 /* Restore the previous selected thread. */
c12a5089 116 cs.general_thread = prev_general_thread;
5b6d1e4f 117 switch_to_thread (the_target, cs.general_thread);
a67a9fae
PA
118}
119
c3e735a6 120int
f450004a 121read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
611cb4a5 122{
c3e735a6 123 int res;
e2558df3 124 res = the_target->pt->read_memory (memaddr, myaddr, len);
611cb4a5 125 check_mem_read (memaddr, myaddr, len);
c3e735a6 126 return res;
611cb4a5
DJ
127}
128
721ec300
GB
129/* See target/target.h. */
130
131int
132target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
133{
134 return read_inferior_memory (memaddr, myaddr, len);
135}
136
137/* See target/target.h. */
138
139int
140target_read_uint32 (CORE_ADDR memaddr, uint32_t *result)
141{
142 return read_inferior_memory (memaddr, (gdb_byte *) result, sizeof (*result));
143}
144
4196ab2a
TT
145/* See target/target.h. */
146
611cb4a5 147int
4196ab2a
TT
148target_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
149 ssize_t len)
0d62e5e8 150{
c6778d00
TT
151 /* Make a copy of the data because check_mem_write may need to
152 update it. */
d59b55f0 153 gdb::byte_vector buffer (myaddr, myaddr + len);
c6778d00 154 check_mem_write (memaddr, buffer.data (), myaddr, len);
e2558df3 155 return the_target->pt->write_memory (memaddr, buffer.data (), len);
0d62e5e8
DJ
156}
157
95954743
PA
158ptid_t
159mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
bd99dc85 160 int connected_wait)
611cb4a5 161{
95954743 162 ptid_t ret;
0d62e5e8
DJ
163
164 if (connected_wait)
165 server_waiting = 1;
166
f2b9e3df 167 ret = target_wait (ptid, ourstatus, options);
bd99dc85 168
4210d83e
PA
169 /* We don't expose _LOADED events to gdbserver core. See the
170 `dlls_changed' global. */
171 if (ourstatus->kind == TARGET_WAITKIND_LOADED)
172 ourstatus->kind = TARGET_WAITKIND_STOPPED;
173
1a3d890b
PA
174 /* If GDB is connected through TCP/serial, then GDBserver will most
175 probably be running on its own terminal/console, so it's nice to
176 print there why is GDBserver exiting. If however, GDB is
177 connected through stdio, then there's no need to spam the GDB
178 console with this -- the user will already see the exit through
179 regular GDB output, in that same terminal. */
180 if (!remote_connection_is_stdio ())
181 {
182 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
183 fprintf (stderr,
184 "\nChild exited with status %d\n", ourstatus->value.integer);
185 else if (ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
186 fprintf (stderr, "\nChild terminated with signal = 0x%x (%s)\n",
187 gdb_signal_to_host (ourstatus->value.sig),
188 gdb_signal_to_name (ourstatus->value.sig));
189 }
0d62e5e8
DJ
190
191 if (connected_wait)
192 server_waiting = 0;
193
194 return ret;
611cb4a5
DJ
195}
196
f8c1d06b
GB
197/* See target/target.h. */
198
199void
03f4463b 200target_stop_and_wait (ptid_t ptid)
f8c1d06b
GB
201{
202 struct target_waitstatus status;
3e6ec53a 203 bool was_non_stop = non_stop;
17e16485 204 struct thread_resume resume_info;
f8c1d06b 205
17e16485
YQ
206 resume_info.thread = ptid;
207 resume_info.kind = resume_stop;
208 resume_info.sig = GDB_SIGNAL_0;
0e4d7e35 209 the_target->pt->resume (&resume_info, 1);
f8c1d06b 210
3e6ec53a 211 non_stop = true;
f8c1d06b
GB
212 mywait (ptid, &status, 0, 0);
213 non_stop = was_non_stop;
214}
215
216/* See target/target.h. */
217
f2b9e3df
SDJ
218ptid_t
219target_wait (ptid_t ptid, struct target_waitstatus *status, int options)
220{
6532e7e3 221 return the_target->pt->wait (ptid, status, options);
f2b9e3df
SDJ
222}
223
224/* See target/target.h. */
225
bc1e6c81
SDJ
226void
227target_mourn_inferior (ptid_t ptid)
228{
8adb37b9 229 the_target->pt->mourn (find_process_pid (ptid.pid ()));
bc1e6c81
SDJ
230}
231
232/* See target/target.h. */
233
f8c1d06b 234void
03f4463b 235target_continue_no_signal (ptid_t ptid)
f8c1d06b
GB
236{
237 struct thread_resume resume_info;
238
239 resume_info.thread = ptid;
240 resume_info.kind = resume_continue;
241 resume_info.sig = GDB_SIGNAL_0;
0e4d7e35 242 the_target->pt->resume (&resume_info, 1);
f8c1d06b
GB
243}
244
049a8570
SDJ
245/* See target/target.h. */
246
247void
248target_continue (ptid_t ptid, enum gdb_signal signal)
249{
250 struct thread_resume resume_info;
251
252 resume_info.thread = ptid;
253 resume_info.kind = resume_continue;
254 resume_info.sig = gdb_signal_to_host (signal);
0e4d7e35 255 the_target->pt->resume (&resume_info, 1);
049a8570
SDJ
256}
257
1fb77080
SDJ
258/* See target/target.h. */
259
260int
261target_supports_multi_process (void)
262{
263 return (the_target->supports_multi_process != NULL ?
264 (*the_target->supports_multi_process) () : 0);
265}
266
bd99dc85
PA
267int
268start_non_stop (int nonstop)
269{
270 if (the_target->start_non_stop == NULL)
271 {
272 if (nonstop)
273 return -1;
274 else
275 return 0;
276 }
277
278 return (*the_target->start_non_stop) (nonstop);
279}
280
ce3a066d 281void
5b6d1e4f 282set_target_ops (process_stratum_target *target)
ce3a066d 283{
5b6d1e4f 284 the_target = XNEW (process_stratum_target);
ce3a066d
DJ
285 memcpy (the_target, target, sizeof (*the_target));
286}
95954743
PA
287
288/* Convert pid to printable format. */
289
290const char *
291target_pid_to_str (ptid_t ptid)
292{
293 static char buf[80];
294
d7e15655 295 if (ptid == minus_one_ptid)
6cebaf6e 296 xsnprintf (buf, sizeof (buf), "<all threads>");
d7e15655 297 else if (ptid == null_ptid)
6cebaf6e 298 xsnprintf (buf, sizeof (buf), "<null thread>");
cc6bcb54 299 else if (ptid.tid () != 0)
6cebaf6e 300 xsnprintf (buf, sizeof (buf), "Thread %d.0x%lx",
cc6bcb54 301 ptid.pid (), ptid.tid ());
e38504b3 302 else if (ptid.lwp () != 0)
6cebaf6e 303 xsnprintf (buf, sizeof (buf), "LWP %d.%ld",
e38504b3 304 ptid.pid (), ptid.lwp ());
95954743 305 else
6cebaf6e 306 xsnprintf (buf, sizeof (buf), "Process %d",
e99b03dc 307 ptid.pid ());
95954743
PA
308
309 return buf;
310}
8336d594 311
7255706c 312int
a780ef4f 313kill_inferior (process_info *proc)
7255706c 314{
a780ef4f 315 gdb_agent_about_to_close (proc->pid);
7255706c 316
c6885a57 317 return the_target->pt->kill (proc);
7255706c 318}
70b90b91 319
2e6ee069
AT
320/* Default implementation for breakpoint_kind_for_pc.
321
322 The default behavior for targets that don't implement breakpoint_kind_for_pc
323 is to use the size of a breakpoint as the kind. */
324
325int
326default_breakpoint_kind_from_pc (CORE_ADDR *pcptr)
327{
328 int size = 0;
329
330 gdb_assert (the_target->sw_breakpoint_from_kind != NULL);
331
332 (*the_target->sw_breakpoint_from_kind) (0, &size);
333 return size;
334}
2090129c 335
223ffa71
TT
336/* Define it. */
337
e671cd59
PA
338target_terminal_state target_terminal::m_terminal_state
339 = target_terminal_state::is_ours;
223ffa71 340
2090129c
SDJ
341/* See target/target.h. */
342
343void
223ffa71 344target_terminal::init ()
2090129c
SDJ
345{
346 /* Placeholder needed because of fork_inferior. Not necessary on
347 GDBserver. */
348}
349
350/* See target/target.h. */
351
352void
223ffa71 353target_terminal::inferior ()
2090129c
SDJ
354{
355 /* Placeholder needed because of fork_inferior. Not necessary on
356 GDBserver. */
357}
358
359/* See target/target.h. */
360
361void
223ffa71 362target_terminal::ours ()
2090129c
SDJ
363{
364 /* Placeholder needed because of fork_inferior. Not necessary on
365 GDBserver. */
366}
223ffa71
TT
367
368/* See target/target.h. */
369
370void
371target_terminal::ours_for_output (void)
372{
373 /* Placeholder. */
374}
375
376/* See target/target.h. */
377
378void
379target_terminal::info (const char *arg, int from_tty)
380{
381 /* Placeholder. */
382}
6dee9afb
TBA
383
384/* Default implementations of target ops.
385 See target.h for definitions. */
386
387void
388process_target::post_create_inferior ()
389{
390 /* Nop. */
391}
79b44087
TBA
392
393int
394process_target::prepare_to_access_memory ()
395{
396 return 0;
397}
398
399void
400process_target::done_accessing_memory ()
401{
402 /* Nop. */
403}
2a31c7aa
TBA
404
405void
406process_target::look_up_symbols ()
407{
408 /* Nop. */
409}
eac215cc
TBA
410
411bool
412process_target::supports_read_auxv ()
413{
414 return false;
415}
416
417int
418process_target::read_auxv (CORE_ADDR offset, unsigned char *myaddr,
419 unsigned int len)
420{
421 gdb_assert_not_reached ("target op read_auxv not supported");
422}
a2b2297a
TBA
423
424bool
425process_target::supports_z_point_type (char z_type)
426{
427 return false;
428}
7e0bde70
TBA
429
430int
431process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
432 int size, raw_breakpoint *bp)
433{
434 return 1;
435}
436
437int
438process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
439 int size, raw_breakpoint *bp)
440{
441 return 1;
442}
84320c4e
TBA
443
444bool
445process_target::stopped_by_sw_breakpoint ()
446{
447 return false;
448}
449
450bool
451process_target::supports_stopped_by_sw_breakpoint ()
452{
453 return false;
454}
93fe88b2
TBA
455
456bool
457process_target::stopped_by_hw_breakpoint ()
458{
459 return false;
460}
461
462bool
463process_target::supports_stopped_by_hw_breakpoint ()
464{
465 return false;
466}
22aa6223
TBA
467
468bool
469process_target::supports_hardware_single_step ()
470{
471 return false;
472}
6eeb5c55
TBA
473
474bool
475process_target::stopped_by_watchpoint ()
476{
477 return false;
478}
479
480CORE_ADDR
481process_target::stopped_data_address ()
482{
483 return 0;
484}
5203ae1e
TBA
485
486bool
487process_target::supports_read_offsets ()
488{
489 return false;
490}
491
492int
493process_target::read_offsets (CORE_ADDR *text, CORE_ADDR *data)
494{
495 gdb_assert_not_reached ("target op read_offsets not supported");
496}
6e3fd7e9
TBA
497
498bool
499process_target::supports_get_tls_address ()
500{
501 return false;
502}
503
504int
505process_target::get_tls_address (thread_info *thread, CORE_ADDR offset,
506 CORE_ADDR load_module, CORE_ADDR *address)
507{
508 gdb_assert_not_reached ("target op get_tls_address not supported");
509}
ea06bbaa
TBA
510
511void
512process_target::hostio_last_error (char *buf)
513{
514 hostio_last_error_from_errno (buf);
515}
2d0795ee
TBA
516
517bool
518process_target::supports_qxfer_osdata ()
519{
520 return false;
521}
522
523int
524process_target::qxfer_osdata (const char *annex, unsigned char *readbuf,
525 unsigned const char *writebuf,
526 CORE_ADDR offset, int len)
527{
528 gdb_assert_not_reached ("target op qxfer_osdata not supported");
529}