X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fser-go32.c;h=a1a8f29c7124799f23bc3e21f8f63d07dbfff0e8;hb=421d1616230a78449dc2f5abb60f03d38b96c3cf;hp=73f69c5ec4f3ac16ac0027b80c33271ec421f996;hpb=70976b65519d4f91bb0345335d7419f2f69eec8c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ser-go32.c b/gdb/ser-go32.c index 73f69c5ec4..a1a8f29c71 100644 --- a/gdb/ser-go32.c +++ b/gdb/ser-go32.c @@ -1,6 +1,5 @@ /* Remote serial interface for local (hardwired) serial ports for GO32. - Copyright (C) 1992-1993, 2000-2001, 2007-2012 Free Software - Foundation, Inc. + Copyright (C) 1992-2020 Free Software Foundation, Inc. Contributed by Nigel Stephens, Algorithmics Ltd. (nigel@algor.co.uk). @@ -25,9 +24,6 @@ #include "defs.h" #include "gdbcmd.h" #include "serial.h" -#include "gdb_string.h" - - /* * NS16550 UART registers */ @@ -149,7 +145,7 @@ typedef unsigned long u_long; #define NCNT 20 static int intrcnt; -static int cnts[NCNT]; +static size_t cnts[NCNT]; static char *cntnames[NCNT] = { /* h/w interrupt counts. */ @@ -231,7 +227,7 @@ static int dos_open (struct serial *scb, const char *name); static void dos_raw (struct serial *scb); static int dos_readchar (struct serial *scb, int timeout); static int dos_setbaudrate (struct serial *scb, int rate); -static int dos_write (struct serial *scb, const char *str, int len); +static int dos_write (struct serial *scb, const void *buf, size_t count); static void dos_close (struct serial *scb); static serial_ttystate dos_get_tty_state (struct serial *scb); static int dos_set_tty_state (struct serial *scb, serial_ttystate state); @@ -597,9 +593,26 @@ dos_close (struct serial *scb) } +/* Implementation of the serial_ops flush_output method. */ static int -dos_noop (struct serial *scb) +dos_flush_output (struct serial *scb) +{ + return 0; +} + +/* Implementation of the serial_ops setparity method. */ + +static int +dos_setparity (struct serial *scb, int parity) +{ + return 0; +} + +/* Implementation of the serial_ops drain_output method. */ + +static int +dos_drain_output (struct serial *scb) { return 0; } @@ -620,6 +633,8 @@ dos_readchar (struct serial *scb, int timeout) then = rawclock () + (timeout * RAWHZ); while ((c = dos_getc (port)) < 0) { + QUIT; + if (timeout >= 0 && (rawclock () - then) >= 0) return SERIAL_TIMEOUT; } @@ -640,14 +655,14 @@ dos_get_tty_state (struct serial *scb) /* We've never heard about this port. We should fail this call, unless they are asking about one of the 3 standard handles, in which case we pretend the handle was open by us if it is - connected to a terminal device. This is beacuse Unix + connected to a terminal device. This is because Unix terminals use the serial interface, so GDB expects the standard handles to go through here. */ if (scb->fd >= 3 || !isatty (scb->fd)) return NULL; } - state = (struct dos_ttystate *) xmalloc (sizeof *state); + state = XNEW (struct dos_ttystate); *state = *port; return (serial_ttystate) state; } @@ -657,7 +672,7 @@ dos_copy_tty_state (struct serial *scb, serial_ttystate ttystate) { struct dos_ttystate *state; - state = (struct dos_ttystate *) xmalloc (sizeof *state); + state = XNEW (struct dos_ttystate); *state = *(struct dos_ttystate *) ttystate; return (serial_ttystate) state; @@ -673,17 +688,6 @@ dos_set_tty_state (struct serial *scb, serial_ttystate ttystate) return 0; } -static int -dos_noflush_set_tty_state (struct serial *scb, serial_ttystate new_ttystate, - serial_ttystate old_ttystate) -{ - struct dos_ttystate *state; - - state = (struct dos_ttystate *) new_ttystate; - dos_setbaudrate (scb, state->baudrate); - return 0; -} - static int dos_flush_input (struct serial *scb) { @@ -788,26 +792,29 @@ dos_setstopbits (struct serial *scb, int num) } static int -dos_write (struct serial *scb, const char *str, int len) +dos_write (struct serial *scb, const void *buf, size_t count) { volatile struct dos_ttystate *port = &ports[scb->fd]; - int fifosize = port->fifo ? 16 : 1; + size_t fifosize = port->fifo ? 16 : 1; long then; - int cnt; + size_t cnt; + const char *str = (const char *) buf; - while (len > 0) + while (count > 0) { + QUIT; + /* Send the data, fifosize bytes at a time. */ - cnt = fifosize > len ? len : fifosize; + cnt = fifosize > count ? count : fifosize; port->txbusy = 1; /* Francisco Pastor says OUTSB messes up the communications with UARTs with FIFOs. */ #ifdef UART_FIFO_WORKS outportsb (port->base + com_data, str, cnt); str += cnt; - len -= cnt; + count -= cnt; #else - for ( ; cnt > 0; cnt--, len--) + for ( ; cnt > 0; cnt--, count--) outportb (port->base + com_data, *str++); #endif #ifdef DOS_STATS @@ -848,16 +855,15 @@ dos_sendbreak (struct serial *scb) } -static struct serial_ops dos_ops = +static const struct serial_ops dos_ops = { "hardwire", - 0, dos_open, dos_close, NULL, /* fdopen, not implemented */ dos_readchar, dos_write, - dos_noop, /* flush output */ + dos_flush_output, dos_flush_input, dos_sendbreak, dos_raw, @@ -865,10 +871,10 @@ static struct serial_ops dos_ops = dos_copy_tty_state, dos_set_tty_state, dos_print_tty_state, - dos_noflush_set_tty_state, dos_setbaudrate, dos_setstopbits, - dos_noop, /* Wait for output to drain. */ + dos_setparity, + dos_drain_output, (void (*)(struct serial *, int))NULL /* Change into async mode. */ }; @@ -881,7 +887,7 @@ gdb_pipe (int pdes[2]) } static void -dos_info (char *arg, int from_tty) +info_serial_command (const char *arg, int from_tty) { struct dos_ttystate *port; #ifdef DOS_STATS @@ -905,13 +911,10 @@ dos_info (char *arg, int from_tty) printf_filtered ("\nTotal interrupts: %d\n", intrcnt); for (i = 0; i < NCNT; i++) if (cnts[i]) - printf_filtered ("%s:\t%d\n", cntnames[i], cnts[i]); + printf_filtered ("%s:\t%lu\n", cntnames[i], (unsigned long) cnts[i]); #endif } -/* -Wmissing-prototypes */ -extern initialize_file_ftype _initialize_ser_dos; - void _initialize_ser_dos (void) { @@ -981,6 +984,6 @@ Show COM4 interrupt request."), NULL, NULL, /* FIXME: i18n: */ &setlist, &showlist); - add_info ("serial", dos_info, + add_info ("serial", info_serial_command, _("Print DOS serial port status.")); }