Index: c/src/lib/libbsp/i386/i386ex/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/i386/i386ex/clock/ckinit.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/i386ex/clock/ckinit.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -78,5 +78,5 @@
 }
 
-static rtems_irq_connect_data clockIrqData = {PC_386_PERIODIC_TIMER,
+static rtems_irq_connect_data clockIrqData = {BSP_PERIODIC_TIMER,
 					      Clock_isr,
 					      ClockOn,
@@ -115,5 +115,5 @@
   outport_byte  ( TMR0   , clock_msb );  /* then MSB       */
  
-  if (!pc386_install_rtems_irq_handler (&clockIrqData)) {
+  if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
     printk("Unable to initialize system clock\n");
     rtems_fatal_error_occurred(1);
@@ -152,5 +152,5 @@
     else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
     {
-      if (!pc386_install_rtems_irq_handler (&clockIrqData)) {
+      if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
 	printk("Error installing clock interrupt handler!\n");
 	rtems_fatal_error_occurred(1);
@@ -169,4 +169,4 @@
 {
   ClockOff(&clockIrqData);  
-  pc386_remove_rtems_irq_handler (&clockIrqData);
+  BSP_remove_rtems_irq_handler (&clockIrqData);
 }
Index: c/src/lib/libbsp/i386/i386ex/console/console.c
===================================================================
--- c/src/lib/libbsp/i386/i386ex/console/console.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/i386ex/console/console.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -1,295 +1,401 @@
+/*-------------------------------------------------------------------------+
+| console.c v1.1 - i386ex BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| This file contains the i386ex console I/O package. It is just a termios 
+| wrapper.
++--------------------------------------------------------------------------+
+| (C) Copyright 1997 -
+| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+|
+| http://pandora.ist.utl.pt
+|
+| Instituto Superior Tecnico * Lisboa * PORTUGAL
++--------------------------------------------------------------------------+
+| Disclaimer:
+|
+| This file is provided "AS IS" without warranty of any kind, either
+| expressed or implied.
++--------------------------------------------------------------------------+
+| This code is based on:
+|   console.c,v 1.4 1995/12/19 20:07:23 joel Exp - go32 BSP
+|   console.c,v 1.15 pc386 BSP
+| With the following copyright notice:
+| **************************************************************************
+| *  COPYRIGHT (c) 1989-1998.
+| *  On-Line Applications Research Corporation (OAR).
+| *  Copyright assigned to U.S. Government, 1994. 
+| *
+| *  The license and distribution terms for this file may be
+| *  found in found in the file LICENSE in this distribution or at
+| *  http://www.OARcorp.com/rtems/license.html.
+| **************************************************************************
+|
+|  $Id$
++--------------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* workaround for gcc development tools */
+#undef __assert
+void __assert (const char *file, int line, const char *msg);
+
+#include <bsp.h>
+#include <irq.h>
+#include <rtems/libio.h>
+#include <termios.h>
+#include <uart.h>
+#include <libcpu/cpuModel.h>
+
 /*
- *  This file contains the i386ex console IO package.
- *
- *  COPYRIGHT (c) 1989-1998.
- *  On-Line Applications Research Corporation (OAR).
- *  Copyright assigned to U.S. Government, 1994.
- *
- *  The license and distribution terms for this file may be
- *  found in the file LICENSE in this distribution or at
- *  http://www.OARcorp.com/rtems/license.html.
- *
- *  $Id$
+ * Possible value for console input/output :
+ *	BSP_UART_COM1
+ *	BSP_UART_COM2
+ *  BSP_CONSOLE_PORT_CONSOLE is not valid in this BSP.  
+ *      All references to either keyboard or video handling have been removed.
  */
 
-#define F386_INIT
-
-#include <bsp.h>
-#include <rtems/libio.h>
-#include <bspIo.h>
-#include <stdlib.h>
-
-#include "../start/80386ex.h"
-
-/*  console_cleanup
- *
- *  This routine is called at exit to clean up the console hardware.
- *
- *  Input parameters: NONE
- *
- *  Output parameters:  NONE
- *
- *  Return values:
+int BSPConsolePort = BSP_UART_COM2;
+int BSPBaseBaud    = 781250;
+int BSP_poll_read(int);
+
+extern BSP_polling_getchar_function_type BSP_poll_char;
+
+static int  conSetAttr(int minor, const struct termios *);
+static void isr_on(const rtems_irq_connect_data *);
+static void isr_off(const rtems_irq_connect_data *);
+static int  isr_is_on(const rtems_irq_connect_data *);
+
+/*
+ * Change references to com2 if required.
  */
 
-void console_cleanup( void )
-{
-  register rtems_unsigned8 ignored;
-
-/* clear the read buffer */
-
-   inport_byte( RBR0, ignored );
-
-}
-
-/*  console_initialize
- *
- *  This routine initializes the console IO driver.
- *
- *  Input parameters: NONE
- *
- *  Output parameters:  NONE
- *
- *  Return values:
- */
-
-rtems_device_driver console_initialize(
-  rtems_device_major_number  major,
-  rtems_device_minor_number  minor,
-  void                      *arg
-)
+static rtems_irq_connect_data console_isr_data = 
+{ BSP_UART_COM2_IRQ,
+  BSP_uart_termios_isr_com2,
+  isr_on,
+  isr_off,
+  isr_is_on};
+
+static void
+isr_on(const rtems_irq_connect_data *unused)
+{
+  return;
+}
+						   
+static void
+isr_off(const rtems_irq_connect_data *unused)
+{
+  return;
+}
+
+static int
+isr_is_on(const rtems_irq_connect_data *irq)
+{
+  return BSP_irq_enabled_at_i8259s(irq->name);
+}
+
+void console_reserve_resources(rtems_configuration_table *conf)
+{
+  rtems_termios_reserve_resources(conf, 1);
+  return;
+}
+
+void __assert (const char *file, int line, const char *msg)
+{
+    static   char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot...";
+  unsigned char  ch;
+   
+  /*
+   * Note we cannot call exit or printf from here, 
+   * assert can fail inside ISR too
+   */
+
+   /*
+   * Close console
+   */
+  __rtems_close(2);
+  __rtems_close(1);
+  __rtems_close(0);
+
+  printk("\nassert failed: %s: ", file);
+  printk("%d: ", line);
+  printk("%s\n\n", msg);
+  printk(exit_msg);
+  ch = BSP_poll_char();
+  printk("\nShould jump to reset now!\n");
+}
+
+
+/*-------------------------------------------------------------------------+
+| Console device driver INITIALIZE entry point.
++--------------------------------------------------------------------------+
+| Initilizes the I/O console (keyboard + VGA display) driver.
++--------------------------------------------------------------------------*/
+rtems_device_driver
+console_initialize(rtems_device_major_number major,
+                   rtems_device_minor_number minor,
+                   void                      *arg)
 {
   rtems_status_code status;
 
   /*
-   *  flush the console now and at exit.  Just in case.
-   */
-
-  console_cleanup();
-
-  status = rtems_io_register_name(
-    "/dev/console",
-    major,
-    (rtems_device_minor_number) 0
-  );
+   * Set up TERMIOS
+   */
+  rtems_termios_initialize ();
+  
+  /*
+   * Do device-specific initialization
+   */
+  
+  /* 9600-8-N-1, no hardware flow control */
+  BSP_uart_init(BSPConsolePort, 9600, 0);
+  
+  
+  /* Set interrupt handler */
+  if(BSPConsolePort == BSP_UART_COM1)
+    {
+      console_isr_data.name = BSP_UART_COM1_IRQ;
+      console_isr_data.hdl  = BSP_uart_termios_isr_com1;
+      
+    }
+  else
+    {
+      assert(BSPConsolePort == BSP_UART_COM2);
+      console_isr_data.name = BSP_UART_COM2_IRQ;
+      console_isr_data.hdl  = BSP_uart_termios_isr_com2;
+    }
+  
+  status = BSP_install_rtems_irq_handler(&console_isr_data);
+  
+  if (!status){
+    printk("Error installing serial console interrupt handler!\n");
+    rtems_fatal_error_occurred(status);
+  }
+  /*
+   * Register the device
+   */
+  status = rtems_io_register_name ("/dev/console", major, 0);
+  if (status != RTEMS_SUCCESSFUL)
+    {
+      printk("Error registering console device!\n");
+      rtems_fatal_error_occurred (status);
+    }
+  
+  if(BSPConsolePort == BSP_UART_COM1)
+    {
+      printk("Initialized console on port COM1 9600-8-N-1\n\n");
+    }
+  else
+    {
+      printk("Initialized console on port COM2 9600-8-N-1\n\n");
+    }
+
+  return RTEMS_SUCCESSFUL;
+} /* console_initialize */
+
+
+static int console_open_count = 0;
+
+static int console_last_close(int major, int minor, void *arg)
+{
+  BSP_remove_rtems_irq_handler (&console_isr_data);
+
+  return 0;
+}
+
+/*-------------------------------------------------------------------------+
+| Console device driver OPEN entry point
++--------------------------------------------------------------------------*/
+rtems_device_driver
+console_open(rtems_device_major_number major,
+                rtems_device_minor_number minor,
+                void                      *arg)
+{
+  rtems_status_code              status;
+  static rtems_termios_callbacks cb = 
+  {
+    NULL,	              /* firstOpen */
+    console_last_close,       /* lastClose */
+    NULL,                     /* poll read  */
+    BSP_uart_termios_write_com2, /* write */
+    conSetAttr,	              /* setAttributes */
+    NULL,	              /* stopRemoteTx */
+    NULL,	              /* startRemoteTx */
+    1		              /* outputUsesInterrupts */
+  };
+
+  if(BSPConsolePort == BSP_UART_COM2)
+    {
+      cb.write = BSP_uart_termios_write_com2;
+    }
+
+  status = rtems_termios_open (major, minor, arg, &cb);
+
+  if(status != RTEMS_SUCCESSFUL)
+    {
+      printk("Error openning console device\n");
+      return status;
+    }
+
+  /*
+   * Pass data area info down to driver
+   */
+  BSP_uart_termios_set(BSPConsolePort, 
+			 ((rtems_libio_open_close_args_t *)arg)->iop->data1);
+  
+  /* Enable interrupts  on channel */
+  BSP_uart_intr_ctrl(BSPConsolePort, BSP_UART_INTR_CTRL_TERMIOS);
+
+  return RTEMS_SUCCESSFUL;
+}
+
+/*-------------------------------------------------------------------------+
+| Console device driver CLOSE entry point
++--------------------------------------------------------------------------*/
+rtems_device_driver
+console_close(rtems_device_major_number major,
+              rtems_device_minor_number minor,
+              void                      *arg)
+{
+
+  return (rtems_termios_close (arg));
+  
+} /* console_close */
+
  
-  if (status != RTEMS_SUCCESSFUL)
-    rtems_fatal_error_occurred(status);
+/*-------------------------------------------------------------------------+
+| Console device driver READ entry point.
++--------------------------------------------------------------------------+
+| Read characters from the I/O console. We only have stdin.
++--------------------------------------------------------------------------*/
+rtems_device_driver
+console_read(rtems_device_major_number major,
+             rtems_device_minor_number minor,
+             void                      *arg)
+{
+  rtems_status_code sc;
+  printf("read the console\n");
+
+  sc = rtems_termios_read (arg);
+
+  if ( sc != RTEMS_SUCCESSFUL )
+    printf("console_read: fails %s\n",rtems_status_text(sc));
+
+  return sc;
+
+} /* console_read */
  
-  atexit( console_cleanup );
-
-  return RTEMS_SUCCESSFUL;
-}
-
-
-/*  is_character_ready
- *
- *  This routine returns TRUE if a character is available.
- *
- *  Input parameters: NONE
- *
- *  Output parameters:  NONE
- *
- *  Return values:
- */
-
-rtems_boolean is_character_ready(
-  char *ch
-)
-{
-  register rtems_unsigned8 status;
-
-  inport_byte( LSR1, status );
-
-  if ( Is_rx_ready( status ) ) {
-     inport_byte( RBR1,  status );
-     *ch = status;
-     return TRUE;
-  }
-  return FALSE;
-}
-
-/*
- * Wait for an input. May be used before  intr are ON.
- */
-char BSP_wait_polled_input( void )
-{
-  char c;
-  while (!is_character_ready(&c))
-    continue;
-
-  return c;
-}
-     
-/*  inbyte
- *
- *  This routine reads a character from the UART.
- *
- *  Input parameters: NONE
- *
- *  Output parameters:  NONE
- *
- *  Return values:
- *    character read from UART
- */
-
-char inbyte( void )
-{
-  register rtems_unsigned8 status; 
-  char                     ch;
-
-  do {
-    inport_byte( LSR1, status );
-  } while ( !( status & 0x01 ));/* s/b while ( !( Is_rx_ready( status ) ) ); */
-
-  inport_byte( RBR1, ch );
-
-  return ch;
-}
-
-/*  outbyte
- *
- *  This routine transmits a character out the port.  It supports
- *  XON/XOFF flow control.
- *
- *  Input parameters:
- *    ch  - character to be transmitted
- *
- *  Output parameters:  NONE
- */
-
-void outbyte(
-  char ch
-)
-{
-  rtems_unsigned8 status;
-
-  do {
-    inport_byte( LSR1, status );
-  } while ( ! ( 0x40 & status ) ); /* ( Is_tx_ready( status ) ) );*/
-
-/*
- *  GDB will NOT use XON/XOFF protocol
- */
-
-
-#ifdef USE_XON
-  
-  while ( is_character_ready( &status ) == TRUE ) { 
-    if ( status == XOFF )
-      do {
-        while ( is_character_ready( &status ) == FALSE ) ;
-      } while ( status != XON );
-  }
-
-#endif
-
-  outport_byte( TBR1, ch );
-
-}
-
-/*
- *  Open entry point
- */
+
+/*-------------------------------------------------------------------------+
+| Console device driver WRITE entry point.
++--------------------------------------------------------------------------+
+| Write characters to the I/O console. Stderr and stdout are the same.
++--------------------------------------------------------------------------*/
+rtems_device_driver
+console_write(rtems_device_major_number major,
+              rtems_device_minor_number minor,
+              void                    * arg)
+{
+        return rtems_termios_write (arg);
  
-rtems_device_driver console_open(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void                    * arg
-)
-{
-  return RTEMS_SUCCESSFUL;
-}
+} /* console_write */
+
+
  
 /*
- *  Close entry point
+ * Handle ioctl request.
  */
- 
-rtems_device_driver console_close(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void                    * arg
+rtems_device_driver 
+console_control(rtems_device_major_number major,
+		rtems_device_minor_number minor,
+		void                      * arg
 )
-{
-  return RTEMS_SUCCESSFUL;
-}
- 
+{ 
+  return rtems_termios_ioctl (arg);
+}
+
+static int
+conSetAttr(int minor, const struct termios *t)
+{
+  int baud;
+
+  switch (t->c_cflag & CBAUD) 
+    {
+    case B50:	
+      baud = 50;
+      break;
+    case B75:	
+      baud = 75;	
+      break;
+    case B110:	
+      baud = 110;	
+      break;
+    case B134:	
+      baud = 134;	
+      break;
+    case B150:	
+      baud = 150;	
+      break;
+    case B200:
+      baud = 200;	
+      break;
+    case B300:	
+      baud = 300;
+      break;
+    case B600:	
+      baud = 600;	
+      break;
+    case B1200:	
+      baud = 1200;
+      break;
+    case B1800:	
+      baud = 1800;	
+      break;
+    case B2400:	
+      baud = 2400;
+      break;
+    case B4800:	
+      baud = 4800;
+      break;
+    case B9600:	
+      baud = 9600;
+      break;
+    case B19200:
+      baud = 19200;
+      break;
+    case B38400:
+      baud = 38400;
+      break;
+    case B57600:	
+      baud = 57600;
+      break;
+    case B115200:
+      baud = 115200;
+      break;
+    default:
+      baud = 0;
+      rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);
+      return 0;
+    }
+
+  BSP_uart_set_baud(BSPConsolePort, baud);
+
+  return 0;
+}
+
 /*
- * read bytes from the serial port. We only have stdin.
+ * BSP initialization
  */
- 
-rtems_device_driver console_read(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void                    * arg
-)
-{
-  rtems_libio_rw_args_t *rw_args;
-  char *buffer;
-  int maximum;
-  int count = 0;
- 
-  rw_args = (rtems_libio_rw_args_t *) arg;
- 
-  buffer = rw_args->buffer;
-  maximum = rw_args->count;
- 
-  for (count = 0; count < maximum; count++) {
-    buffer[ count ] = inbyte();
-    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
-      buffer[ count++ ]  = '\n';
-      break;
-    }
-  }
- 
-  rw_args->bytes_moved = count;
-  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
-}
-
-/*
- * write bytes to the serial port. Stdout and stderr are the same.
- */
- 
-rtems_device_driver console_write(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void                    * arg
-)
-{
-  int count;
-  int maximum;
-  rtems_libio_rw_args_t *rw_args;
-  char *buffer;
- 
-  rw_args = (rtems_libio_rw_args_t *) arg;
- 
-  buffer = rw_args->buffer;
-  maximum = rw_args->count;
- 
-  for (count = 0; count < maximum; count++) {
-    if ( buffer[ count ] == '\n') {
-      outbyte('\r');
-    }
-    outbyte( buffer[ count ] );
-  }
- 
-  rw_args->bytes_moved = maximum;
-  return 0;
-}
- 
-/*
- *  IO Control entry point
- */
- 
-rtems_device_driver console_control(
-  rtems_device_major_number major,
-  rtems_device_minor_number minor,
-  void                    * arg
-)
-{
-  return RTEMS_SUCCESSFUL;
-}
-
-BSP_output_char_function_type 		BSP_output_char = outbyte;
-BSP_polling_getchar_function_type 	BSP_poll_char = BSP_wait_polled_input;
-
+
+BSP_output_char_function_type BSP_output_char = 
+                       (BSP_output_char_function_type)    BSP_output_char_via_serial;
+
+BSP_polling_getchar_function_type BSP_poll_char =  
+                      (BSP_polling_getchar_function_type) BSP_poll_char_via_serial;
+
+int BSP_poll_read(int ttyMinor){
+  
+  return BSP_poll_char_via_serial();
+}
Index: c/src/lib/libbsp/i386/i386ex/start/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/i386ex/start/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/i386ex/start/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -37,4 +37,5 @@
 DEFINES  += -DNEXT_GAS
 endif
+
 CPPFLAGS +=
 CFLAGS   +=
Index: c/src/lib/libbsp/i386/i386ex/startup/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/i386ex/startup/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/i386ex/startup/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -5,5 +5,5 @@
 @SET_MAKE@
 srcdir = @srcdir@
-VPATH = @srcdir@:@srcdir@/../../../shared
+VPATH = @srcdir@:@srcdir@/../../../shared:@srcdir@/../../shared/comm:@srcdir@/../../shared/irq:@srcdir@/../../shared/io
 RTEMS_ROOT = @top_srcdir@
 PROJECT_ROOT = @PROJECT_ROOT@
@@ -11,9 +11,7 @@
 PGM=${ARCH}/startup.rel
 
-IMPORT_SRC=$(srcdir)/../../shared/irq/irq.c \
-   $(srcdir)/../../shared/irq/irq_init.c $(srcdir)/../../shared/irq/irq_asm.s
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bsplibc bsppost bspstart main sbrk irq irq_init i386-stub-glue uart i386-stub
 
-# C source names, if any, go here -- minus the .c
-C_PIECES=bspclean bsplibc bsppost bspstart main sbrk irq irq_init
 C_FILES=$(C_PIECES:%=%.c)
 C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
@@ -38,5 +36,6 @@
 
 #DEFINES  += -DPRINTON
-DEFINES  += -I$(srcdir)
+
+DEFINES  += -I$(srcdir) -DBSP_IS_I386EX=1 
 CPPFLAGS +=
 CFLAGS   += -g 
@@ -57,5 +56,7 @@
 
 preinstall:
-	${CP} ${IMPORT_SRC} .
+	$(INSTALL) ${IMPORT_SRC} .
+
+#	${CP} ${IMPORT_SRC} .
 
 ${PGM}: ${SRCS} ${OBJS}
Index: c/src/lib/libbsp/i386/i386ex/timer/timer.c
===================================================================
--- c/src/lib/libbsp/i386/i386ex/timer/timer.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/i386ex/timer/timer.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -56,5 +56,5 @@
    * enable interrrupt at i8259 level
    */
-  pc386_irq_enable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE);
+  BSP_irq_enable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
 }
 
@@ -64,10 +64,10 @@
      * disable interrrupt at i8259 level
      */
-     pc386_irq_disable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE);
+     BSP_irq_disable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
      /* reset timer mode to standard (DOS) value */
 }
 
 static rtems_raw_irq_connect_data timer_raw_irq_data = {
-  PC_386_RT_TIMER3 + PC386_IRQ_VECTOR_BASE,
+  BSP_RT_TIMER3 + BSP_IRQ_VECTOR_BASE,
   timerisr,
   TimerOn,
Index: c/src/lib/libbsp/i386/pc386/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/pc386/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -18,4 +18,4 @@
 # wrapup is the one that actually builds and installs the library
 #  from the individual .rel files built in other directories
-SUB_DIRS=include tools start startup clock console timer pc386dev $(NETWORK) \
+SUB_DIRS=include tools start startup clock console timer $(NETWORK) \
           wrapup
Index: c/src/lib/libbsp/i386/pc386/clock/ckinit.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/clock/ckinit.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/clock/ckinit.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -177,5 +177,5 @@
 }
 
