Index: c/src/exec/include/rtems/bspIo.h
===================================================================
--- c/src/exec/include/rtems/bspIo.h	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
+++ c/src/exec/include/rtems/bspIo.h	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -0,0 +1,37 @@
+/* bspIo.h
+ *
+ *  This include file contains declaration of interface that
+ *  will be provided by the file contained in this directory.
+ *
+ *
+ *  COPYRIGHT (c) 1998 valette@crf.canon.fr
+ *
+ *  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$
+ */
+#ifndef _LIBBSP_I386_SHARED_IO_BSP_IO_H
+#define _LIBBSP_I386_SHARED_IO_BSP_IO_H
+
+/*
+ * All the functions declared as extern after this comment
+ * MUST be implemented in each BSP. Using this function,
+ * this directory contains shared code that export higher level
+ * functionnality described after the next command.
+ */
+typedef void 	(*BSP_output_char_function_type) 	(char c);
+typedef char 	(*BSP_polling_getchar_function_type) 	(void);
+
+extern 	BSP_output_char_function_type 		BSP_output_char;
+extern 	BSP_polling_getchar_function_type 	BSP_poll_char;
+/*
+ * All the function declared as extern after this comment
+ * are available for each ix86 BSP by compiling and linking
+ * the files contained in this directory PROVIDED definition
+ * and initialisation of the previous variable are done.
+ */
+void printk(char *fmt, ...);
+
+#endif
Index: c/src/exec/libcsupport/src/Makefile.am
===================================================================
--- c/src/exec/libcsupport/src/Makefile.am	(revision 1f5cb74eb0a87988f28ab1dabade2c35a6527397)
+++ c/src/exec/libcsupport/src/Makefile.am	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -49,5 +49,6 @@
 UNIX_LIBC_C_FILES = unixlibc.c hosterr.c
 
-COMMON_C_FILES = gxx_wrappers.c $(BASE_FS_C_FILES) $(MALLOC_C_FILES) $(TERMIOS_C_FILES) \
+COMMON_C_FILES = gxx_wrappers.c printk.c $(BASE_FS_C_FILES) \
+    $(MALLOC_C_FILES) $(TERMIOS_C_FILES) \
     $(ERROR_C_FILES) $(ASSOCIATION_C_FILES)
 
