target.c revision 130803
1/* Target operations for the remote server for GDB.
2   Copyright 2002, 2004
3   Free Software Foundation, Inc.
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
11   the Free Software Foundation; either version 2 of the License, or
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
20   along with this program; if not, write to the Free Software
21   Foundation, Inc., 59 Temple Place - Suite 330,
22   Boston, MA 02111-1307, USA.  */
23
24#include "server.h"
25
26struct target_ops *the_target;
27
28void
29set_desired_inferior (int use_general)
30{
31  struct thread_info *found;
32
33  if (use_general == 1)
34    {
35      found = (struct thread_info *) find_inferior_id (&all_threads,
36						       general_thread);
37    }
38  else
39    {
40      found = NULL;
41
42      /* If we are continuing any (all) thread(s), use step_thread
43	 to decide which thread to step and/or send the specified
44	 signal to.  */
45      if (step_thread > 0 && (cont_thread == 0 || cont_thread == -1))
46	found = (struct thread_info *) find_inferior_id (&all_threads,
47							 step_thread);
48
49      if (found == NULL)
50	found = (struct thread_info *) find_inferior_id (&all_threads,
51							 cont_thread);
52    }
53
54  if (found == NULL)
55    current_inferior = (struct thread_info *) all_threads.head;
56  else
57    current_inferior = found;
58}
59
60int
61read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
62{
63  int res;
64  res = (*the_target->read_memory) (memaddr, myaddr, len);
65  check_mem_read (memaddr, myaddr, len);
66  return res;
67}
68
69int
70write_inferior_memory (CORE_ADDR memaddr, const char *myaddr, int len)
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.  */
75  static char *buffer = 0;
76  int res;
77
78  if (buffer != NULL)
79    free (buffer);
80
81  buffer = malloc (len);
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
91unsigned char
92mywait (char *statusp, int connected_wait)
93{
94  unsigned char ret;
95
96  if (connected_wait)
97    server_waiting = 1;
98
99  ret = (*the_target->wait) (statusp);
100
101  if (connected_wait)
102    server_waiting = 0;
103
104  return ret;
105}
106
107void
108set_target_ops (struct target_ops *target)
109{
110  the_target = (struct target_ops *) malloc (sizeof (*the_target));
111  memcpy (the_target, target, sizeof (*the_target));
112}
113