-static rtems_irq_connect_data clockIrqData = {PC_386_PERIODIC_TIMER,
+static rtems_irq_connect_data clockIrqData = {BSP_PERIODIC_TIMER,
 					      clockIsr,
 					      clockOn,
@@ -196,5 +196,5 @@
 {
 
-  if (!pc386_install_rtems_irq_handler (&clockIrqData)) {
+  if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
     printk("Unable to initialize system clock\n");
     rtems_fatal_error_occurred(1);
@@ -230,5 +230,5 @@
     else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
     {
-      if (!pc386_install_rtems_irq_handler (&clockIrqData)) {
+      if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
 	printk("Error installing clock interrupt handler!\n");
 	rtems_fatal_error_occurred(1);
@@ -242,5 +242,5 @@
 void Clock_exit()
 {
-  pc386_remove_rtems_irq_handler (&clockIrqData);
+  BSP_remove_rtems_irq_handler (&clockIrqData);
 }
 
Index: c/src/lib/libbsp/i386/pc386/console/console.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/console/console.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/console/console.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -35,4 +35,6 @@
 #include <stdlib.h>
 #include <assert.h>
+#undef __assert
+void __assert (const char *file, int line, const char *msg);
 
 #include <bsp.h>
@@ -40,22 +42,25 @@
 #include <rtems/libio.h>
 #include <termios.h>
-#include <pc386uart.h>
+#include <uart.h>
 #include <libcpu/cpuModel.h>
 
 /*
  * Possible value for console input/output :
- *	PC386_CONSOLE_PORT_CONSOLE
- *	PC386_UART_COM1
- *	PC386_UART_COM2
+ *	BSP_CONSOLE_PORT_CONSOLE
+ *	BSP_UART_COM1
+ *	BSP_UART_COM2
  */
 
 /*
  * Possible value for console input/output :
- *	PC386_CONSOLE_PORT_CONSOLE
- *	PC386_UART_COM1
- *	PC386_UART_COM2
+ *	BSP_CONSOLE_PORT_CONSOLE
+ *	BSP_UART_COM1
+ *	BSP_UART_COM2
  */
 
-int PC386ConsolePort = PC386_CONSOLE_PORT_CONSOLE;
+int BSPConsolePort = BSP_CONSOLE_PORT_CONSOLE;
+
+/* int BSPConsolePort = BSP_UART_COM2;  */
+int BSPBaseBaud    = 115200;
 
 extern BSP_polling_getchar_function_type BSP_poll_char;
@@ -67,4 +72,5 @@
 extern rtems_boolean _IBMPC_scankey(char *);  /* defined in 'inch.c' */
 extern char BSP_wait_polled_input(void);
+extern void _IBMPC_initVideo(void);
 
 static int  conSetAttr(int minor, const struct termios *);
@@ -74,5 +80,5 @@
 
 
-static rtems_irq_connect_data console_isr_data = {PC_386_KEYBOARD,
+static rtems_irq_connect_data console_isr_data = {BSP_KEYBOARD,
 						   _IBMPC_keyboard_isr,
 						   isr_on,
@@ -95,26 +101,28 @@
 isr_is_on(const rtems_irq_connect_data *irq)
 {
-  return pc386_irq_enabled_at_i8259s(irq->name);
+  return BSP_irq_enabled_at_i8259s(irq->name);
 }
 
 void console_reserve_resources(rtems_configuration_table *conf)
 {
-  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+    if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)
     {
       rtems_termios_reserve_resources(conf, 1);
     }
+   
   return;
 }
 
-void __assert(const char *file, int line, const char *msg)
-{
-  static   char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot...";
+void __assert (const char *file, int line, const char *msg)
+{
+    static   char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot...";
   unsigned char  ch;
- 
+   
   /*
    * Note we cannot call exit or printf from here, 
    * assert can fail inside ISR too
    */
-  /*
+
+   /*
    * Close console
    */
@@ -130,4 +138,5 @@
   printk("\n\n");
   rtemsReboot();
+
 }
 
@@ -150,9 +159,9 @@
    */
 
-  if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
-    {
-
+
+  if(BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)
+    {
       /* Install keyboard interrupt handler */
-      status = pc386_install_rtems_irq_handler(&console_isr_data);
+      status = BSP_install_rtems_irq_handler(&console_isr_data);
   
       if (!status)
@@ -182,22 +191,22 @@
       
       /* 9600-8-N-1 */
-      PC386_uart_init(PC386ConsolePort, 9600, 0);
+      BSP_uart_init(BSPConsolePort, 9600, 0);
       
       
       /* Set interrupt handler */
-      if(PC386ConsolePort == PC386_UART_COM1)
-	{
-	  console_isr_data.name = PC386_UART_COM1_IRQ;
-	  console_isr_data.hdl  = PC386_uart_termios_isr_com1;
+      if(BSPConsolePort == BSP_UART_COM1)
+	{
+	  console_isr_data.name = BSP_UART_COM1_IRQ;
+	  console_isr_data.hdl  = BSP_uart_termios_isr_com1;
 	  
 	}
       else
 	{
-          assert(PC386ConsolePort == PC386_UART_COM2);
-	  console_isr_data.name = PC386_UART_COM2_IRQ;
-	  console_isr_data.hdl  = PC386_uart_termios_isr_com2;
-	}
-
-      status = pc386_install_rtems_irq_handler(&console_isr_data);
+          assert(BSPConsolePort == BSP_UART_COM2);
+	  console_isr_data.name = BSP_UART_COM2_IRQ;
+	  console_isr_data.hdl  = BSP_uart_termios_isr_com2;
+	}
+
+      status = BSP_install_rtems_irq_handler(&console_isr_data);
 
       if (!status){
@@ -215,5 +224,5 @@
 	}
 
-      if(PC386ConsolePort == PC386_UART_COM1)
+      if(BSPConsolePort == BSP_UART_COM1)
 	{
 	  printk("Initialized console on port COM1 9600-8-N-1\n\n");
@@ -230,5 +239,5 @@
        * This may be convenient to debug the serial line driver itself...
        */
-      printk("Warning : This will be the last message displayed on console\n");
+      /*      printk("Warning : This will be the last message displayed on console\n");*/
       BSP_output_char = (BSP_output_char_function_type) BSP_output_char_via_serial;
       BSP_poll_char   = (BSP_polling_getchar_function_type) BSP_poll_char_via_serial;
@@ -243,5 +252,5 @@
 static int console_last_close(int major, int minor, void *arg)
 {
-  pc386_remove_rtems_irq_handler (&console_isr_data);
+  BSP_remove_rtems_irq_handler (&console_isr_data);
 
   return 0;
@@ -262,5 +271,5 @@
     console_last_close,       /* lastClose */
     NULL,	              /* pollRead */
-    PC386_uart_termios_write_com1, /* write */
+    BSP_uart_termios_write_com1, /* write */
     conSetAttr,	              /* setAttributes */
     NULL,	              /* stopRemoteTx */
@@ -269,5 +278,5 @@
   };
 
-  if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
+  if(BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)
     {
       ++console_open_count;
@@ -275,7 +284,7 @@
     }
 
-  if(PC386ConsolePort == PC386_UART_COM2)
-    {
-      cb.write = PC386_uart_termios_write_com2;
+  if(BSPConsolePort == BSP_UART_COM2)
+    {
+      cb.write = BSP_uart_termios_write_com2;
     }
 
@@ -291,9 +300,9 @@
    * Pass data area info down to driver
    */
-  PC386_uart_termios_set(PC386ConsolePort, 
+  BSP_uart_termios_set(BSPConsolePort, 
 			 ((rtems_libio_open_close_args_t *)arg)->iop->data1);
   
   /* Enable interrupts  on channel */
-  PC386_uart_intr_ctrl(PC386ConsolePort, PC386_UART_INTR_CTRL_TERMIOS);
+  BSP_uart_intr_ctrl(BSPConsolePort, BSP_UART_INTR_CTRL_TERMIOS);
 
   return RTEMS_SUCCESSFUL;
@@ -310,5 +319,5 @@
   rtems_device_driver res = RTEMS_SUCCESSFUL;
 
-  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+  if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)
     {
       res =  rtems_termios_close (arg);
@@ -338,5 +347,5 @@
   int            count, maximum  = rw_args->count;
 
-  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+  if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)
     {
       return rtems_termios_read (arg);
@@ -383,5 +392,5 @@
   int            count, maximum  = rw_args->count;
 
-  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+  if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)
     {
       return rtems_termios_write (arg);
@@ -410,5 +419,5 @@
 )
 { 
-  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+  if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)
     {
       return rtems_termios_ioctl (arg);
@@ -482,5 +491,5 @@
     }
 
-  PC386_uart_set_baud(PC386ConsolePort, baud);
+  BSP_uart_set_baud(BSPConsolePort, baud);
 
   return 0;
Index: c/src/lib/libbsp/i386/pc386/include/bsp.h
===================================================================
--- c/src/lib/libbsp/i386/pc386/include/bsp.h	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/include/bsp.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -161,8 +161,8 @@
 void rtemsReboot(void);                  /* from 'exit.c'   */
 
-/* Definitions for PC386ConsolePort */
-#define PC386_CONSOLE_PORT_CONSOLE (-1)
-#define PC386_CONSOLE_PORT_COM1    (PC386_UART_COM1)
-#define PC386_CONSOLE_PORT_COM2    (PC386_UART_COM2)
+/* Definitions for BSPConsolePort */
+#define BSP_CONSOLE_PORT_CONSOLE (-1)
+#define BSP_CONSOLE_PORT_COM1    (BSP_UART_COM1)
+#define BSP_CONSOLE_PORT_COM2    (BSP_UART_COM2)
 
 /* GDB stub stuff */
Index: c/src/lib/libbsp/i386/pc386/start/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/pc386/start/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/start/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -34,7 +34,7 @@
 #
 
-ifeq ($(RTEMS_GAS_CODE16),yes)
+#ifeq ($(RTEMS_GAS_CODE16),yes)
 DEFINES  += -DNEXT_GAS
-endif
+#endif
 CPPFLAGS +=
 CFLAGS   +=
Index: c/src/lib/libbsp/i386/pc386/start/start16.s
===================================================================
--- c/src/lib/libbsp/i386/pc386/start/start16.s	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/start/start16.s	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -34,5 +34,5 @@
 .set STACKOFF,      0x200-0x10  # offset to load into %esp, from start of image
 
-/* #define NEW_GAS*/
+ /* #define NEW_GAS */
 /*----------------------------------------------------------------------------+
 | CODE section
Index: c/src/lib/libbsp/i386/pc386/startup/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/startup/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -5,5 +5,5 @@
 @SET_MAKE@
 srcdir = @srcdir@
-VPATH = @srcdir@:@srcdir@/../../../shared:@srcdir@/../../shared/irq
+VPATH = @srcdir@:@srcdir@/../../../shared:@srcdir@/../../shared/irq:@srcdir@/../../shared/comm:@srcdir@/../../shared/pci
 RTEMS_ROOT = @top_srcdir@
 PROJECT_ROOT = @PROJECT_ROOT@
@@ -12,5 +12,5 @@
 
 # C source names, if any, go here -- minus the .c
-C_PIECES=bsplibc bsppost bspstart exit irq irq_init main sbrk 
+C_PIECES=bsplibc bsppost bspstart exit irq irq_init main sbrk i386-stub i386-stub-glue uart pcibios
 C_FILES=$(C_PIECES:%=%.c)
 C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
Index: c/src/lib/libbsp/i386/pc386/startup/bspstart.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/bspstart.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/startup/bspstart.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -147,4 +147,5 @@
    * Initialize printk channel
    */
+  
   _IBMPC_initVideo();
 
Index: c/src/lib/libbsp/i386/pc386/startup/exit.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/exit.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/startup/exit.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -36,5 +36,5 @@
 #include <bsp.h>
 #include <rtems/libio.h>
-#include <pc386uart.h>
+#include <uart.h>
 
 void bsp_cleanup(void)
Index: c/src/lib/libbsp/i386/pc386/startup/linkcmds
===================================================================
--- c/src/lib/libbsp/i386/pc386/startup/linkcmds	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/startup/linkcmds	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -63,5 +63,4 @@
     _rodata_start = . ;
     *(.rodata)
-    *(.gnu.linkonce.r*)
     _erodata = ALIGN( 0x10 ) ;
 
Index: c/src/lib/libbsp/i386/pc386/timer/timer.c
===================================================================
--- c/src/lib/libbsp/i386/pc386/timer/timer.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/timer/timer.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -168,5 +168,5 @@
      * disable interrrupt at i8259 level
      */
-     pc386_irq_disable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE);
+     BSP_irq_disable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
      /* reset timer mode to standard (DOS) value */
      outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN);
@@ -186,5 +186,5 @@
      * enable interrrupt at i8259 level
      */
-     pc386_irq_enable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE);
+     BSP_irq_enable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
 }
 
@@ -192,8 +192,8 @@
 timerIsOn(const rtems_raw_irq_connect_data *used)
 {
-     return pc386_irq_enabled_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE);}
+     return BSP_irq_enabled_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);}
 
 static rtems_raw_irq_connect_data timer_raw_irq_data = {
-  PC_386_PERIODIC_TIMER + PC386_IRQ_VECTOR_BASE,
+  BSP_PERIODIC_TIMER + BSP_IRQ_VECTOR_BASE,
   timerisr,
   timerOn,
Index: c/src/lib/libbsp/i386/pc386/wrapup/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/pc386/wrapup/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/pc386/wrapup/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -13,5 +13,5 @@
 NETWORK = $(NETWORK_$(HAS_NETWORKING)_V)
 
-BSP_PIECES=startup clock console timer pc386dev $(NETWORK) 
+BSP_PIECES=startup clock console timer $(NETWORK) 
 GENERIC_PIECES=
 
Index: c/src/lib/libbsp/i386/shared/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/shared/Makefile.in	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/shared/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -13,4 +13,4 @@
 
 # Descend into the $(RTEMS_BSP_FAMILY) directory
-SUB_DIRS=irq io
+SUB_DIRS=irq io comm pci
 
Index: c/src/lib/libbsp/i386/shared/comm/GDB.HOWTO
===================================================================
--- c/src/lib/libbsp/i386/shared/comm/GDB.HOWTO	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/comm/GDB.HOWTO	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,177 @@
+1. Add GDB initilization to your target's code:
+
+a) include file:
+
+#include <uart.h>
+
+b) declare this variable:   
+
+extern int BSPConsolePort;
+
+c) To start-up GDB, run this:
+
+ /* Init GDB glue  */
+
+  if(BSPConsolePort != BSP_UART_COM2)
+    {
+      /*
+       * If com2 is not used as console use it for
+       * debugging
+       */
+      i386_stub_glue_init(BSP_UART_COM2);
+    }
+  else
+    {
+      /* Otherwise use com1 */
+      i386_stub_glue_init(BSP_UART_COM1);
+    }
+
+  /* Init GDB stub itself */
+  set_debug_traps();
+
+  /*
+   * Init GDB break in capability,
+   * has to be called after
+   * set_debug_traps
+   */
+  i386_stub_glue_init_breakin();
+
+  /* Put breakpoint in */
+  breakpoint();
+
+d) This is all you need to do for the target.
+
+2. Edit cmds: specify path to current directory and device used for debugging
+   example of cmds is attached below.  Make sure your paths are correct.
+3. type 'make'
+4. Boot o-pc386/<test>.exe on target computer, where <test> has the code from step 1. ( I modified and recompiled base_sp as the <test> )
+5. run 'i396-rtems-gdb --nx --command=./cmds o-pc386/<test>.coff
+
+=========================== example cmds ==============================
+dir /home/cross-19980908/tools/rtems-980923
+dir /home/cross-19980908/tools/rtems-980923/aclocal
+dir /home/cross-19980908/tools/rtems-980923/c
+dir /home/cross-19980908/tools/rtems-980923/c/build-tools
+dir /home/cross-19980908/tools/rtems-980923/c/build-tools/os
+dir /home/cross-19980908/tools/rtems-980923/c/build-tools/os/msdos
+dir /home/cross-19980908/tools/rtems-980923/c/build-tools/scripts
+dir /home/cross-19980908/tools/rtems-980923/c/build-tools/src
+dir /home/cross-19980908/tools/rtems-980923/c/src
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/base
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/headers
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/inline
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/macros
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/optman
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/src
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/posix/sys
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/sapi
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/sapi/headers
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/sapi/src
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/sapi/inline
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/sapi/macros
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/sapi/optman
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/rtems
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/rtems/headers
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/rtems/src
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/rtems/inline
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/rtems/macros
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/rtems/optman
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/a29k
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/hppa1.1
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/i386
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/i960
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/m68k
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/mips64orion
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/no_cpu
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/powerpc
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/sh
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/sparc
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/cpu/unix
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/headers
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/inline
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/macros
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/src
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/tools
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/tools/generic
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/tools/unix
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/score/tools/hppa1.1
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/wrapup
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/wrapup/posix
+dir /home/cross-19980908/tools/rtems-980923/c/src/exec/wrapup/rtems
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/include
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/include/motorola
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/include/rtems++
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/include/sys
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/include/zilog
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libc
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/clock
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/console
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/include
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/start
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/startup
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/timer
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/tools
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/pc386/wrapup
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/shared/comm
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libbsp/i386/shared/pci
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1/clock
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1/include
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1/milli
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1/runway
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1/semaphore
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/hppa1.1/timer
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/m68k
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/m68k/m68040
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/m68k/m68040/fpsp
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/mips64orion
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/mips64orion/clock
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/mips64orion/include
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/mips64orion/timer
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc/ppc403
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc/ppc403/clock
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc/ppc403/console
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc/ppc403/include
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc/ppc403/timer
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/powerpc/ppc403/vectors
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh/sh7032
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh/sh7032/clock
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh/sh7032/null
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh/sh7032/console
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh/sh7032/include
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sh/sh7032/timer
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sparc
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libcpu/sparc/reg_win
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libnetworking
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/assoc
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/cpuuse
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/error
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/monitor
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/rtmonuse
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/stackchk
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/libmisc/wrapup
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/librtems++
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/start
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/start/a29k
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/start/i960
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/start/m68k
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/start/mips64orion
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/start/sh
+dir /home/cross-19980908/tools/rtems-980923/c/src/lib/wrapup
+dir /home/cross-19980908/tools/rtems-980923/c/src/tests
+dir /home/cross-19980908/tools/rtems-980923/c/src/tests/samples
+dir /home/cross-19980908/tools/rtems-980923/c/src/tests/samples/base_sp
+set remotebaud 38400
+target remote /dev/ttyS1
Index: c/src/lib/libbsp/i386/shared/comm/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/shared/comm/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/comm/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,33 @@
+#
+#  $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+VPATH = @srcdir@
+RTEMS_ROOT = @top_srcdir@
+PROJECT_ROOT = @PROJECT_ROOT@
+
+H_FILES = $(srcdir)/uart.h 
+
+#
+#  Equate files are for including from assembly preprocessed by
+#  gm4 or gasp.  No examples are provided except for those for
+#  other CPUs.  The best way to generate them would be to
+#  provide a program which generates the constants used based
+#  on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+preinstall all: $(SRCS)
+	$(INSTALL) -m 444 $(SRCS) $(PROJECT_INCLUDE)
+
Index: c/src/lib/libbsp/i386/shared/comm/i386-stub-glue.c
===================================================================
--- c/src/lib/libbsp/i386/shared/comm/i386-stub-glue.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/comm/i386-stub-glue.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,194 @@
+/*
+ * This software is Copyright (C) 1998 by T.sqware - all rights limited
+ * It is provided in to the public domain "as is", can be freely modified
+ * as far as this copyight notice is kept unchanged, but does not imply
+ * an endorsement by T.sqware of the product in which it is included.
+ *
+ *  $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+#include <bsp.h>
+#include <irq.h>
+#include <uart.h>
+#include <assert.h>
+
+
+int  putDebugChar(int ch);     /* write a single character      */
+int  getDebugChar(void);       /* read and return a single char */
+
+/* assign an exception handler */
+void exceptionHandler(int, void (*handler)(void));   
+
+
+/* Current uart used by gdb stub */
+static int uart_current = 0;
+
+/*
+ * Initialize glue code linking i386-stub with the rest of
+ * the system
+ */
+void
+i386_stub_glue_init(int uart)
+{
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+
+  uart_current = uart;
+
+  BSP_uart_init(uart, 38400, 0); 
+}
+
+void BSP_uart_on(const rtems_raw_irq_connect_data* used)
+{
+  BSP_irq_enable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
+}
+
+void BSP_uart_off(const rtems_raw_irq_connect_data* used)
+{
+  BSP_irq_disable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
+}
+
+int BSP_uart_isOn(const rtems_raw_irq_connect_data* used)
+{
+  return BSP_irq_enabled_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
+}
+
+
+/*
+ * In order to have a possibility to break into 
+ * running program, one has to call this function
+ */
+void i386_stub_glue_init_breakin(void)
+{
+  rtems_raw_irq_connect_data uart_raw_irq_data;
+
+  assert(uart_current == BSP_UART_COM1 || uart_current == BSP_UART_COM2);
+
+  if(uart_current == BSP_UART_COM1)
+    {
+      uart_raw_irq_data.idtIndex = BSP_UART_COM1_IRQ + BSP_IRQ_VECTOR_BASE;
+    }
+  else
+    {
+      uart_raw_irq_data.idtIndex = BSP_UART_COM2_IRQ + BSP_IRQ_VECTOR_BASE;
+    }
+
+  if(!i386_get_current_idt_entry(&uart_raw_irq_data)) 
+    {
+      printk("cannot get idt entry\n");
+      rtems_fatal_error_occurred(1);
+    }
+
+  if(!i386_delete_idt_entry(&uart_raw_irq_data)) 
+    {
+      printk("cannot delete idt entry\n");
+      rtems_fatal_error_occurred(1);
+    }
+
+  uart_raw_irq_data.on  = BSP_uart_on;
+  uart_raw_irq_data.off = BSP_uart_off;
+  uart_raw_irq_data.isOn= BSP_uart_isOn;
+
+  /* Install ISR  */
+  if(uart_current == BSP_UART_COM1)
+    {
+      uart_raw_irq_data.idtIndex = BSP_UART_COM1_IRQ + BSP_IRQ_VECTOR_BASE;
+      uart_raw_irq_data.hdl = BSP_uart_dbgisr_com1;
+    }
+  else
+    {
+      uart_raw_irq_data.idtIndex = BSP_UART_COM2_IRQ + BSP_IRQ_VECTOR_BASE;
+      uart_raw_irq_data.hdl = BSP_uart_dbgisr_com2;
+    }
+
+  if (!i386_set_idt_entry (&uart_raw_irq_data)) 
+    {
+      printk("raw exception handler connection failed\n");
+      rtems_fatal_error_occurred(1);
+    }
+  
+  /* Enable interrupts */
+  BSP_uart_intr_ctrl(uart_current, BSP_UART_INTR_CTRL_GDB);
+
+  return;
+}
+
+
+int
+putDebugChar(int ch)
+{
+  assert(uart_current == BSP_UART_COM1 || uart_current == BSP_UART_COM2);
+
+  BSP_uart_polled_write(uart_current, ch);
+
+  return 1;
+}
+
+int getDebugChar(void)
+{
+  int val;
+
+  assert(uart_current == BSP_UART_COM1 || uart_current == BSP_UART_COM2);
+
+  val = BSP_uart_polled_read(uart_current);
+
+  return val;
+}
+
+static void nop(){}
+static int isOn() {return 1;}
+
+void exceptionHandler(int vector, void (*handler)(void))
+{
+  rtems_raw_irq_connect_data excep_raw_irq_data;
+
+  excep_raw_irq_data.idtIndex = vector;
+
+  if(!i386_get_current_idt_entry(&excep_raw_irq_data)) 
+    {
+      printk("cannot get idt entry\n");
+      rtems_fatal_error_occurred(1);
+    }
+
+  if(!i386_delete_idt_entry(&excep_raw_irq_data)) 
+    {
+      printk("cannot delete idt entry\n");
+      rtems_fatal_error_occurred(1);
+    }
+
+  excep_raw_irq_data.on = nop;
+  excep_raw_irq_data.off = nop;
+  excep_raw_irq_data.isOn = isOn;
+  excep_raw_irq_data.hdl = handler;
+
+  if (!i386_set_idt_entry (&excep_raw_irq_data)) {
+      printk("raw exception handler connection failed\n");
+      rtems_fatal_error_occurred(1);
+    }
+  return;
+}
+
+
+
+  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: c/src/lib/libbsp/i386/shared/comm/i386-stub.c
===================================================================
--- c/src/lib/libbsp/i386/shared/comm/i386-stub.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/comm/i386-stub.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,937 @@
+/*
+ *  This is the gdb i386 remote debug stub from gdb 4.XX.
+ *
+ *  $Id$
+ */
+
+/****************************************************************************
+  
+  THIS SOFTWARE IS NOT COPYRIGHTED
+  
+  HP offers the following for use in the public domain.  HP makes no
+  warranty with regard to the software or it's performance and the
+  user accepts the software "AS IS" with all faults.
+  
+  HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
+  TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+  
+  ****************************************************************************/
+
+/****************************************************************************
+ *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
+ *
+ *  Module name: remcom.c $
+ *  Revision: 1.34 $
+ *  Date: 91/03/09 12:29:49 $
+ *  Contributor:     Lake Stevens Instrument Division$
+ *
+ *  Description:     low level support for gdb debugger. $
+ *
+ *  Considerations:  only works on target hardware $
+ *
+ *  Written by:      Glenn Engel $
+ *  ModuleState:     Experimental $
+ *
+ *  NOTES:           See Below $
+ *
+ *  Modified for 386 by Jim Kingdon, Cygnus Support.
+ *  Modified for RTEMS by Aleksey Romanov, Quality Quorum, Inc.
+ *
+ *  To enable debugger support, two things need to happen.  One, a
+ *  call to set_debug_traps() is necessary in order to allow any breakpoints
+ *  or error conditions to be properly intercepted and reported to gdb.
+ *  Two, a breakpoint needs to be generated to begin communication.  This
+ *  is most easily accomplished by a call to breakpoint().  Breakpoint()
+ *  simulates a breakpoint by executing a trap #1.
+ *
+ *  The external function exceptionHandler() is
+ *  used to attach a specific handler to a specific 386 vector number.
+ *  It should use the same privilege level it runs at.  It should
+ *  install it as an interrupt gate so that interrupts are masked
+ *  while the handler runs.
+ *  Also, need to assign exceptionHook and oldExceptionHook.
+ *
+ *  Because gdb will sometimes write to the stack area to execute function
+ *  calls, this program cannot rely on using the supervisor stack so it
+ *  uses it's own stack area reserved in the int array remcomStack.
+ *
+ *************
+ *
+ *    The following gdb commands are supported:
+ *
+ * command          function                               Return value
+ *
+ *    g             return the value of the CPU registers  hex data or ENN
+ *    G             set the value of the CPU registers     OK or ENN
+ *
+ *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
+ *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
+ *
+ *    c             Resume at current address              SNN   ( signal NN)
+ *    cAA..AA       Continue at address AA..AA             SNN
+ *
+ *    s             Step one instruction                   SNN
+ *    sAA..AA       Step one instruction from AA..AA       SNN
+ *
+ *    k             kill
+ *
+ *    ?             What was the last sigval ?             SNN   (signal NN)
+ *
+ * All commands and responses are sent with a packet which includes a
+ * checksum.  A packet consists of
+ *
+ * $<packet info>#<checksum>.
+ *
+ * where
+ * <packet info> :: <characters representing the command or response>
+ * <checksum>    :: < two hex digits computed as modulo 256 sum of <packetinfo>>
+ *
+ * When a packet is received, it is first acknowledged with either '+' or '-'.
+ * '+' indicates a successful transfer.  '-' indicates a failed transfer.
+ *
+ * Example:
+ *
+ * Host:                  Reply:
+ * $m0,10#2a               +$00010203040506070809101112131415#42
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+/************************************************************************
+ *
+ * external low-level support routines
+ */
+extern int putDebugChar (int ch);	   /* write a single character      */
+extern int getDebugChar (void);	           /* read and return a single char */
+
+/* assign an exception handler */
+extern void exceptionHandler (int, void (*handler) (void));
+
+/************************************************************************/
+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers */
+/* at least NUMREGBYTES*2 are needed for register packets */
+#define BUFMAX 400
+
+static char initialized;	/* boolean flag. != 0 means we've been initialized */
+
+int remote_debug;
+/*  debug >  0 prints ill-formed commands in valid packets & checksum errors */
+
+void waitabit ();
+
+static const char hexchars[] = "0123456789abcdef";
+
+/* Number of bytes of registers.  */
+#define NUMREGBYTES 64
+enum regnames
+  {
+    EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
+    PC /* also known as eip */ ,
+    PS /* also known as eflags */ ,
+    CS, SS, DS, ES, FS, GS
+  };
+
+/*
+ * these should not be static cuz they can be used outside this module
+ */
+int registers[NUMREGBYTES / 4];
+
+#define STACKSIZE 10000
+int remcomStack[STACKSIZE / sizeof (int)];
+static int *stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1];
+
+/***************************  ASSEMBLY CODE MACROS *************************/
+/*                                                                         */
+
+extern void
+  return_to_prog (void);
+
+/* Restore the program's registers (including the stack pointer, which
+   means we get the right stack and don't have to worry about popping our
+   return address and any stack frames and so on) and return.  */
+asm (".text");
+asm (".globl return_to_prog");
+asm ("return_to_prog:");
+asm ("        movw registers+44, %ss");
+asm ("        movl registers+16, %esp");
+asm ("        movl registers+4, %ecx");
+asm ("        movl registers+8, %edx");
+asm ("        movl registers+12, %ebx");
+asm ("        movl registers+20, %ebp");
+asm ("        movl registers+24, %esi");
+asm ("        movl registers+28, %edi");
+asm ("        movw registers+48, %ds");
+asm ("        movw registers+52, %es");
+asm ("        movw registers+56, %fs");
+asm ("        movw registers+60, %gs");
+asm ("        movl registers+36, %eax");
+asm ("        pushl %eax");	/* saved eflags */
+asm ("        movl registers+40, %eax");
+asm ("        pushl %eax");	/* saved cs */
+asm ("        movl registers+32, %eax");
+asm ("        pushl %eax");	/* saved eip */
+asm ("        movl registers, %eax");
+/* use iret to restore pc and flags together so
+   that trace flag works right.  */
+asm ("        iret");
+
+#define BREAKPOINT() asm("   int $3");
+
+/* Put the error code here just in case the user cares.  */
+int gdb_i386errcode;
+/* Likewise, the vector number here (since GDB only gets the signal
+   number through the usual means, and that's not very specific).  */
+int gdb_i386vector = -1;
+
+/* GDB stores segment registers in 32-bit words (that's just the way
+   m-i386v.h is written).  So zero the appropriate areas in registers.  */
+#define SAVE_REGISTERS1() \
+  asm ("movl %eax, registers");                                   	  \
+  asm ("movl %ecx, registers+4");			  		     \
+  asm ("movl %edx, registers+8");			  		     \
+  asm ("movl %ebx, registers+12");			  		     \
+  asm ("movl %ebp, registers+20");			  		     \
+  asm ("movl %esi, registers+24");			  		     \
+  asm ("movl %edi, registers+28");			  		     \
+  asm ("movw $0, %ax");							     \
+  asm ("movw %ds, registers+48");			  		     \
+  asm ("movw %ax, registers+50");					     \
+  asm ("movw %es, registers+52");			  		     \
+  asm ("movw %ax, registers+54");					     \
+  asm ("movw %fs, registers+56");			  		     \
+  asm ("movw %ax, registers+58");					     \
+  asm ("movw %gs, registers+60");			  		     \
+  asm ("movw %ax, registers+62");
+#define SAVE_ERRCODE() \
+  asm ("popl %ebx");                                  \
+  asm ("movl %ebx, gdb_i386errcode");
+#define SAVE_REGISTERS2() \
+  asm ("popl %ebx"); /* old eip */			  		     \
+  asm ("movl %ebx, registers+32");			  		     \
+  asm ("popl %ebx");	 /* old cs */			  		     \
+  asm ("movl %ebx, registers+40");			  		     \
+  asm ("movw %ax, registers+42");                                           \
+  asm ("popl %ebx");	 /* old eflags */		  		     \
+  asm ("movl %ebx, registers+36");			 		     \
+  /* Now that we've done the pops, we can save the stack pointer.");  */   \
+  asm ("movw %ss, registers+44");					     \
+  asm ("movw %ax, registers+46");     	       	       	       	       	     \
+  asm ("movl %esp, registers+16");
+
+/* See if mem_fault_routine is set, if so just IRET to that address.  */
+#define CHECK_FAULT() \
+  asm ("cmpl $0, mem_fault_routine");					   \
+  asm ("jne mem_fault");
+
+asm (".text");
+asm ("mem_fault:");
+/* OK to clobber temp registers; we're just going to end up in set_mem_err.  */
+/* Pop error code from the stack and save it.  */
+asm ("     popl %eax");
+asm ("     movl %eax, gdb_i386errcode");
+
+asm ("     popl %eax");		/* eip */
+/* We don't want to return there, we want to return to the function
+   pointed to by mem_fault_routine instead.  */
+asm ("     movl mem_fault_routine, %eax");
+asm ("     popl %ecx");		/* cs (low 16 bits; junk in hi 16 bits).  */
+asm ("     popl %edx");		/* eflags */
+
+/* Remove this stack frame; when we do the iret, we will be going to
+   the start of a function, so we want the stack to look just like it
+   would after a "call" instruction.  */
+asm ("     leave");
+
+/* Push the stuff that iret wants.  */
+asm ("     pushl %edx");	/* eflags */
+asm ("     pushl %ecx");	/* cs */
+asm ("     pushl %eax");	/* eip */
+
+/* Zero mem_fault_routine.  */
+asm ("     movl $0, %eax");
+asm ("     movl %eax, mem_fault_routine");
+
+asm ("iret");
+
+#define CALL_HOOK() asm("call _remcomHandler");
+
+/* This function is called when a i386 exception occurs.  It saves
+ * all the cpu regs in the registers array, munges the stack a bit,
+ * and invokes an exception handler (remcom_handler).
+ *
+ * stack on entry:                       stack on exit:
+ *   old eflags                          vector number
+ *   old cs (zero-filled to 32 bits)
+ *   old eip
+ *
+ */
+extern void _catchException3 ();
+asm (".text");
+asm (".globl _catchException3");
+asm ("_catchException3:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $3");
+CALL_HOOK ();
+
+/* Same thing for exception 1.  */
+extern void _catchException1 ();
+asm (".text");
+asm (".globl _catchException1");
+asm ("_catchException1:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $1");
+CALL_HOOK ();
+
+/* Same thing for exception 0.  */
+extern void _catchException0 ();
+asm (".text");
+asm (".globl _catchException0");
+asm ("_catchException0:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $0");
+CALL_HOOK ();
+
+/* Same thing for exception 4.  */
+extern void _catchException4 ();
+asm (".text");
+asm (".globl _catchException4");
+asm ("_catchException4:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $4");
+CALL_HOOK ();
+
+/* Same thing for exception 5.  */
+extern void _catchException5 ();
+asm (".text");
+asm (".globl _catchException5");
+asm ("_catchException5:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $5");
+CALL_HOOK ();
+
+/* Same thing for exception 6.  */
+extern void _catchException6 ();
+asm (".text");
+asm (".globl _catchException6");
+asm ("_catchException6:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $6");
+CALL_HOOK ();
+
+/* Same thing for exception 7.  */
+extern void _catchException7 ();
+asm (".text");
+asm (".globl _catchException7");
+asm ("_catchException7:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $7");
+CALL_HOOK ();
+
+/* Same thing for exception 8.  */
+extern void _catchException8 ();
+asm (".text");
+asm (".globl _catchException8");
+asm ("_catchException8:");
+SAVE_REGISTERS1 ();
+SAVE_ERRCODE ();
+SAVE_REGISTERS2 ();
+asm ("pushl $8");
+CALL_HOOK ();
+
+/* Same thing for exception 9.  */
+extern void _catchException9 ();
+asm (".text");
+asm (".globl _catchException9");
+asm ("_catchException9:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $9");
+CALL_HOOK ();
+
+/* Same thing for exception 10.  */
+extern void _catchException10 ();
+asm (".text");
+asm (".globl _catchException10");
+asm ("_catchException10:");
+SAVE_REGISTERS1 ();
+SAVE_ERRCODE ();
+SAVE_REGISTERS2 ();
+asm ("pushl $10");
+CALL_HOOK ();
+
+/* Same thing for exception 12.  */
+extern void _catchException12 ();
+asm (".text");
+asm (".globl _catchException12");
+asm ("_catchException12:");
+SAVE_REGISTERS1 ();
+SAVE_ERRCODE ();
+SAVE_REGISTERS2 ();
+asm ("pushl $12");
+CALL_HOOK ();
+
+/* Same thing for exception 16.  */
+extern void _catchException16 ();
+asm (".text");
+asm (".globl _catchException16");
+asm ("_catchException16:");
+SAVE_REGISTERS1 ();
+SAVE_REGISTERS2 ();
+asm ("pushl $16");
+CALL_HOOK ();
+
+/* For 13, 11, and 14 we have to deal with the CHECK_FAULT stuff.  */
+
+/* Same thing for exception 13.  */
+extern void _catchException13 ();
+asm (".text");
+asm (".globl _catchException13");
+asm ("_catchException13:");
+CHECK_FAULT ();
+SAVE_REGISTERS1 ();
+SAVE_ERRCODE ();
+SAVE_REGISTERS2 ();
+asm ("pushl $13");
+CALL_HOOK ();
+
+/* Same thing for exception 11.  */
+extern void _catchException11 ();
+asm (".text");
+asm (".globl _catchException11");
+asm ("_catchException11:");
+CHECK_FAULT ();
+SAVE_REGISTERS1 ();
+SAVE_ERRCODE ();
+SAVE_REGISTERS2 ();
+asm ("pushl $11");
+CALL_HOOK ();
+
+/* Same thing for exception 14.  */
+extern void _catchException14 ();
+asm (".text");
+asm (".globl _catchException14");
+asm ("_catchException14:");
+CHECK_FAULT ();
+SAVE_REGISTERS1 ();
+SAVE_ERRCODE ();
+SAVE_REGISTERS2 ();
+asm ("pushl $14");
+CALL_HOOK ();
+
+/*
+ * remcomHandler is a front end for handle_exception.  It moves the
+ * stack pointer into an area reserved for debugger use.
+ */
+asm ("_remcomHandler:");
+asm ("           popl %eax");	/* pop off return address     */
+asm ("           popl %eax");	/* get the exception number   */
+asm ("		movl stackPtr, %esp");	/* move to remcom stack area  */
+asm ("		pushl %eax");	/* push exception onto stack  */
+asm ("		call  handle_exception");	/* this never returns */
+
+void 
+_returnFromException (void)
+{
+  return_to_prog ();
+}
+
+int 
+hex (char ch)
+{
+  if ((ch >= 'a') && (ch <= 'f'))
+    return (ch - 'a' + 10);
+  if ((ch >= '0') && (ch <= '9'))
+    return (ch - '0');
+  if ((ch >= 'A') && (ch <= 'F'))
+    return (ch - 'A' + 10);
+  return (-1);
+}
+
+
+/* scan for the sequence $<data>#<checksum>     */
+void 
+getpacket (char *buffer)
+{
+  unsigned char checksum;
+  unsigned char xmitcsum;
+  int i;
+  int count;
+  char ch;
+
+  do
+    {
+      /* wait around for the start character, ignore all other characters */
+      while ((ch = (getDebugChar () & 0x7f)) != '$');
+      checksum = 0;
+      xmitcsum = -1;
+
+      count = 0;
+
+      /* now, read until a # or end of buffer is found */
+      while (count < BUFMAX)
+	{
+	  ch = getDebugChar () & 0x7f;
+	  if (ch == '#')
+	    break;
+	  checksum = checksum + ch;
+	  buffer[count] = ch;
+	  count = count + 1;
+	}
+      buffer[count] = 0;
+
+      if (ch == '#')
+	{
+	  xmitcsum = hex (getDebugChar () & 0x7f) << 4;
+	  xmitcsum += hex (getDebugChar () & 0x7f);
+	  if ((remote_debug) && (checksum != xmitcsum))
+	    {
+	      fprintf (stderr, "bad checksum.  My count = 0x%x, sent=0x%x. buf=%s\n",
+		       checksum, xmitcsum, buffer);
+	    }
+
+	  if (checksum != xmitcsum)
+	    putDebugChar ('-');	/* failed checksum */
+	  else
+	    {
+	      putDebugChar ('+');	/* successful transfer */
+	      /* if a sequence char is present, reply the sequence ID */
+	      if (buffer[2] == ':')
+		{
+		  putDebugChar (buffer[0]);
+		  putDebugChar (buffer[1]);
+		  /* remove sequence chars from buffer */
+		  count = strlen (buffer);
+		  for (i = 3; i <= count; i++)
+		    buffer[i - 3] = buffer[i];
+		}
+	    }
+	}
+    }
+  while (checksum != xmitcsum);
+
+}
+
+/* send the packet in buffer.  */
+
+
+void 
+putpacket (char *buffer)
+{
+  unsigned char checksum;
+  int count;
+  char ch;
+
+  /*  $<packet info>#<checksum>. */
+  do
+    {
+      putDebugChar ('$');
+      checksum = 0;
+      count = 0;
+
+      while ((ch = buffer[count]))
+	{
+	  if (!putDebugChar (ch))
+	    return;
+	  checksum += ch;
+	  count += 1;
+	}
+
+      putDebugChar ('#');
+      putDebugChar (hexchars[checksum >> 4]);
+      putDebugChar (hexchars[checksum % 16]);
+
+    }
+  while ((getDebugChar () & 0x7f) != '+');
+
+}
+
+char remcomInBuffer[BUFMAX];
+char remcomOutBuffer[BUFMAX];
+static short error;
+
+void 
+debug_error (format, parm)
+     char *format;
+     char *parm;
+{
+  if (remote_debug)
+    fprintf (stderr, format, parm);
+}
+
+/* Address of a routine to RTE to if we get a memory fault.  */
+static void (*volatile mem_fault_routine) (void) = NULL;
+
+/* Indicate to caller of mem2hex or hex2mem that there has been an
+   error.  */
+static volatile int mem_err = 0;
+
+void
+set_mem_err (void)
+{
+  mem_err = 1;
+}
+
+/* These are separate functions so that they are so short and sweet
+   that the compiler won't save any registers (if there is a fault
+   to mem_fault, they won't get restored, so there better not be any
+   saved).  */
+int
+get_char (char *addr)
+{
+  return *addr;
+}
+
+void
+set_char (char *addr, int val)
+{
+  *addr = val;
+}
+
+/* convert the memory pointed to by mem into hex, placing result in buf */
+/* return a pointer to the last char put in buf (null) */
+/* If MAY_FAULT is non-zero, then we should set mem_err in response to
+   a fault; if zero treat a fault like any other fault in the stub.  */
+char *
+mem2hex (char *mem, char *buf, int count, int may_fault)
+{
+  int i;
+  unsigned char ch;
+
+  if (may_fault)
+    mem_fault_routine = set_mem_err;
+  for (i = 0; i < count; i++)
+    {
+      ch = get_char (mem++);
+      if (may_fault && mem_err)
+	return (buf);
+      *buf++ = hexchars[ch >> 4];
+      *buf++ = hexchars[ch % 16];
+    }
+  *buf = 0;
+  if (may_fault)
+    mem_fault_routine = NULL;
+  return (buf);
+}
+
+/* convert the hex array pointed to by buf into binary to be placed in mem */
+/* return a pointer to the character AFTER the last byte written */
+char *
+hex2mem (char *buf, char *mem, int count, int may_fault)
+{
+  int i;
+  unsigned char ch;
+
+  if (may_fault)
+    mem_fault_routine = set_mem_err;
+  for (i = 0; i < count; i++)
+    {
+      ch = hex (*buf++) << 4;
+      ch = ch + hex (*buf++);
+      set_char (mem++, ch);
+      if (may_fault && mem_err)
+	return (mem);
+    }
+  if (may_fault)
+    mem_fault_routine = NULL;
+  return (mem);
+}
+
+/* this function takes the 386 exception vector and attempts to
+   translate this number into a unix compatible signal value */
+int 
+computeSignal (int exceptionVector)
+{
+  int sigval;
+  switch (exceptionVector)
+    {
+    case 0:
+      sigval = 8;
+      break;			/* divide by zero */
+    case 1:
+      sigval = 5;
+      break;			/* debug exception */
+    case 3:
+      sigval = 5;
+      break;			/* breakpoint */
+    case 4:
+      sigval = 16;
+      break;			/* into instruction (overflow) */
+    case 5:
+      sigval = 16;
+      break;			/* bound instruction */
+    case 6:
+      sigval = 4;
+      break;			/* Invalid opcode */
+    case 7:
+      sigval = 8;
+      break;			/* coprocessor not available */
+    case 8:
+      sigval = 7;
+      break;			/* double fault */
+    case 9:
+      sigval = 11;
+      break;			/* coprocessor segment overrun */
+    case 10:
+      sigval = 11;
+      break;			/* Invalid TSS */
+    case 11:
+      sigval = 11;
+      break;			/* Segment not present */
+    case 12:
+      sigval = 11;
+      break;			/* stack exception */
+    case 13:
+      sigval = 11;
+      break;			/* general protection */
+    case 14:
+      sigval = 11;
+      break;			/* page fault */
+    case 16:
+      sigval = 7;
+      break;			/* coprocessor error */
+    default:
+      sigval = 7;		/* "software generated" */
+    }
+  return (sigval);
+}
+
+/**********************************************/
+/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
+/* RETURN NUMBER OF CHARS PROCESSED           */
+/**********************************************/
+int 
+hexToInt (char **ptr, int *intValue)
+{
+  int numChars = 0;
+  int hexValue;
+
+  *intValue = 0;
+
+  while (**ptr)
+    {
+      hexValue = hex (**ptr);
+      if (hexValue >= 0)
+	{
+	  *intValue = (*intValue << 4) | hexValue;
+	  numChars++;
+	}
+      else
+	break;
+
+      (*ptr)++;
+    }
+
+  return (numChars);
+}
+
+/*
+ * This function does all command procesing for interfacing to gdb.
+ */
+void 
+handle_exception (int exceptionVector)
+{
+  int sigval;
+  int addr, length;
+  char *ptr;
+  int newPC;
+
+  gdb_i386vector = exceptionVector;
+
+  if (remote_debug)
+    printf ("vector=%d, sr=0x%x, pc=0x%x\n",
+	    exceptionVector,
+	    registers[PS],
+	    registers[PC]);
+
+  /* reply to host that an exception has occurred */
+  sigval = computeSignal (exceptionVector);
+  remcomOutBuffer[0] = 'S';
+  remcomOutBuffer[1] = hexchars[sigval >> 4];
+  remcomOutBuffer[2] = hexchars[sigval % 16];
+  remcomOutBuffer[3] = 0;
+
+  putpacket (remcomOutBuffer);
+
+  while (1 == 1)
+    {
+      error = 0;
+      remcomOutBuffer[0] = 0;
+      getpacket (remcomInBuffer);
+      switch (remcomInBuffer[0])
+	{
+	case '?':
+	  remcomOutBuffer[0] = 'S';
+	  remcomOutBuffer[1] = hexchars[sigval >> 4];
+	  remcomOutBuffer[2] = hexchars[sigval % 16];
+	  remcomOutBuffer[3] = 0;
+	  break;
+	case 'd':
+	  remote_debug = !(remote_debug);	/* toggle debug flag */
+	  break;
+	case 'g':		/* return the value of the CPU registers */
+	  mem2hex ((char *) registers, remcomOutBuffer, NUMREGBYTES, 0);
+	  break;
+	case 'G':		/* set the value of the CPU registers - return OK */
+	  hex2mem (&remcomInBuffer[1], (char *) registers, NUMREGBYTES, 0);
+	  strcpy (remcomOutBuffer, "OK");
+	  break;
+
+	  /* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
+	case 'm':
+	  /* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
+	  ptr = &remcomInBuffer[1];
+	  if (hexToInt (&ptr, &addr))
+	    if (*(ptr++) == ',')
+	      if (hexToInt (&ptr, &length))
+		{
+		  ptr = 0;
+		  mem_err = 0;
+		  mem2hex ((char *) addr, remcomOutBuffer, length, 1);
+		  if (mem_err)
+		    {
+		      strcpy (remcomOutBuffer, "E03");
+		      debug_error ("memory fault");
+		    }
+		}
+
+	  if (ptr)
+	    {
+	      strcpy (remcomOutBuffer, "E01");
+	      debug_error ("malformed read memory command: %s", remcomInBuffer);
+	    }
+	  break;
+
+	  /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
+	case 'M':
+	  /* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
+	  ptr = &remcomInBuffer[1];
+	  if (hexToInt (&ptr, &addr))
+	    if (*(ptr++) == ',')
+	      if (hexToInt (&ptr, &length))
+		if (*(ptr++) == ':')
+		  {
+		    mem_err = 0;
+		    hex2mem (ptr, (char *) addr, length, 1);
+
+		    if (mem_err)
+		      {
+			strcpy (remcomOutBuffer, "E03");
+			debug_error ("memory fault");
+		      }
+		    else
+		      {
+			strcpy (remcomOutBuffer, "OK");
+		      }
+
+		    ptr = 0;
+		  }
+	  if (ptr)
+	    {
+	      strcpy (remcomOutBuffer, "E02");
+	      debug_error ("malformed write memory command: %s", remcomInBuffer);
+	    }
+	  break;
+
+	  /* cAA..AA    Continue at address AA..AA(optional) */
+	  /* sAA..AA   Step one instruction from AA..AA(optional) */
+	case 'c':
+	case 's':
+	  /* try to read optional parameter, pc unchanged if no parm */
+	  ptr = &remcomInBuffer[1];
+	  if (hexToInt (&ptr, &addr))
+	    registers[PC] = addr;
+
+	  newPC = registers[PC];
+
+	  /* clear the trace bit */
+	  registers[PS] &= 0xfffffeff;
+
+	  /* set the trace bit if we're stepping */
+	  if (remcomInBuffer[0] == 's')
+	    registers[PS] |= 0x100;
+
+	  _returnFromException ();	/* this is a jump */
+
+	  break;
+
+	  /* kill the program */
+	case 'k':		/* do nothing */
+	  break;
+	}			/* switch */
+
+      /* reply to the request */
+      putpacket (remcomOutBuffer);
+    }
+}
+
+/* this function is used to set up exception handlers for tracing and
+   breakpoints */
+void 
+set_debug_traps (void)
+{
+  extern void remcomHandler ();
+
+  stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1];
+
+  exceptionHandler (0, _catchException0);
+  exceptionHandler (1, _catchException1);
+  exceptionHandler (3, _catchException3);
+  exceptionHandler (4, _catchException4);
+  exceptionHandler (5, _catchException5);
+  exceptionHandler (6, _catchException6);
+  exceptionHandler (7, _catchException7);
+  exceptionHandler (8, _catchException8);
+  exceptionHandler (9, _catchException9);
+  exceptionHandler (10, _catchException10);
+  exceptionHandler (11, _catchException11);
+  exceptionHandler (12, _catchException12);
+  exceptionHandler (13, _catchException13);
+  exceptionHandler (14, _catchException14);
+  exceptionHandler (16, _catchException16);
+
+  /* In case GDB is started before us, ack any packets (presumably
+     "$?#xx") sitting there.  */
+  putDebugChar ('+');
+
+  initialized = 1;
+
+}
+
+/* This function will generate a breakpoint exception.  It is used at the
+   beginning of a program to sync up with a debugger and can be used
+   otherwise as a quick means to stop program execution and "break" into
+   the debugger. */
+
+void 
+breakpoint (void)
+{
+  if (initialized)
+    {
+      BREAKPOINT ();
+    }
+  waitabit ();
+}
+
+int waitlimit = 1000000;
+
+void
+waitabit (void)
+{
+  int i;
+  for (i = 0; i < waitlimit; i++);
+}
+
+
+
+
+
Index: c/src/lib/libbsp/i386/shared/comm/uart.c
===================================================================
--- c/src/lib/libbsp/i386/shared/comm/uart.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/comm/uart.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,935 @@
+/*
+ * This software is Copyright (C) 1998 by T.sqware - all rights limited
+ * It is provided in to the public domain "as is", can be freely modified
+ * as far as this copyight notice is kept unchanged, but does not imply
+ * an endorsement by T.sqware of the product in which it is included.
+ *
+ *  $Id$
+ */
+
+#include <bsp.h>
+#include <irq.h>
+#include <uart.h>
+#include <rtems/libio.h>
+#include <assert.h>
+
+/*
+ * Basic 16552 driver
+ */
+
+struct uart_data
+{
+  int hwFlow;
+  int baud;
+};
+
+static struct uart_data uart_data[2];
+
+/* 
+ * Macros to read/wirte register of uart, if configuration is
+ * different just rewrite these macros
+ */ 
+
+static inline unsigned char
+uread(int uart, unsigned int reg)
+{
+  register unsigned char val;
+
+  if(uart == 0)
+    {
+      i386_inport_byte(COM1_BASE_IO+reg, val);
+    }
+  else
+    {
+      i386_inport_byte(COM2_BASE_IO+reg, val);
+    }
+
+  return val;
+}
+
+static inline void      
+uwrite(int uart, int reg, unsigned int val)
+{
+  if(uart == 0)
+    {
+      i386_outport_byte(COM1_BASE_IO+reg, val);
+    } 
+  else
+    {
+      i386_outport_byte(COM2_BASE_IO+reg, val);
+    }
+}
+
+#ifdef UARTDEBUG
+    static void
+uartError(int uart)
+{
+  unsigned char uartStatus, dummy;
+
+  uartStatus = uread(uart, LSR);
+  dummy = uread(uart, RBR);
+
+  if (uartStatus & OE)
+    printk("********* Over run Error **********\n");
+  if (uartStatus & PE)
+    printk("********* Parity Error   **********\n");
+  if (uartStatus & FE)
+    printk("********* Framing Error  **********\n");
+  if (uartStatus & BI)
+    printk("********* Parity Error   **********\n");
+  if (uartStatus & ERFIFO)
+    printk("********* Error receive Fifo **********\n");
+
+}
+#else
+inline void uartError(int uart)
+{
+  unsigned char uartStatus;
+  
+  uartStatus = uread(uart, LSR);
+  uartStatus = uread(uart, RBR);
+}
+#endif
+
+/* 
+ * Uart initialization, it is hardcoded to 8 bit, no parity,
+ * one stop bit, FIFO, things to be changed
+ * are baud rate and nad hw flow control,
+ * and longest rx fifo setting
+ */
+void
+BSP_uart_init(int uart, int baud, int hwFlow)
+{
+  unsigned char tmp;
+  
+  /* Sanity check */
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+  
+  switch(baud)
+    {
+    case 50:
+    case 75:
+    case 110:
+    case 134:
+    case 300:
+    case 600:
+    case 1200:
+    case 2400:
+    case 9600:
+    case 19200:
+    case 38400:
+    case 57600:
+    case 115200:
+      break;
+    default:
+      assert(0);
+      return;
+    }
+  
+  /* Set DLAB bit to 1 */
+  uwrite(uart, LCR, DLAB);
+  
+  /* Set baud rate */
+  uwrite(uart, DLL,  (BSPBaseBaud/baud) & 0xff); 
+  uwrite(uart, DLM,  ((BSPBaseBaud/baud) >> 8) & 0xff); 
+
+  /* 8-bit, no parity , 1 stop */
+  uwrite(uart, LCR, CHR_8_BITS);
+  
+
+  /* Set DTR, RTS and OUT2 high */
+  uwrite(uart, MCR, DTR | RTS | OUT_2);
+
+  /* Enable FIFO */
+  uwrite(uart, FCR, FIFO_EN | XMIT_RESET | RCV_RESET | RECEIVE_FIFO_TRIGGER12); 
+
+  /* Disable Interrupts */
+  uwrite(uart, IER, 0);
+
+  /* Read status to clear them */
+  tmp = uread(uart, LSR);
+  tmp = uread(uart, RBR);
+  tmp = uread(uart, MSR);
+
+  /* Remember state */
+  uart_data[uart].hwFlow     = hwFlow;
+  uart_data[uart].baud       = baud;
+  return;
+}
+
+/* 
+ * Set baud
+ */
+void
+BSP_uart_set_baud(int uart, int baud)
+{
+  unsigned char mcr, ier;
+
+  /* Sanity check */
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+  
+  /* 
+   * This function may be called whenever TERMIOS parameters
+   * are changed, so we have to make sire that baud change is 
+   * indeed required
+   */
+
+  if(baud == uart_data[uart].baud)
+    {
+      return;
+    }
+
+  mcr = uread(uart, MCR);
+  ier = uread(uart, IER);
+
+  BSP_uart_init(uart, baud, uart_data[uart].hwFlow);
+
+  uwrite(uart, MCR, mcr);
+  uwrite(uart, IER, ier);
+  
+  return;
+}
+
+/*
+ * Enable/disable interrupts 
+ */
+void 
+BSP_uart_intr_ctrl(int uart, int cmd)
+{
+
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+
+  switch(cmd)
+    {
+    case BSP_UART_INTR_CTRL_DISABLE:
+      uwrite(uart, IER, INTERRUPT_DISABLE);
+      break;
+    case BSP_UART_INTR_CTRL_ENABLE:
+      if(uart_data[uart].hwFlow)
+	{
+	  uwrite(uart, IER,
+		 (RECEIVE_ENABLE  |
+		  TRANSMIT_ENABLE |
+		  RECEIVER_LINE_ST_ENABLE |
+		  MODEM_ENABLE
+		 )
+		);
+	}
+      else
+	{
+	  uwrite(uart, IER,
+		 (RECEIVE_ENABLE  |
+		  TRANSMIT_ENABLE |
+		  RECEIVER_LINE_ST_ENABLE
+		 )
+		);
+	}
+      break;
+    case BSP_UART_INTR_CTRL_TERMIOS:
+      if(uart_data[uart].hwFlow)
+	{
+	  uwrite(uart, IER,
+		 (RECEIVE_ENABLE  |
+		  RECEIVER_LINE_ST_ENABLE |
+		  MODEM_ENABLE
+		 )
+		);
+	}
+      else
+	{
+	  uwrite(uart, IER,
+		 (RECEIVE_ENABLE  |
+		  RECEIVER_LINE_ST_ENABLE
+		 )
+		);
+	}
+      break;
+    case BSP_UART_INTR_CTRL_GDB:
+      uwrite(uart, IER, RECEIVE_ENABLE);
+      break;
+    default:
+      assert(0);
+      break;
+    }
+ 
+  return;
+}
+
+void
+BSP_uart_throttle(int uart)
+{
+  unsigned int mcr;
+  
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+
+  if(!uart_data[uart].hwFlow)
+    {
+      /* Should not happen */
+      assert(0);
+      return;
+    }
+  mcr = uread (uart, MCR);
+  /* RTS down */
+  mcr &= ~RTS;
+  uwrite(uart, MCR, mcr);
+
+  return;
+}
+
+void
+BSP_uart_unthrottle(int uart)
+{
+  unsigned int mcr;
+
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+
+  if(!uart_data[uart].hwFlow)
+    {
+      /* Should not happen */
+      assert(0);
+      return;
+    }
+  mcr = uread (uart, MCR);
+  /* RTS up */
+  mcr |= RTS;
+  uwrite(uart, MCR, mcr);
+
+  return;
+}
+
+/*
+ * Status function, -1 if error
+ * detected, 0 if no received chars available,
+ * 1 if received char available, 2 if break
+ * is detected, it will eat break and error 
+ * chars. It ignores overruns - we cannot do 
+ * anything about - it execpt count statistics
+ * and we are not counting it.
+ */
+int 
+BSP_uart_polled_status(int uart)
+{
+  unsigned char val;
+
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+
+  val = uread(uart, LSR);
+
+  if(val & BI)
+    {
+      /* BREAK found, eat character */
+      uread(uart, RBR);
+      return BSP_UART_STATUS_BREAK;
+    }
+
+  if((val & (DR | OE | FE)) ==  1)
+    {
+      /* No error, character present */ 
+      return BSP_UART_STATUS_CHAR;
+    }
+
+  if((val & (DR | OE | FE)) == 0)
+    {
+      /* Nothing */
+      return BSP_UART_STATUS_NOCHAR;
+    }
+
+  /* 
+   * Framing or parity error
+   * eat character
+   */
+  uread(uart, RBR);
+ 
+  return BSP_UART_STATUS_ERROR;
+}
+
+
+/*
+ * Polled mode write function
+ */
+void 
+BSP_uart_polled_write(int uart, int val)
+{
+  unsigned char val1;
+  
+  /* Sanity check */
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+  
+  for(;;)
+    {
+      if((val1=uread(uart, LSR)) & THRE)
+	{
+	  break;
+	}
+    }
+
+  if(uart_data[uart].hwFlow)
+    {
+      for(;;)
+	{
+	  if(uread(uart, MSR) & CTS)
+	    {
+	      break;
+	    }
+	}
+    }
+
+  uwrite(uart, THR, val & 0xff);
+      
+  return;
+}
+
+void
+BSP_output_char_via_serial(int val)
+{
+  BSP_uart_polled_write(BSPConsolePort, val);
+  if (val == '\n') BSP_uart_polled_write(BSPConsolePort,'\r');
+}
+
+/* 
+ * Polled mode read function
+ */
+int 
+BSP_uart_polled_read(int uart)
+{
+  unsigned char val;
+
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+  
+  for(;;)
+    {
+      if(uread(uart, LSR) & DR)
+	{
+	  break;
+	}
+    }
+  
+  val = uread(uart, RBR);
+
+  return (int)(val & 0xff);
+}
+
+unsigned 
+BSP_poll_char_via_serial()
+{
+	return BSP_uart_polled_read(BSPConsolePort);
+}
+
+
+/* ================ Termios support  =================*/
+
+static volatile int  termios_stopped_com1        = 0;
+static volatile int  termios_tx_active_com1      = 0;
+static void*	     termios_ttyp_com1           = NULL;
+static char          termios_tx_hold_com1        = 0;
+static volatile char termios_tx_hold_valid_com1  = 0;
+
+static volatile int  termios_stopped_com2        = 0;
+static volatile int  termios_tx_active_com2      = 0;
+static void*	     termios_ttyp_com2           = NULL;
+static char          termios_tx_hold_com2        = 0;
+static volatile char termios_tx_hold_valid_com2  = 0;
+
+/*
+ * Set channel parameters 
+ */
+void
+BSP_uart_termios_set(int uart, void *ttyp)
+{
+  unsigned char val;
+  assert(uart == BSP_UART_COM1 || uart == BSP_UART_COM2);
+  
+  if(uart == BSP_UART_COM1)
+    {
+      if(uart_data[uart].hwFlow)
+	{
+	  val = uread(uart, MSR);
+
+	  termios_stopped_com1   = (val & CTS) ? 0 : 1;
+	}
+      else
+	{
+	  termios_stopped_com1 = 0;
+	}
+      termios_tx_active_com1      = 0;
+      termios_ttyp_com1           = ttyp;
+      termios_tx_hold_com1        = 0; 
+      termios_tx_hold_valid_com1  = 0;
+    }
+  else
+    {
+      if(uart_data[uart].hwFlow)
+	{
+	  val = uread(uart, MSR);
+
+	  termios_stopped_com2   = (val & CTS) ? 0 : 1;
+	}
+      else
+	{
+	  termios_stopped_com2 = 0;
+	}
+      termios_tx_active_com2      = 0;
+      termios_ttyp_com2           = ttyp;
+      termios_tx_hold_com2        = 0; 
+      termios_tx_hold_valid_com2  = 0;
+    }
+
+  return;
+}
+
+int
+BSP_uart_termios_write_com1(int minor, const char *buf, int len)
+{
+  assert(buf != NULL);
+
+  if(len <= 0)
+    {
+      return 0;
+    }
+
+  /* If there TX buffer is busy - something is royally screwed up */
+  assert((uread(BSP_UART_COM1, LSR) & THRE) != 0);
+
+  if(termios_stopped_com1)
+    {
+      /* CTS low */
+      termios_tx_hold_com1       = *buf;
+      termios_tx_hold_valid_com1 = 1;
+      return 0;
+    }
+
+  /* Write character */
+  uwrite(BSP_UART_COM1, THR, *buf & 0xff);
+
+  /* Enable interrupts if necessary */
+  if(!termios_tx_active_com1 && uart_data[BSP_UART_COM1].hwFlow)
+    {
+      termios_tx_active_com1 = 1;
+      uwrite(BSP_UART_COM1, IER,
+	     (RECEIVE_ENABLE  |
+	      TRANSMIT_ENABLE |
+	      RECEIVER_LINE_ST_ENABLE |
+	      MODEM_ENABLE
+	     )
+	    );
+    }
+  else if(!termios_tx_active_com1)
+    {
+      termios_tx_active_com1 = 1;
+      uwrite(BSP_UART_COM1, IER, 
+	     (RECEIVE_ENABLE  |
+	      TRANSMIT_ENABLE |
+	      RECEIVER_LINE_ST_ENABLE
+	     )
+	    );
+    }
+
+  return 0;
+}
+
+int
+BSP_uart_termios_write_com2(int minor, const char *buf, int len)
+{
+  assert(buf != NULL);
+
+  if(len <= 0)
+    {
+      return 0;
+    }
+
+
+  /* If there TX buffer is busy - something is royally screwed up */
+  assert((uread(BSP_UART_COM2, LSR) & THRE) != 0);
+
+  if(termios_stopped_com2)
+    {
+      /* CTS low */
+      termios_tx_hold_com2       = *buf;
+      termios_tx_hold_valid_com2 = 1;
+      return 0;
+    }
+
+  /* Write character */
+
+  uwrite(BSP_UART_COM2, THR, *buf & 0xff);
+
+  /* Enable interrupts if necessary */
+  if(!termios_tx_active_com2 && uart_data[BSP_UART_COM2].hwFlow)
+    {
+      termios_tx_active_com2 = 1;
+      uwrite(BSP_UART_COM2, IER,
+	     (RECEIVE_ENABLE  |
+	      TRANSMIT_ENABLE |
+	      RECEIVER_LINE_ST_ENABLE |
+	      MODEM_ENABLE
+	     )
+	    );
+    }
+  else if(!termios_tx_active_com2)
+    {
+      termios_tx_active_com2 = 1;
+      uwrite(BSP_UART_COM2, IER,
+	     (RECEIVE_ENABLE  |
+	      TRANSMIT_ENABLE |
+	      RECEIVER_LINE_ST_ENABLE
+	     )
+	    );
+    }
+
+  return 0;
+}
+
+
+void
+BSP_uart_termios_isr_com1(void)
+{
+  unsigned char buf[40];
+  unsigned char val;
+  int      off, ret, vect;
+
+  off = 0;
+
+  for(;;)
+    {
+      vect = uread(BSP_UART_COM1, IIR) & 0xf;
+      
+      switch(vect)
+	{
+	case MODEM_STATUS :
+	  val = uread(BSP_UART_COM1, MSR);
+	  if(uart_data[BSP_UART_COM1].hwFlow)
+	    {
+	      if(val & CTS)
+		{
+		  /* CTS high */
+		  termios_stopped_com1 = 0;
+		  if(termios_tx_hold_valid_com1)
+		    {
+		      termios_tx_hold_valid_com1 = 0;
+		      BSP_uart_termios_write_com1(0, &termios_tx_hold_com1,
+						    1);
+		    }
+		}
+	      else
+		{
+		  /* CTS low */
+		  termios_stopped_com1 = 1;
+		}
+	    }
+	  break;
+	case NO_MORE_INTR :
+	  /* No more interrupts */
+	  if(off != 0)
+	    {
+	      /* Update rx buffer */
+	      rtems_termios_enqueue_raw_characters(termios_ttyp_com1,
+						   (char *)buf,
+						   off);
+	    }
+	  return;
+	case TRANSMITTER_HODING_REGISTER_EMPTY :
+	  /* 
+	   * TX holding empty: we have to disable these interrupts 
+	   * if there is nothing more to send. 
+	   */
+
+	  ret = rtems_termios_dequeue_characters(termios_ttyp_com1, 1);
+
+	  /* If nothing else to send disable interrupts */
+	  if(ret == 0 && uart_data[BSP_UART_COM1].hwFlow)
+	    {
+	      uwrite(BSP_UART_COM1, IER,
+		     (RECEIVE_ENABLE  |
+		      RECEIVER_LINE_ST_ENABLE |
+		      MODEM_ENABLE
+		     )
+		    );
+              termios_tx_active_com1 = 0;
+	    }
+	  else if(ret == 0)
+	    {
+	      uwrite(BSP_UART_COM1, IER,
+		     (RECEIVE_ENABLE  |
+		      RECEIVER_LINE_ST_ENABLE
+		     )
+		    );
+              termios_tx_active_com1 = 0;
+	    }
+	  break;
+	case RECEIVER_DATA_AVAIL :
+	case CHARACTER_TIMEOUT_INDICATION:
+	  /* RX data ready */
+	  assert(off < sizeof(buf));
+	  buf[off++] = uread(BSP_UART_COM1, RBR);
+	  break;
+	case RECEIVER_ERROR:
+	  /* RX error: eat character */
+	   uartError(BSP_UART_COM1);
+	  break;
+	default:
+	  /* Should not happen */
+	  assert(0);
+	  return;
+	}
+    }
+}
+	  
+void
+BSP_uart_termios_isr_com2()
+{
+  unsigned char buf[40];
+  unsigned char val;
+  int      off, ret, vect;
+
+  off = 0;
+
+  for(;;)
+    {
+      vect = uread(BSP_UART_COM2, IIR) & 0xf;
+      
+      switch(vect)
+	{
+	case MODEM_STATUS :
+	  val = uread(BSP_UART_COM2, MSR);
+	  if(uart_data[BSP_UART_COM2].hwFlow)
+	    {
+	      if(val & CTS)
+		{
+		  /* CTS high */
+		  termios_stopped_com2 = 0;
+		  if(termios_tx_hold_valid_com2)
+		    {
+		      termios_tx_hold_valid_com2 = 0;
+		      BSP_uart_termios_write_com2(0, &termios_tx_hold_com2,
+						    1);
+		    }
+		}
+	      else
+		{
+		  /* CTS low */
+		  termios_stopped_com2 = 1;
+		}
+	    }
+	  break;
+	case NO_MORE_INTR :
+	  /* No more interrupts */
+	  if(off != 0)
+	    {
+	      /* Update rx buffer */
+	      rtems_termios_enqueue_raw_characters(termios_ttyp_com2,
+						   (char *)buf,
+						   off);
+	    }
+	  return;
+	case TRANSMITTER_HODING_REGISTER_EMPTY :
+	  /* 
+	   * TX holding empty: we have to disable these interrupts 
+	   * if there is nothing more to send.
+	   */
+
+	  ret = rtems_termios_dequeue_characters(termios_ttyp_com2, 1);
+
+	  /* If nothing else to send disable interrupts */
+	  if(ret == 0 && uart_data[BSP_UART_COM2].hwFlow)
+	    {
+	      uwrite(BSP_UART_COM2, IER,
+		     (RECEIVE_ENABLE  |
+		      RECEIVER_LINE_ST_ENABLE |
+		      MODEM_ENABLE
+		     )
+		    );
+              termios_tx_active_com2 = 0;
+	    }
+	  else if(ret == 0)
+	    {
+	      uwrite(BSP_UART_COM2, IER,
+		     (RECEIVE_ENABLE  |
+		      RECEIVER_LINE_ST_ENABLE
+		     )
+		    );
+              termios_tx_active_com2 = 0;
+	    }
+	  break;
+	case RECEIVER_DATA_AVAIL :
+	case CHARACTER_TIMEOUT_INDICATION:
+	  /* RX data ready */
+	  assert(off < sizeof(buf));
+	  buf[off++] = uread(BSP_UART_COM2, RBR);
+	  break;
+	case RECEIVER_ERROR:
+	  /* RX error: eat character */
+	   uartError(BSP_UART_COM2);
+	  break;
+	default:
+	  /* Should not happen */
+	  assert(0);
+	  return;
+	}
+    }
+}
+	  
+  
+/* ================= GDB support     ===================*/ 
+static int sav[4];
+
+/*
+ * Interrupt service routine for COM1 - all, 
+ * it does it check whether ^C is received
+ * if yes it will flip TF bit before returning
+ * Note: it should be installed as raw interrupt
+ * handler
+ */
+
+asm (".p2align 4");
+asm (".text");
+asm (".globl BSP_uart_dbgisr_com1");
+asm ("BSP_uart_dbgisr_com1:");
+asm ("    movl %eax, sav");          /* Save eax */
+asm ("    movl %ebx, sav + 4");      /* Save ebx */
+asm ("    movl %edx, sav + 8");      /* Save edx */
+
+asm ("    movl $0, %ebx");           /* Clear flag */
+
+/* 
+ * We know that only receive related interrupts
+ * are available, eat chars
+ */
+asm ("uart_dbgisr_com1_1:");
+asm ("    movw $0x3FD, %dx");
+asm ("    inb  %dx, %al"); /* Read LSR */
+asm ("    andb $1, %al");
+asm ("    cmpb $0, %al");
+asm ("    je   uart_dbgisr_com1_2");
+asm ("    movw $0x3F8, %dx");
+asm ("    inb  %dx, %al");    /* Get input character */
+asm ("    cmpb $3, %al");
+asm ("    jne  uart_dbgisr_com1_1");
+
+/* ^C received, set flag */ 
+asm ("    movl $1, %ebx");
+asm ("    jmp uart_dbgisr_com1_1");
+
+/* All chars read */
+asm ("uart_dbgisr_com1_2:");
+
+/* If flag is set we have to tweak TF */
+asm ("   cmpl $0, %ebx");
+asm ("   je   uart_dbgisr_com1_3");
+
+/* Flag is set */
+asm ("   movl sav+4, %ebx");     /* Restore ebx */
+asm ("   movl sav+8, %edx");     /* Restore edx */
+
+/* Set TF bit */
+asm ("   popl  %eax");           /* Pop eip */
+asm ("   movl  %eax, sav + 4");  /* Save it */
+asm ("   popl  %eax");           /* Pop cs */
+asm ("   movl  %eax, sav + 8");  /* Save it */
+asm ("   popl  %eax");           /* Pop flags */
+asm ("   orl   $0x100, %eax");   /* Modify it */
+asm ("   pushl %eax");           /* Push it back */
+asm ("   movl  sav+8, %eax");    /* Put back cs */
+asm ("   pushl %eax");
+asm ("   movl  sav+4, %eax");    /* Put back eip */
+asm ("   pushl %eax");
+
+/* Acknowledge IRQ */
+asm ("   movb  $0x20, %al");
+asm ("   outb  %al, $0x20");
+asm ("   movl  sav, %eax");      /* Restore eax */
+asm ("   iret");                 /* Done */
+
+/* Flag is not set */
+asm("uart_dbgisr_com1_3:");
+asm ("   movl sav+4, %ebx");     /* Restore ebx */
+asm ("   movl sav+8, %edx");     /* Restore edx */
+
+/* Acknowledge irq */
+asm ("   movb  $0x20, %al");
+asm ("   outb  %al, $0x20");
+asm ("   movl  sav, %eax");      /* Restore eax */
+asm ("   iret");                 /* Done */
+
+
+/*
+ * Interrupt service routine for COM2 - all, 
+ * it does it check whether ^C is received
+ * if yes it will flip TF bit before returning
+ * Note: it has to be installed as raw interrupt 
+ * handler
+ */
+asm (".p2align 4");
+asm (".text");
+asm (".globl BSP_uart_dbgisr_com2");
+asm ("BSP_uart_dbgisr_com2:");
+asm ("    movl %eax, sav");          /* Save eax */
+asm ("    movl %ebx, sav + 4");      /* Save ebx */
+asm ("    movl %edx, sav + 8");      /* Save edx */
+
+asm ("    movl $0, %ebx");           /* Clear flag */
+
+/* 
+ * We know that only receive related interrupts
+ * are available, eat chars
+ */
+asm ("uart_dbgisr_com2_1:");
+asm ("    movw $0x2FD, %dx");
+asm ("    inb  %dx, %al"); /* Read LSR */
+asm ("    andb $1, %al");
+asm ("    cmpb $0, %al");
+asm ("    je   uart_dbgisr_com2_2");
+asm ("    movw $0x2F8, %dx");
+asm ("    inb  %dx, %al");    /* Get input character */
+asm ("    cmpb $3, %al");
+asm ("    jne  uart_dbgisr_com2_1");
+
+/* ^C received, set flag */ 
+asm ("    movl $1, %ebx");
+asm ("    jmp uart_dbgisr_com2_1");
+
+/* All chars read */
+asm ("uart_dbgisr_com2_2:");
+
+/* If flag is set we have to tweak TF */
+asm ("   cmpl $0, %ebx");
+asm ("   je   uart_dbgisr_com2_3");
+
+/* Flag is set */
+asm ("   movl sav+4, %ebx");     /* Restore ebx */
+asm ("   movl sav+8, %edx");     /* Restore edx */
+
+/* Set TF bit */
+asm ("   popl  %eax");           /* Pop eip */
+asm ("   movl  %eax, sav + 4");  /* Save it */
+asm ("   popl  %eax");           /* Pop cs */
+asm ("   movl  %eax, sav + 8");  /* Save it */
+asm ("   popl  %eax");           /* Pop flags */
+asm ("   orl   $0x100, %eax");   /* Modify it */
+asm ("   pushl %eax");           /* Push it back */
+asm ("   movl  sav+8, %eax");    /* Put back cs */
+asm ("   pushl %eax");
+asm ("   movl  sav+4, %eax");    /* Put back eip */
+asm ("   pushl %eax");
+
+/* Acknowledge IRQ */
+asm ("   movb  $0x20, %al");
+asm ("   outb  %al, $0x20");
+asm ("   movl  sav, %eax");      /* Restore eax */
+asm ("   iret");                 /* Done */
+
+/* Flag is not set */
+asm("uart_dbgisr_com2_3:");
+asm ("   movl sav+4, %ebx");     /* Restore ebx */
+asm ("   movl sav+8, %edx");     /* Restore edx */
+
+/* Acknowledge irq */
+asm ("   movb  $0x20, %al");
+asm ("   outb  %al, $0x20");
+asm ("   movl  sav, %eax");      /* Restore eax */
+asm ("   iret");                 /* Done */
+
+
+
+
+
+
Index: c/src/lib/libbsp/i386/shared/comm/uart.h
===================================================================
--- c/src/lib/libbsp/i386/shared/comm/uart.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/comm/uart.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,169 @@
+
+
+/*
+ * This software is Copyright (C) 1998 by T.sqware - all rights limited
+ * It is provided in to the public domain "as is", can be freely modified
+ * as far as this copyight notice is kept unchanged, but does not imply
+ * an endorsement by T.sqware of the product in which it is included.
+ */
+
+#ifndef _BSPUART_H
+#define _BSPUART_H
+
+void BSP_uart_init(int uart, int baud, int hwFlow);
+void BSP_uart_set_baud(int aurt, int baud);
+void BSP_uart_intr_ctrl(int uart, int cmd);
+void BSP_uart_throttle(int uart);
+void BSP_uart_unthrottle(int uart);
+int  BSP_uart_polled_status(int uart);
+void BSP_uart_polled_write(int uart, int val);
+int  BSP_uart_polled_read(int uart);
+void BSP_uart_termios_set(int uart, void *ttyp);
+int  BSP_uart_termios_write_com1(int minor, const char *buf, int len);
+int  BSP_uart_termios_write_com2(int minor, const char *buf, int len);
+void BSP_uart_termios_isr_com1();
+void BSP_uart_termios_isr_com2();
+void BSP_uart_dbgisr_com1(void);
+void BSP_uart_dbgisr_com2(void);
+extern unsigned BSP_poll_char_via_serial(void);
+extern void BSP_output_char_via_serial(int val);
+extern int BSPConsolePort;
+extern int BSPBaseBaud;
+/*
+ * Command values for BSP_uart_intr_ctrl(),
+ * values are strange in order to catch errors 
+ * with assert
+ */
+#define BSP_UART_INTR_CTRL_DISABLE  (0)
+#define BSP_UART_INTR_CTRL_GDB      (0xaa) /* RX only */
+#define BSP_UART_INTR_CTRL_ENABLE   (0xbb) /* Normal operations */
+#define BSP_UART_INTR_CTRL_TERMIOS  (0xcc) /* RX & line status */
+
+/* Return values for uart_polled_status() */
+#define BSP_UART_STATUS_ERROR    (-1) /* No character */
+#define BSP_UART_STATUS_NOCHAR   (0)  /* No character */
+#define BSP_UART_STATUS_CHAR     (1)  /* Character present */
+#define BSP_UART_STATUS_BREAK    (2)  /* Break point is detected */
+
+/* PC UART definitions */
+#define BSP_UART_COM1            (0)
+#define BSP_UART_COM2            (1)
+
+/*
+ * Base IO for UART
+ */
+
+#define COM1_BASE_IO	0x3F8
+#define COM2_BASE_IO	0x2F8
+
+/*
+ * Offsets from base
+ */
+
+/* DLAB 0 */
+#define RBR  (0)    /* Rx Buffer Register (read) */
+#define THR  (0)    /* Tx Buffer Register (write) */
+#define IER  (1)    /* Interrupt Enable Register */
+
+/* DLAB X */
+#define IIR  (2)    /* Interrupt Ident Register (read) */
+#define FCR  (2)    /* FIFO Control Register (write) */
+#define LCR  (3)    /* Line Control Register */
+#define MCR  (4)    /* Modem Control Register */
+#define LSR  (5)    /* Line Status Register */
+#define MSR  (6)    /* Modem Status  Register */
+#define SCR  (7)    /* Scratch register */
+
+/* DLAB 1 */
+#define DLL  (0)    /* Divisor Latch, LSB */
+#define DLM  (1)    /* Divisor Latch, MSB */
+#define AFR  (2)    /* Alternate Function register */
+
+/*
+ * Interrupt source definition via IIR
+ */
+#define MODEM_STATUS				0
+#define NO_MORE_INTR				1
+#define TRANSMITTER_HODING_REGISTER_EMPTY	2
+#define RECEIVER_DATA_AVAIL			4
+#define RECEIVER_ERROR  			6
+#define CHARACTER_TIMEOUT_INDICATION		12
+
+/*
+ * Bits definition of IER
+ */
+#define	RECEIVE_ENABLE		0x1
+#define	TRANSMIT_ENABLE		0x2
+#define RECEIVER_LINE_ST_ENABLE	0x4
+#define MODEM_ENABLE	   	0x8
+#define INTERRUPT_DISABLE	0x0
+
+/*
+ * Bits definition of the Line Status Register (LSR)
+ */
+#define DR	0x01	/* Data Ready */
+#define OE	0x02	/* Overrun Error */
+#define PE	0x04	/* Parity Error */
+#define FE	0x08	/* Framing Error */
+#define BI	0x10	/* Break Interrupt */
+#define THRE	0x20	/* Transmitter Holding Register Empty */
+#define TEMT	0x40	/* Transmitter Empty */
+#define ERFIFO	0x80	/* Error receive Fifo */
+
+/*
+ * Bits definition of the MODEM Control Register (MCR)
+ */
+#define DTR	0x01	/* Data Terminal Ready */
+#define RTS 	0x02	/* Request To Send */
+#define OUT_1	0x04	/* Output 1, (reserved on COMPAQ I/O Board) */
+#define OUT_2	0x08	/* Output 2, Enable Asynchronous Port Interrupts */
+#define LB	0x10	/* Enable Internal Loop Back */
+
+/*
+ * Bits definition of the Line Control Register (LCR)
+ */
+#define CHR_5_BITS 0
+#define CHR_6_BITS 1
+#define CHR_7_BITS 2
+#define CHR_8_BITS 3
+
+#define WL	0x03	/* Word length mask */
+#define STB	0x04	/* 1 Stop Bit, otherwise 2 Stop Bits */
+#define PEN	0x08	/* Parity Enabled */
+#define EPS	0x10	/* Even Parity Select, otherwise Odd */
+#define SP	0x20	/* Stick Parity */
+#define BCB	0x40	/* Break Control Bit */
+#define DLAB	0x80	/* Enable Divisor Latch Access */
+
+/*
+ * Bits definition of the MODEM Status Register (MSR)
+ */
+#define DCTS	0x01	/* Delta Clear To Send */
+#define DDSR	0x02	/* Delta Data Set Ready */
+#define TERI	0x04 	/* Trailing Edge Ring Indicator */
+#define DDCD	0x08	/* Delta Carrier Detect Indicator */
+#define CTS  	0x10 	/* Clear To Send (when loop back is active) */
+#define DSR	0x20	/* Data Set Ready (when loop back is active) */
+#define RI  	0x40 	/* Ring Indicator (when loop back is active) */
+#define DCD	0x80	/* Data Carrier Detect (when loop back is active) */
+
+/*
+ * Bits definition of the FIFO Control Register : WD16C552 or NS16550
+ */
+
+#define FIFO_CTRL   0x01    /* Set to 1 permit access to other bits */
+#define FIFO_EN	    0x01    /* Enable the FIFO */
+#define XMIT_RESET  0x02    /* Transmit FIFO Reset */
+#define RCV_RESET   0x04    /* Receive FIFO Reset */
+#define FCR3	    0x08    /* do not understand manual! */
+
+#define RECEIVE_FIFO_TRIGGER1	0x0  /* trigger recieve interrupt after 1 byte  */
+#define RECEIVE_FIFO_TRIGGER4	0x40 /* trigger recieve interrupt after 4 byte  */
+#define RECEIVE_FIFO_TRIGGER8	0x80 /* trigger recieve interrupt after 8 byte  */
+#define RECEIVE_FIFO_TRIGGER12	0xc0 /* trigger recieve interrupt after 12 byte */
+#define TRIG_LEVEL  		0xc0 /* Mask for the trigger level 		*/
+
+#endif /* _BSPUART_H */
+
+
+
Index: c/src/lib/libbsp/i386/shared/irq/irq.c
===================================================================
--- c/src/lib/libbsp/i386/shared/irq/irq.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/shared/irq/irq.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -22,17 +22,17 @@
  * that must be disabled when a particular entry is activated.
  * They will be dynamically computed from teh prioruty table given
