2003-06-08 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / ser-go32.c
index f776161964aac50c4d630107ad0885db7ee9ed99..cea01cdf2214425dcbec5902c7708258f264c279 100644 (file)
@@ -1,12 +1,12 @@
-/* Remote serial interface for local (hardwired) serial ports for
-   GO32.  Copyright 1992, 1993 Free Software Foundation, Inc.
+/* Remote serial interface for local (hardwired) serial ports for GO32.
+   Copyright 1992, 1993, 2000, 2001 Free Software Foundation, Inc.
 
    Contributed by Nigel Stephens, Algorithmics Ltd. (nigel@algor.co.uk).
 
-   This version uses DPMI interrupts to handle buffered i/o 
+   This version uses DPMI interrupts to handle buffered i/o
    without the separate "asynctsr" program.
 
-   This file is part of GDB.  
+   This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "gdbcmd.h"
 #include "serial.h"
+#include "gdb_string.h"
 
 
 /*
 #define        MSR_DDSR        0x02
 #define        MSR_DCTS        0x01
 
-#include <sys/dos.h>
-#include <sys/go32.h>
-#include <sys/dpmi.h>
-
-/* DPMI Communication */
-static union REGS dpmi_regs;
-static struct SREGS dpmi_sregs;
+#include <time.h>
+#include <dos.h>
+#include <go32.h>
+#include <dpmi.h>
+typedef unsigned long u_long;
 
 /* 16550 rx fifo trigger point */
 #define FIFO_TRIGGER   FIFO_TRIGGER_4
@@ -140,9 +140,6 @@ static struct SREGS dpmi_sregs;
 /* input buffer size */
 #define CBSIZE 4096
 
-/* return raw 18Hz clock count */
-extern long rawclock (void);
-
 #define RAWHZ  18
 
 #ifdef DOS_STATS
@@ -152,21 +149,22 @@ extern long rawclock (void);
 #define CNT_ORUN       19
 #define NCNT           20
 
