console code cleanup.
authorStefan Reinauer <stepan@openbios.org>
Fri, 28 May 2004 15:07:03 +0000 (15:07 +0000)
committerStefan Reinauer <stepan@openbios.org>
Fri, 28 May 2004 15:07:03 +0000 (15:07 +0000)
 - drop srm console code (not supported anyways)
 - make internal uart8250 console functions static
 - split vsprintf.c into vsprintf.c and vtxprintf.c

git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1585 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/console/Config.lb
src/console/printk.c
src/console/uart8250_console.c
src/console/vsprintf.c
src/console/vtxprintf.c [new file with mode: 0644]

index f6ba5fce3f928f5cceaec42d37d51b28e11e01e5..0990e451dc7ae38bdbcd5abddb399b956121cdbc 100644 (file)
@@ -1,5 +1,5 @@
 uses CONFIG_CONSOLE_SERIAL8250 CONFIG_CONSOLE_VGA CONFIG_CONSOLE_BTEXT
-uses CONFIG_CONSOLE_LOGBUF CONFIG_CONSOLE_SROM
+uses CONFIG_CONSOLE_LOGBUF
 uses CONFIG_USE_INIT
 
 object printk.o
@@ -16,13 +16,12 @@ end
 if CONFIG_CONSOLE_LOGBUF
        driver logbuf_console.o
 end
-if CONFIG_CONSOLE_SROM
-       driver srom_console.o
-end
 
 object console.o
+object vtxprintf.o
 object vsprintf.o
 
 if CONFIG_USE_INIT
-       initobject vsprintf.o
+       initobject vtxprintf.o
 end
+
index 636424c12a764c9925ad7807e0e35521c33c39c1..da330c932bf570a4e1f9bae97da84b7df3e1da89 100644 (file)
@@ -4,7 +4,6 @@
  *  Copyright (C) 1991, 1992  Linus Torvalds
  *
  */
-//typedef void * va_list;
 
 #include <stdarg.h>
 #include <smp/spinlock.h>
index c5d32cf5790780abbee63c57a173e2afdc0fe494..e6642350d726036c92719251fa1f55b92ad31183 100644 (file)
@@ -26,9 +26,9 @@
 
 #define UART_LCS       TTYS0_LCS
 
-void ttyS0_init(void)
+static void ttyS0_init(void)
 {
-       static unsigned char div[8]={1,2,3,6,12,24,48,96};
+       static const unsigned char div[8]={1,2,3,6,12,24,48,96};
        int b_index=0;
        unsigned int divisor=TTYS0_DIV;
 
@@ -38,17 +38,17 @@ void ttyS0_init(void)
        uart8250_init(TTYS0_BASE, divisor, TTYS0_LCS);
 }
 
-void ttyS0_tx_byte(unsigned char data) 
+static void ttyS0_tx_byte(unsigned char data) 
 {
        uart8250_tx_byte(TTYS0_BASE, data);
 }
 
-unsigned char ttyS0_rx_byte(void) 
+static unsigned char ttyS0_rx_byte(void) 
 {
        return uart8250_rx_byte(TTYS0_BASE);
 }
 
-int ttyS0_tst_byte(void) 
+static int ttyS0_tst_byte(void) 
 {
        return uart8250_can_rx_byte(TTYS0_BASE);
 }
index 129f02ea48b432c88e3386e4829ef7aafd3b0aab..1ce6bd1e88df5af06acd52be5f7ec50019dc9a64 100644 (file)
 #include <stdarg.h>
 #include <string.h>
 
-/* haha, don't need ctype.c */
-#define isdigit(c)     ((c) >= '0' && (c) <= '9')
-#define is_digit isdigit
-#define isxdigit(c)    (((c) >= '0' && (c) <= '9') || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args);
 
-unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
-{
-       unsigned long result = 0,value;
-
-       if (!base) {
-               base = 10;
-               if (*cp == '0') {
-                       base = 8;
-                       cp++;
-                       if ((*cp == 'x') && isxdigit(cp[1])) {
-                               cp++;
-                               base = 16;
-                       }
-               }
-       }
-       while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
-           ? toupper(*cp) : *cp)-'A'+10) < base) {
-               result = result*base + value;
-               cp++;
-       }
-       if (endp)
-               *endp = (char *)cp;
-       return result;
-}
-
-long simple_strtol(const char *cp,char **endp,unsigned int base)
-{
-       if(*cp=='-')
-               return -simple_strtoul(cp+1,endp,base);
-       return simple_strtoul(cp,endp,base);
-}
-
-
-static int skip_atoi(const char **s)
-{
-       int i=0;
-
-       while (is_digit(**s))
-               i = i*10 + *((*s)++) - '0';
-       return i;
-}
-
-#define ZEROPAD        1               /* pad with zero */
-#define SIGN   2               /* unsigned/signed long */
-#define PLUS   4               /* show plus */
-#define SPACE  8               /* space if plus */
-#define LEFT   16              /* left justified */
-#define SPECIAL        32              /* 0x */
-#define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
-
-#define do_div(n,base) ({ \
-int __res; \
-__res = ((unsigned long) n) % (unsigned) base; \
-n = ((unsigned long) n) / (unsigned) base; \
-__res; })
-
-static int number(void (*tx_byte)(unsigned char byte), long num, int base, int size, int precision
-       ,int type)
-{
-       char c,sign,tmp[66];
-       const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
-       int i;
-       int count = 0;
-
-       if (type & LARGE)
-               digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-       if (type & LEFT)
-               type &= ~ZEROPAD;
-       if (base < 2 || base > 36)
-               return 0;
-       c = (type & ZEROPAD) ? '0' : ' ';
-       sign = 0;
-       if (type & SIGN) {
-               if (num < 0) {
-                       sign = '-';
-                       num = -num;
-                       size--;
-               } else if (type & PLUS) {
-                       sign = '+';
-                       size--;
-               } else if (type & SPACE) {
-                       sign = ' ';
-                       size--;
-               }
-       }
-       if (type & SPECIAL) {
-               if (base == 16)
-                       size -= 2;
-               else if (base == 8)
-                       size--;
-       }
-       i = 0;
-       if (num == 0)
-               tmp[i++]='0';
-       else while (num != 0)
-               tmp[i++] = digits[do_div(num,base)];
-       if (i > precision)
-               precision = i;
-       size -= precision;
-       if (!(type&(ZEROPAD+LEFT)))
-               while(size-->0)
-                       tx_byte(' '), count++;
-       if (sign)
-               tx_byte(sign), count++;
-       if (type & SPECIAL) {
-               if (base==8)
-                       tx_byte('0'), count++;
-               else if (base==16) {
-                       tx_byte('0'), count++;
-                       tx_byte(digits[33]), count++;
-               }
-       }
-       if (!(type & LEFT))
-               while (size-- > 0)
-                       tx_byte(c), count++;
-       while (i < precision--)
-               tx_byte('0'), count++;
-       while (i-- > 0)
-               tx_byte(tmp[i]), count++;
-       while (size-- > 0)
-               tx_byte(' '), count++;
-       return count;
-}
-
-
-int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args)
-{
-       int len;
-       unsigned long num;
-       int i, base;
-       const char *s;
-
-       int flags;              /* flags to number() */
-
-       int field_width;        /* width of output field */
-       int precision;          /* min. # of digits for integers; max
-                                  number of chars for from string */
-       int qualifier;          /* 'h', 'l', or 'L' for integer fields */
-       
-       int count;
-
-       for (count=0; *fmt ; ++fmt) {
-               if (*fmt != '%') {
-                       tx_byte(*fmt), count++;
-                       continue;
-               }
-                       
-               /* process flags */
-               flags = 0;
-               repeat:
-                       ++fmt;          /* this also skips first '%' */
-                       switch (*fmt) {
-                               case '-': flags |= LEFT; goto repeat;
-                               case '+': flags |= PLUS; goto repeat;
-                               case ' ': flags |= SPACE; goto repeat;
-                               case '#': flags |= SPECIAL; goto repeat;
-                               case '0': flags |= ZEROPAD; goto repeat;
-                               }
-               
-               /* get field width */
-               field_width = -1;
-               if (is_digit(*fmt))
-                       field_width = skip_atoi(&fmt);
-               else if (*fmt == '*') {
-                       ++fmt;
-                       /* it's the next argument */
-                       field_width = va_arg(args, int);
-                       if (field_width < 0) {
-                               field_width = -field_width;
-                               flags |= LEFT;
-                       }
-               }
-
-               /* get the precision */
-               precision = -1;
-               if (*fmt == '.') {
-                       ++fmt;  
-                       if (is_digit(*fmt))
-                               precision = skip_atoi(&fmt);
-                       else if (*fmt == '*') {
-                               ++fmt;
-                               /* it's the next argument */
-                               precision = va_arg(args, int);
-                       }
-                       if (precision < 0)
-                               precision = 0;
-               }
-
-               /* get the conversion qualifier */
-               qualifier = -1;
-               if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
-                       qualifier = *fmt;
-                       ++fmt;
-               }
-
-               /* default base */
-               base = 10;
-
-               switch (*fmt) {
-               case 'c':
-                       if (!(flags & LEFT))
-                               while (--field_width > 0)
-                                       tx_byte(' '), count++;
-                       tx_byte((unsigned char) va_arg(args, int)), count++;
-                       while (--field_width > 0)
-                               tx_byte(' '), count++;
-                       continue;
-
-               case 's':
-                       s = va_arg(args, char *);
-                       if (!s)
-                               s = "<NULL>";
-
-                       len = strnlen(s, precision);
-
-                       if (!(flags & LEFT))
-                               while (len < field_width--)
-                                       tx_byte(' '), count++;
-                       for (i = 0; i < len; ++i)
-                               tx_byte(*s++), count++;
-                       while (len < field_width--)
-                               tx_byte(' '), count++;
-                       continue;
+/* FIXME this global makes vsprintf non-reentrant */
 
-               case 'p':
-                       if (field_width == -1) {
-                               field_width = 2*sizeof(void *);
-                               flags |= ZEROPAD;
-                       }
-                       count += number(tx_byte,
-                               (unsigned long) va_arg(args, void *), 16,
-                               field_width, precision, flags);
-                       continue;
-
-
-               case 'n':
-                       if (qualifier == 'l') {
-                               long * ip = va_arg(args, long *);
-                               *ip = count;
-                       } else {
-                               int * ip = va_arg(args, int *);
-                               *ip = count;
-                       }
-                       continue;
-
-               case '%':
-                       tx_byte('%'), count++;
-                       continue;
-
-               /* integer number formats - set up the flags and "break" */
-               case 'o':
-                       base = 8;
-                       break;
-
-               case 'X':
-                       flags |= LARGE;
-               case 'x':
-                       base = 16;
-                       break;
-
-               case 'd':
-               case 'i':
-                       flags |= SIGN;
-               case 'u':
-                       break;
-
-               default:
-                       tx_byte('%'), count++;
-                       if (*fmt)
-                               tx_byte(*fmt), count++;
-                       else
-                               --fmt;
-                       continue;
-               }
-               if (qualifier == 'l')
-                       num = va_arg(args, unsigned long);
-               else if (qualifier == 'h') {
-                       num = (unsigned short) va_arg(args, int);
-                       if (flags & SIGN)
-                               num = (short) num;
-               } else if (flags & SIGN)
-                       num = va_arg(args, int);
-               else
-                       num = va_arg(args, unsigned int);
-               count += number(tx_byte, num, base, field_width, precision, flags);
-       }
-       return count;
-}
-
-/* FIXME this global makes vsprintf non-reentrant
- */
 static char *str_buf;
 static void str_tx_byte(unsigned char byte)
 {
diff --git a/src/console/vtxprintf.c b/src/console/vtxprintf.c
new file mode 100644 (file)
index 0000000..0f12672
--- /dev/null
@@ -0,0 +1,303 @@
+/*  vtxprintf.c, from
+ *    linux/lib/vsprintf.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+#include <stdarg.h>
+#include <string.h>
+
+/* haha, don't need ctype.c */
+#define isdigit(c)     ((c) >= '0' && (c) <= '9')
+#define is_digit isdigit
+#define isxdigit(c)    (((c) >= '0' && (c) <= '9') || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+
+static unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
+{
+       unsigned long result = 0,value;
+
+       if (!base) {
+               base = 10;
+               if (*cp == '0') {
+                       base = 8;
+                       cp++;
+                       if ((*cp == 'x') && isxdigit(cp[1])) {
+                               cp++;
+                               base = 16;
+                       }
+               }
+       }
+       while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
+           ? toupper(*cp) : *cp)-'A'+10) < base) {
+               result = result*base + value;
+               cp++;
+       }
+       if (endp)
+               *endp = (char *)cp;
+       return result;
+}
+
+static long simple_strtol(const char *cp,char **endp,unsigned int base)
+{
+       if(*cp=='-')
+               return -simple_strtoul(cp+1,endp,base);
+       return simple_strtoul(cp,endp,base);
+}
+
+
+static int skip_atoi(const char **s)
+{
+       int i=0;
+
+       while (is_digit(**s))
+               i = i*10 + *((*s)++) - '0';
+       return i;
+}
+
+#define ZEROPAD        1               /* pad with zero */
+#define SIGN   2               /* unsigned/signed long */
+#define PLUS   4               /* show plus */
+#define SPACE  8               /* space if plus */
+#define LEFT   16              /* left justified */
+#define SPECIAL        32              /* 0x */
+#define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
+
+#define do_div(n,base) ({ \
+int __res; \
+__res = ((unsigned long) n) % (unsigned) base; \
+n = ((unsigned long) n) / (unsigned) base; \
+__res; })
+
+static int number(void (*tx_byte)(unsigned char byte), long num, int base, int size, int precision
+       ,int type)
+{
+       char c,sign,tmp[66];
+       const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
+       int i;
+       int count = 0;
+
+       if (type & LARGE)
+               digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+       if (type & LEFT)
+               type &= ~ZEROPAD;
+       if (base < 2 || base > 36)
+               return 0;
+       c = (type & ZEROPAD) ? '0' : ' ';
+       sign = 0;
+       if (type & SIGN) {
+               if (num < 0) {
+                       sign = '-';
+                       num = -num;
+                       size--;
+               } else if (type & PLUS) {
+                       sign = '+';
+                       size--;
+               } else if (type & SPACE) {
+                       sign = ' ';
+                       size--;
+               }
+       }
+       if (type & SPECIAL) {
+               if (base == 16)
+                       size -= 2;
+               else if (base == 8)
+                       size--;
+       }
+       i = 0;
+       if (num == 0)
+               tmp[i++]='0';
+       else while (num != 0)
+               tmp[i++] = digits[do_div(num,base)];
+       if (i > precision)
+               precision = i;
+       size -= precision;
+       if (!(type&(ZEROPAD+LEFT)))
+               while(size-->0)
+                       tx_byte(' '), count++;
+       if (sign)
+               tx_byte(sign), count++;
+       if (type & SPECIAL) {
+               if (base==8)
+                       tx_byte('0'), count++;
+               else if (base==16) {
+                       tx_byte('0'), count++;
+                       tx_byte(digits[33]), count++;
+               }
+       }
+       if (!(type & LEFT))
+               while (size-- > 0)
+                       tx_byte(c), count++;
+       while (i < precision--)
+               tx_byte('0'), count++;
+       while (i-- > 0)
+               tx_byte(tmp[i]), count++;
+       while (size-- > 0)
+               tx_byte(' '), count++;
+       return count;
+}
+
+
+int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args)
+{
+       int len;
+       unsigned long num;
+       int i, base;
+       const char *s;
+
+       int flags;              /* flags to number() */
+
+       int field_width;        /* width of output field */
+       int precision;          /* min. # of digits for integers; max
+                                  number of chars for from string */
+       int qualifier;          /* 'h', 'l', or 'L' for integer fields */
+       
+       int count;
+
+       for (count=0; *fmt ; ++fmt) {
+               if (*fmt != '%') {
+                       tx_byte(*fmt), count++;
+                       continue;
+               }
+                       
+               /* process flags */
+               flags = 0;
+               repeat:
+                       ++fmt;          /* this also skips first '%' */
+                       switch (*fmt) {
+                               case '-': flags |= LEFT; goto repeat;
+                               case '+': flags |= PLUS; goto repeat;
+                               case ' ': flags |= SPACE; goto repeat;
+                               case '#': flags |= SPECIAL; goto repeat;
+                               case '0': flags |= ZEROPAD; goto repeat;
+                               }
+               
+               /* get field width */
+               field_width = -1;
+               if (is_digit(*fmt))
+                       field_width = skip_atoi(&fmt);
+               else if (*fmt == '*') {
+                       ++fmt;
+                       /* it's the next argument */
+                       field_width = va_arg(args, int);
+                       if (field_width < 0) {
+                               field_width = -field_width;
+                               flags |= LEFT;
+                       }
+               }
+
+               /* get the precision */
+               precision = -1;
+               if (*fmt == '.') {
+                       ++fmt;  
+                       if (is_digit(*fmt))
+                               precision = skip_atoi(&fmt);
+                       else if (*fmt == '*') {
+                               ++fmt;
+                               /* it's the next argument */
+                               precision = va_arg(args, int);
+                       }
+                       if (precision < 0)
+                               precision = 0;
+               }
+
+               /* get the conversion qualifier */
+               qualifier = -1;
+               if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
+                       qualifier = *fmt;
+                       ++fmt;
+               }
+
+               /* default base */
+               base = 10;
+
+               switch (*fmt) {
+               case 'c':
+                       if (!(flags & LEFT))
+                               while (--field_width > 0)
+                                       tx_byte(' '), count++;
+                       tx_byte((unsigned char) va_arg(args, int)), count++;
+                       while (--field_width > 0)
+                               tx_byte(' '), count++;
+                       continue;
+
+               case 's':
+                       s = va_arg(args, char *);
+                       if (!s)
+                               s = "<NULL>";
+
+                       len = strnlen(s, precision);
+
+                       if (!(flags & LEFT))
+                               while (len < field_width--)
+                                       tx_byte(' '), count++;
+                       for (i = 0; i < len; ++i)
+                               tx_byte(*s++), count++;
+                       while (len < field_width--)
+                               tx_byte(' '), count++;
+                       continue;
+
+               case 'p':
+                       if (field_width == -1) {
+                               field_width = 2*sizeof(void *);
+                               flags |= ZEROPAD;
+                       }
+                       count += number(tx_byte,
+                               (unsigned long) va_arg(args, void *), 16,
+                               field_width, precision, flags);
+                       continue;
+
+
+               case 'n':
+                       if (qualifier == 'l') {
+                               long * ip = va_arg(args, long *);
+                               *ip = count;
+                       } else {
+                               int * ip = va_arg(args, int *);
+                               *ip = count;
+                       }
+                       continue;
+
+               case '%':
+                       tx_byte('%'), count++;
+                       continue;
+
+               /* integer number formats - set up the flags and "break" */
+               case 'o':
+                       base = 8;
+                       break;
+
+               case 'X':
+                       flags |= LARGE;
+               case 'x':
+                       base = 16;
+                       break;
+
+               case 'd':
+               case 'i':
+                       flags |= SIGN;
+               case 'u':
+                       break;
+
+               default:
+                       tx_byte('%'), count++;
+                       if (*fmt)
+                               tx_byte(*fmt), count++;
+                       else
+                               --fmt;
+                       continue;
+               }
+               if (qualifier == 'l')
+                       num = va_arg(args, unsigned long);
+               else if (qualifier == 'h') {
+                       num = (unsigned short) va_arg(args, int);
+                       if (flags & SIGN)
+                               num = (short) num;
+               } else if (flags & SIGN)
+                       num = va_arg(args, int);
+               else
+                       num = va_arg(args, unsigned int);
+               count += number(tx_byte, num, base, field_width, precision, flags);
+       }
+       return count;
+}
+