- * in pc386_rtems_irq_mngt_set();
+ * in BSP_rtems_irq_mngt_set();
  * CAUTION : this table is accessed directly by interrupt routine
  * 	     prologue.
  */
-rtems_i8259_masks 	irq_mask_or_tbl[PC_386_IRQ_LINES_NUMBER];
-
-/*
- * Copy of data given via initial pc386_rtems_irq_mngt_set() for
+rtems_i8259_masks 	irq_mask_or_tbl[BSP_IRQ_LINES_NUMBER];
+
+/*
+ * Copy of data given via initial BSP_rtems_irq_mngt_set() for
  * the sake of efficiency.
  * CAUTION : this table is accessed directly by interrupt routine
  * 	     prologue.
  */
-rtems_irq_hdl		current_irq[PC_386_IRQ_LINES_NUMBER];
+rtems_irq_hdl		current_irq[BSP_IRQ_LINES_NUMBER];
 /*
  * default handler connected on each irq after bsp initialization
@@ -57,5 +57,5 @@
 
 /*-------------------------------------------------------------------------+
-|         Function:  PC386_irq_disable_at_i8259s
+|         Function:  BSP_irq_disable_at_i8259s
 |      Description: Mask IRQ line in appropriate PIC chip.
 | Global Variables: i8259s_cache
@@ -63,11 +63,11 @@
 |          Returns: Nothing. 
 +--------------------------------------------------------------------------*/
