blob: 435401b7efcd33aa088a4f6dc528ca747a060fbe [file] [log] [blame]
Eric Biederman8ca8d762003-04-22 19:02:15 +00001/*
Stefan Reinauer52fc6b12009-10-24 13:06:04 +00002 * This file is part of the coreboot project.
Stefan Reinauer14e22772010-04-27 06:56:47 +00003 *
Stefan Reinauer52fc6b12009-10-24 13:06:04 +00004 * Copyright (C) 2009 coresystems GmbH
Eric Biederman8ca8d762003-04-22 19:02:15 +00005 *
Stefan Reinauer52fc6b12009-10-24 13:06:04 +00006 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; version 2 of
9 * the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
19 * MA 02110-1301 USA
Eric Biederman8ca8d762003-04-22 19:02:15 +000020 */
21
Myles Watson58170782009-10-28 16:13:28 +000022#include <string.h>
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000023#include <smp/spinlock.h>
24#include <console/vtxprintf.h>
Rudolf Marek7f0e9302011-09-02 23:23:41 +020025#include <trace.h>
Eric Biederman8ca8d762003-04-22 19:02:15 +000026
Myles Watson2e672732009-11-12 16:38:03 +000027DECLARE_SPIN_LOCK(vsprintf_lock)
Eric Biederman8ca8d762003-04-22 19:02:15 +000028
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000029static char *str_buf;
30
31static void str_tx_byte(unsigned char byte)
Eric Biederman8ca8d762003-04-22 19:02:15 +000032{
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000033 *str_buf = byte;
34 str_buf++;
35}
Patrick Georgi736221f12009-05-26 14:31:37 +000036
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000037static int vsprintf(char *buf, const char *fmt, va_list args)
38{
Eric Biederman8ca8d762003-04-22 19:02:15 +000039 int i;
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000040
Rudolf Marek7f0e9302011-09-02 23:23:41 +020041 DISABLE_TRACE;
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000042 spin_lock(&vsprintf_lock);
43
Eric Biederman8ca8d762003-04-22 19:02:15 +000044 str_buf = buf;
45 i = vtxprintf(str_tx_byte, fmt, args);
Eric Biederman8ca8d762003-04-22 19:02:15 +000046 *str_buf = '\0';
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000047
48 spin_unlock(&vsprintf_lock);
Rudolf Marek7f0e9302011-09-02 23:23:41 +020049 ENABLE_TRACE;
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000050
Eric Biederman8ca8d762003-04-22 19:02:15 +000051 return i;
52}
53
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000054int sprintf(char *buf, const char *fmt, ...)
Eric Biederman8ca8d762003-04-22 19:02:15 +000055{
56 va_list args;
57 int i;
58
59 va_start(args, fmt);
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000060 i = vsprintf(buf, fmt, args);
Eric Biederman8ca8d762003-04-22 19:02:15 +000061 va_end(args);
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000062
Eric Biederman8ca8d762003-04-22 19:02:15 +000063 return i;
64}