-static int     intrcnt;
-static int     cnts[NCNT];
-static char    *cntnames[NCNT] = {
+static int intrcnt;
+static int cnts[NCNT];
+static char *cntnames[NCNT] =
+{
   /* h/w interrupt counts. */
-  "mlsc",      "nopend",       "txrdy",        "?3",
-  "rxrdy",     "?5",           "rls",          "?7", 
-  "?8",        "?9",           "?a",           "?b", 
-  "rxtout",    "?d",           "?e",           "?f", 
+  "mlsc", "nopend", "txrdy", "?3",
+  "rxrdy", "?5", "rls", "?7",
+  "?8", "?9", "?a", "?b",
+  "rxtout", "?d", "?e", "?f",
   /* s/w counts. */
-  "rxcnt",     "txcnt",        "stray",        "swoflo"
+  "rxcnt", "txcnt", "stray", "swoflo"
 };
 
 #define COUNT(x) cnts[x]++
 #else
-#define COUNT(x) 
+#define COUNT(x)
 #endif
 
 /* Main interrupt controller port addresses. */
@@ -175,56 +173,70 @@ static char       *cntnames[NCNT] = {
 #define ICU_MASK       (ICU_BASE + 1)
 
 /* Original interrupt controller mask register. */
-unsigned char  icu_oldmask;
+unsigned char icu_oldmask;
 
 /* Maximum of 8 interrupts (we don't handle the slave icu yet). */
 #define NINTR  8
 
 static struct intrupt
-{  
-  char                 inuse;
-  struct dos_ttystate  *port;
-  _go32_dpmi_seginfo   old_rmhandler;
-  _go32_dpmi_seginfo   old_pmhandler;
-  _go32_dpmi_seginfo   new_rmhandler;
-  _go32_dpmi_seginfo   new_pmhandler;
-  _go32_dpmi_registers regs;
-} intrupts[NINTR];
+  {
+    char inuse;
+    struct dos_ttystate *port;
+    _go32_dpmi_seginfo old_rmhandler;
+    _go32_dpmi_seginfo old_pmhandler;
+    _go32_dpmi_seginfo new_rmhandler;
+    _go32_dpmi_seginfo new_pmhandler;
+    _go32_dpmi_registers regs;
+  }
+intrupts[NINTR];
 
 
 static struct dos_ttystate
+  {
+    int base;
+    int irq;
+    int refcnt;
+    struct intrupt *intrupt;
+    int fifo;
+    int baudrate;
+    unsigned char cbuf[CBSIZE];
+    unsigned int first;
+    unsigned int count;
+    int txbusy;
+    unsigned char old_mcr;
+    int ferr;
+    int perr;
+    int oflo;
+    int msr;
+  }
+ports[4] =
 {
-  int          base;
-  int          irq;
-  int          refcnt;
-  struct intrupt *intrupt;
-  int          fifo;
-  int          baudrate;
-  unsigned char        cbuf[CBSIZE];
-  unsigned int first;
-  unsigned int count;
-  int          txbusy;
-  unsigned char        old_mcr;
-  int          ferr;
-  int          perr;
-  int          oflo;
-  int          msr;
-} ports[4] = {
-  {COM1ADDR, 4}, 
-  {COM2ADDR, 3}, 
-  {COM3ADDR, 4}, 
-  {COM4ADDR, 3}
+  {
+    COM1ADDR, 4, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
+  }
+  ,
+  {
+    COM2ADDR, 3, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
+  }
+  ,
+  {
+    COM3ADDR, 4, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
+  }
+  ,
+  {
+    COM4ADDR, 3, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
+  }
 };
 
-static int dos_open PARAMS ((serial_t scb, const char *name));
-static void dos_raw PARAMS ((serial_t scb));
-static int dos_readchar PARAMS ((serial_t scb, int timeout));
-static int dos_setbaudrate PARAMS ((serial_t scb, int rate));
-static int dos_write PARAMS ((serial_t scb, const char *str, int len));
-static void dos_close PARAMS ((serial_t scb));
-static serial_ttystate dos_get_tty_state PARAMS ((serial_t scb));
-static int dos_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
-static int dos_baudconv PARAMS ((int rate));
+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 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);
+static int dos_baudconv (int rate);
 
 #define inb(p,a)       inportb((p)->base + (a))
 #define outb(p,a,v)    outportb((p)->base + (a), (v))
@@ -233,40 +245,36 @@ static int dos_baudconv PARAMS ((int rate));
 
 
 static int
-dos_getc (port)
-     volatile struct dos_ttystate *port;
+dos_getc (volatile struct dos_ttystate *port)
 {
-    int c;
+  int c;
 
-    if (port->count == 0)
-      return -1;
+  if (port->count == 0)
+    return -1;
 
-    c = port->cbuf[port->first];
-    disable ();
-    port->first = (port->first + 1) & (CBSIZE - 1);
-    port->count--;
-    enable ();
-    return c;
+  c = port->cbuf[port->first];
+  disable ();
+  port->first = (port->first + 1) & (CBSIZE - 1);
+  port->count--;
+  enable ();
+  return c;
 }
-    
 
-static int 
-dos_putc (c, port)
-     int c;
-     struct dos_ttystate *port;
+
+static int
+dos_putc (int c, struct dos_ttystate *port)
 {
-    if (port->count >= CBSIZE - 1)
-       return -1;
-    port->cbuf[(port->first + port->count) & (CBSIZE - 1)] = c;
-    port->count++;
-    return 0;
+  if (port->count >= CBSIZE - 1)
+    return -1;
+  port->cbuf[(port->first + port->count) & (CBSIZE - 1)] = c;
+  port->count++;
+  return 0;
 }
-
 \f
 
+
 static void
-dos_comisr (irq)
-     int irq;
+dos_comisr (int irq)
 {
   struct dos_ttystate *port;
   unsigned char iir, lsr, c;
@@ -278,28 +286,28 @@ dos_comisr (irq)
 #endif
 
   port = intrupts[irq].port;
-  if (!port) 
+  if (!port)
     {
       COUNT (CNT_STRAY);
-      return;          /* not open */
+      return;                  /* not open */
     }
 
   while (1)
     {
       iir = inb (port, com_iir) & IIR_IMASK;
-      switch (iir) 
+      switch (iir)
        {
-         
+
        case IIR_RLS:
          lsr = inb (port, com_lsr);
          goto rx;
-         
+
        case IIR_RXTOUT:
        case IIR_RXRDY:
          lsr = 0;
-         
-      rx:
-         do 
+
+       rx:
+         do
            {
              c = inb (port, com_data);
              if (lsr & (LSR_BI | LSR_FE | LSR_PE | LSR_OE))
@@ -323,12 +331,12 @@ dos_comisr (irq)
            }
          while ((lsr = inb (port, com_lsr)) & LSR_RXRDY);
          break;
-         
+
        case IIR_MLSC:
          /* could be used to flowcontrol Tx */
          port->msr = inb (port, com_msr);
          break;
-         
+
        case IIR_TXRDY:
          port->txbusy = 0;
          break;
@@ -342,31 +350,27 @@ dos_comisr (irq)
          break;
        }
       COUNT (iir);
-    } 
+    }
 }
 
