Remove warnings from USB debug console code.
[coreboot.git] / src / console / vsprintf.c
index bfa6ffebab9989b3a4dbe91a9669883c22d2ef94..4a745233b918257fc65fd589d42f0fd09a71d62e 100644 (file)
@@ -1,45 +1,61 @@
 /*
- *  linux/lib/vsprintf.c
+ * This file is part of the coreboot project.
  *
- *  Copyright (C) 1991, 1992  Linus Torvalds
+ * Copyright (C) 2009 coresystems GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
  */
 
-/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
-/*
- * Wirzenius wrote this portably, Torvalds fucked it up :-)
- */
-#include <stdarg.h>
 #include <string.h>
+#include <smp/spinlock.h>
+#include <console/vtxprintf.h>
 
-int vtxprintf(void (*tx_byte)(unsigned char byte), const char *fmt, va_list args);
+DECLARE_SPIN_LOCK(vsprintf_lock)
 
-int vsprintf(char * buf, const char *fmt, va_list args)
-{
-       char *str_buf;
+static char *str_buf;
 
-       /* this function is only used by vsprintf.
-          To keep str_buf local (for reentrancy
-          and to avoid .bss use, nest it */
-       void str_tx_byte(unsigned char byte)
-       {
-               *str_buf = byte;
-               str_buf++;
-       }
+static void str_tx_byte(unsigned char byte)
+{
+       *str_buf = byte;
+       str_buf++;
+}
 
+static int vsprintf(char *buf, const char *fmt, va_list args)
+{
        int i;
+
+       spin_lock(&vsprintf_lock);
+
        str_buf = buf;
        i = vtxprintf(str_tx_byte, fmt, args);
        *str_buf = '\0';
+
+       spin_unlock(&vsprintf_lock);
+
        return i;
 }
 
-int sprintf(char * buf, const char *fmt, ...)
+int sprintf(char *buf, const char *fmt, ...)
 {
        va_list args;
        int i;
 
        va_start(args, fmt);
-       i=vsprintf(buf,fmt,args);
+       i = vsprintf(buf, fmt, args);
        va_end(args);
+
        return i;
 }