|
@@ -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;
|
|
|
|