Index: c/src/exec/libcsupport/src/printk.c
===================================================================
--- c/src/exec/libcsupport/src/printk.c	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
+++ c/src/exec/libcsupport/src/printk.c	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -0,0 +1,144 @@
+/*-------------------------------------------------------------------------+
+| printk.c v1.1 - PC386 BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| (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 code by: Jose Rufino - IST
+|
+|  $Id$
++--------------------------------------------------------------------------*/
+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <bspIo.h>
+/* #include <libcpu/cpu.h> */
+
+/*-------------------------------------------------------------------------+
+|         Function: printNum
+|      Description: print number in a given base.
+| Global Variables: None.
+|        Arguments: num - number to print, base - base used to print the number.
+|          Returns: Nothing. 
++--------------------------------------------------------------------------*/
+static void
+printNum(long unsigned int num, int base, int sign, int maxwidth, int lead)
+{
+  long unsigned int n;
+  int count;
+  char toPrint[20];
+
+  if ( (sign == 1) && ((long)num <  0) ) {
+    BSP_output_char('-');
+    num = -num;
+    maxwidth--;
+  }
+  
+  count = 0;
+  while ((n = num / base) > 0) {
+    toPrint[count++] = (num - (n*base));
+    num = n ;
+  }
+  toPrint[count++] = num;
+
+  if (maxwidth) {
+    for (n=maxwidth-count ; n ; n-- )
+      BSP_output_char(lead);
+  }
+
+  for (n = 0; n < count; n++){
+    BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
+  }
+} /* printNum */
+
+
+/*-------------------------------------------------------------------------+
+|         Function: printk
+|      Description: a simplified version of printf intended for use when the
+                    console is not yet initialized or in ISR's.
+| Global Variables: None.
+|        Arguments: as in printf: fmt - format string, ... - unnamed arguments.
+|          Returns: Nothing. 
++--------------------------------------------------------------------------*/
+void
+printk(char *fmt, ...)
+{
+  va_list  ap;      /* points to each unnamed argument in turn */
+  char     c, *str;
+  int      lflag, base, sign, width, lead;
+  /* unsigned int level; */
+
+  /* _CPU_ISR_Disable(level); */
+ 
+  va_start(ap, fmt); /* make ap point to 1st unnamed arg */
+  for (; *fmt != '\0'; fmt++)
+  {
+    lflag = 0;
+    base  = 0;
+    sign = 0;
+    width = 0;
+    lead = ' ';
+    if (*fmt == '%')
+    {
+      fmt++;
+      if (*fmt == '0' ) {
+        lead = '0';
+        fmt++;
+      }
+      while (*fmt >= '0' && *fmt <= '9' ) {
+        width *= 10;
+        width += (*fmt - '0');
+        fmt++;
+      }
+
+      if ((c = *fmt) == 'l')
+      {
+        lflag = 1;
+        c = *++fmt;
+      }
+      switch (c)
+      {
+        case 'o': case 'O': base = 8; sign = 0; break;
+        case 'd': case 'D': base = 10; sign = 1; break;
+        case 'u': case 'U': base = 10; sign = 0; break;
+        case 'x': case 'X': base = 16; sign = 0; break;
+        case 's':
+          for (str = va_arg(ap, char *); *str; str++) 
+            BSP_output_char(*str);
+          break;
+        case 'c':
+#if defined(_TMS320C3x) || defined(_TMS320C4x)
+          BSP_output_char(va_arg(ap, int));
+#else
+          BSP_output_char(va_arg(ap, char));
+#endif
+          break;
+        default:
+          BSP_output_char(c);
+          break;
+      } /* switch*/
+
+      if (base)
+        printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int),
+                 base, sign, width, lead);
+    }
+    else
+    {
+      BSP_output_char(*fmt);
+    }
+  }
+  va_end(ap); /* clean up when done */
+  /* _CPU_ISR_Enable(level); */
+
+} /* printk */
+
Index: c/src/lib/include/Makefile.am
===================================================================
--- c/src/lib/include/Makefile.am	(revision 1f5cb74eb0a87988f28ab1dabade2c35a6527397)
+++ c/src/lib/include/Makefile.am	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -5,5 +5,5 @@
 AUTOMAKE_OPTIONS = foreign 1.4
 
-H_FILES = chain.h console.h clockdrv.h iosupp.h ringbuf.h spurious.h \
+H_FILES = bspIo.h chain.h console.h clockdrv.h iosupp.h ringbuf.h spurious.h \
     timerdrv.h vmeintr.h
 
Index: c/src/lib/include/bspIo.h
===================================================================
--- c/src/lib/include/bspIo.h	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
+++ c/src/lib/include/bspIo.h	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -0,0 +1,37 @@
+/* bspIo.h
+ *
+ *  This include file contains declaration of interface that
+ *  will be provided by the file contained in this directory.
+ *
+ *
+ *  COPYRIGHT (c) 1998 valette@crf.canon.fr
+ *
+ *  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$
+ */
+#ifndef _LIBBSP_I386_SHARED_IO_BSP_IO_H
+#define _LIBBSP_I386_SHARED_IO_BSP_IO_H
+
+/*
+ * All the functions declared as extern after this comment
+ * MUST be implemented in each BSP. Using this function,
+ * this directory contains shared code that export higher level
+ * functionnality described after the next command.
+ */
+typedef void 	(*BSP_output_char_function_type) 	(char c);
+typedef char 	(*BSP_polling_getchar_function_type) 	(void);
+
+extern 	BSP_output_char_function_type 		BSP_output_char;
+extern 	BSP_polling_getchar_function_type 	BSP_poll_char;
+/*
+ * All the function declared as extern after this comment
+ * are available for each ix86 BSP by compiling and linking
+ * the files contained in this directory PROVIDED definition
+ * and initialisation of the previous variable are done.
+ */
+void printk(char *fmt, ...);
+
+#endif
Index: c/src/lib/libc/Makefile.am
===================================================================
--- c/src/lib/libc/Makefile.am	(revision 1f5cb74eb0a87988f28ab1dabade2c35a6527397)
+++ c/src/lib/libc/Makefile.am	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -49,5 +49,6 @@
 UNIX_LIBC_C_FILES = unixlibc.c hosterr.c
 
