lkml.org 
[lkml]   [2002]   [Jun]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[patch] early printk. (was: Re: computer reboots before "Uncompressing Linux..." with 2.5.19-xfs)

On Wed, 12 Jun 2002, Keith Owens wrote:

> >>Then, after a small pause, the box reboots (note: it does _not_ print
> >>"Uncompressing Linux..."). I have tried the following:
> >
> >Interesting problem..... Interesting because I'm having the EXACT
> >SAME PROBLEM!!!! ARRRRRGGGGHHH!!!!
>
> Try http://marc.theaimsgroup.com/?l=linux-kernel&m=101072840225142&w=2

you might as well try the attached early_printk() patch, it's slightly
easier to use than a one-char macro. But the goal is the same.

Ingo

diff -Naur -X dontdiff linux-2.4.14-gold/Documentation/Configure.help linux/Documentation/Configure.help
--- linux-2.4.14-gold/Documentation/Configure.help Mon Nov 12 12:56:02 2001
+++ linux/Documentation/Configure.help Wed Nov 14 11:20:39 2001
@@ -18510,6 +18510,13 @@
It is recommended to be used on a NetWinder, but it is not a
necessity.

+Early printk support
+CONFIG_X86_EARLY_PRINTK
+ Saying Y here enables the early_printk function, which allows output
+ to the console much earlier in the boot process than printk. This
+ is useful when debugging fatal problems early in the boot sequence
+ (e.g. within setup_arch). If unsure, say N.
+
Debug high memory support
CONFIG_DEBUG_HIGHMEM
This options enables addition error checking for high memory systems.
diff -Naur -X dontdiff linux-2.4.14-gold/arch/i386/config.in linux/arch/i386/config.in
--- linux-2.4.14-gold/arch/i386/config.in Mon Nov 12 12:55:48 2001
+++ linux/arch/i386/config.in Wed Nov 14 11:08:50 2001
@@ -405,6 +405,7 @@
bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ
bool ' Spinlock debugging' CONFIG_DEBUG_SPINLOCK
bool ' Verbose BUG() reporting (adds 70K)' CONFIG_DEBUG_BUGVERBOSE
+ bool ' Early printk support' CONFIG_X86_EARLY_PRINTK
fi

endmenu
diff -Naur -X dontdiff linux-2.4.14-gold/arch/i386/kernel/Makefile linux/arch/i386/kernel/Makefile
--- linux-2.4.14-gold/arch/i386/kernel/Makefile Mon Nov 12 12:55:48 2001
+++ linux/arch/i386/kernel/Makefile Wed Nov 14 11:09:04 2001
@@ -40,5 +40,6 @@
obj-$(CONFIG_X86_LOCAL_APIC) += mpparse.o apic.o nmi.o
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
obj-$(CONFIG_X86_VISWS_APIC) += visws_apic.o
+obj-$(CONFIG_X86_EARLY_PRINTK) += debug.o

