-/* 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 Free Software Foundation, Inc.
Contributed by Nigel Stephens, Algorithmics Ltd. (nigel@algor.co.uk).
#define MSR_DDSR 0x02
#define MSR_DCTS 0x01
+#include <string.h>
#include <dos.h>
#include <go32.h>
#include <dpmi.h>
typedef unsigned long u_long;
-/* DPMI Communication */
-static union REGS dpmi_regs;
-static struct SREGS dpmi_sregs;
-
/* 16550 rx fifo trigger point */
#define FIFO_TRIGGER FIFO_TRIGGER_4
ports[4] =
{
{
- COM1ADDR, 4
+ COM1ADDR, 4, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
,
{
- COM2ADDR, 3
+ COM2ADDR, 3, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
,
{
- COM3ADDR, 4
+ COM3ADDR, 4, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
,
{
- COM4ADDR, 3
+ COM4ADDR, 3, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
};
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)
static int
-dos_noop (scb)
- serial_t scb;
+dos_noop (serial_t scb ATTRIBUTE_UNUSED)
{
return 0;
}
static void
-dos_raw (scb)
- serial_t scb;
+dos_raw (serial_t scb ATTRIBUTE_UNUSED)
{
/* Always in raw mode */
}
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_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 (serial_t scb, serial_ttystate new_ttystate,
+ serial_ttystate old_ttystate ATTRIBUTE_UNUSED)
{
struct dos_ttystate *state;
if (port->fifo)
outb (port, com_fifo, FIFO_ENABLE | FIFO_RCV_RST | FIFO_TRIGGER);
enable ();
+ return 0;
}
static void
-dos_print_tty_state (serial_t scb,
- serial_ttystate ttystate,
- struct gdb_file *stream)
+dos_print_tty_state (serial_t scb ATTRIBUTE_UNUSED,
+ serial_ttystate ttystate ATTRIBUTE_UNUSED,
+ struct ui_file *stream ATTRIBUTE_UNUSED)
{
/* Nothing to print */
return;
dos_setbaudrate,
dos_setstopbits,
dos_noop, /* wait for output to drain */
+ (void (*)(serial_t, int))NULL /* change into async mode */
};
static void
-dos_info (arg, from_tty)
- char *arg;
- int from_tty;
+dos_info (char *arg ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
{
struct dos_ttystate *port;
+#ifdef DOS_STATS
int i;
+#endif
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");
void
_initialize_ser_dos ()
{
- struct cmd_list_element *c;
-
serial_add_interface (&dos_ops);
/* Save original interrupt mask register. */