From 3a479851ff70446bd7ef968ee5ffabc0aa61a73e Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Sat, 29 Jan 1994 19:07:02 +0000 Subject: [PATCH] * serial.h (SERIAL_SET_TTY_STATE): Comment return value. * remote-es.c: Extensive changes to update to current conventions. --- gdb/ChangeLog | 4 +- gdb/remote-es.c | 246 ++++++++++++------------------------------------ gdb/serial.h | 4 +- 3 files changed, 64 insertions(+), 190 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6bd31f92278..b885102e49b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,7 @@ Sat Jan 29 07:44:59 1994 Jim Kingdon (kingdon@deneb.cygnus.com) + * serial.h (SERIAL_SET_TTY_STATE): Comment return value. + * Makefile.in (TAGS): Just echo one line, rather than the whole thing. * Makefile.in: Remove all references to sparcly-nat.c. @@ -13,7 +15,7 @@ Sat Jan 29 07:44:59 1994 Jim Kingdon (kingdon@deneb.cygnus.com) * config/m68k/monitor.mt (TDEPFILE): Add remote-es.o. * config/m68k/es1800.mt: Add comment. - * remote-es.c: Comment out entire file until it can be fixed. + * remote-es.c: Extensive changes to update to current conventions. * ser-unix.c (wait_for, hardwire_readchar) [HAVE_TERMIO, HAVE_TERMIOS]: If the timeout is too big to fit in c_cc[VTIME], then do multiple reads diff --git a/gdb/remote-es.c b/gdb/remote-es.c index 8f4e01b85f7..d8f3da1faf4 100644 --- a/gdb/remote-es.c +++ b/gdb/remote-es.c @@ -90,10 +90,6 @@ STP */ -#if 0 -/* Comment out entire file until it can be fixed (need to clean up - TERMINAL, etc.). */ - #include #include #include @@ -108,20 +104,10 @@ STP #include "inferior.h" #include "target.h" #include "wait.h" -#include "terminal.h" #include "command.h" #include "remote-utils.h" - -#ifdef USG -#include -#include -#endif - -#include - -/* External variables referenced. */ - -extern bfd *exec_bfd; +#include "gdbcore.h" +#include "serial.h" /* Prototypes for local functions */ @@ -162,8 +148,7 @@ 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, enum target_signal)); @@ -255,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; @@ -266,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) @@ -277,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") @@ -333,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. @@ -364,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[1024]; m68020 = 0; @@ -376,7 +342,6 @@ es1800_open (name, from_tty) { error_no_arg ("serial port device name"); } - sprintf(baudrate, "%d", sr_get_baud_rate()); target_preopen (from_tty); es1800_close (0); @@ -385,47 +350,39 @@ 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 (SERIAL_SETBAUDRATE (es1800_desc, baud_rate)) { - perror ("es1800_open: error in ioctl"); + 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 */ @@ -434,30 +391,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"); @@ -520,13 +453,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) { @@ -553,61 +487,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 */ @@ -681,7 +560,8 @@ es1800_resume (pid, step, siggnal) status - */ static int -es1800_wait (status) +es1800_wait (pid, status) + int pid; struct target_waitstatus *status; { unsigned char buf[PBUFSIZ]; @@ -1399,7 +1279,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; @@ -1721,38 +1601,23 @@ readchar () static int readchar () { - char buf[1]; + int ch; - buf[0] = '\0'; + ch = SERIAL_READCHAR (es1800_desc, timeout); -#ifdef HAVE_TERMIO - - /* termio does the timeout for us. */ - read (es1800_desc, buf, 1); - -#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 */ @@ -1770,7 +1635,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); @@ -1790,7 +1655,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); @@ -1810,7 +1675,7 @@ send (string) { fprintf (stderr, "Sending: %s\n", string); } - write (es1800_desc, string, strlen (string)); + SERIAL_WRITE (es1800_desc, string, strlen (string)); } @@ -1911,6 +1776,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 */ @@ -1936,7 +1806,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; @@ -1980,7 +1850,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"); } @@ -1988,7 +1858,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"); } @@ -2006,9 +1876,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) @@ -2024,7 +1894,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; ) @@ -2063,7 +1933,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"); } @@ -2071,6 +1941,7 @@ es1800_transparent (args, from_tty) printf ("\n"); } +#endif /* PROVIDE_TRANSPARENT */ static void es1800_init_break (args, from_tty) @@ -2259,17 +2130,16 @@ Specify the serial device it is connected to (e.g. /dev/ttya).", NULL, /* to_sections_end */ OPS_MAGIC /* to_magic (always last) */ }; -#endif /* 0 */ void _initialize_es1800 () { -#if 0 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"); -#endif } diff --git a/gdb/serial.h b/gdb/serial.h index ed8b33ae6dc..9e669cbb2bb 100644 --- a/gdb/serial.h +++ b/gdb/serial.h @@ -105,7 +105,9 @@ serial_t serial_fdopen PARAMS ((const int fd)); #define SERIAL_GET_TTY_STATE(SERIAL_T) (SERIAL_T)->ops->get_tty_state((SERIAL_T)) /* Set the state of the tty to TTYSTATE. The change is immediate. - When changing to or from raw mode, input might be discarded. */ + When changing to or from raw mode, input might be discarded. + Returns 0 for success, negative value for error (in which case errno + contains the error). */ #define SERIAL_SET_TTY_STATE(SERIAL_T, TTYSTATE) (SERIAL_T)->ops->set_tty_state((SERIAL_T), (TTYSTATE)) /* printf_filtered a user-comprehensible description of ttystate. */