[RFC PATCH] Add an earlyprintk debug console

Kristoffer Ericson kristoffer.ericson at gmail.com
Thu Nov 5 15:36:37 EST 2009


On Thu, 05 Nov 2009 12:35:12 +0000
Catalin Marinas <catalin.marinas at arm.com> wrote:

> This patch allows an earlyprintk console if CONFIG_DEBUG_LL is enabled,
> using the printch asm function.
> 
> The patch is based on the original work by Sascha Hauer.
> 
> Signed-off-by: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Sascha Hauer <s.hauer at pengutronix.de>
> Cc: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
> ---

Finally :) Hate having to hacking in printascii everytime I want debuginfo.

> 
> The first variant of this patch was posted earlier this year -
> http://thread.gmane.org/gmane.linux.ports.arm.kernel/52478 - and there
> were a few comments but no follow-up patch. I implemented those
> comments and I think we should merge this (it's much easier to pass
> earlyprintk on the kernel command line than hacking the printk code to
> do a printascii).
> 
> 
>  arch/arm/Kconfig.debug         |    8 ++++++
>  arch/arm/kernel/Makefile       |    1 +
>  arch/arm/kernel/early_printk.c |   57 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 66 insertions(+), 0 deletions(-)
>  create mode 100644 arch/arm/kernel/early_printk.c
> 
> diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
> index 1a6f70e..feb7b11 100644
> --- a/arch/arm/Kconfig.debug
> +++ b/arch/arm/Kconfig.debug
> @@ -71,6 +71,14 @@ config DEBUG_LL
>  	  in the kernel.  This is helpful if you are debugging code that
>  	  executes before the console is initialized.
>  
> +config EARLY_PRINTK
> +	bool "Early printk"
> +	depends on DEBUG_LL
> +	help
> +	  Say Y here if you want to have an early console using the
> +	  kernel low-level debugging functions. Add earlyprintk to your
> +	  kernel parameters to enable this console.
> +
>  config DEBUG_ICEDCC
>  	bool "Kernel low-level debugging via EmbeddedICE DCC channel"
>  	depends on DEBUG_LL
> diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
> index 79087dd..d0e40b7 100644
> --- a/arch/arm/kernel/Makefile
> +++ b/arch/arm/kernel/Makefile
> @@ -52,5 +52,6 @@ endif
>  
>  head-y			:= head$(MMUEXT).o
>  obj-$(CONFIG_DEBUG_LL)	+= debug.o
> +obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
>  
>  extra-y := $(head-y) init_task.o vmlinux.lds
> diff --git a/arch/arm/kernel/early_printk.c b/arch/arm/kernel/early_printk.c
> new file mode 100644
> index 0000000..85aa2b2
> --- /dev/null
> +++ b/arch/arm/kernel/early_printk.c
> @@ -0,0 +1,57 @@
> +/*
> + *  linux/arch/arm/kernel/early_printk.c
> + *
> + *  Copyright (C) 2009 Sascha Hauer <s.hauer at pengutronix.de>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/console.h>
> +#include <linux/init.h>
> +
> +extern void printch(int);
> +
> +static void early_write(const char *s, unsigned n)
> +{
> +	while (n-- > 0) {
> +		if (*s == '\n')
> +			printch('\r');
> +		printch(*s);
> +		s++;
> +	}
> +}
> +
> +static void early_console_write(struct console *con, const char *s, unsigned n)
> +{
> +	early_write(s, n);
> +}
> +
> +static struct console early_console = {
> +	.name =		"earlycon",
> +	.write =	early_console_write,
> +	.flags =	CON_PRINTBUFFER | CON_BOOT,
> +	.index =	-1,
> +};
> +
> +asmlinkage void early_printk(const char *fmt, ...)
> +{
> +	char buf[512];
> +	int n;
> +	va_list ap;
> +
> +	va_start(ap, fmt);
> +	n = vscnprintf(buf, sizeof(buf), fmt, ap);
> +	early_write(buf, n);
> +	va_end(ap);
> +}
> +
> +static int __init setup_early_printk(char *buf)
> +{
> +	register_console(&early_console);
> +	return 0;
> +}
> +
> +early_param("earlyprintk", setup_early_printk);
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel


-- 
Kristoffer Ericson <kristoffer.ericson at gmail.com>



More information about the linux-arm-kernel mailing list