X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote-es.c;h=0da26accc6a04908f77ce48cf620141aa7fe5d92;hb=c20c1bdf992a90db69c4abb73594b2ff58154ef6;hp=1c442d5831c0136a6aa70917c40b669df0bc6ac8;hpb=91c87211d6ecd30611e8488ca812f32f404ea0d5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-es.c b/gdb/remote-es.c index 1c442d5831..0da26accc6 100644 --- a/gdb/remote-es.c +++ b/gdb/remote-es.c @@ -104,19 +104,10 @@ STP #include "inferior.h" #include "target.h" #include "wait.h" -#include "terminal.h" #include "command.h" - -#ifdef USG -#include -#include -#endif - -#include - -/* External variables referenced. */ - -extern bfd *exec_bfd; +#include "remote-utils.h" +#include "gdbcore.h" +#include "serial.h" /* Prototypes for local functions */ @@ -157,11 +148,9 @@ es1800_xfer_inferior_memory PARAMS ((CORE_ADDR, char *, int, int, static void es1800_prepare_to_store PARAMS ((void)); -static int -es1800_wait PARAMS ((WAITTYPE *)); +static int es1800_wait PARAMS ((int, struct target_waitstatus *)); -static void -es1800_resume PARAMS ((int, int)); +static void es1800_resume PARAMS ((int, int, enum target_signal)); static void es1800_detach PARAMS ((char *, int)); @@ -251,6 +240,7 @@ es1800_init_break PARAMS ((char *, int)); /* Local variables */ +/* FIXME: Convert this to use "set remotedebug" instead. */ #define LOG_FILE "es1800.log" #if defined (LOG_FILE) static FILE *log_file; @@ -262,7 +252,7 @@ extern struct target_ops es1800_child_ops; /* Forward decl */ static int kiodebug; static int timeout = 100; static char *savename; /* Name of i/o device used */ -static TERMINAL es1800_sg_save; /* Save stty state */ +static serial_ttystate es1800_saved_ttystate; static int es1800_fc_save; /* Save fcntl state */ /* indicates that the emulator uses 32-bit data-adress (68020-mode) @@ -273,11 +263,11 @@ static int m68020; #define MODE (m68020 ? "M68020" : "M68000" ) #define ES1800_BREAK_VEC (0xf) -/* Descriptor for I/O to remote machine. Initialize it to -1 so that +/* Descriptor for I/O to remote machine. Initialize it to NULL so that es1800_open knows that we don't have a file open when the program starts. */ -static int es1800_desc = -1; +static serial_t es1800_desc = NULL; #define PBUFSIZ 1000 #define HDRLEN sizeof("@.BAAAAAAAA=$VV\r") @@ -329,24 +319,6 @@ es1800_reset (quit) } -/* Called when SIGALRM signal sent due to alarm() timeout. - Rely on global variables: timeout */ - -#ifndef HAVE_TERMIO - -static void -es1800_timer () -{ - if (kiodebug) - { - printf ("es1800_timer called\n"); - } - alarm (timeout); -} - -#endif /* HAVE_TERMIO */ - - /* Open a connection to a remote debugger and push the new target onto the stack. Check if the emulator is responding and find out what kind of processor the emulator is connected to. @@ -360,11 +332,9 @@ es1800_open (name, from_tty) char *name; int from_tty; { - TERMINAL sg; char buf[PBUFSIZ]; char *p; int i, fcflag; - char *baudrate; m68020 = 0; @@ -372,7 +342,6 @@ es1800_open (name, from_tty) { error_no_arg ("serial port device name"); } - baudrate = baud_rate ? baud_rate : "19200"; /* default baudrate = 19200 */ target_preopen (from_tty); es1800_close (0); @@ -381,47 +350,42 @@ es1800_open (name, from_tty) #ifndef DEBUG_STDIN - es1800_desc = open (name, O_RDWR); - if (es1800_desc < 0) + es1800_desc = SERIAL_OPEN (name); + if (es1800_desc == NULL) { perror_with_name (name); } savename = savestring (name, strlen (name)); - if (ioctl (es1800_desc, TIOCGETP, &sg) == -1) - { - perror_with_name (name); - } - es1800_sg_save = sg; + es1800_saved_ttystate = SERIAL_GET_TTY_STATE (es1800_desc); - if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1) + if ((fcflag = fcntl (es1800_desc->fd, F_GETFL, 0)) == -1) { perror_with_name ("fcntl serial"); } es1800_fc_save = fcflag; fcflag = (fcflag & (FREAD | FWRITE)); /* mask out any funny stuff */ - if (fcntl (es1800_desc, F_SETFL, fcflag) == -1) + if (fcntl (es1800_desc->fd, F_SETFL, fcflag) == -1) { perror_with_name ("fcntl serial"); } -#ifdef HAVE_TERMIO - sg.c_cc[VMIN] = 0; /* read with timeout. */ - sg.c_cc[VTIME] = timeout * 10; - sg.c_lflag &= ~(ICANON | ECHO); - sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate); -#else - sg.sg_ispeed = damn_b (baudrate); - sg.sg_ospeed = damn_b (baudrate); - sg.sg_flags = CBREAK+TANDEM; -#endif - - if ((ioctl (es1800_desc, TIOCSETP, &sg)) == -1) + if (baud_rate != -1) { - perror ("es1800_open: error in ioctl"); + if (SERIAL_SETBAUDRATE (es1800_desc, baud_rate)) + { + SERIAL_CLOSE (es1800_desc); + perror_with_name (name); + } } + SERIAL_RAW (es1800_desc); + + /* If there is something sitting in the buffer we might take it as a + response to a command, which would be bad. */ + SERIAL_FLUSH_INPUT (es1800_desc); + #endif /* DEBUG_STDIN */ push_target (&es1800_ops); /* Switch to using remote target now */ @@ -430,30 +394,6 @@ es1800_open (name, from_tty) printf ("Remote ES1800 debugging using %s\n", name); } -#ifndef HAVE_TERMIO - -#ifndef NO_SIGINTERRUPT - - /* Cause SIGALRM's to make reads fail with EINTR instead of resuming - the read. */ - - if (siginterrupt (SIGALRM, 1) != 0) - { - perror ("es1800_open: error in siginterrupt"); - } - -#endif /* NO_SIGINTERRUPT */ - - /* Set up read timeout timer. */ - - if ((void(*)()) signal (SIGALRM, es1800_timer) == (void(*)()) -1) - { - perror ("es1800_open: error in signal"); - } - -#endif /* HAVE_TERMIO */ - - #if defined (LOG_FILE) log_file = fopen (LOG_FILE, "w"); @@ -516,13 +456,14 @@ static void es1800_close (quitting) int quitting; { - if (es1800_desc >= 0) + if (es1800_desc != NULL) { printf ("\nClosing connection to emulator...\n"); - ioctl (es1800_desc, TIOCSETP, &es1800_sg_save); - fcntl (es1800_desc,F_SETFL, es1800_fc_save); - close (es1800_desc); - es1800_desc = -1; + if (SERIAL_SET_TTY_STATE (es1800_desc, es1800_saved_ttystate) < 0) + print_sys_errmsg ("warning: unable to restore tty state", errno); + fcntl (es1800_desc->fd, F_SETFL, es1800_fc_save); + SERIAL_CLOSE (es1800_desc); + es1800_desc = NULL; } if (savename != NULL) { @@ -549,61 +490,6 @@ es1800_close (quitting) } -/* damn_b() - - Translate baud rates from integers to damn B_codes. Unix should - have outgrown this crap years ago, but even POSIX wouldn't buck it. - rate - the baudrate given as a string - return value: the baudrate as a B_code */ - -#ifndef B19200 -# define B19200 EXTA -#endif -#ifndef B38400 -# define B38400 EXTB -#endif - -struct -{ - char *rate, - damn_b; -} baudtab[] = { - {"0", B0}, - {"50", B50}, - {"75", B75}, - {"110", B110}, - {"134", B134}, - {"150", B150}, - {"200", B200}, - {"300", B300}, - {"600", B600}, - {"1200", B1200}, - {"1800", B1800}, - {"2400", B2400}, - {"4800", B4800}, - {"9600", B9600}, - {"19200", B19200}, - {"38400", B38400}, - {0, -1}, -}; - -static int -damn_b (rate) - char *rate; -{ - int i; - - for (i = 0; baudtab[i].rate != 0; i++) - { - if (STREQ (rate, baudtab[i].rate)) - { - return (baudtab[i].damn_b); - } - } - error ("Illegal baudrate"); -} - - /* Attaches to a process on the target side proc_id - the id of the process to be attached. from_tty - says whether to be verbose or not */ @@ -650,9 +536,10 @@ es1800_detach (args, from_tty) siggnal - the signal value to be given to the target (0 = no signal) */ static void -es1800_resume (step, siggnal) +es1800_resume (pid, step, siggnal) + int pid; int step; - int siggnal; + enum target_signal siggnal; { char buf[PBUFSIZ]; @@ -676,13 +563,16 @@ es1800_resume (step, siggnal) status - */ static int -es1800_wait (status) - WAITTYPE *status; +es1800_wait (pid, status) + int pid; + struct target_waitstatus *status; { unsigned char buf[PBUFSIZ]; int old_timeout = timeout; - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; + timeout = 0; /* Don't time out -- user program is running. */ if (!setjmp (interrupt)) { @@ -692,7 +582,8 @@ es1800_wait (status) getmessage (buf, sizeof(buf)); if (strncmp ( buf, "\r\n* BREAK *", 11) == 0) { - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; send_command ("STP"); /* Restore stack and PC and such */ if (m68020) { @@ -702,7 +593,8 @@ es1800_wait (status) } if (strncmp (buf, "STP\r\n ", 6) == 0) { - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; } if (buf[strlen (buf) - 2] == 'R') @@ -712,7 +604,8 @@ es1800_wait (status) else { printf ("Unexpected stop: \n%s\n", buf); - WSETSTOP ((*status), SIGQUIT); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_QUIT; break; } } @@ -726,7 +619,8 @@ es1800_wait (status) old_sigint = signal (SIGINT, es1800_request_quit); send_command ("STP"); printf (" emulator stopped\n"); - WSETSTOP ((*status), SIGINT); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_INT; } else { @@ -1388,7 +1282,7 @@ es1800_load (filename, from_tty) struct cleanup *old_chain; int es1800_load_format = 5; - if (es1800_desc < 0) + if (es1800_desc == NULL) { printf ("No emulator attached, type emulator-command first\n"); return; @@ -1428,7 +1322,7 @@ es1800_load (filename, from_tty) error ("Downloading format not defined\n"); } - mark_breakpoints_out (); + breakpoint_init_inferior (); inferior_pid = 0; if (from_tty) { @@ -1609,7 +1503,8 @@ es1800_create_inferior (execfile, args, env) /* trap_expected = 0; */ /* insert_step_breakpoint (); FIXME, do we need this? */ - proceed ((CORE_ADDR) entry_pt, -1, 0); /* Let 'er rip... */ + /* Let 'er rip... */ + proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0); } @@ -1709,38 +1604,23 @@ readchar () static int readchar () { - char buf[1]; - - buf[0] = '\0'; - -#ifdef HAVE_TERMIO + int ch; - /* termio does the timeout for us. */ - read (es1800_desc, buf, 1); + ch = SERIAL_READCHAR (es1800_desc, timeout); -#else - - alarm (timeout); - while (read (es1800_desc, buf, 1) != 1) - { - if (errno == EINTR) - { - error ("Timeout reading from remote system."); - } - else if (errno != EWOULDBLOCK) - { - perror_with_name ("remote read"); - } - } - alarm (0); -#endif + /* FIXME: doing an error() here will probably cause trouble, at least if from + es1800_wait. */ + if (ch == SERIAL_TIMEOUT) + error ("Timeout reading from remote system."); + else if (ch == SERIAL_ERROR) + perror_with_name ("remote read"); #if defined (LOG_FILE) - putc (buf[0] & 0x7f, log_file); + putc (ch & 0x7f, log_file); fflush (log_file); #endif - return (buf[0] & 0x7f); + return (ch); } #endif /* DEBUG_STDIN */ @@ -1758,7 +1638,7 @@ send_with_reply (string, buf, len) int len; { send (string); - write (es1800_desc, "\r", 1); + SERIAL_WRITE (es1800_desc, "\r", 1); #ifndef DEBUG_STDIN expect (string, 1); @@ -1778,7 +1658,7 @@ send_command (string) char *string; { send (string); - write (es1800_desc, "\r", 1); + SERIAL_WRITE (es1800_desc, "\r", 1); #ifndef DEBUG_STDIN expect (string, 0); @@ -1798,7 +1678,7 @@ send (string) { fprintf (stderr, "Sending: %s\n", string); } - write (es1800_desc, string, strlen (string)); + SERIAL_WRITE (es1800_desc, string, strlen (string)); } @@ -1899,6 +1779,11 @@ FILE *instream; /* Additional commands */ +#if defined (TIOCGETP) && defined (FNDELAY) && defined (EWOULDBLOCK) +#define PROVIDE_TRANSPARENT +#endif + +#ifdef PROVIDE_TRANSPARENT /* Talk directly to the emulator FIXME, uses busy wait, and is SUNOS (or at least BSD) specific */ @@ -1924,7 +1809,7 @@ es1800_transparent (args, from_tty) int i; dont_repeat (); - if (es1800_desc < 0) + if (es1800_desc == NULL) { printf ("No emulator attached, type emulator-command first\n"); return; @@ -1968,7 +1853,7 @@ es1800_transparent (args, from_tty) perror_with_name ("ioctl console"); } - if ((fcflag = fcntl (es1800_desc, F_GETFL, 0)) == -1) + if ((fcflag = fcntl (es1800_desc->fd, F_GETFL, 0)) == -1) { perror_with_name ("fcntl serial"); } @@ -1976,7 +1861,7 @@ es1800_transparent (args, from_tty) es1800_fc_save = fcflag; fcflag = fcflag | FNDELAY; - if (fcntl (es1800_desc, F_SETFL, fcflag) == -1) + if (fcntl (es1800_desc->fd, F_SETFL, fcflag) == -1) { perror_with_name ("fcntl serial"); } @@ -1994,9 +1879,9 @@ es1800_transparent (args, from_tty) { es1800_buf[es1800_cnt++] = inputbuf[i++]; } - if ((cc = write (es1800_desc, es1800_buf, es1800_cnt)) == -1) + if ((cc = SERIAL_WRITE (es1800_desc, es1800_buf, es1800_cnt)) == -1) { - perror_with_name ("FEL! read:"); + perror_with_name ("FEL! write:"); } es1800_cnt -= cc; if (es1800_cnt && cc) @@ -2012,7 +1897,7 @@ es1800_transparent (args, from_tty) perror_with_name ("FEL! read:"); } - cc = read (es1800_desc,inputbuf,inputcnt); + cc = read (es1800_desc->fd,inputbuf,inputcnt); if (cc != -1) { for (i = 0; i < cc; ) @@ -2051,7 +1936,7 @@ es1800_transparent (args, from_tty) close (console); - if (fcntl (es1800_desc, F_SETFL, es1800_fc_save) == -1) + if (fcntl (es1800_desc->fd, F_SETFL, es1800_fc_save) == -1) { perror_with_name ("FEL! fcntl"); } @@ -2059,6 +1944,7 @@ es1800_transparent (args, from_tty) printf ("\n"); } +#endif /* PROVIDE_TRANSPARENT */ static void es1800_init_break (args, from_tty) @@ -2248,15 +2134,15 @@ Specify the serial device it is connected to (e.g. /dev/ttya).", OPS_MAGIC /* to_magic (always last) */ }; -/* _initialize_es1800 () */ - void _initialize_es1800 () { add_target (&es1800_ops); add_target (&es1800_child_ops); +#ifdef PROVIDE_TRANSPARENT add_com ("transparent", class_support, es1800_transparent, "Start transparent communication with the ES 1800 emulator."); +#endif /* PROVIDE_TRANSPARENT */ add_com ("init_break", class_support, es1800_init_break, "Download break routine and initialize break facility on ES 1800"); }