include $(TOPDIR)/Rules.make
diff -Naur -X dontdiff linux-2.4.14-gold/arch/i386/kernel/debug.c linux/arch/i386/kernel/debug.c
--- linux-2.4.14-gold/arch/i386/kernel/debug.c Wed Dec 31 16:00:00 1969
+++ linux/arch/i386/kernel/debug.c Wed Nov 14 13:12:06 2001
@@ -0,0 +1,67 @@
+/*
+ * debug.c - IA32 Early Debug Support
+ *
+ * Copyright (C) 2001 Ingo Molnar <mingo@elte.hu> [early_printk support]
+ *
+ * Boot-time and early wakeup debug support for IA32 platforms.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/kernel_stat.h>
+#include <linux/swap.h>
+#include <linux/swapctl.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/bootmem.h>
+
+
+/* --------------------------------------------------------------------------
+ Early printk
+ -------------------------------------------------------------------------- */
+
+#ifdef CONFIG_X86_EARLY_PRINTK
+
+int early_printk_disable = 0;
+char printk_buffer[1024];
+
+#define vmem ((char *)(PAGE_OFFSET+0xb8000))
+
+#define NCOLS 80
+#define NROWS 25
+
+#define early_putc(c, row, line, color) \
+ { vmem[2*(row)+(line)]=(c); vmem[2*(row)+(line)+1]=(color); }
+
+void __early_printk(char * str)
+{
+ char num [16];
+ int i;
+ static int x = 0;
+ static int y = 0;
+ static int line = 0;
+ int s_len = strlen(str), num_len;
+
+ num_len = sprintf(num, "<%03d> ", line);
+ num[num_len] = 0;
+
+ for (i = 0; i < num_len; i++)
+ early_putc(num[i], i, y, 0x2f);
+
+ x = num_len;
+
+ for (i = 0; i < s_len; i++) {
+ early_putc(str[i], x, y, 0x3f);
+ x++;
+ if ((str[i] == '\n') || x > NCOLS) {
+ line++;
+ y += 2*NCOLS;
+ x = 0;
+ if (y >= NROWS*2*NCOLS)
+ y = 0;
+ }
+ }
+}
+
+#endif /*CONFIG_X86_EARLY_PRINTK*/
diff -Naur -X dontdiff linux-2.4.14-gold/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c
--- linux-2.4.14-gold/arch/i386/kernel/setup.c Mon Nov 12 12:55:48 2001
+++ linux/arch/i386/kernel/setup.c Wed Nov 14 13:10:24 2001
@@ -108,10 +108,13 @@
#include <asm/dma.h>
#include <asm/mpspec.h>
#include <asm/mmu_context.h>
+#ifdef CONFIG_X86_EARLY_PRINTK
+#include <asm/debug.h>
+#endif
+
/*
* Machine setup..
*/
-
char ignore_irq13; /* set if exception 16 works */
struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };

@@ -941,7 +944,9 @@
*/
reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
#endif
-
+#ifdef CONFIG_X86_EARLY_PRINTK
+ early_printk("Early printk support enabled\n");
+#endif
#ifdef CONFIG_X86_LOCAL_APIC
/*
* Find and reserve possible boot-time SMP configuration:
@@ -984,7 +989,6 @@
init_apic_mappings();
#endif

-
/*
* Request address space for all standard RAM and ROM resources
* and also for regions reported as reserved by the e820.
@@ -1033,6 +1037,9 @@
conswitchp = &dummy_con;
#endif
#endif
+#ifdef CONFIG_X86_EARLY_PRINTK
+ early_printk_disable = 1;
+#endif
}

#ifndef CONFIG_X86_TSC
diff -Naur -X dontdiff linux-2.4.14-gold/include/asm-i386/debug.h linux/include/asm-i386/debug.h
--- linux-2.4.14-gold/include/asm-i386/debug.h Wed Dec 31 16:00:00 1969
+++ linux/include/asm-i386/debug.h Wed Nov 14 13:12:51 2001
@@ -0,0 +1,41 @@
+/*
+ * asm-i386/debug.h - IA32 Early Debug Support
+ *
+ * Copyright (C) 2001 Ingo Molnar <mingo@elte.hu>
+ */
+
+#ifndef _ASM_DEBUG_H
+#define _ASM_DEBUG_H
+
+
+/* --------------------------------------------------------------------------
+ Early printk
+ -------------------------------------------------------------------------- */
+
+#if !defined(ASSEMBLY) && !defined(__ASSEMBLY__)
+
+#ifdef CONFIG_X86_EARLY_PRINTK
+
+extern int early_printk_disable;
+extern char printk_buffer[1024];
+extern void __early_printk(char * str);
+
+static inline void early_printk(char * v, ...)
+{
+ if (!early_printk_disable) {
+ unsigned int len = sprintf(printk_buffer, v);
+ printk_buffer[len] = 0;
+ __early_printk(printk_buffer);
+ }
+ printk(v);
+}
+
+#else /*CONFIG_X86_EARLY_PRINTK*/
+
+#define early_printk(v...) do { printk(v); } while (0)
+
+#endif /*CONFIG_X86_EARLY_PRINTK*/
+
+#endif /*!defined(ASSEMBLY) && !defined(__ASSEMBLY__)*/
+
+#endif /*_ASM_DEBUG_H*/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:26    [from the cache]
©2003-2011 Jasper Spaans