x86, setup: enable early console output from the decompressor
[pandora-kernel.git] / arch / x86 / boot / compressed / misc.c
index 51e2407..8f7bef8 100644 (file)
@@ -9,23 +9,7 @@
  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
  */
 
-/*
- * we have to be careful, because no indirections are allowed here, and
- * paravirt_ops is a kind of one. As it will only run in baremetal anyway,
- * we just keep it from happening
- */
-#undef CONFIG_PARAVIRT
-#ifdef CONFIG_X86_32
-#define _ASM_X86_DESC_H 1
-#endif
-
-#include <linux/linkage.h>
-#include <linux/screen_info.h>
-#include <linux/elf.h>
-#include <linux/io.h>
-#include <asm/page.h>
-#include <asm/boot.h>
-#include <asm/bootparam.h>
+#include "misc.h"
 
 /* WARNING!!
  * This code is compiled with -fPIC and it is relocated dynamically
@@ -123,15 +107,13 @@ static void error(char *m);
 /*
  * This is set up by the setup-routine at boot-time
  */
-static struct boot_params *real_mode;          /* Pointer to real-mode data */
+struct boot_params *real_mode;         /* Pointer to real-mode data */
 static int quiet;
+static int debug;
 
 void *memset(void *s, int c, size_t n);
 void *memcpy(void *dest, const void *src, size_t n);
 
-static void __putstr(int, const char *);
-#define putstr(__x)  __putstr(0, __x)
-
 #ifdef CONFIG_X86_64
 #define memptr long
 #else
@@ -170,7 +152,21 @@ static void scroll(void)
                vidmem[i] = ' ';
 }
 
-static void __putstr(int error, const char *s)
+#define XMTRDY          0x20
+
+#define TXR             0       /*  Transmit register (WRITE) */
+#define LSR             5       /*  Line Status               */
+static void serial_putchar(int ch)
+{
+       unsigned timeout = 0xffff;
+
+       while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout)
+               cpu_relax();
+
+       outb(ch, early_serial_base + TXR);
+}
+
+void __putstr(int error, const char *s)
 {
        int x, y, pos;
        char c;
@@ -179,6 +175,14 @@ static void __putstr(int error, const char *s)
        if (!error)
                return;
 #endif
+       if (early_serial_base) {
+               const char *str = s;
+               while (*str) {
+                       if (*str == '\n')
+                               serial_putchar('\r');
+                       serial_putchar(*str++);
+               }
+       }
 
        if (real_mode->screen_info.orig_video_mode == 0 &&
            lines == 0 && cols == 0)
@@ -305,8 +309,10 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
 {
        real_mode = rmode;
 
-       if (real_mode->hdr.loadflags & QUIET_FLAG)
+       if (cmdline_find_option_bool("quiet"))
                quiet = 1;
+       if (cmdline_find_option_bool("debug"))
+               debug = 1;
 
        if (real_mode->screen_info.orig_video_mode == 7) {
                vidmem = (char *) 0xb0000;
@@ -319,6 +325,10 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
        lines = real_mode->screen_info.orig_video_lines;
        cols = real_mode->screen_info.orig_video_cols;
 
+       console_init();
+       if (debug)
+               putstr("early console in decompress_kernel\n");
+
        free_mem_ptr     = heap;        /* Heap */
        free_mem_end_ptr = heap + BOOT_HEAP_SIZE;