Add support for the tracing infastructure in coreboot.

The compiler is forced to emmit special functions on every
entry/exit of the function. Add a compile time option
to support it. Function entries will be printed in
the console. The CONFIG_TRACE has more documentation.

Patch for userspace tools will follow.

Change-Id: I2cbeb3f104892b034c8756f86ed05bf71187c3f3
Signed-off-by: Rudolf Marek <r.marek@assembler.cz>
Reviewed-on: http://review.coreboot.org/178
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Rudolf Marek 2011-09-02 23:23:41 +02:00 committed by Stefan Reinauer
parent f73535c089
commit 7f0e93060e
8 changed files with 117 additions and 0 deletions

View File

@ -51,6 +51,10 @@ classes-y := ramstage romstage driver smm
romstage-c-ccopts:=-D__PRE_RAM__
romstage-S-ccopts:=-D__PRE_RAM__
ifeq ($(CONFIG_TRACE),y)
ramstage-c-ccopts:= -finstrument-functions
endif
smm-c-ccopts:=-D__SMM__
smm-S-ccopts:=-D__SMM__

View File

@ -845,6 +845,15 @@ config LLSHELL
Put llshell() in your (romstage) code to start the shell.
See src/arch/x86/llshell/llshell.inc for details.
config TRACE
bool "Trace function calls"
default n
help
If enabled, every function will print information to console once
the function is entered. The syntax is ~0xaaaabbbb(0xccccdddd)
the 0xaaaabbbb is the actual function and 0xccccdddd is EIP
of calling function. Please note some printk releated functions
are omitted from trace to have good looking console dumps.
endmenu
config LIFT_BSP_APIC_ID

View File

@ -8,6 +8,7 @@
#include <smp/spinlock.h>
#include <console/vtxprintf.h>
#include <console/console.h>
#include <trace.h>
int console_loglevel = CONFIG_DEFAULT_CONSOLE_LOGLEVEL;
int default_console_loglevel = CONFIG_DEFAULT_CONSOLE_LOGLEVEL;
@ -23,6 +24,7 @@ int do_printk(int msg_level, const char *fmt, ...)
return 0;
}
DISABLE_TRACE;
spin_lock(&console_lock);
va_start(args, fmt);
@ -32,6 +34,7 @@ int do_printk(int msg_level, const char *fmt, ...)
console_tx_flush();
spin_unlock(&console_lock);
ENABLE_TRACE;
return i;
}

View File

@ -22,6 +22,7 @@
#include <string.h>
#include <smp/spinlock.h>
#include <console/vtxprintf.h>
#include <trace.h>
DECLARE_SPIN_LOCK(vsprintf_lock)
@ -37,6 +38,7 @@ static int vsprintf(char *buf, const char *fmt, va_list args)
{
int i;
DISABLE_TRACE;
spin_lock(&vsprintf_lock);
str_buf = buf;
@ -44,6 +46,7 @@ static int vsprintf(char *buf, const char *fmt, va_list args)
*str_buf = '\0';
spin_unlock(&vsprintf_lock);
ENABLE_TRACE;
return i;
}

54
src/include/trace.h Normal file
View File

@ -0,0 +1,54 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2011 Rudolf Marek <r.marek@assembler.cz>
*
* 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
*/
#ifndef __TRACE_H
#define __TRACE_H
#ifdef __PRE_RAM__
#define DISABLE_TRACE
#define ENABLE_TRACE
#define DISABLE_TRACE_ON_FUNCTION
#else /* !__PRE_RAM__ */
#if CONFIG_TRACE
void __cyg_profile_func_enter( void *, void * )
__attribute__ ((no_instrument_function));
void __cyg_profile_func_exit( void *, void * )
__attribute__ ((no_instrument_function));
extern volatile int trace_dis;
#define DISABLE_TRACE do { trace_dis = 1; } while (0);
#define ENABLE_TRACE do { trace_dis = 0; } while (0);
#define DISABLE_TRACE_ON_FUNCTION __attribute__ ((no_instrument_function));
#else /* !CONFIG_TRACE */
#define DISABLE_TRACE
#define ENABLE_TRACE
#define DISABLE_TRACE_ON_FUNCTION
#endif
#endif
#endif

View File

@ -33,6 +33,7 @@ ramstage-$(CONFIG_CONSOLE_SERIAL8250) += uart8250.c
ramstage-$(CONFIG_CONSOLE_SERIAL8250MEM) += uart8250mem.c
ramstage-$(CONFIG_USBDEBUG) += usbdebug.c
ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c
ramstage-$(CONFIG_TRACE) += trace.c
driver-$(CONFIG_CONSOLE_NE2K) += ne2k.c

39
src/lib/trace.c Normal file
View File

@ -0,0 +1,39 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2011 Rudolf Marek <r.marek@assembler.cz>
*
* 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
*/
#include <types.h>
#include <console/console.h>
#include <trace.h>
int volatile trace_dis = 0;
void __cyg_profile_func_enter( void *func, void *callsite)
{
if (trace_dis)
return;
DISABLE_TRACE
printk(BIOS_INFO, "~0x%08x(0x%08x)\n", (uint32_t) func, (uint32_t) callsite);
ENABLE_TRACE
}
void __cyg_profile_func_exit( void *func, void *callsite )
{
}

View File

@ -21,6 +21,8 @@
#include <arch/io.h>
#include <uart8250.h>
#include <pc80/mc146818rtc.h>
#include <trace.h>
#if CONFIG_USE_OPTION_TABLE
#include "option_table.h"
#endif
@ -69,6 +71,7 @@ unsigned char uart8250_rx_byte(unsigned base_port)
void uart8250_init(unsigned base_port, unsigned divisor)
{
DISABLE_TRACE;
/* Disable interrupts */
outb(0x0, base_port + UART_IER);
/* Enable FIFOs */
@ -86,6 +89,7 @@ void uart8250_init(unsigned base_port, unsigned divisor)
/* Set to 3 for 8N1 */
outb(CONFIG_TTYS0_LCS, base_port + UART_LCR);
ENABLE_TRACE;
}
void uart_init(void)