-COMMON_C_FILES = gxx_wrappers.c $(BASE_FS_C_FILES) $(MALLOC_C_FILES) $(TERMIOS_C_FILES) \
+COMMON_C_FILES = gxx_wrappers.c printk.c $(BASE_FS_C_FILES) \
+    $(MALLOC_C_FILES) $(TERMIOS_C_FILES) \
     $(ERROR_C_FILES) $(ASSOCIATION_C_FILES)
 
Index: c/src/lib/libc/printk.c
===================================================================
--- c/src/lib/libc/printk.c	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
+++ c/src/lib/libc/printk.c	(revision 1bce63758768e6ef94426fd11d63478f2cec1306)
@@ -0,0 +1,144 @@
+/*-------------------------------------------------------------------------+
+| printk.c v1.1 - PC386 BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| (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 code by: Jose Rufino - IST
+|
+|  $Id$
++--------------------------------------------------------------------------*/
+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <bspIo.h>
+/* #include <libcpu/cpu.h> */
+
+/*-------------------------------------------------------------------------+
+|         Function: printNum
+|      Description: print number in a given base.
+| Global Variables: None.
+|        Arguments: num - number to print, base - base used to print the number.
+|          Returns: Nothing. 
++--------------------------------------------------------------------------*/
+static void
+printNum(long unsigned int num, int base, int sign, int maxwidth, int lead)
+{
+  long unsigned int n;
+  int count;
+  char toPrint[20];
+
+  if ( (sign == 1) && ((long)num <  0) ) {
+    BSP_output_char('-');
+    num = -num;
+    maxwidth--;
+  }
+  
+  count = 0;
+  while ((n = num / base) > 0) {
+    toPrint[count++] = (num - (n*base));
+    num = n ;
+  }
+  toPrint[count++] = num;
+
+  if (maxwidth) {
+    for (n=maxwidth-count ; n ; n-- )
+      BSP_output_char(lead);
+  }
+
+  for (n = 0; n < count; n++){
+    BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
+  }
+} /* printNum */
+
+
+/*-------------------------------------------------------------------------+
+|         Function: printk
+|      Description: a simplified version of printf intended for use when the
+                    console is not yet initialized or in ISR's.
+| Global Variables: None.
+|        Arguments: as in printf: fmt - format string, ... - unnamed arguments.
+|          Returns: Nothing. 
++--------------------------------------------------------------------------*/
+void
+printk(char *fmt, ...)
+{
+  va_list  ap;      /* points to each unnamed argument in turn */
+  char     c, *str;
+  int      lflag, base, sign, width, lead;
+  /* unsigned int level; */
+
+  /* _CPU_ISR_Disable(level); */
+ 
+  va_start(ap, fmt); /* make ap point to 1st unnamed arg */
+  for (; *fmt != '\0'; fmt++)
+  {
+    lflag = 0;
+    base  = 0;
+    sign = 0;
+    width = 0;
+    lead = ' ';
+    if (*fmt == '%')
+    {
+      fmt++;
+      if (*fmt == '0' ) {
+        lead = '0';
+        fmt++;
+      }
+      while (*fmt >= '0' && *fmt <= '9' ) {
+        width *= 10;
+        width += (*fmt - '0');
+        fmt++;
+      }
+
+      if ((c = *fmt) == 'l')
+      {
+        lflag = 1;
+        c = *++fmt;
+      }
+      switch (c)
+      {
+        case 'o': case 'O': base = 8; sign = 0; break;
+        case 'd': case 'D': base = 10; sign = 1; break;
+        case 'u': case 'U': base = 10; sign = 0; break;
+        case 'x': case 'X': base = 16; sign = 0; break;
+        case 's':
+          for (str = va_arg(ap, char *); *str; str++) 
+            BSP_output_char(*str);
+          break;
+        case 'c':
+#if defined(_TMS320C3x) || defined(_TMS320C4x)
+          BSP_output_char(va_arg(ap, int));
+#else
+          BSP_output_char(va_arg(ap, char));
+#endif
+          break;
+        default:
+          BSP_output_char(c);
+          break;
+      } /* switch*/
+
+      if (base)
+        printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int),
+                 base, sign, width, lead);
+    }
+    else
+    {
+      BSP_output_char(*fmt);
+    }
+  }
+  va_end(ap); /* clean up when done */
+  /* _CPU_ISR_Enable(level); */
+
+} /* printk */
+
