* corelow.c, exec.c, inftarg.c, m3-nat.c, op50-rom.c, procfs.c,
[deliverable/binutils-gdb.git] / gdb / remote-nindy.c
CommitLineData
dd3b648e 1/* Memory-access and commands for remote NINDY process, for GDB.
58bcc08c 2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
dd3b648e
RP
3 Contributed by Intel Corporation. Modified from remote.c by Chris Benenati.
4
5GDB is distributed in the hope that it will be useful, but WITHOUT ANY
6WARRANTY. No author or distributor accepts responsibility to anyone
7for the consequences of using it or for whether it serves any
8particular purpose or works at all, unless he says so in writing.
9Refer to the GDB General Public License for full details.
10
11Everyone is granted permission to copy, modify and redistribute GDB,
12but only under the conditions described in the GDB General Public
13License. A copy of this license is supposed to have been given to you
14along with GDB so you can know your rights and responsibilities. It
15should be in a file named COPYING. Among other things, the copyright
16notice and this notice must be preserved on all copies.
17
18In other words, go ahead and share GDB, but don't try to stop
19anyone else from sharing it farther. Help stamp out software hoarding!
20*/
21
22/*
23Except for the data cache routines, this file bears little resemblence
24to remote.c. A new (although similar) protocol has been specified, and
25portions of the code are entirely dependent on having an i80960 with a
26NINDY ROM monitor at the other end of the line.
27*/
28
29/*****************************************************************************
30 *
31 * REMOTE COMMUNICATION PROTOCOL BETWEEN GDB960 AND THE NINDY ROM MONITOR.
32 *
33 *
34 * MODES OF OPERATION
35 * ----- -- ---------
36 *
37 * As far as NINDY is concerned, GDB is always in one of two modes: command
38 * mode or passthrough mode.
39 *
40 * In command mode (the default) pre-defined packets containing requests
41 * are sent by GDB to NINDY. NINDY never talks except in reponse to a request.
42 *
43 * Once the the user program is started, GDB enters passthrough mode, to give
44 * the user program access to the terminal. GDB remains in this mode until
45 * NINDY indicates that the program has stopped.
46 *
47 *
48 * PASSTHROUGH MODE
49 * ----------- ----
50 *
51 * GDB writes all input received from the keyboard directly to NINDY, and writes
52 * all characters received from NINDY directly to the monitor.
53 *
54 * Keyboard input is neither buffered nor echoed to the monitor.
55 *
56 * GDB remains in passthrough mode until NINDY sends a single ^P character,
57 * to indicate that the user process has stopped.
58 *
59 * Note:
60 * GDB assumes NINDY performs a 'flushreg' when the user program stops.
61 *
62 *
63 * COMMAND MODE
64 * ------- ----
65 *
66 * All info (except for message ack and nak) is transferred between gdb
67 * and the remote processor in messages of the following format:
68 *
69 * <info>#<checksum>
70 *
71 * where
72 * # is a literal character
73 *
74 * <info> ASCII information; all numeric information is in the
75 * form of hex digits ('0'-'9' and lowercase 'a'-'f').
76 *
77 * <checksum>
78 * is a pair of ASCII hex digits representing an 8-bit
79 * checksum formed by adding together each of the
80 * characters in <info>.
81 *
82 * The receiver of a message always sends a single character to the sender
83 * to indicate that the checksum was good ('+') or bad ('-'); the sender
84 * re-transmits the entire message over until a '+' is received.
85 *
86 * In response to a command NINDY always sends back either data or
87 * a result code of the form "Xnn", where "nn" are hex digits and "X00"
88 * means no errors. (Exceptions: the "s" and "c" commands don't respond.)
89 *
90 * SEE THE HEADER OF THE FILE "gdb.c" IN THE NINDY MONITOR SOURCE CODE FOR A
91 * FULL DESCRIPTION OF LEGAL COMMANDS.
92 *
93 * SEE THE FILE "stop.h" IN THE NINDY MONITOR SOURCE CODE FOR A LIST
94 * OF STOP CODES.
95 *
6ecb870e 96 ***************************************************************************/
dd3b648e 97
d747e0af 98#include "defs.h"
dd3b648e
RP
99#include <signal.h>
100#include <sys/types.h>
101#include <setjmp.h>
102
dd3b648e
RP
103#include "frame.h"
104#include "inferior.h"
77641260 105#include "bfd.h"
6b27ebe8 106#include "symfile.h"
dd3b648e
RP
107#include "target.h"
108#include "gdbcore.h"
109#include "command.h"
48792545 110#include "floatformat.h"
dd3b648e
RP
111
112#include "wait.h"
dd3b648e
RP
113#include <sys/file.h>
114#include <ctype.h>
704deef2 115#include "serial.h"
dd3b648e
RP
116#include "nindy-share/env.h"
117#include "nindy-share/stop.h"
118
5a0a463f 119#include "dcache.h"
a94abe5b 120#include "remote-utils.h"
5a0a463f
RP
121
122static DCACHE *nindy_dcache;
123
dd3b648e
RP
124extern int unlink();
125extern char *getenv();
126extern char *mktemp();
127
dd3b648e
RP
128extern void generic_mourn_inferior ();
129
130extern struct target_ops nindy_ops;
199b2450 131extern GDB_FILE *instream;
dd3b648e
RP
132
133extern char ninStopWhy ();
6deb63ab
JK
134extern int ninMemGet ();
135extern int ninMemPut ();
dd3b648e
RP
136
137int nindy_initial_brk; /* nonzero if want to send an initial BREAK to nindy */
138int nindy_old_protocol; /* nonzero if want to use old protocol */
139char *nindy_ttyname; /* name of tty to talk to nindy on, or null */
140
141#define DLE '\020' /* Character NINDY sends to indicate user program has
142 * halted. */
143#define TRUE 1
144#define FALSE 0
145
704deef2
JK
146/* From nindy-share/nindy.c. */
147extern serial_t nindy_serial;
148
dd3b648e
RP
149static int have_regs = 0; /* 1 iff regs read since i960 last halted */
150static int regs_changed = 0; /* 1 iff regs were modified since last read */
151
152extern char *exists();
e4db3f3e 153
e4db3f3e
JG
154static void
155nindy_fetch_registers PARAMS ((int));
156
157static void
158nindy_store_registers PARAMS ((int));
dd3b648e 159\f
dd3b648e
RP
160static char *savename;
161
162static void
163nindy_close (quitting)
164 int quitting;
165{
704deef2
JK
166 if (nindy_serial != NULL)
167 SERIAL_CLOSE (nindy_serial);
168 nindy_serial = NULL;
dd3b648e
RP
169
170 if (savename)
171 free (savename);
172 savename = 0;
173}
174
175/* Open a connection to a remote debugger.
b10f4dd9
JK
176 FIXME, there should be "set" commands for the options that are
177 now specified with gdb command-line options (old_protocol,
178 and initial_brk). */
dd3b648e
RP
179void
180nindy_open (name, from_tty)
181 char *name; /* "/dev/ttyXX", "ttyXX", or "XX": tty to be opened */
182 int from_tty;
183{
a94abe5b 184 char baudrate[1024];
dd3b648e
RP
185
186 if (!name)
187 error_no_arg ("serial port device name");
188
f2fc6e7a 189 target_preopen (from_tty);
b10f4dd9 190
dd3b648e
RP
191 nindy_close (0);
192
704deef2 193 have_regs = regs_changed = 0;
5a0a463f 194 nindy_dcache = dcache_init(ninMemGet, ninMemPut);
dd3b648e 195
704deef2
JK
196 /* Allow user to interrupt the following -- we could hang if there's
197 no NINDY at the other end of the remote tty. */
198 immediate_quit++;
c20c1bdf
JK
199 /* If baud_rate is -1, then ninConnect will not recognize the baud rate
200 and will deal with the situation in a (more or less) reasonable
201 fashion. */
202 sprintf(baudrate, "%d", baud_rate);
a94abe5b 203 ninConnect(name, baudrate,
704deef2
JK
204 nindy_initial_brk, !from_tty, nindy_old_protocol);
205 immediate_quit--;
dd3b648e 206
704deef2
JK
207 if (nindy_serial == NULL)
208 {
209 perror_with_name (name);
210 }
dd3b648e 211
704deef2
JK
212 savename = savestring (name, strlen (name));
213 push_target (&nindy_ops);
214 target_fetch_registers(-1);
dd3b648e
RP
215}
216
217/* User-initiated quit of nindy operations. */
218
219static void
220nindy_detach (name, from_tty)
221 char *name;
222 int from_tty;
223{
dd3b648e
RP
224 if (name)
225 error ("Too many arguments");
226 pop_target ();
227}
228
229static void
230nindy_files_info ()
231{
c20c1bdf
JK
232 /* FIXME: this lies about the baud rate if we autobauded. */
233 printf_unfiltered("\tAttached to %s at %d bits per second%s%s.\n", savename,
234 baud_rate,
dd3b648e
RP
235 nindy_old_protocol? " in old protocol": "",
236 nindy_initial_brk? " with initial break": "");
237}
238\f
6b27ebe8
JK
239/* Return the number of characters in the buffer before
240 the first DLE character. */
dd3b648e
RP
241
242static
243int
244non_dle( buf, n )
245 char *buf; /* Character buffer; NOT '\0'-terminated */
246 int n; /* Number of characters in buffer */
247{
248 int i;
249
250 for ( i = 0; i < n; i++ ){
251 if ( buf[i] == DLE ){
252 break;
253 }
254 }
255 return i;
256}
257\f
258/* Tell the remote machine to resume. */
259
260void
25286543 261nindy_resume (pid, step, siggnal)
67ac9759
JK
262 int pid, step;
263 enum target_signal siggnal;
dd3b648e 264{
67ac9759
JK
265 if (siggnal != TARGET_SIGNAL_0 && siggnal != stop_signal)
266 warning ("Can't send signals to remote NINDY targets.");
dd3b648e 267
5a0a463f 268 dcache_flush(nindy_dcache);
dd3b648e 269 if ( regs_changed ){
df86eb44 270 nindy_store_registers (-1);
dd3b648e
RP
271 regs_changed = 0;
272 }
273 have_regs = 0;
274 ninGo( step );
275}
704deef2
JK
276\f
277/* FIXME, we can probably use the normal terminal_inferior stuff here.
278 We have to do terminal_inferior and then set up the passthrough
279 settings initially. Thereafter, terminal_ours and terminal_inferior
280 will automatically swap the settings around for us. */
281
282struct clean_up_tty_args {
283 serial_ttystate state;
284 serial_t serial;
285};
286
287static void
288clean_up_tty (ptrarg)
289 PTR ptrarg;
290{
291 struct clean_up_tty_args *args = (struct clean_up_tty_args *) ptrarg;
292 SERIAL_SET_TTY_STATE (args->serial, args->state);
293 free (args->state);
294 warning ("\n\n\
295You may need to reset the 80960 and/or reload your program.\n");
296}
dd3b648e
RP
297
298/* Wait until the remote machine stops. While waiting, operate in passthrough
199b2450 299 * mode; i.e., pass everything NINDY sends to gdb_stdout, and everything from
dd3b648e
RP
300 * stdin to NINDY.
301 *
302 * Return to caller, storing status in 'status' just as `wait' would.
303 */
304
e4db3f3e 305static int
de43d7d0
SG
306nindy_wait( pid, status )
307 int pid;
67ac9759 308 struct target_waitstatus *status;
dd3b648e 309{
704deef2
JK
310 fd_set fds;
311 char buf[500]; /* FIXME, what is "500" here? */
312 int i, n;
313 unsigned char stop_exit;
314 unsigned char stop_code;
315 struct clean_up_tty_args tty_args;
316 struct cleanup *old_cleanups;
317 long ip_value, fp_value, sp_value; /* Reg values from stop */
318
67ac9759
JK
319 status->kind = TARGET_WAITKIND_EXITED;
320 status->value.integer = 0;
704deef2
JK
321
322 /* OPERATE IN PASSTHROUGH MODE UNTIL NINDY SENDS A DLE CHARACTER */
323
324 /* Save current tty attributes, and restore them when done. */
325 tty_args.serial = SERIAL_FDOPEN (0);
326 tty_args.state = SERIAL_GET_TTY_STATE (tty_args.serial);
327 old_cleanups = make_cleanup (clean_up_tty, &tty_args);
328
329 /* Pass input from keyboard to NINDY as it arrives. NINDY will interpret
330 <CR> and perform echo. */
331 /* This used to set CBREAK and clear ECHO and CRMOD. I hope this is close
332 enough. */
333 SERIAL_RAW (tty_args.serial);
334
335 while (1)
336 {
337 /* Wait for input on either the remote port or stdin. */
338 FD_ZERO (&fds);
339 FD_SET (0, &fds);
340 FD_SET (nindy_serial->fd, &fds);
341 if (select (nindy_serial->fd + 1, &fds, 0, 0, 0) <= 0)
342 continue;
343
344 /* Pass input through to correct place */
345 if (FD_ISSET (0, &fds))
346 {
347 /* Input on stdin */
348 n = read (0, buf, sizeof (buf));
349 if (n)
350 {
351 SERIAL_WRITE (nindy_serial, buf, n );
352 }
353 }
dd3b648e 354
704deef2
JK
355 if (FD_ISSET (nindy_serial->fd, &fds))
356 {
357 /* Input on remote */
358 n = read (nindy_serial->fd, buf, sizeof (buf));
359 if (n)
360 {
361 /* Write out any characters in buffer preceding DLE */
362 i = non_dle( buf, n );
363 if ( i > 0 )
364 {
365 write (1, buf, i);
dd3b648e
RP
366 }
367
704deef2
JK
368 if (i != n)
369 {
370 /* There *was* a DLE in the buffer */
371 stop_exit = ninStopWhy(&stop_code,
372 &ip_value, &fp_value, &sp_value);
373 if (!stop_exit && (stop_code == STOP_SRQ))
374 {
375 immediate_quit++;
376 ninSrq();
377 immediate_quit--;
378 }
379 else
380 {
381 /* Get out of loop */
382 supply_register (IP_REGNUM,
383 (char *)&ip_value);
384 supply_register (FP_REGNUM,
385 (char *)&fp_value);
386 supply_register (SP_REGNUM,
387 (char *)&sp_value);
388 break;
389 }
dd3b648e 390 }
704deef2 391 }
dd3b648e 392 }
704deef2 393 }
dd3b648e 394
704deef2
JK
395 do_cleanups (old_cleanups);
396
397 if (stop_exit)
398 {
67ac9759
JK
399 status->kind = TARGET_WAITKIND_EXITED;
400 status->value.integer = stop_code;
704deef2
JK
401 }
402 else
403 {
67ac9759
JK
404 status->kind = TARGET_WAITKIND_STOPPED;
405 status->value.sig = i960_fault_to_signal (stop_code);
704deef2
JK
406 }
407 return inferior_pid;
dd3b648e
RP
408}
409
410/* Read the remote registers into the block REGS. */
411
412/* This is the block that ninRegsGet and ninRegsPut handles. */
413struct nindy_regs {
414 char local_regs[16 * 4];
415 char global_regs[16 * 4];
416 char pcw_acw[2 * 4];
417 char ip[4];
418 char tcw[4];
419 char fp_as_double[4 * 8];
420};
421
120f867e 422static void
dd3b648e
RP
423nindy_fetch_registers(regno)
424 int regno;
425{
426 struct nindy_regs nindy_regs;
427 int regnum, inv;
428 double dub;
429
430 immediate_quit++;
431 ninRegsGet( (char *) &nindy_regs );
432 immediate_quit--;
433
704deef2
JK
434 memcpy (&registers[REGISTER_BYTE (R0_REGNUM)], nindy_regs.local_regs, 16*4);
435 memcpy (&registers[REGISTER_BYTE (G0_REGNUM)], nindy_regs.global_regs, 16*4);
436 memcpy (&registers[REGISTER_BYTE (PCW_REGNUM)], nindy_regs.pcw_acw, 2*4);
437 memcpy (&registers[REGISTER_BYTE (IP_REGNUM)], nindy_regs.ip, 1*4);
438 memcpy (&registers[REGISTER_BYTE (TCW_REGNUM)], nindy_regs.tcw, 1*4);
dd3b648e
RP
439 for (regnum = FP0_REGNUM; regnum < FP0_REGNUM + 4; regnum++) {
440 dub = unpack_double (builtin_type_double,
441 &nindy_regs.fp_as_double[8 * (regnum - FP0_REGNUM)],
442 &inv);
443 /* dub now in host byte order */
48792545 444 floatformat_from_double (&floatformat_i960_ext, &dub,
dd3b648e
RP
445 &registers[REGISTER_BYTE (regnum)]);
446 }
447
448 registers_fetched ();
dd3b648e
RP
449}
450
451static void
452nindy_prepare_to_store()
453{
4ddd278f
JG
454 /* Fetch all regs if they aren't already here. */
455 read_register_bytes (0, NULL, REGISTER_BYTES);
dd3b648e
RP
456}
457
120f867e 458static void
dd3b648e
RP
459nindy_store_registers(regno)
460 int regno;
461{
462 struct nindy_regs nindy_regs;
bf5c0d64 463 int regnum;
dd3b648e
RP
464 double dub;
465
704deef2
JK
466 memcpy (nindy_regs.local_regs, &registers[REGISTER_BYTE (R0_REGNUM)], 16*4);
467 memcpy (nindy_regs.global_regs, &registers[REGISTER_BYTE (G0_REGNUM)], 16*4);
468 memcpy (nindy_regs.pcw_acw, &registers[REGISTER_BYTE (PCW_REGNUM)], 2*4);
469 memcpy (nindy_regs.ip, &registers[REGISTER_BYTE (IP_REGNUM)], 1*4);
470 memcpy (nindy_regs.tcw, &registers[REGISTER_BYTE (TCW_REGNUM)], 1*4);
bf5c0d64
JK
471 for (regnum = FP0_REGNUM; regnum < FP0_REGNUM + 4; regnum++)
472 {
48792545
JK
473 floatformat_to_double (&floatformat_i960_ext,
474 &registers[REGISTER_BYTE (regnum)], &dub);
bf5c0d64
JK
475 store_floating (&nindy_regs.fp_as_double[8 * (regnum - FP0_REGNUM)],
476 REGISTER_VIRTUAL_SIZE (regnum),
477 dub);
478 }
dd3b648e
RP
479
480 immediate_quit++;
481 ninRegsPut( (char *) &nindy_regs );
482 immediate_quit--;
dd3b648e
RP
483}
484
485/* Read a word from remote address ADDR and return it.
486 * This goes through the data cache.
487 */
488int
489nindy_fetch_word (addr)
490 CORE_ADDR addr;
491{
5a0a463f 492 return dcache_fetch (nindy_dcache, addr);
dd3b648e
RP
493}
494
495/* Write a word WORD into remote address ADDR.
496 This goes through the data cache. */
497
498void
499nindy_store_word (addr, word)
500 CORE_ADDR addr;
501 int word;
502{
5a0a463f 503 dcache_poke (nindy_dcache, addr, word);
dd3b648e
RP
504}
505
506/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
507 to debugger memory starting at MYADDR. Copy to inferior if
508 WRITE is nonzero. Returns the length copied.
509
510 This is stolen almost directly from infptrace.c's child_xfer_memory,
511 which also deals with a word-oriented memory interface. Sometime,
512 FIXME, rewrite this to not use the word-oriented routines. */
513
514int
8f1f2a72 515nindy_xfer_inferior_memory(memaddr, myaddr, len, write, target)
dd3b648e
RP
516 CORE_ADDR memaddr;
517 char *myaddr;
518 int len;
519 int write;
8f1f2a72 520 struct target_ops *target; /* ignored */
dd3b648e
RP
521{
522 register int i;
523 /* Round starting address down to longword boundary. */
524 register CORE_ADDR addr = memaddr & - sizeof (int);
525 /* Round ending address up; get number of longwords that makes. */
526 register int count
527 = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
528 /* Allocate buffer of that many longwords. */
529 register int *buffer = (int *) alloca (count * sizeof (int));
530
531 if (write)
532 {
533 /* Fill start and end extra bytes of buffer with existing memory data. */
534
535 if (addr != memaddr || len < (int)sizeof (int)) {
536 /* Need part of initial word -- fetch it. */
537 buffer[0] = nindy_fetch_word (addr);
538 }
539
540 if (count > 1) /* FIXME, avoid if even boundary */
541 {
542 buffer[count - 1]
543 = nindy_fetch_word (addr + (count - 1) * sizeof (int));
544 }
545
546 /* Copy data to be written over corresponding part of buffer */
547
704deef2 548 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
dd3b648e
RP
549
550 /* Write the entire buffer. */
551
552 for (i = 0; i < count; i++, addr += sizeof (int))
553 {
554 errno = 0;
555 nindy_store_word (addr, buffer[i]);
556 if (errno)
557 return 0;
558 }
559 }
560 else
561 {
562 /* Read all the longwords */
563 for (i = 0; i < count; i++, addr += sizeof (int))
564 {
565 errno = 0;
566 buffer[i] = nindy_fetch_word (addr);
567 if (errno)
568 return 0;
569 QUIT;
570 }
571
572 /* Copy appropriate bytes out of the buffer. */
704deef2 573 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
dd3b648e
RP
574 }
575 return len;
576}
577\f
dd3b648e
RP
578static void
579nindy_create_inferior (execfile, args, env)
580 char *execfile;
581 char *args;
582 char **env;
583{
584 int entry_pt;
585 int pid;
586
587 if (args && *args)
588 error ("Can't pass arguments to remote NINDY process");
589
590 if (execfile == 0 || exec_bfd == 0)
591 error ("No exec file specified");
592
593 entry_pt = (int) bfd_get_start_address (exec_bfd);
594
595 pid = 42;
596
5d76c8e6
JK
597 /* The "process" (board) is already stopped awaiting our commands, and
598 the program is already downloaded. We just set its PC and go. */
dd3b648e
RP
599
600 inferior_pid = pid; /* Needed for wait_for_inferior below */
601
602 clear_proceed_status ();
603
dd3b648e
RP
604 /* Tell wait_for_inferior that we've started a new process. */
605 init_wait_for_inferior ();
606
607 /* Set up the "saved terminal modes" of the inferior
608 based on what modes we are starting it with. */
609 target_terminal_init ();
610
611 /* Install inferior's terminal modes. */
612 target_terminal_inferior ();
613
dd3b648e 614 /* insert_step_breakpoint (); FIXME, do we need this? */
45dc9be3
JK
615 /* Let 'er rip... */
616 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
dd3b648e
RP
617}
618
619static void
620reset_command(args, from_tty)
621 char *args;
622 int from_tty;
623{
704deef2
JK
624 if (nindy_serial == NULL)
625 {
626 error( "No target system to reset -- use 'target nindy' command.");
627 }
628 if ( query("Really reset the target system?",0,0) )
629 {
630 SERIAL_SEND_BREAK (nindy_serial);
631 tty_flush (nindy_serial);
632 }
dd3b648e
RP
633}
634
635void
636nindy_kill (args, from_tty)
637 char *args;
638 int from_tty;
639{
640 return; /* Ignore attempts to kill target system */
641}
642
643/* Clean up when a program exits.
644
645 The program actually lives on in the remote processor's RAM, and may be
646 run again without a download. Don't leave it full of breakpoint
647 instructions. */
648
649void
650nindy_mourn_inferior ()
651{
652 remove_breakpoints ();
71607f9d 653 unpush_target (&nindy_ops);
dd3b648e
RP
654 generic_mourn_inferior (); /* Do all the proper things now */
655}
656\f
9748446f
JK
657/* Pass the args the way catch_errors wants them. */
658static int
659nindy_open_stub (arg)
660 char *arg;
661{
662 nindy_open (arg, 1);
663 return 1;
664}
665
666static int
667load_stub (arg)
668 char *arg;
669{
670 target_load (arg, 1);
671 return 1;
672}
673
dd3b648e
RP
674/* This routine is run as a hook, just before the main command loop is
675 entered. If gdb is configured for the i960, but has not had its
676 nindy target specified yet, this will loop prompting the user to do so.
677
678 Unlike the loop provided by Intel, we actually let the user get out
679 of this with a RETURN. This is useful when e.g. simply examining
680 an i960 object file on the host system. */
681
df86eb44 682void
dd3b648e
RP
683nindy_before_main_loop ()
684{
685 char ttyname[100];
686 char *p, *p2;
687
cad1498f
SG
688 while (target_stack->target_ops != &nindy_ops) /* What is this crap??? */
689 { /* remote tty not specified yet */
dd3b648e 690 if ( instream == stdin ){
199b2450
TL
691 printf_unfiltered("\nAttach /dev/ttyNN -- specify NN, or \"quit\" to quit: ");
692 gdb_flush( gdb_stdout );
dd3b648e
RP
693 }
694 fgets( ttyname, sizeof(ttyname)-1, stdin );
695
696 /* Strip leading and trailing whitespace */
697 for ( p = ttyname; isspace(*p); p++ ){
698 ;
699 }
700 if ( *p == '\0' ){
701 return; /* User just hit spaces or return, wants out */
702 }
703 for ( p2= p; !isspace(*p2) && (*p2 != '\0'); p2++ ){
704 ;
705 }
706 *p2= '\0';
2e4964ad 707 if ( STREQ("quit",p) ){
dd3b648e
RP
708 exit(1);
709 }
710
9748446f
JK
711 if (catch_errors (nindy_open_stub, p, "", RETURN_MASK_ALL))
712 {
713 /* Now that we have a tty open for talking to the remote machine,
714 download the executable file if one was specified. */
715 if (exec_bfd)
716 {
717 catch_errors (load_stub, bfd_get_filename (exec_bfd), "",
718 RETURN_MASK_ALL);
719 }
720 }
dd3b648e
RP
721 }
722}
723\f
724/* Define the target subroutine names */
725
726struct target_ops nindy_ops = {
727 "nindy", "Remote serial target in i960 NINDY-specific protocol",
f2fc6e7a
JK
728 "Use a remote i960 system running NINDY connected by a serial line.\n\
729Specify the name of the device the serial line is connected to.\n\
730The speed (baud rate), whether to use the old NINDY protocol,\n\
731and whether to send a break on startup, are controlled by options\n\
732specified when you started GDB.",
dd3b648e 733 nindy_open, nindy_close,
58bcc08c
JG
734 0,
735 nindy_detach,
736 nindy_resume,
737 nindy_wait,
dd3b648e 738 nindy_fetch_registers, nindy_store_registers,
a03d4f8e 739 nindy_prepare_to_store,
dd3b648e
RP
740 nindy_xfer_inferior_memory, nindy_files_info,
741 0, 0, /* insert_breakpoint, remove_breakpoint, */
742 0, 0, 0, 0, 0, /* Terminal crud */
743 nindy_kill,
6b27ebe8 744 generic_load,
dd3b648e
RP
745 0, /* lookup_symbol */
746 nindy_create_inferior,
747 nindy_mourn_inferior,
0256270d
KR
748 0, /* can_run */
749 0, /* notice_signals */
78b459a7 750 0, /* to_stop */
dd3b648e
RP
751 process_stratum, 0, /* next */
752 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */
8f1f2a72 753 0, 0, /* Section pointers */
dd3b648e
RP
754 OPS_MAGIC, /* Always the last thing */
755};
756
757void
758_initialize_nindy ()
759{
760 add_target (&nindy_ops);
761 add_com ("reset", class_obscure, reset_command,
762 "Send a 'break' to the remote target system.\n\
763Only useful if the target has been equipped with a circuit\n\
764to perform a hard reset when a break is detected.");
765}
This page took 0.219279 seconds and 4 git commands to generate.