]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdbserver/target.c
Decouple target code from remote protocol.
[thirdparty/binutils-gdb.git] / gdb / gdbserver / target.c
CommitLineData
ce3a066d 1/* Target operations for the remote server for GDB.
0fb0cc75
JB
2 Copyright (C) 2002, 2004, 2005, 2007, 2008, 2009
3 Free Software Foundation, Inc.
ce3a066d
DJ
4
5 Contributed by MontaVista Software.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
ce3a066d
DJ
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ce3a066d
DJ
21
22#include "server.h"
23
24struct target_ops *the_target;
25
0d62e5e8
DJ
26void
27set_desired_inferior (int use_general)
28{
29 struct thread_info *found;
30
31 if (use_general == 1)
32 {
33 found = (struct thread_info *) find_inferior_id (&all_threads,
34 general_thread);
35 }
36 else
37 {
38 found = NULL;
39
40 /* If we are continuing any (all) thread(s), use step_thread
41 to decide which thread to step and/or send the specified
42 signal to. */
d592fa2f
DJ
43 if ((step_thread != 0 && step_thread != -1)
44 && (cont_thread == 0 || cont_thread == -1))
0d62e5e8
DJ
45 found = (struct thread_info *) find_inferior_id (&all_threads,
46 step_thread);
47
48 if (found == NULL)
49 found = (struct thread_info *) find_inferior_id (&all_threads,
50 cont_thread);
51 }
52
53 if (found == NULL)
54 current_inferior = (struct thread_info *) all_threads.head;
55 else
56 current_inferior = found;
57}
58
c3e735a6 59int
f450004a 60read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
611cb4a5 61{
c3e735a6
DJ
62 int res;
63 res = (*the_target->read_memory) (memaddr, myaddr, len);
611cb4a5 64 check_mem_read (memaddr, myaddr, len);
c3e735a6 65 return res;
611cb4a5
DJ
66}
67
68int
f450004a
DJ
69write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
70 int len)
0d62e5e8
DJ
71{
72 /* Lacking cleanups, there is some potential for a memory leak if the
73 write fails and we go through error(). Make sure that no more than
74 one buffer is ever pending by making BUFFER static. */
f450004a 75 static unsigned char *buffer = 0;
0d62e5e8
DJ
76 int res;
77
78 if (buffer != NULL)
79 free (buffer);
80
bca929d3 81 buffer = xmalloc (len);
0d62e5e8
DJ
82 memcpy (buffer, myaddr, len);
83 check_mem_write (memaddr, buffer, len);
84 res = (*the_target->write_memory) (memaddr, buffer, len);
85 free (buffer);
86 buffer = NULL;
87
88 return res;
89}
90
5b1c542e
PA
91unsigned long
92mywait (struct target_waitstatus *ourstatus, int connected_wait)
611cb4a5 93{
5b1c542e 94 unsigned long ret;
0d62e5e8
DJ
95
96 if (connected_wait)
97 server_waiting = 1;
98
5b1c542e 99 ret = (*the_target->wait) (ourstatus);
0d62e5e8
DJ
100
101 if (connected_wait)
102 server_waiting = 0;
103
104 return ret;
611cb4a5
DJ
105}
106
ce3a066d
DJ
107void
108set_target_ops (struct target_ops *target)
109{
bca929d3 110 the_target = (struct target_ops *) xmalloc (sizeof (*the_target));
ce3a066d
DJ
111 memcpy (the_target, target, sizeof (*the_target));
112}