Skip to content

Commit

Permalink
x86: make early printk selectable on 64-bit as well
Browse files Browse the repository at this point in the history
Enable CONFIG_EMBEDDED to select CONFIG_EARLY_PRINTK on 64-bit as well.

saves ~2K:

   text    data     bss     dec     hex filename
   7290283 3672091 1907848 12870222         c4624e vmlinux.before
   7288373 3671795 1907848 12868016         c459b0 vmlinux.after

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Ingo Molnar committed Jan 30, 2008
1 parent 8866cd9 commit 076f977
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 3 deletions.
2 changes: 1 addition & 1 deletion arch/x86/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ config TRACE_IRQFLAGS_SUPPORT
source "lib/Kconfig.debug"

config EARLY_PRINTK
bool "Early printk" if EMBEDDED && DEBUG_KERNEL && X86_32
bool "Early printk" if EMBEDDED
default y
help
Write kernel log output directly into the VGA buffer or to a serial
Expand Down
7 changes: 6 additions & 1 deletion arch/x86/kernel/head64.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,13 @@ void __init x86_64_start_kernel(char * real_mode_data)
/* Make NULL pointers segfault */
zap_identity_mappings();

for (i = 0; i < IDT_ENTRIES; i++)
for (i = 0; i < IDT_ENTRIES; i++) {
#ifdef CONFIG_EARLY_PRINTK
set_intr_gate(i, &early_idt_handlers[i]);
#else
set_intr_gate(i, early_idt_handler);
#endif
}
load_idt((const struct desc_ptr *)&idt_descr);

early_printk("Kernel alive\n");
Expand Down
7 changes: 7 additions & 0 deletions arch/x86/kernel/head_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ init_rsp:
bad_address:
jmp bad_address

#ifdef CONFIG_EARLY_PRINTK
.macro early_idt_tramp first, last
.ifgt \last-\first
early_idt_tramp \first, \last-1
Expand All @@ -281,8 +282,10 @@ early_idt_handlers:
early_idt_tramp 64, 127
early_idt_tramp 128, 191
early_idt_tramp 192, 255
#endif

ENTRY(early_idt_handler)
#ifdef CONFIG_EARLY_PRINTK
cmpl $2,early_recursion_flag(%rip)
jz 1f
incl early_recursion_flag(%rip)
Expand Down Expand Up @@ -311,15 +314,19 @@ ENTRY(early_idt_handler)
movq 8(%rsp),%rsi # get rip again
call __print_symbol
#endif
#endif /* EARLY_PRINTK */
1: hlt
jmp 1b

#ifdef CONFIG_EARLY_PRINTK
early_recursion_flag:
.long 0

early_idt_msg:
.asciz "PANIC: early exception %02lx rip %lx:%lx error %lx cr2 %lx\n"
early_idt_ripmsg:
.asciz "RIP %s\n"
#endif /* CONFIG_EARLY_PRINTK */

.balign PAGE_SIZE

Expand Down
1 change: 0 additions & 1 deletion include/asm-x86/kdebug.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ enum die_val {
DIE_PAGE_FAULT,
};

extern void early_printk(const char *fmt, ...) __attribute__((format(printf,1,2)));
extern void printk_address(unsigned long address);
extern void die(const char *,struct pt_regs *,long);
extern int __must_check __die(const char *, struct pt_regs *, long);
Expand Down
3 changes: 3 additions & 0 deletions include/linux/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,9 @@ static inline int log_buf_read(int idx) { return 0; }
static inline int log_buf_copy(char *dest, int idx, int len) { return 0; }
#endif

extern void __attribute__((format(printf, 1, 2)))
early_printk(const char *fmt, ...);

unsigned long int_sqrt(unsigned long);

extern int printk_ratelimit(void);
Expand Down
7 changes: 7 additions & 0 deletions kernel/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@

#include <asm/uaccess.h>

/*
* Architectures can override it:
*/
void __attribute__((weak)) early_printk(const char *fmt, ...)
{
}

#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)

/* printk's without a loglevel use this.. */
Expand Down

0 comments on commit 076f977

Please sign in to comment.