1 /* Remote debugging with the XLNT Designs, Inc (XDI) NetROM.
2 Copyright 1990, 1991, 1992, 1995, 1998, 1999, 2000
3 Free Software Foundation, Inc.
7 15050 Avenue of Science, Suite 106
11 Adapted from work done at Cygnus Support in remote-nindy.c,
12 later merged in by Stan Shebs at Cygnus.
14 This file is part of GDB.
16 This program is free software; you can redistribute it and/or modify
17 it under the terms of the GNU General Public License as published by
18 the Free Software Foundation; either version 2 of the License, or
19 (at your option) any later version.
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 59 Temple Place - Suite 330,
29 Boston, MA 02111-1307, USA. */
36 /* Default ports used to talk with the NetROM. */
38 #define DEFAULT_NETROM_LOAD_PORT 1236
39 #define DEFAULT_NETROM_CONTROL_PORT 1237
41 static void nrom_close (int quitting
);
45 static void nrom_passthru (char *, int);
47 /* We talk to the NetROM over these sockets. */
49 static struct serial
*load_desc
= NULL
;
50 static struct serial
*ctrl_desc
= NULL
;
52 static int load_port
= DEFAULT_NETROM_LOAD_PORT
;
53 static int control_port
= DEFAULT_NETROM_CONTROL_PORT
;
55 static char nrom_hostname
[100];
57 /* Forward data declaration. */
59 extern struct target_ops nrom_ops
;
61 /* Scan input from the remote system, until STRING is found. Print chars that
74 c
= SERIAL_READCHAR (ctrl_desc
, 5);
86 fputc_unfiltered (c
, gdb_stdout
);
100 static struct serial
*
101 open_socket (char *name
, int port
)
106 sprintf (sockname
, "%s:%d", name
, port
);
107 desc
= SERIAL_OPEN (sockname
);
109 perror_with_name (sockname
);
117 SERIAL_CLOSE (load_desc
);
121 /* Download a file specified in ARGS to the netROM. */
124 nrom_load (char *args
, int fromtty
)
126 int fd
, rd_amt
, fsize
;
129 char *downloadstring
= "download 0\n";
130 struct cleanup
*old_chain
;
132 /* Tell the netrom to get ready to download. */
133 if (SERIAL_WRITE (ctrl_desc
, downloadstring
, strlen (downloadstring
)))
134 error ("nrom_load: control_send() of `%s' failed", downloadstring
);
136 expect ("Waiting for a connection...\n");
138 load_desc
= open_socket (nrom_hostname
, load_port
);
140 old_chain
= make_cleanup (load_cleanup
, 0);
142 pbfd
= bfd_openr (args
, 0);
146 make_cleanup (bfd_close
, pbfd
);
148 if (!bfd_check_format (pbfd
, bfd_object
))
149 error ("\"%s\": not in executable format: %s",
150 args
, bfd_errmsg (bfd_get_error ()));
152 for (section
= pbfd
->sections
; section
; section
= section
->next
)
154 if (bfd_get_section_flags (pbfd
, section
) & SEC_ALLOC
)
156 bfd_vma section_address
;
157 unsigned long section_size
;
158 const char *section_name
;
160 section_name
= bfd_get_section_name (pbfd
, section
);
161 section_address
= bfd_get_section_vma (pbfd
, section
);
162 section_size
= bfd_section_size (pbfd
, section
);
164 if (bfd_get_section_flags (pbfd
, section
) & SEC_LOAD
)
168 printf_filtered ("[Loading section %s at %x (%d bytes)]\n",
169 section_name
, section_address
,
174 while (section_size
> 0)
179 count
= min (section_size
, 1024);
181 bfd_get_section_contents (pbfd
, section
, buffer
, fptr
,
184 SERIAL_WRITE (load_desc
, buffer
, count
);
185 section_address
+= count
;
187 section_size
-= count
;
193 printf_filtered ("[section %s: not loading]\n",
200 error ("\"%s\": Could not open", args
);
202 do_cleanups (old_chain
);
205 /* Open a connection to the remote NetROM devices. */
208 nrom_open (char *name
, int from_tty
)
212 if (!name
|| strchr (name
, '/') || strchr (name
, ':'))
214 "To open a NetROM connection, you must specify the hostname\n\
215 or IP address of the NetROM device you wish to use.");
217 strcpy (nrom_hostname
, name
);
219 target_preopen (from_tty
);
221 unpush_target (&nrom_ops
);
223 ctrl_desc
= open_socket (nrom_hostname
, control_port
);
225 push_target (&nrom_ops
);
228 printf_filtered ("Connected to NetROM device \"%s\"\n", nrom_hostname
);
231 /* Close out all files and local state before this target loses control. */
234 nrom_close (int quitting
)
237 SERIAL_CLOSE (load_desc
);
239 SERIAL_CLOSE (ctrl_desc
);
242 /* Pass arguments directly to the NetROM. */
245 nrom_passthru (char *args
, int fromtty
)
249 sprintf (buf
, "%s\n", args
);
250 if (SERIAL_WRITE (ctrl_desc
, buf
, strlen (buf
)))
251 error ("nrom_reset: control_send() of `%s'failed", args
);
257 unpush_target (&nrom_ops
);
258 generic_mourn_inferior ();
261 /* Define the target vector. */
263 struct target_ops nrom_ops
;
268 nrom_ops
.to_shortname
= "nrom";
269 nrom_ops
.to_longname
= "Remote XDI `NetROM' target";
270 nrom_ops
.to_doc
= "Remote debug using a NetROM over Ethernet";
271 nrom_ops
.to_open
= nrom_open
;
272 nrom_ops
.to_close
= nrom_close
;
273 nrom_ops
.to_attach
= NULL
;
274 nrom_ops
.to_post_attach
= NULL
;
275 nrom_ops
.to_require_attach
= NULL
;
276 nrom_ops
.to_detach
= NULL
;
277 nrom_ops
.to_require_detach
= NULL
;
278 nrom_ops
.to_resume
= NULL
;
279 nrom_ops
.to_wait
= NULL
;
280 nrom_ops
.to_post_wait
= NULL
;
281 nrom_ops
.to_fetch_registers
= NULL
;
282 nrom_ops
.to_store_registers
= NULL
;
283 nrom_ops
.to_prepare_to_store
= NULL
;
284 nrom_ops
.to_xfer_memory
= NULL
;
285 nrom_ops
.to_files_info
= NULL
;
286 nrom_ops
.to_insert_breakpoint
= NULL
;
287 nrom_ops
.to_remove_breakpoint
= NULL
;
288 nrom_ops
.to_terminal_init
= NULL
;
289 nrom_ops
.to_terminal_inferior
= NULL
;
290 nrom_ops
.to_terminal_ours_for_output
= NULL
;
291 nrom_ops
.to_terminal_ours
= NULL
;
292 nrom_ops
.to_terminal_info
= NULL
;
293 nrom_ops
.to_kill
= nrom_kill
;
294 nrom_ops
.to_load
= nrom_load
;
295 nrom_ops
.to_lookup_symbol
= NULL
;
296 nrom_ops
.to_create_inferior
= NULL
;
297 nrom_ops
.to_post_startup_inferior
= NULL
;
298 nrom_ops
.to_acknowledge_created_inferior
= NULL
;
299 nrom_ops
.to_clone_and_follow_inferior
= NULL
;
300 nrom_ops
.to_post_follow_inferior_by_clone
= NULL
;
301 nrom_ops
.to_insert_fork_catchpoint
= NULL
;
302 nrom_ops
.to_remove_fork_catchpoint
= NULL
;
303 nrom_ops
.to_insert_vfork_catchpoint
= NULL
;
304 nrom_ops
.to_remove_vfork_catchpoint
= NULL
;
305 nrom_ops
.to_has_forked
= NULL
;
306 nrom_ops
.to_has_vforked
= NULL
;
307 nrom_ops
.to_can_follow_vfork_prior_to_exec
= NULL
;
308 nrom_ops
.to_post_follow_vfork
= NULL
;
309 nrom_ops
.to_insert_exec_catchpoint
= NULL
;
310 nrom_ops
.to_remove_exec_catchpoint
= NULL
;
311 nrom_ops
.to_has_execd
= NULL
;
312 nrom_ops
.to_reported_exec_events_per_exec_call
= NULL
;
313 nrom_ops
.to_has_exited
= NULL
;
314 nrom_ops
.to_mourn_inferior
= nrom_mourn
;
315 nrom_ops
.to_can_run
= NULL
;
316 nrom_ops
.to_notice_signals
= 0;
317 nrom_ops
.to_thread_alive
= 0;
318 nrom_ops
.to_stop
= 0;
319 nrom_ops
.to_pid_to_exec_file
= NULL
;
320 nrom_ops
.to_stratum
= download_stratum
;
321 nrom_ops
.DONT_USE
= NULL
;
322 nrom_ops
.to_has_all_memory
= 1;
323 nrom_ops
.to_has_memory
= 1;
324 nrom_ops
.to_has_stack
= 1;
325 nrom_ops
.to_has_registers
= 1;
326 nrom_ops
.to_has_execution
= 0;
327 nrom_ops
.to_sections
= NULL
;
328 nrom_ops
.to_sections_end
= NULL
;
329 nrom_ops
.to_magic
= OPS_MAGIC
;
333 _initialize_remote_nrom (void)
336 add_target (&nrom_ops
);
339 add_set_cmd ("nrom_load_port", no_class
, var_zinteger
, (char *) &load_port
,
340 "Set the port to use for NetROM downloads\n", &setlist
),
344 add_set_cmd ("nrom_control_port", no_class
, var_zinteger
, (char *) &control_port
,
345 "Set the port to use for NetROM debugger services\n", &setlist
),
348 add_cmd ("nrom", no_class
, nrom_passthru
,
349 "Pass arguments as command to NetROM",