Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93fd03a8 authored by Catalin Marinas's avatar Catalin Marinas
Browse files

ARM: Add an earlyprintk debug console



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: default avatarCatalin Marinas <catalin.marinas@arm.com>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: default avatarPavel Machek <pavel@ucw.cz>
parent 22763c5c
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -71,6 +71,14 @@ config DEBUG_LL
	  in the kernel.  This is helpful if you are debugging code that
	  in the kernel.  This is helpful if you are debugging code that
	  executes before the console is initialized.
	  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
config DEBUG_ICEDCC
	bool "Kernel low-level debugging via EmbeddedICE DCC channel"
	bool "Kernel low-level debugging via EmbeddedICE DCC channel"
	depends on DEBUG_LL
	depends on DEBUG_LL
+1 −0
Original line number Original line Diff line number Diff line
@@ -52,5 +52,6 @@ endif


head-y			:= head$(MMUEXT).o
head-y			:= head$(MMUEXT).o
obj-$(CONFIG_DEBUG_LL)	+= debug.o
obj-$(CONFIG_DEBUG_LL)	+= debug.o
obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o


extra-y := $(head-y) init_task.o vmlinux.lds
extra-y := $(head-y) init_task.o vmlinux.lds
+57 −0
Original line number Original line Diff line number Diff line
/*
 *  linux/arch/arm/kernel/early_printk.c
 *
 *  Copyright (C) 2009 Sascha Hauer <s.hauer@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);