Add support to run SMM handler in TSEG instead of ASEG
[coreboot.git] / src / console / vtxprintf.c
index 72bbac5fb0d599f3b2cbc3d3661e777bf0c27476..a370e5f21ddd591cef4c08fbc74e7117b47675b4 100644 (file)
@@ -4,53 +4,16 @@
  *  Copyright (C) 1991, 1992  Linus Torvalds
  */
 
-#include <stdarg.h>
 #include <string.h>
 #include <div64.h>
+#include <console/console.h>
+#include <console/vtxprintf.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'))
 
-#if 0
-/* We are using number() instead. So this code is obsoleted and should
- * probably go away.
- */
-
-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);
-}
-#endif
-
 static int skip_atoi(const char **s)
 {
        int i=0;
@@ -68,7 +31,7 @@ static int skip_atoi(const char **s)
 #define SPECIAL        32              /* 0x */
 #define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
 
-static int number(void (*tx_byte)(unsigned char byte), 
+static int number(void (*tx_byte)(unsigned char byte),
        unsigned long long num, int base, int size, int precision, int type)
 {
        char c,sign,tmp[66];
@@ -150,18 +113,23 @@ int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args
        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;
 
+#if defined(__SMM__) && CONFIG_SMM_TSEG
+       /* Fix pointer in TSEG */
+       tx_byte = console_tx_byte;
+#endif
+
        for (count=0; *fmt ; ++fmt) {
                if (*fmt != '%') {
                        tx_byte(*fmt), count++;
                        continue;
                }
-                       
+
                /* process flags */
                flags = 0;
-               repeat:
+repeat:
                        ++fmt;          /* this also skips first '%' */
                        switch (*fmt) {
                                case '-': flags |= LEFT; goto repeat;
@@ -170,7 +138,7 @@ int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args
                                case '#': flags |= SPECIAL; goto repeat;
                                case '0': flags |= ZEROPAD; goto repeat;
                                }
-               
+
                /* get field width */
                field_width = -1;
                if (is_digit(*fmt))
@@ -188,7 +156,7 @@ int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args
                /* get the precision */
                precision = -1;
                if (*fmt == '.') {
-                       ++fmt;  
+                       ++fmt;
                        if (is_digit(*fmt))
                                precision = skip_atoi(&fmt);
                        else if (*fmt == '*') {