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 26 struct target_ops *the_target; 27 28 void 29 set_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 60 int 61 read_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 69 int 70 write_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 91 unsigned char 92 mywait (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 107 void 108 set_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