X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fser-go32.c;h=0b2fa93b9c98ee0fff52c9d5342b7899ac9ae5ec;hb=e008305278cb42a576107cd8aa9f0b182eea1af2;hp=3d336f77c3beda7525d5925477d6228c38f1eac2;hpb=4d2779813faf9e0309a2eefe7a35e4b7d3489140;p=binutils-gdb.git
diff --git a/gdb/ser-go32.c b/gdb/ser-go32.c
index 3d336f77c3b..0b2fa93b9c9 100644
--- a/gdb/ser-go32.c
+++ b/gdb/ser-go32.c
@@ -1,5 +1,5 @@
/* Remote serial interface for local (hardwired) serial ports for GO32.
- Copyright 1992, 1993, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1992-2022 Free Software Foundation, Inc.
Contributed by Nigel Stephens, Algorithmics Ltd. (nigel@algor.co.uk).
@@ -10,7 +10,7 @@
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
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -19,16 +19,11 @@
GNU General Public License for more details.
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. */
+ along with this program. If not, see . */
#include "defs.h"
#include "gdbcmd.h"
#include "serial.h"
-#include "gdb_string.h"
-
-
/*
* NS16550 UART registers
*/
@@ -150,15 +145,15 @@ 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. */
+ /* h/w interrupt counts. */
"mlsc", "nopend", "txrdy", "?3",
"rxrdy", "?5", "rls", "?7",
"?8", "?9", "?a", "?b",
"rxtout", "?d", "?e", "?f",
- /* s/w counts. */
+ /* s/w counts. */
"rxcnt", "txcnt", "stray", "swoflo"
};
@@ -167,15 +162,15 @@ static char *cntnames[NCNT] =
#define COUNT(x)
#endif
-/* Main interrupt controller port addresses. */
+/* Main interrupt controller port addresses. */
#define ICU_BASE 0x20
#define ICU_OCW2 (ICU_BASE + 0)
#define ICU_MASK (ICU_BASE + 1)
-/* Original interrupt controller mask register. */
+/* Original interrupt controller mask register. */
unsigned char icu_oldmask;
-/* Maximum of 8 interrupts (we don't handle the slave icu yet). */
+/* Maximum of 8 interrupts (we don't handle the slave icu yet). */
#define NINTR 8
static struct intrupt
@@ -228,14 +223,14 @@ ports[4] =
}
};
-static int dos_open (serial_t scb, const char *name);
-static void dos_raw (serial_t scb);
-static int dos_readchar (serial_t scb, int timeout);
-static int dos_setbaudrate (serial_t scb, int rate);
-static int dos_write (serial_t scb, const char *str, int len);
-static void dos_close (serial_t scb);
-static serial_ttystate dos_get_tty_state (serial_t scb);
-static int dos_set_tty_state (serial_t scb, serial_ttystate state);
+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 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);
static int dos_baudconv (int rate);
#define inb(p,a) inportb((p)->base + (a))
@@ -342,11 +337,11 @@ dos_comisr (int irq)
break;
case IIR_NOPEND:
- /* no more pending interrupts, all done */
+ /* No more pending interrupts, all done. */
return;
default:
- /* unexpected interrupt, ignore */
+ /* Unexpected interrupt, ignore. */
break;
}
COUNT (iir);
@@ -356,8 +351,8 @@ dos_comisr (int irq)
#define ISRNAME(x) dos_comisr##x
#define ISR(x) static void ISRNAME(x)(void) {dos_comisr(x);}
-ISR (0) ISR (1) ISR (2) ISR (3)
-ISR (4) ISR (5) ISR (6) ISR (7)
+ISR (0) ISR (1) ISR (2) ISR (3) /* OK */
+ISR (4) ISR (5) ISR (6) ISR (7) /* OK */
typedef void (*isr_t) (void);
@@ -386,7 +381,7 @@ dos_hookirq (unsigned int irq)
vec = 0x08 + irq;
isr = isrs[irq];
- /* setup real mode handler */
+ /* Setup real mode handler. */
_go32_dpmi_get_real_mode_interrupt_vector (vec, &intr->old_rmhandler);
intr->new_rmhandler.pm_selector = _go32_my_cs ();
@@ -402,7 +397,7 @@ dos_hookirq (unsigned int irq)
return 0;
}
- /* setup protected mode handler */
+ /* Setup protected mode handler. */
_go32_dpmi_get_protected_mode_interrupt_vector (vec, &intr->old_pmhandler);
intr->new_pmhandler.pm_selector = _go32_my_cs ();
@@ -415,7 +410,7 @@ dos_hookirq (unsigned int irq)
return 0;
}
- /* setup interrupt controller mask */
+ /* Setup interrupt controller mask. */
disable ();
outportb (ICU_MASK, inportb (ICU_MASK) & ~(1 << irq));
enable ();
@@ -434,17 +429,17 @@ dos_unhookirq (struct intrupt *intr)
irq = intr - intrupts;
vec = 0x08 + irq;
- /* restore old interrupt mask bit */
+ /* Restore old interrupt mask bit. */
mask = 1 << irq;
disable ();
outportb (ICU_MASK, inportb (ICU_MASK) | (mask & icu_oldmask));
enable ();
- /* remove real mode handler */
+ /* 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 */
+ /* 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;
@@ -453,7 +448,7 @@ dos_unhookirq (struct intrupt *intr)
static int
-dos_open (serial_t scb, const char *name)
+dos_open (struct serial *scb, const char *name)
{
struct dos_ttystate *port;
int fd, i;
@@ -483,12 +478,12 @@ dos_open (serial_t scb, const char *name)
port = &ports[fd];
if (port->refcnt++ > 0)
{
- /* Device already opened another user. Just point at it. */
+ /* Device already opened another user. Just point at it. */
scb->fd = fd;
return 0;
}
- /* force access to ID reg */
+ /* Force access to ID reg. */
outb (port, com_cfcr, 0);
outb (port, com_iir, 0);
for (i = 0; i < 17; i++)
@@ -501,23 +496,23 @@ dos_open (serial_t scb, const char *name)
return -1;
ok:
- /* disable all interrupts in chip */
+ /* Disable all interrupts in chip. */
outb (port, com_ier, 0);
- /* tentatively enable 16550 fifo, and see if it responds */
+ /* 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);
- /* clear pending status reports. */
+ /* clear pending status reports. */
(void) inb (port, com_lsr);
(void) inb (port, com_msr);
- /* enable external interrupt gate (to avoid floating IRQ) */
+ /* Enable external interrupt gate (to avoid floating IRQ). */
outb (port, com_mcr, MCR_IENABLE);
- /* hook up interrupt handler and initialise icu */
+ /* Hook up interrupt handler and initialise icu. */
port->intrupt = dos_hookirq (port->irq);
if (!port->intrupt)
{
@@ -533,22 +528,22 @@ ok:
port->intrupt->port = port;
scb->fd = fd;
- /* clear rx buffer, tx busy flag and overflow count */
+ /* Clear rx buffer, tx busy flag and overflow count. */
port->first = port->count = 0;
port->txbusy = 0;
port->oflo = 0;
- /* set default baud rate and mode: 9600,8,n,1 */
+ /* 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);
- /* enable all interrupts */
+ /* Enable all interrupts. */
outb (port, com_ier, IER_ETXRDY | IER_ERXRDY | IER_ERLS | IER_EMSC);
- /* enable DTR & RTS */
+ /* Enable DTR & RTS. */
outb (port, com_mcr, MCR_DTR | MCR_RTS | MCR_IENABLE);
enable ();
@@ -558,7 +553,7 @@ ok:
static void
-dos_close (serial_t scb)
+dos_close (struct serial *scb)
{
struct dos_ttystate *port;
struct intrupt *intrupt;
@@ -574,7 +569,7 @@ dos_close (serial_t scb)
if (!(intrupt = port->intrupt))
return;
- /* disable interrupts, fifo, flow control */
+ /* Disable interrupts, fifo, flow control. */
disable ();
port->intrupt = 0;
intrupt->port = 0;
@@ -582,11 +577,11 @@ dos_close (serial_t scb)
outb (port, com_ier, 0);
enable ();
- /* unhook handler, and disable interrupt gate */
+ /* Unhook handler, and disable interrupt gate. */
dos_unhookirq (intrupt);
outb (port, com_mcr, 0);
- /* Check for overflow errors */
+ /* Check for overflow errors. */
if (port->oflo)
{
fprintf_unfiltered (gdb_stderr,
@@ -598,21 +593,38 @@ dos_close (serial_t scb)
}
+/* Implementation of the serial_ops flush_output method. */
+
+static int
+dos_flush_output (struct serial *scb)
+{
+ return 0;
+}
+
+/* Implementation of the serial_ops setparity method. */
static int
-dos_noop (serial_t scb)
+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;
}
static void
-dos_raw (serial_t scb)
+dos_raw (struct serial *scb)
{
- /* Always in raw mode */
+ /* Always in raw mode. */
}
static int
-dos_readchar (serial_t scb, int timeout)
+dos_readchar (struct serial *scb, int timeout)
{
struct dos_ttystate *port = &ports[scb->fd];
long then;
@@ -621,9 +633,10 @@ dos_readchar (serial_t scb, int timeout)
then = rawclock () + (timeout * RAWHZ);
while ((c = dos_getc (port)) < 0)
{
+ QUIT;
+
if (timeout >= 0 && (rawclock () - then) >= 0)
return SERIAL_TIMEOUT;
- notice_quit ();
}
return c;
@@ -631,7 +644,7 @@ dos_readchar (serial_t scb, int timeout)
static serial_ttystate
-dos_get_tty_state (serial_t scb)
+dos_get_tty_state (struct serial *scb)
{
struct dos_ttystate *port = &ports[scb->fd];
struct dos_ttystate *state;
@@ -642,43 +655,44 @@ dos_get_tty_state (serial_t 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;
}
-static int
-dos_set_tty_state (serial_t scb, serial_ttystate ttystate)
+static serial_ttystate
+dos_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
{
struct dos_ttystate *state;
- state = (struct dos_ttystate *) ttystate;
- dos_setbaudrate (scb, state->baudrate);
- return 0;
+ state = XNEW (struct dos_ttystate);
+ *state = *(struct dos_ttystate *) ttystate;
+
+ return (serial_ttystate) state;
}
static int
-dos_noflush_set_tty_state (serial_t scb, serial_ttystate new_ttystate,
- serial_ttystate old_ttystate)
+dos_set_tty_state (struct serial *scb, serial_ttystate ttystate)
{
struct dos_ttystate *state;
- state = (struct dos_ttystate *) new_ttystate;
+ state = (struct dos_ttystate *) ttystate;
dos_setbaudrate (scb, state->baudrate);
return 0;
}
static int
-dos_flush_input (serial_t scb)
+dos_flush_input (struct serial *scb)
{
struct dos_ttystate *port = &ports[scb->fd];
+
disable ();
port->first = port->count = 0;
if (port->fifo)
@@ -688,10 +702,10 @@ dos_flush_input (serial_t scb)
}
static void
-dos_print_tty_state (serial_t scb, serial_ttystate ttystate,
+dos_print_tty_state (struct serial *scb, serial_ttystate ttystate,
struct ui_file *stream)
{
- /* Nothing to print */
+ /* Nothing to print. */
return;
}
@@ -703,7 +717,7 @@ dos_baudconv (int rate)
if (rate <= 0)
return -1;
-#define divrnd(n, q) (((n) * 2 / (q) + 1) / 2) /* divide and round off */
+#define divrnd(n, q) (((n) * 2 / (q) + 1) / 2) /* Divide and round off. */
x = divrnd (COMTICK, rate);
if (x <= 0)
return -1;
@@ -719,7 +733,7 @@ dos_baudconv (int rate)
static int
-dos_setbaudrate (serial_t scb, int rate)
+dos_setbaudrate (struct serial *scb, int rate)
{
struct dos_ttystate *port = &ports[scb->fd];
@@ -751,7 +765,7 @@ dos_setbaudrate (serial_t scb, int rate)
}
static int
-dos_setstopbits (serial_t scb, int num)
+dos_setstopbits (struct serial *scb, int num)
{
struct dos_ttystate *port = &ports[scb->fd];
unsigned char cfcr;
@@ -778,32 +792,35 @@ dos_setstopbits (serial_t scb, int num)
}
static int
-dos_write (serial_t 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)
{
- /* send the data, fifosize bytes at a time */
- cnt = fifosize > len ? len : fifosize;
+ QUIT;
+
+ /* Send the data, fifosize bytes at a time. */
+ 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
cnts[CNT_TX] += cnt;
#endif
- /* wait for transmission to complete (max 1 sec) */
+ /* Wait for transmission to complete (max 1 sec). */
then = rawclock () + RAWHZ;
while (port->txbusy)
{
@@ -819,7 +836,7 @@ dos_write (serial_t scb, const char *str, int len)
static int
-dos_sendbreak (serial_t scb)
+dos_sendbreak (struct serial *scb)
{
volatile struct dos_ttystate *port = &ports[scb->fd];
unsigned char cfcr;
@@ -838,31 +855,39 @@ dos_sendbreak (serial_t 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,
dos_get_tty_state,
+ 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 */
- (void (*)(serial_t, int))NULL /* change into async mode */
+ dos_setparity,
+ dos_drain_output,
+ (void (*)(struct serial *, int))NULL /* Change into async mode. */
};
+int
+gdb_pipe (int pdes[2])
+{
+ /* No support for pipes. */
+ errno = ENOSYS;
+ return -1;
+}
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
@@ -886,80 +911,80 @@ 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
}
-
+void _initialize_ser_dos ();
void
-_initialize_ser_dos (void)
+_initialize_ser_dos ()
{
serial_add_interface (&dos_ops);
- /* Save original interrupt mask register. */
+ /* Save original interrupt mask register. */
icu_oldmask = inportb (ICU_MASK);
- /* Mark fixed motherboard irqs as inuse. */
+ /* Mark fixed motherboard irqs as inuse. */
intrupts[0].inuse = /* timer tick */
intrupts[1].inuse = /* keyboard */
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_show_from_set (
- 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_show_from_set (
- 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_show_from_set (
- 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_show_from_set (
- 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.");
+ add_setshow_zinteger_cmd ("com1base", class_obscure, &ports[0].base, _("\
+Set COM1 base i/o port address."), _("\
+Show COM1 base i/o port address."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com1irq", class_obscure, &ports[0].irq, _("\
+Set COM1 interrupt request."), _("\
+Show COM1 interrupt request."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com2base", class_obscure, &ports[1].base, _("\
+Set COM2 base i/o port address."), _("\
+Show COM2 base i/o port address."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com2irq", class_obscure, &ports[1].irq, _("\
+Set COM2 interrupt request."), _("\
+Show COM2 interrupt request."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com3base", class_obscure, &ports[2].base, _("\
+Set COM3 base i/o port address."), _("\
+Show COM3 base i/o port address."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com3irq", class_obscure, &ports[2].irq, _("\
+Set COM3 interrupt request."), _("\
+Show COM3 interrupt request."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com4base", class_obscure, &ports[3].base, _("\
+Set COM4 base i/o port address."), _("\
+Show COM4 base i/o port address."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zinteger_cmd ("com4irq", class_obscure, &ports[3].irq, _("\
+Set COM4 interrupt request."), _("\
+Show COM4 interrupt request."), NULL,
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_info ("serial", info_serial_command,
+ _("Print DOS serial port status."));
}