-#ifdef __STDC__
 #define ISRNAME(x) dos_comisr##x
-#else
-#define ISRNAME(x) dos_comisr/**/x
-#endif
-#define ISR(x) static void ISRNAME(x)() {dos_comisr(x);}
-
-ISR(0) ISR(1) ISR(2) ISR(3)
-ISR(4) ISR(5) ISR(6) ISR(7)
+#define ISR(x) static void ISRNAME(x)(void) {dos_comisr(x);}
 
-typedef void (*isr_t)();
+ISR (0) ISR (1) ISR (2) ISR (3) /* OK */
+ISR (4) ISR (5) ISR (6) ISR (7) /* OK */
 
-static isr_t isrs[NINTR] = {
-  ISRNAME(0), ISRNAME(1), ISRNAME(2), ISRNAME(3),
-  ISRNAME(4), ISRNAME(5), ISRNAME(6), ISRNAME(7)
-};
+typedef void (*isr_t) (void);
 
+static isr_t isrs[NINTR] =
+  {
+       ISRNAME (0), ISRNAME (1), ISRNAME (2), ISRNAME (3),
+       ISRNAME (4), ISRNAME (5), ISRNAME (6), ISRNAME (7)
+  };
 \f
 
+
 static struct intrupt *
-dos_hookirq (irq)
-     unsigned int irq;
+dos_hookirq (unsigned int irq)
 {
   struct intrupt *intr;
   unsigned int vec;
@@ -378,15 +382,15 @@ dos_hookirq (irq)
   intr = &intrupts[irq];
   if (intr->inuse)
     return 0;
-  
+
   vec = 0x08 + irq;
   isr = isrs[irq];
 
   /* setup real mode handler */
   _go32_dpmi_get_real_mode_interrupt_vector (vec, &intr->old_rmhandler);
 
-  intr->new_rmhandler.pm_selector = _go32_my_cs();
-  intr->new_rmhandler.pm_offset = (u_long)isr;
+  intr->new_rmhandler.pm_selector = _go32_my_cs ();
+  intr->new_rmhandler.pm_offset = (u_long) isr;
   if (_go32_dpmi_allocate_real_mode_callback_iret (&intr->new_rmhandler,
                                                   &intr->regs))
     {
@@ -397,15 +401,16 @@ dos_hookirq (irq)
     {
       return 0;
     }
-      
+
   /* setup protected mode handler */
-  _go32_dpmi_get_protected_mode_interrupt_vector(vec, &intr->old_pmhandler);
+  _go32_dpmi_get_protected_mode_interrupt_vector (vec, &intr->old_pmhandler);
 
-  intr->new_pmhandler.pm_selector = _go32_my_cs();
-  intr->new_pmhandler.pm_offset = (u_long)isr;
+  intr->new_pmhandler.pm_selector = _go32_my_cs ();
+  intr->new_pmhandler.pm_offset = (u_long) isr;
   _go32_dpmi_allocate_iret_wrapper (&intr->new_pmhandler);
 
-  if (_go32_dpmi_set_protected_mode_interrupt_vector(vec, &intr->new_pmhandler))
+  if (_go32_dpmi_set_protected_mode_interrupt_vector (vec,
+                                                     &intr->new_pmhandler))
     {
       return 0;
     }
@@ -421,8 +426,7 @@ dos_hookirq (irq)
 
 
 static void
-dos_unhookirq (intr)
-     struct intrupt *intr;
+dos_unhookirq (struct intrupt *intr)
 {
   unsigned int irq, vec;
   unsigned char mask;
@@ -439,19 +443,17 @@ dos_unhookirq (intr)
   /* remove real mode handler */
   _go32_dpmi_set_real_mode_interrupt_vector (vec, &intr->old_rmhandler);
   _go32_dpmi_free_real_mode_callback (&intr->new_rmhandler);
-      
+
   /* remove protected mode handler */
   _go32_dpmi_set_protected_mode_interrupt_vector (vec, &intr->old_pmhandler);
   _go32_dpmi_free_iret_wrapper (&intr->new_pmhandler);
   intr->inuse = 0;
 }
-
 \f
 
+
 static int
-dos_open (scb, name)
-     serial_t scb;
-     const char *name;
+dos_open (struct serial *scb, const char *name)
 {
   struct dos_ttystate *port;
   int fd, i;
@@ -473,6 +475,10 @@ dos_open (scb, name)
       return -1;
     }
 
+  /* FIXME: this is a Bad Idea (tm)!  One should *never* invent file
+     handles, since they might be already used by other files/devices.
+     The Right Way to do this is to create a real handle by dup()'ing
+     some existing one.  */
   fd = name[3] - '1';
   port = &ports[fd];
   if (port->refcnt++ > 0)
@@ -483,38 +489,40 @@ dos_open (scb, name)
     }
 
   /* force access to ID reg */
-  outb(port, com_cfcr, 0);
-  outb(port, com_iir, 0);
-  for (i = 0; i < 17; i++) {
-    if ((inb(port, com_iir) & 0x38) == 0)
-      goto ok;
-    (void) inb(port, com_data); /* clear recv */
-  }
+  outb (port, com_cfcr, 0);
+  outb (port, com_iir, 0);
+  for (i = 0; i < 17; i++)
+    {
+      if ((inb (port, com_iir) & 0x38) == 0)
+       goto ok;
+      (void) inb (port, com_data);     /* clear recv */
+    }
   errno = ENODEV;
   return -1;
 
 ok:
   /* disable all interrupts in chip */
-  outb(port, com_ier, 0);
+  outb (port, com_ier, 0);
 
   /* tentatively enable 16550 fifo, and see if it responds */
-  outb(port, com_fifo, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER);
-  sleep(1);
-  port->fifo = ((inb(port, com_iir) & IIR_FIFO_MASK) == IIR_FIFO_MASK);
+  outb (port, com_fifo,
+       FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | FIFO_TRIGGER);
+  sleep (1);
+  port->fifo = ((inb (port, com_iir) & IIR_FIFO_MASK) == IIR_FIFO_MASK);
 
   /* clear pending status reports. */
-  (void) inb(port, com_lsr);
-  (void) inb(port, com_msr);
+  (void) inb (port, com_lsr);
+  (void) inb (port, com_msr);
 
   /* enable external interrupt gate (to avoid floating IRQ) */
-  outb(port, com_mcr, MCR_IENABLE);
+  outb (port, com_mcr, MCR_IENABLE);
 
   /* hook up interrupt handler and initialise icu */
   port->intrupt = dos_hookirq (port->irq);
   if (!port->intrupt)
     {
-      outb(port, com_mcr, 0);
-      outb(port, com_fifo, 0);
+      outb (port, com_mcr, 0);
+      outb (port, com_fifo, 0);
       errno = ENODEV;
       return -1;
     }
@@ -522,7 +530,7 @@ ok:
   disable ();
 
   /* record port */
-  port->intrupt->port = port; 
+  port->intrupt->port = port;
   scb->fd = fd;
 
   /* clear rx buffer, tx busy flag and overflow count */
@@ -532,16 +540,16 @@ ok:
 
   /* set default baud rate and mode: 9600,8,n,1 */
   i = dos_baudconv (port->baudrate = 9600);
-  outb(port, com_cfcr, CFCR_DLAB);
-  outb(port, com_dlbl, i & 0xff);
-  outb(port, com_dlbh, i >> 8);
-  outb(port, com_cfcr, CFCR_8BITS);
+  outb (port, com_cfcr, CFCR_DLAB);
+  outb (port, com_dlbl, i & 0xff);
+  outb (port, com_dlbh, i >> 8);
+  outb (port, com_cfcr, CFCR_8BITS);
 
   /* enable all interrupts */
-  outb(port, com_ier, IER_ETXRDY | IER_ERXRDY | IER_ERLS | IER_EMSC);
+  outb (port, com_ier, IER_ETXRDY | IER_ERXRDY | IER_ERLS | IER_EMSC);
 
   /* enable DTR & RTS */
-  outb(port, com_mcr, MCR_DTR | MCR_RTS | MCR_IENABLE);
+  outb (port, com_mcr, MCR_DTR | MCR_RTS | MCR_IENABLE);
 
   enable ();
 
@@ -550,77 +558,71 @@ ok:
 
 
 static void
-dos_close (scb)
-     serial_t scb;
+dos_close (struct serial *scb)
 {
-    struct dos_ttystate *port;
-    struct intrupt *intrupt;
+  struct dos_ttystate *port;
+  struct intrupt *intrupt;
 
-    if (!scb)
-      return;
-
-    port = &ports[scb->fd];
-
-    if (port->refcnt-- > 1)
-      return;
-
-    if (!(intrupt = port->intrupt))
-      return;
-
-    /* disable interrupts, fifo, flow control */
-    disable ();
-    port->intrupt = 0;
-    intrupt->port = 0;
-    outb(port, com_fifo, 0);
-    outb(port, com_ier, 0);
-    enable ();
-
-    /* unhook handler, and disable interrupt gate */
-    dos_unhookirq (intrupt);
-    outb(port, com_mcr, 0);
-
-    /* Check for overflow errors */
-    if (port->oflo)
-      {
-       fprintf_unfiltered (gdb_stderr,
-                           "Serial input overruns occurred.\n");
-       fprintf_unfiltered (gdb_stderr, "This system %s handle %d baud.\n",
-                           port->fifo ? "cannot" : "needs a 16550 to",
-                           port->baudrate);
-      }
-}
+  if (!scb)
+    return;
+
+  port = &ports[scb->fd];
 
+  if (port->refcnt-- > 1)
+    return;
+
+  if (!(intrupt = port->intrupt))
+    return;
+
+  /* disable interrupts, fifo, flow control */
+  disable ();
+  port->intrupt = 0;
+  intrupt->port = 0;
+  outb (port, com_fifo, 0);
+  outb (port, com_ier, 0);
+  enable ();
+
+  /* unhook handler, and disable interrupt gate */
+  dos_unhookirq (intrupt);
+  outb (port, com_mcr, 0);
+
+  /* Check for overflow errors */
+  if (port->oflo)
+    {
+      fprintf_unfiltered (gdb_stderr,
+                         "Serial input overruns occurred.\n");
+      fprintf_unfiltered (gdb_stderr, "This system %s handle %d baud.\n",
+                         port->fifo ? "cannot" : "needs a 16550 to",
+                         port->baudrate);
+    }
+}
 \f
 