-int pc386_irq_disable_at_i8259s    (const rtems_irq_symbolic_name irqLine)
+int BSP_irq_disable_at_i8259s    (const rtems_irq_symbolic_name irqLine)
 {
   unsigned short mask;
   unsigned int 	level;
 
-  if ( ((int)irqLine < PC_386_LOWEST_OFFSET) ||
-       ((int)irqLine > PC_386_MAX_OFFSET )
+  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
+       ((int)irqLine > BSP_MAX_OFFSET )
        )
     return 1;
@@ -92,5 +92,5 @@
 
 /*-------------------------------------------------------------------------+
-|         Function:  pc386_irq_enable_at_i8259s
+|         Function:  BSP_irq_enable_at_i8259s
 |      Description: Unmask IRQ line in appropriate PIC chip.
 | Global Variables: i8259s_cache
@@ -98,11 +98,11 @@
 |          Returns: Nothing. 
 +--------------------------------------------------------------------------*/
-int pc386_irq_enable_at_i8259s    (const rtems_irq_symbolic_name irqLine)
+int BSP_irq_enable_at_i8259s    (const rtems_irq_symbolic_name irqLine)
 {
   unsigned short mask;
   unsigned int 	level;
 
-  if ( ((int)irqLine < PC_386_LOWEST_OFFSET) ||
-       ((int)irqLine > PC_386_MAX_OFFSET )
+  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
+       ((int)irqLine > BSP_MAX_OFFSET )
        )
     return 1;
@@ -126,10 +126,10 @@
 } /* mask_irq */
 
-int pc386_irq_enabled_at_i8259s        	(const rtems_irq_symbolic_name irqLine)
+int BSP_irq_enabled_at_i8259s        	(const rtems_irq_symbolic_name irqLine)
 {
   unsigned short mask;
 
-  if ( ((int)irqLine < PC_386_LOWEST_OFFSET) ||
-       ((int)irqLine > PC_386_MAX_OFFSET )
+  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
+       ((int)irqLine > BSP_MAX_OFFSET )
      )
     return 1;
@@ -141,5 +141,5 @@
 
 /*-------------------------------------------------------------------------+
-|         Function: pc386_irq_ack_at_i8259s
+|         Function: BSP_irq_ack_at_i8259s
 |      Description: Signal generic End Of Interrupt (EOI) to appropriate PIC.
 | Global Variables: None.
@@ -147,8 +147,8 @@
 |          Returns: Nothing. 
 +--------------------------------------------------------------------------*/
-int pc386_irq_ack_at_i8259s  	(const rtems_irq_symbolic_name irqLine)
-{
-  if ( ((int)irqLine < PC_386_LOWEST_OFFSET) ||
-       ((int)irqLine > PC_386_MAX_OFFSET )
+int BSP_irq_ack_at_i8259s  	(const rtems_irq_symbolic_name irqLine)
+{
+  if ( ((int)irqLine < BSP_LOWEST_OFFSET) ||
+       ((int)irqLine > BSP_MAX_OFFSET )
        )
     return 1;
@@ -213,5 +213,5 @@
 static int isValidInterrupt(int irq)
 {
-  if ( (irq < PC_386_LOWEST_OFFSET) || (irq > PC_386_MAX_OFFSET))
+  if ( (irq < BSP_LOWEST_OFFSET) || (irq > BSP_MAX_OFFSET))
     return 0;
   return 1;
@@ -222,5 +222,5 @@
  */
 
-int pc386_install_rtems_irq_handler  (const rtems_irq_connect_data* irq)
+int BSP_install_rtems_irq_handler  (const rtems_irq_connect_data* irq)
 {
     unsigned int level;
@@ -252,5 +252,5 @@
      * Enable interrupt at PIC level
      */
-    pc386_irq_enable_at_i8259s (irq->name);
+    BSP_irq_enable_at_i8259s (irq->name);
     /*
      * Enable interrupt on device
@@ -264,5 +264,5 @@
 
 
-int pc386_get_current_rtems_irq_handler	(rtems_irq_connect_data* irq)
+int BSP_get_current_rtems_irq_handler	(rtems_irq_connect_data* irq)
 {
      if (!isValidInterrupt(irq->name)) {
@@ -273,5 +273,5 @@
 }
 
-int pc386_remove_rtems_irq_handler  (const rtems_irq_connect_data* irq)
+int BSP_remove_rtems_irq_handler  (const rtems_irq_connect_data* irq)
 {
     unsigned int level;
@@ -295,5 +295,5 @@
      * disable interrupt at PIC level
      */
-    pc386_irq_disable_at_i8259s (irq->name);
+    BSP_irq_disable_at_i8259s (irq->name);
 
     /*
@@ -318,5 +318,5 @@
  */
 
-int pc386_rtems_irq_mngt_set(rtems_irq_global_settings* config)
+int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config)
 {
     int i;
@@ -338,10 +338,10 @@
     for (i=0; i < internal_config->irqNb; i++) {
       if (rtems_hdl_tbl[i].hdl != default_rtems_entry.hdl) {
-	pc386_irq_enable_at_i8259s (i);
+	BSP_irq_enable_at_i8259s (i);
 	rtems_hdl_tbl[i].on(&rtems_hdl_tbl[i]);
       }
       else {
 	rtems_hdl_tbl[i].off(&rtems_hdl_tbl[i]);
-	pc386_irq_disable_at_i8259s (i);
+	BSP_irq_disable_at_i8259s (i);
       }
     }
@@ -349,10 +349,10 @@
      * must disable slave pic anyway
      */
-    pc386_irq_enable_at_i8259s (2);
+    BSP_irq_enable_at_i8259s (2);
     _CPU_ISR_Enable(level);
     return 1;
 }
 
-int pc386_rtems_irq_mngt_get(rtems_irq_global_settings** config)
+int BSP_rtems_irq_mngt_get(rtems_irq_global_settings** config)
 {
     *config = internal_config;
Index: c/src/lib/libbsp/i386/shared/irq/irq.h
===================================================================
--- c/src/lib/libbsp/i386/shared/irq/irq.h	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/shared/irq/irq.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -38,25 +38,25 @@
 typedef enum {
     /* Base vector for our IRQ handlers. */
-  PC386_IRQ_VECTOR_BASE		=	PC386_ASM_IRQ_VECTOR_BASE,       
-  PC_386_IRQ_LINES_NUMBER    	= 	16,
-  PC_386_LOWEST_OFFSET		= 	0,
-  PC_386_MAX_OFFSET		= 	PC_386_IRQ_LINES_NUMBER - 1,
+  BSP_IRQ_VECTOR_BASE		=	BSP_ASM_IRQ_VECTOR_BASE,       
+  BSP_IRQ_LINES_NUMBER    	= 	16,
+  BSP_LOWEST_OFFSET		= 	0,
+  BSP_MAX_OFFSET		= 	BSP_IRQ_LINES_NUMBER - 1,
     /*
-     * Interrupt offset in comparison to PC386_ASM_IRQ_VECTOR_BASE
-     * NB : 1) Interrupt vector number in IDT = offset + PC386_ASM_IRQ_VECTOR_BASE
+     * Interrupt offset in comparison to BSP_ASM_IRQ_VECTOR_BASE
+     * NB : 1) Interrupt vector number in IDT = offset + BSP_ASM_IRQ_VECTOR_BASE
      * 	    2) The same name should be defined on all architecture
      *	       so that handler connexion can be unchanged.
      */	       
-  PC_386_PERIODIC_TIMER      	= 	0,
-
-  PC_386_KEYBOARD          	= 	1,
-
-  PC386_UART_COM2_IRQ		=	3,
-
-  PC386_UART_COM1_IRQ		=	4,
-
-  PC_386_RT_TIMER1	      	= 	8,
+  BSP_PERIODIC_TIMER      	= 	0,
+
+  BSP_KEYBOARD          	= 	1,
+
+  BSP_UART_COM2_IRQ		=	3,
+
+  BSP_UART_COM1_IRQ		=	4,
+
+  BSP_RT_TIMER1	      	= 	8,
   
-  PC_386_RT_TIMER3		= 	10
+  BSP_RT_TIMER3		= 	10
 }rtems_irq_symbolic_name;
 
@@ -128,5 +128,5 @@
   rtems_irq_connect_data*	irqHdlTbl;
   /*
-   * actual value of PC386_IRQ_VECTOR_BASE...
+   * actual value of BSP_IRQ_VECTOR_BASE...
    */
   rtems_irq_symbolic_name	irqBase;
@@ -156,5 +156,5 @@
  * not be propagated further to the processor
  */
-int pc386_irq_disable_at_i8259s        (const rtems_irq_symbolic_name irqLine);
+int BSP_irq_disable_at_i8259s        (const rtems_irq_symbolic_name irqLine);
 /*
  * function to enable a particular irq at 8259 level. After calling
@@ -162,5 +162,5 @@
  * be propagated further to the processor
  */
-int pc386_irq_enable_at_i8259s		(const rtems_irq_symbolic_name irqLine);
+int BSP_irq_enable_at_i8259s		(const rtems_irq_symbolic_name irqLine);
 /*
  * function to acknoledge a particular irq at 8259 level. After calling
@@ -170,9 +170,9 @@
  * handlers.
  */
-int pc386_irq_ack_at_i8259s           	(const rtems_irq_symbolic_name irqLine);
+int BSP_irq_ack_at_i8259s           	(const rtems_irq_symbolic_name irqLine);
 /*
  * function to check if a particular irq is enabled at 8259 level. After calling
  */
-int pc386_irq_enabled_at_i8259s        	(const rtems_irq_symbolic_name irqLine);
+int BSP_irq_enabled_at_i8259s        	(const rtems_irq_symbolic_name irqLine);
 /*
  * ------------------------ RTEMS Single Irq Handler Mngt Routines ----------------
@@ -212,10 +212,10 @@
  * 
  */
-int pc386_install_rtems_irq_handler   	(const rtems_irq_connect_data*);
+int BSP_install_rtems_irq_handler   	(const rtems_irq_connect_data*);
 /*
  * function to get the current RTEMS irq handler for ptr->name. It enables to
  * define hanlder chain...
  */
-int pc386_get_current_rtems_irq_handler	(rtems_irq_connect_data* ptr);
+int BSP_get_current_rtems_irq_handler	(rtems_irq_connect_data* ptr);
 /*
  * function to get disconnect the RTEMS irq handler for ptr->name.
@@ -223,5 +223,5 @@
  * The user can use the previous function to get it.
  */
-int pc386_remove_rtems_irq_handler    	(const rtems_irq_connect_data*);
+int BSP_remove_rtems_irq_handler    	(const rtems_irq_connect_data*);
 
 /*
@@ -234,8 +234,8 @@
  * handler (config->irqHdlTbl[i].hdl)  different from "config->defaultEntry.hdl"
  * has been individualy connected via
- *	pc386_install_rtems_irq_handler(&config->irqHdlTbl[i])
+ *	BSP_install_rtems_irq_handler(&config->irqHdlTbl[i])
  * And each handler currently equal to config->defaultEntry.hdl
  * has been previously disconnected via
- * 	 pc386_remove_rtems_irq_handler (&config->irqHdlTbl[i])
+ * 	 BSP_remove_rtems_irq_handler (&config->irqHdlTbl[i])
  *
  * This is to say that all information given will be used and not just
@@ -248,9 +248,9 @@
  */
 
-int pc386_rtems_irq_mngt_set(rtems_irq_global_settings* config);
+int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config);
 /*
  * (Re) get info on current RTEMS interrupt management.
  */
-int pc386_rtems_irq_mngt_get(rtems_irq_global_settings**);
+int BSP_rtems_irq_mngt_get(rtems_irq_global_settings**);
   
 #ifdef __cplusplus
Index: c/src/lib/libbsp/i386/shared/irq/irq_asm.h
===================================================================
--- c/src/lib/libbsp/i386/shared/irq/irq_asm.h	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/shared/irq/irq_asm.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -16,5 +16,5 @@
 #define __IRQ_ASM_H__
 
-#define PC386_ASM_IRQ_VECTOR_BASE 0x20
+#define BSP_ASM_IRQ_VECTOR_BASE 0x20
     /* PIC's command and mask registers */
 #define PIC_MASTER_COMMAND_IO_PORT		0x20	/* Master PIC command register */
Index: c/src/lib/libbsp/i386/shared/irq/irq_init.c
===================================================================
--- c/src/lib/libbsp/i386/shared/irq/irq_init.c	(revision 711a2a113395e4801cf82adbcb70990e5eeddc65)
+++ c/src/lib/libbsp/i386/shared/irq/irq_init.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -56,7 +56,7 @@
  * Table used to store rtems managed interrupt handlers.
  * Borrow the table to store raw handler entries at the beginning.
- * The table will be reinitialized before the call to pc386_rtems_irq_mngt_set().
- */
-static rtems_irq_connect_data     	rtemsIrq[PC_386_IRQ_LINES_NUMBER] = {
+ * The table will be reinitialized before the call to BSP_rtems_irq_mngt_set().
+ */
+static rtems_irq_connect_data     	rtemsIrq[BSP_IRQ_LINES_NUMBER] = {
   {0,(rtems_irq_hdl)rtems_irq_prologue_0},
   {0,(rtems_irq_hdl)rtems_irq_prologue_1},
@@ -87,5 +87,5 @@
 };
 
-static rtems_irq_prio irqPrioTable[PC_386_IRQ_LINES_NUMBER]={
+static rtems_irq_prio irqPrioTable[BSP_IRQ_LINES_NUMBER]={
   /*
    * actual rpiorities for interrupt :
@@ -156,7 +156,7 @@
      * with RTEMS prologue.
      */
-    for (i = 0; i < PC_386_IRQ_LINES_NUMBER; i++) {
+    for (i = 0; i < BSP_IRQ_LINES_NUMBER; i++) {
       create_interrupt_gate_descriptor(&idtEntry,(rtems_raw_irq_hdl) rtemsIrq[i].hdl);
-      idt_entry_tbl[i + PC386_ASM_IRQ_VECTOR_BASE] = idtEntry;
+      idt_entry_tbl[i + BSP_ASM_IRQ_VECTOR_BASE] = idtEntry;
     }
     /*
@@ -168,5 +168,5 @@
      * re-init the rtemsIrq table
      */
-    for (i = 0; i < PC_386_IRQ_LINES_NUMBER; i++) {
+    for (i = 0; i < BSP_IRQ_LINES_NUMBER; i++) {
       rtemsIrq[i]      = defaultIrq;
       rtemsIrq[i].name = i;
@@ -175,11 +175,11 @@
      * Init initial Interrupt management config
      */
-    initial_config.irqNb 	= PC_386_IRQ_LINES_NUMBER;
+    initial_config.irqNb 	= BSP_IRQ_LINES_NUMBER;
     initial_config.defaultEntry = defaultIrq;
     initial_config.irqHdlTbl	= rtemsIrq;
-    initial_config.irqBase	= PC386_ASM_IRQ_VECTOR_BASE;
+    initial_config.irqBase	= BSP_ASM_IRQ_VECTOR_BASE;
     initial_config.irqPrioTbl	= irqPrioTable;
 
-    if (!pc386_rtems_irq_mngt_set(&initial_config)) {
+    if (!BSP_rtems_irq_mngt_set(&initial_config)) {
       /*
        * put something here that will show the failure...
@@ -201,5 +201,5 @@
       printk("idt_entry_tbl =  %x Interrupt_descriptor_table addr = %x\n",
 	     idt_entry_tbl, &Interrupt_descriptor_table);
-      tmp = (unsigned) get_hdl_from_vector (PC386_ASM_IRQ_VECTOR_BASE + PC_386_PERIODIC_TIMER);
+      tmp = (unsigned) get_hdl_from_vector (BSP_ASM_IRQ_VECTOR_BASE + BSP_PERIODIC_TIMER);
       printk("clock isr address from idt = %x should be %x\n",
 	     tmp, (unsigned) rtems_irq_prologue_0);
Index: c/src/lib/libbsp/i386/shared/pci/Makefile.in
===================================================================
--- c/src/lib/libbsp/i386/shared/pci/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/pci/Makefile.in	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,32 @@
+#
+#  $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+VPATH = @srcdir@
+RTEMS_ROOT = @top_srcdir@
+PROJECT_ROOT = @PROJECT_ROOT@
+
+H_FILES = $(srcdir)/pcibios.h 
+
+#
+#  Equate files are for including from assembly preprocessed by
+#  gm4 or gasp.  No examples are provided except for those for
+#  other CPUs.  The best way to generate them would be to
+#  provide a program which generates the constants used based
+#  on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+preinstall all: $(SRCS)
+	$(INSTALL) -m 444 $(SRCS) $(PROJECT_INCLUDE)
Index: c/src/lib/libbsp/i386/shared/pci/pcibios.c
===================================================================
--- c/src/lib/libbsp/i386/shared/pci/pcibios.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/pci/pcibios.c	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,499 @@
+/*
+ * This software is Copyright (C) 1998 by T.sqware - all rights limited
+ * It is provided in to the public domain "as is", can be freely modified
+ * as far as this copyight notice is kept unchanged, but does not imply
+ * an endorsement by T.sqware of the product in which it is included.
+ *
+ *  $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <assert.h>
+#include <pcibios.h>
+
+/*
+ * This is simpliest possible PCI BIOS, it assumes that addressing
+ * is flat and that stack is big enough 
+ */ 
+
+
+static int pcibInitialized = 0;
+static unsigned int pcibEntry;
+
+/*
+ * Array to pass data between c and asm parts, at the time of 
+ * writing I am not yet that familiar with extended asm feature 
+ * of gcc. This code is not on performance path, so we can care 
+ * relatively little about performance here 
+ */
+static volatile unsigned int pcibExchg[5];
+
+static int pcib_convert_err(int err);
+
+/*
+ * Detects presense of PCI BIOS, returns 
+ * error code
+ */
+int 
+pcib_init(void)
+{
+  unsigned char *ucp;
+  unsigned char sum;
+  int      i;
+
+  pcibInitialized = 0;
+
+  /* First, we have to look for BIOS-32 */
+  for(ucp=(unsigned char *)0xE0000; ucp < (unsigned char *)0xFFFFF; ucp+=0x10)
+    {
+      if(memcmp(ucp, "_32_", 4) != 0)
+	{
+	  continue;
+	}
+
+      /* Got signature, check length  */
+      if(*(ucp + 9) != 1)
+	{
+	  continue;
+	}
+
+      /* Verify checksum */
+      sum = 0;
+      for(i=0; i<16; i++)
+	{
+	  sum += *(ucp+i);
+	}
+
+      if(sum == 0)
+	{
+	  /* found */
+	  break;
+	}
+    }
+
+  if(ucp >= (unsigned char *)0xFFFFF)
+    {
+      /* BIOS-32 not found */
+      assert(0);
+      return PCIB_ERR_NOTPRESENT;
+    }
+
+  /* BIOS-32 found, let us find PCI BIOS */
+  ucp += 4;
+
+  pcibExchg[0] = *(unsigned int *)ucp;
+
+  asm ("    pusha");                  /* Push all registers */  
+  asm ("    movl pcibExchg, %edi");   /* Move entry point to esi */
+  asm ("    movl $0x49435024, %eax"); /* Move signature to eax */
+  asm ("    xorl %ebx, %ebx");        /* Zero ebx */
+  asm ("    pushl %cs");
+  asm ("    call *%edi");             /* Call entry */
+  asm ("    movl %eax, pcibExchg");
+  asm ("    movl %ebx, pcibExchg+4");
+  asm ("    movl %ecx, pcibExchg+8");
+  asm ("    movl %edx, pcibExchg+12");
+  asm ("    popa");
+
+  if((pcibExchg[0] & 0xff) != 0)
+    {
+      /* Not found */
+      assert(0);
+      return PCIB_ERR_NOTPRESENT;
+    }
+
+  /* Found PCI entry point */
+  pcibEntry = pcibExchg[1] + pcibExchg[3];
+
+  /* Let us check whether PCI bios is present */
+  pcibExchg[0] = pcibEntry;
+  
+  asm("    pusha");
+  asm("    movl pcibExchg, %edi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x01, %al");
+  asm ("   pushl %cs");
+  asm("    call *%edi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ebx, pcibExchg+4");
+  asm("    movl %ecx, pcibExchg+8");
+  asm("    movl %edx, pcibExchg+12");
+  asm("    popa");
+
+  if((pcibExchg[0] & 0xff00) != 0)
+    {
+      /* Not found */
+      assert(0);
+      return PCIB_ERR_NOTPRESENT;
+    }
+
+  if(pcibExchg[3] != 0x20494350)
+    {
+      /* Signature does not match */
+      assert(0);
+      return PCIB_ERR_NOTPRESENT;
+    }
+
+  /* Success */
+  
+  pcibInitialized = 1;
+  return PCIB_ERR_SUCCESS;
+}
+
+/* 
+ * Find specified device and return its signature: combination 
+ * of bus number, device number and function number
+ */
+int
+pcib_find_by_devid(int vendorId, int devId, int idx, int *sig)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = vendorId;
+  pcibExchg[2] = devId;
+  pcibExchg[3] = idx;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %edi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x02, %al");
+  asm("    movl pcibExchg+4, %edx");
+  asm("    movl pcibExchg+8, %ecx");
+  asm("    movl pcibExchg+12, %esi");
+  asm("    pushl %cs");
+  asm("    call *%edi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ebx, pcibExchg+4");
+  asm("    popa");
+
+  *sig = pcibExchg[1] & 0xffff;
+
+  return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+}
+
+/* 
+ * Find specified class code return device signature: combination 
+ * of bus number, device number and function number
+ */
+int
+pcib_find_by_class(int classCode, int idx, int *sig)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = classCode;
+  pcibExchg[2] = idx;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %edi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x03, %al");
+  asm("    movl pcibExchg+4, %ecx");
+  asm("    movl pcibExchg+8, %esi");
+  asm("    pushl %cs");
+  asm("    call *%edi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ebx, pcibExchg+4");
+  asm("    popa");
+
+  if((pcibExchg[0] & 0xff00) != 0)
+    {
+      return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+    }
+
+  *sig = pcibExchg[1] & 0xffff;
+
+  return PCIB_ERR_SUCCESS;
+}
+  
+  
+
+/* 
+ * Generate Special Cycle
+ */
+int
+pcib_special_cycle(int busNo, int data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = busNo << 8;
+  pcibExchg[2] = data;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %edi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x06, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edx");
+  asm("    pushl %cs");
+  asm("    call *%edi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ebx, pcibExchg+4");
+  asm("    popa");
+
+  return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+}
+  
+
+/* 
+ * Read byte from config space
+ */
+int
+pcib_conf_read8(int sig, int off, unsigned char *data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = sig;
+  pcibExchg[2] = off;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %esi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x08, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edi");
+  asm("    pushl %cs");
+  asm("    call *%esi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ecx, pcibExchg+4");
+  asm("    popa");
+
+  if((pcibExchg[0] & 0xff00) != 0)
+    {
+      return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+    }
+
+  *data = (unsigned char)pcibExchg[1] & 0xff;
+
+  return PCIB_ERR_SUCCESS;
+}
+  
+
+/* 
+ * Read word from config space
+ */
+int
+pcib_conf_read16(int sig, int off, unsigned short *data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = sig;
+  pcibExchg[2] = off;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %esi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x09, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edi");
+  asm("    pushl %cs");
+  asm("    call *%esi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ecx, pcibExchg+4");
+  asm("    popa");
+
+  if((pcibExchg[0] & 0xff00) != 0)
+    {
+      return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+    }
+
+  *data = (unsigned short)pcibExchg[1] & 0xffff;
+
+  return PCIB_ERR_SUCCESS;
+}
+  
+
+/* 
+ * Read dword from config space
+ */
+int
+pcib_conf_read32(int sig, int off, unsigned int *data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = sig;
+  pcibExchg[2] = off;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %esi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x0a, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edi");
+  asm("    pushl %cs");
+  asm("    call *%esi");
+  asm("    movl %eax, pcibExchg");
+  asm("    movl %ecx, pcibExchg+4");
+  asm("    popa");
+
+  if((pcibExchg[0] & 0xff00) != 0)
+    {
+      return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+    }
+
+  *data = (unsigned int)pcibExchg[1];
+
+  return PCIB_ERR_SUCCESS;
+}
+  
+
+/* 
+ * Write byte into  config space
+ */
+int
+pcib_conf_write8(int sig, int off, unsigned int data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = sig;
+  pcibExchg[2] = off;
+  pcibExchg[3] = data & 0xff;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %esi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x0b, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edi");
+  asm("    movl pcibExchg+12, %ecx");
+  asm("    pushl %cs");
+  asm("    call *%esi");
+  asm("    movl %eax, pcibExchg");
+  asm("    popa");
+
+  return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+}
+
+/* 
+ * Write word into config space
+ */
+int
+pcib_conf_write16(int sig, int off, unsigned int data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = sig;
+  pcibExchg[2] = off;
+  pcibExchg[3] = data & 0xffff;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %esi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x0c, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edi");
+  asm("    movl pcibExchg+12, %ecx");
+  asm("    pushl %cs");
+  asm("    call *%esi");
+  asm("    movl %eax, pcibExchg");
+  asm("    popa");
+
+  return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+}
+  
+
+
+/* 
+ * Write dword into config space
+ */
+int
+pcib_conf_write32(int sig, int off, unsigned int data)
+{
+  if(!pcibInitialized)
+    {
+      assert(0);
+      return PCIB_ERR_UNINITIALIZED;
+    }
+
+  pcibExchg[0] = pcibEntry;
+  pcibExchg[1] = sig;
+  pcibExchg[2] = off;
+  pcibExchg[3] = data;
+
+  asm("    pusha");
+  asm("    movl pcibExchg, %esi");
+  asm("    movb $0xb1, %ah");
+  asm("    movb $0x0d, %al");
+  asm("    movl pcibExchg+4, %ebx");
+  asm("    movl pcibExchg+8, %edi");
+  asm("    movl pcibExchg+12, %ecx");
+  asm("    pushl %cs");
+  asm("    call *%esi");
+  asm("    movl %eax, pcibExchg");
+  asm("    popa");
+
+  return pcib_convert_err((pcibExchg[0] >> 8) & 0xff);
+}
+  
+
+static int
+pcib_convert_err(int err)
+{
+  switch(err & 0xff)
+    {
+    case 0:
+      return PCIB_ERR_SUCCESS;
+    case 0x81:
+      return PCIB_ERR_NOFUNC;
+    case 0x83:
+      return PCIB_ERR_BADVENDOR;
+    case 0x86:
+      return PCIB_ERR_DEVNOTFOUND;
+    case 0x87:
+      return PCIB_ERR_BADREG;
+    default:
+      assert(0);
+      break;
+    }
+  return PCIB_ERR_NOFUNC;
+}
+	
+      
+
+
+  
+      
+  
+
+
+
Index: c/src/lib/libbsp/i386/shared/pci/pcibios.h
===================================================================
--- c/src/lib/libbsp/i386/shared/pci/pcibios.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
+++ c/src/lib/libbsp/i386/shared/pci/pcibios.h	(revision 0ebbf66b0ee518763ee38b4ac28c7d3b6feaadf1)
@@ -0,0 +1,46 @@
+/*
+ * This software is Copyright (C) 1998 by T.sqware - all rights limited
+ * It is provided in to the public domain "as is", can be freely modified
+ * as far as this copyight notice is kept unchanged, but does not imply
+ * an endorsement by T.sqware of the product in which it is included.
+ */
+
+#ifndef _PCIB_H
+#define _PCIB_H
+
+/* Error codes */
+#define PCIB_ERR_SUCCESS       (0)
+#define PCIB_ERR_UNINITIALIZED (-1)  /* PCI BIOS is not initilized */
+#define PCIB_ERR_NOTPRESENT    (-2)  /* PCI BIOS not present */
+#define PCIB_ERR_NOFUNC        (-3)  /* Function not supported */
+#define PCIB_ERR_BADVENDOR     (-4)  /* Bad Vendor ID */
+#define PCIB_ERR_DEVNOTFOUND   (-5)  /* Device not found */
+#define PCIB_ERR_BADREG        (-6)  /* Bad register number */   
+
+/* 
+ * Make device signature from bus number, device numebr and function 
+ * number
+ */
+#define PCIB_DEVSIG_MAKE(b,d,f) ((b<<8)|(d<<3)|(f))
+
+/*
+ * Extract valrous part from device signature
+ */
+#define PCIB_DEVSIG_BUS(x) (((x)>>8) &0xff)
+#define PCIB_DEVSIG_DEV(x) (((x)>>3) & 0x1f)
+#define PCIB_DEVSIG_FUNC(x) ((x) & 0x7)
+
+int pcib_init(void);
+int pcib_find_by_devid(int vendorId, int devId, int idx, int *sig);
+int pcib_find_by_class(int classCode, int idx, int *sig);
+int pcib_special_cycle(int busNo, int data);
+int pcib_conf_read8(int sig, int off, unsigned char *data);
+int pcib_conf_read16(int sig, int off, unsigned short *data);
+int pcib_conf_read32(int sig, int off, unsigned int *data);
+int pcib_conf_write8(int sig, int off, unsigned int data);
+int pcib_conf_write16(int sig, int off, unsigned int data);
+int pcib_conf_write32(int sig, int off, unsigned int data);
+
+
+#endif /* _PCIB_H */
+