+
 static int
-dos_noop (scb)
-     serial_t scb;
+dos_noop (struct serial *scb)
 {
   return 0;
 }
 
 static void
-dos_raw (scb)
-     serial_t scb;
+dos_raw (struct serial *scb)
 {
   /* Always in raw mode */
 }
 
 static int
-dos_readchar (scb, timeout)
-     serial_t scb;
-     int timeout;
+dos_readchar (struct serial *scb, int timeout)
 {
   struct dos_ttystate *port = &ports[scb->fd];
   long then;
   int c;
 
-  then = rawclock() + (timeout * RAWHZ);
+  then = rawclock () + (timeout * RAWHZ);
   while ((c = dos_getc (port)) < 0)
     {
       if (timeout >= 0 && (rawclock () - then) >= 0)
        return SERIAL_TIMEOUT;
-      notice_quit ();
     }
 
   return c;
@@ -628,21 +630,31 @@ dos_readchar (scb, timeout)
 
 
 static serial_ttystate
-dos_get_tty_state (scb)
-     serial_t scb;
+dos_get_tty_state (struct serial *scb)
 {
   struct dos_ttystate *port = &ports[scb->fd];
   struct dos_ttystate *state;
 
+  /* Are they asking about a port we opened?  */
+  if (port->refcnt <= 0)
+    {
+      /* 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
+        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 = *port;
   return (serial_ttystate) state;
 }
 
 static int
-dos_set_tty_state (scb, ttystate)
-     serial_t scb;
-     serial_ttystate ttystate;
+dos_set_tty_state (struct serial *scb, serial_ttystate ttystate)
 {
   struct dos_ttystate *state;
 
@@ -652,10 +664,8 @@ dos_set_tty_state (scb, ttystate)
 }
 
 static int
-dos_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
-     serial_t scb;
-     serial_ttystate new_ttystate;
-     serial_ttystate old_ttystate;
+dos_noflush_set_tty_state (struct serial *scb, serial_ttystate new_ttystate,
+                          serial_ttystate old_ttystate)
 {
   struct dos_ttystate *state;
 
@@ -665,41 +675,39 @@ dos_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
 }
 
 static int
-dos_flush_input (scb)
-     serial_t scb;
+dos_flush_input (struct serial *scb)
 {
   struct dos_ttystate *port = &ports[scb->fd];
-  disable();
+  disable ();
   port->first = port->count = 0;
   if (port->fifo)
-    outb(port, com_fifo, FIFO_ENABLE|FIFO_RCV_RST|FIFO_TRIGGER);
-  enable();
+    outb (port, com_fifo, FIFO_ENABLE | FIFO_RCV_RST | FIFO_TRIGGER);
+  enable ();
+  return 0;
 }
 
 static void
-dos_print_tty_state (scb, ttystate)
-     serial_t scb;
-     serial_ttystate ttystate;
+dos_print_tty_state (struct serial *scb, serial_ttystate ttystate,
+                    struct ui_file *stream)
 {
   /* Nothing to print */
   return;
 }
 
 static int
-dos_baudconv (rate)
-     int rate;
+dos_baudconv (int rate)
 {
   long x, err;
-  
-  if (rate <= 0) 
+
+  if (rate <= 0)
     return -1;
 
 #define divrnd(n, q)   (((n) * 2 / (q) + 1) / 2) /* divide and round off */
-  x = divrnd(COMTICK, rate);
+  x = divrnd (COMTICK, rate);
   if (x <= 0)
     return -1;
-  
-  err = divrnd(1000 * COMTICK, x * rate) - 1000;
+
+  err = divrnd (1000 * COMTICK, x * rate) - 1000;
   if (err < 0)
     err = -err;
   if (err > SPEED_TOLERANCE)
@@ -710,122 +718,121 @@ dos_baudconv (rate)
 
 
 static int
-dos_setbaudrate (scb, rate)
-     serial_t scb;
-     int rate;
+dos_setbaudrate (struct serial *scb, int rate)
 {
-    struct dos_ttystate *port = &ports[scb->fd];
-
-    if (port->baudrate != rate) 
-      {
-       int x;
-       unsigned char cfcr;
-
-       x = dos_baudconv (rate);
-       if (x <= 0)
-         {
-           fprintf_unfiltered (gdb_stderr, "%d: impossible baudrate\n", rate);
-           errno = EINVAL;
-           return -1;
-         }
-
-       disable ();
-       cfcr = inb (port, com_cfcr);
-
-       outb(port, com_cfcr, CFCR_DLAB);
-       outb(port, com_dlbl, x & 0xff);
-       outb(port, com_dlbh, x >> 8);
-       outb(port, com_cfcr, cfcr);
-       port->baudrate = rate;
-       enable ();
-      }
+  struct dos_ttystate *port = &ports[scb->fd];
 
-    return 0;
+  if (port->baudrate != rate)
+    {
+      int x;
+      unsigned char cfcr;
+
+      x = dos_baudconv (rate);
+      if (x <= 0)
+       {
+         fprintf_unfiltered (gdb_stderr, "%d: impossible baudrate\n", rate);
+         errno = EINVAL;
+         return -1;
+       }
+
+      disable ();
+      cfcr = inb (port, com_cfcr);
+
+      outb (port, com_cfcr, CFCR_DLAB);
+      outb (port, com_dlbl, x & 0xff);
+      outb (port, com_dlbh, x >> 8);
+      outb (port, com_cfcr, cfcr);
+      port->baudrate = rate;
+      enable ();
+    }
+
+  return 0;
 }
 
 static int
-dos_setstopbits (scb, num)
-     serial_t scb;
-     int num;
+dos_setstopbits (struct serial *scb, int num)
 {
-    struct dos_ttystate *port = &ports[scb->fd];
-    unsigned char cfcr;
-
-    disable ();
-    cfcr = inb (port, com_cfcr);
-
-    switch (num)
-      {
-      case SERIAL_1_STOPBITS:
-       outb (port, com_cfcr, cfcr & ~CFCR_STOPB);
-       break;
-      case SERIAL_1_AND_A_HALF_STOPBITS:
-      case SERIAL_2_STOPBITS:
-       outb (port, com_cfcr, cfcr | CFCR_STOPB);
-       break;
-      default:
-       enable ();
-       return 1;
-      }
-    enable ();
+  struct dos_ttystate *port = &ports[scb->fd];
+  unsigned char cfcr;
 
-    return 0;
+  disable ();
+  cfcr = inb (port, com_cfcr);
+
+  switch (num)
+    {
+    case SERIAL_1_STOPBITS:
+      outb (port, com_cfcr, cfcr & ~CFCR_STOPB);
+      break;
+    case SERIAL_1_AND_A_HALF_STOPBITS:
+    case SERIAL_2_STOPBITS:
+      outb (port, com_cfcr, cfcr | CFCR_STOPB);
+      break;
+    default:
+      enable ();
+      return 1;
+    }
+  enable ();
+
+  return 0;
 }
 
 static int
-dos_write (scb, str, len)
-     serial_t scb;
-     const char *str;
-     int len;
+dos_write (struct serial *scb, const char *str, int len)
 {
   volatile struct dos_ttystate *port = &ports[scb->fd];
   int fifosize = port->fifo ? 16 : 1;
   long then;
   int cnt;
 
-   while (len > 0) 
-     {
-       /* send the data, fifosize bytes at a time */
-       cnt = fifosize > len ? len : fifosize;
-       port->txbusy = 1;
-       outportsb (port->base + com_data, str, cnt);
-       str += cnt;
-       len -= cnt;
+  while (len > 0)
+    {
+      /* send the data, fifosize bytes at a time */
+      cnt = fifosize > len ? len : fifosize;
+      port->txbusy = 1;
+      /* Francisco Pastor <fpastor.etra-id@etra.es> 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;
+#else
+      for ( ; cnt > 0; cnt--, len--)
+       outportb (port->base + com_data, *str++);
+#endif
 #ifdef DOS_STATS
-       cnts[CNT_TX] += cnt;
+      cnts[CNT_TX] += cnt;
 #endif
-       /* wait for transmission to complete (max 1 sec) */
-       then = rawclock() + RAWHZ;
-       while (port->txbusy)
-         {
-           if ((rawclock () - then) >= 0)
-             {
-                 errno = EIO;
-                 return SERIAL_ERROR;
-             }
-         }
+      /* wait for transmission to complete (max 1 sec) */
+      then = rawclock () + RAWHZ;
+      while (port->txbusy)
+       {
+         if ((rawclock () - then) >= 0)
+           {
+             errno = EIO;
+             return SERIAL_ERROR;
+           }
+       }
     }
   return 0;
 }
 
 
 static int
-dos_sendbreak (scb)
-     serial_t scb;
+dos_sendbreak (struct serial *scb)
 {
   volatile struct dos_ttystate *port = &ports[scb->fd];
   unsigned char cfcr;
   long then;
 
-  cfcr = inb(port, com_cfcr);
-  outb(port, com_cfcr, cfcr | CFCR_SBREAK);
+  cfcr = inb (port, com_cfcr);
+  outb (port, com_cfcr, cfcr | CFCR_SBREAK);
 
   /* 0.25 sec delay */
   then = rawclock () + RAWHZ / 4;
   while ((rawclock () - then) < 0)
     continue;
 
-  outb(port, com_cfcr, cfcr);
+  outb (port, com_cfcr, cfcr);
   return 0;
 }
 
@@ -849,27 +856,28 @@ static struct serial_ops dos_ops =
   dos_setbaudrate,
   dos_setstopbits,
   dos_noop,                    /* wait for output to drain */
+  (void (*)(struct serial *, int))NULL /* change into async mode */
 };
 
 
 static void
-dos_info (arg, from_tty)
-     char *arg;
-     int from_tty;
+dos_info (char *arg, int from_tty)
 {
   struct dos_ttystate *port;
+#ifdef DOS_STATS
   int i;
+#endif
 
-  for (port = ports; port < &ports[4]; port++) 
+  for (port = ports; port < &ports[4]; port++)
     {
       if (port->baudrate == 0)
        continue;
-      printf_filtered ("Port:\tCOM%d (%sactive)\n", port - ports + 1,
+      printf_filtered ("Port:\tCOM%ld (%sactive)\n", (long)(port - ports) + 1,
                       port->intrupt ? "" : "not ");
       printf_filtered ("Addr:\t0x%03x (irq %d)\n", port->base, port->irq);
       printf_filtered ("16550:\t%s\n", port->fifo ? "yes" : "no");
       printf_filtered ("Speed:\t%d baud\n", port->baudrate);
-      printf_filtered ("Errs:\tframing %d parity %d overflow %d\n\n", 
+      printf_filtered ("Errs:\tframing %d parity %d overflow %d\n\n",
                       port->ferr, port->perr, port->oflo);
     }
 
@@ -883,10 +891,8 @@ dos_info (arg, from_tty)
 
 
 void
-_initialize_ser_dos ()
+_initialize_ser_dos (void)
 {
-  struct cmd_list_element *c;
-
   serial_add_interface (&dos_ops);
 
   /* Save original interrupt mask register. */
@@ -895,63 +901,63 @@ _initialize_ser_dos ()
   /* Mark fixed motherboard irqs as inuse. */
   intrupts[0].inuse =          /* timer tick */
     intrupts[1].inuse =                /* keyboard */
-      intrupts[2].inuse = 1;   /* slave icu */
-    
+    intrupts[2].inuse = 1;     /* slave icu */
+
   add_show_from_set (
-    add_set_cmd ("com1base", class_obscure, var_zinteger,
-                (char *) &ports[0].base,
-                "Set COM1 base i/o port address.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com1base", class_obscure, var_zinteger,
+                                  (char *) &ports[0].base,
+                                  "Set COM1 base i/o port address.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com1irq", class_obscure, var_zinteger,
-                (char *) &ports[0].irq,
-                "Set COM1 interrupt request.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com1irq", class_obscure, var_zinteger,
+                                  (char *) &ports[0].irq,
+                                  "Set COM1 interrupt request.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com2base", class_obscure, var_zinteger,
-                (char *) &ports[1].base,
-                "Set COM2 base i/o port address.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com2base", class_obscure, var_zinteger,
+                                  (char *) &ports[1].base,
+                                  "Set COM2 base i/o port address.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com2irq", class_obscure, var_zinteger,
-                (char *) &ports[1].irq,
-                "Set COM2 interrupt request.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com2irq", class_obscure, var_zinteger,
+                                  (char *) &ports[1].irq,
+                                  "Set COM2 interrupt request.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com3base", class_obscure, var_zinteger,
-                (char *) &ports[2].base,
-                "Set COM3 base i/o port address.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com3base", class_obscure, var_zinteger,
+                                  (char *) &ports[2].base,
+                                  "Set COM3 base i/o port address.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com3irq", class_obscure, var_zinteger,
-                (char *) &ports[2].irq,
-                "Set COM3 interrupt request.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com3irq", class_obscure, var_zinteger,
+                                  (char *) &ports[2].irq,
+                                  "Set COM3 interrupt request.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com4base", class_obscure, var_zinteger,
-                (char *) &ports[3].base,
-                "Set COM4 base i/o port address.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com4base", class_obscure, var_zinteger,
+                                  (char *) &ports[3].base,
+                                  "Set COM4 base i/o port address.",
+                                  &setlist),
+                     &showlist);
 
   add_show_from_set (
-    add_set_cmd ("com4irq", class_obscure, var_zinteger,
-                (char *) &ports[3].irq,
-                "Set COM4 interrupt request.",
-                &setlist),
-       &showlist);
+                     add_set_cmd ("com4irq", class_obscure, var_zinteger,
+                                  (char *) &ports[3].irq,
+                                  "Set COM4 interrupt request.",
+                                  &setlist),
+                     &showlist);
 
   add_info ("serial", dos_info,
            "Print DOS serial port status.");
This page took 0.03972 seconds and 4 git commands to generate.