Skip to content

Commit 8fee13a

Browse files
Yinghai LuH. Peter Anvin
authored andcommitted
x86, setup: enable early console output from the decompressor
This enables the decompressor output to be seen on the serial console. Most of the code is shared with the regular boot code. We could add printf to the decompressor if needed, but currently there is no sufficiently compelling user. -v2: define BOOT_BOOT_H to avoid include boot.h -v3: early_serial_base need to be static in misc.c ? -v4: create seperate string.c printf.c cmdline.c early_serial_console.c after hpa's patch that allow global variables in compressed/misc stage -v5: remove printf.c related Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
1 parent f4ed287 commit 8fee13a

File tree

7 files changed

+105
-29
lines changed

7 files changed

+105
-29
lines changed

arch/x86/boot/compressed/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# create a compressed vmlinux image from the original vmlinux
55
#
66

7-
targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.lzo head_$(BITS).o misc.o piggy.o
7+
targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.lzo head_$(BITS).o misc.o string.o cmdline.o early_serial_console.o piggy.o
88

99
KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2
1010
KBUILD_CFLAGS += -fno-strict-aliasing -fPIC
@@ -23,7 +23,7 @@ LDFLAGS_vmlinux := -T
2323

2424
hostprogs-y := mkpiggy
2525

26-
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o $(obj)/piggy.o FORCE
26+
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o $(obj)/piggy.o FORCE
2727
$(call if_changed,ld)
2828
@:
2929

arch/x86/boot/compressed/cmdline.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "misc.h"
2+
3+
static unsigned long fs;
4+
static inline void set_fs(unsigned long seg)
5+
{
6+
fs = seg << 4; /* shift it back */
7+
}
8+
typedef unsigned long addr_t;
9+
static inline char rdfs8(addr_t addr)
10+
{
11+
return *((char *)(fs + addr));
12+
}
13+
#include "../cmdline.c"
14+
int cmdline_find_option(const char *option, char *buffer, int bufsize)
15+
{
16+
return __cmdline_find_option(real_mode->hdr.cmd_line_ptr, option, buffer, bufsize);
17+
}
18+
int cmdline_find_option_bool(const char *option)
19+
{
20+
return __cmdline_find_option_bool(real_mode->hdr.cmd_line_ptr, option);
21+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "misc.h"
2+
3+
int early_serial_base;
4+
5+
#include "../early_serial_console.c"

arch/x86/boot/compressed/misc.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,7 @@
99
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
1010
*/
1111

12-
/*
13-
* we have to be careful, because no indirections are allowed here, and
14-
* paravirt_ops is a kind of one. As it will only run in baremetal anyway,
15-
* we just keep it from happening
16-
*/
17-
#undef CONFIG_PARAVIRT
18-
#ifdef CONFIG_X86_32
19-
#define _ASM_X86_DESC_H 1
20-
#endif
21-
22-
#include <linux/linkage.h>
23-
#include <linux/screen_info.h>
24-
#include <linux/elf.h>
25-
#include <linux/io.h>
26-
#include <asm/page.h>
27-
#include <asm/boot.h>
28-
#include <asm/bootparam.h>
12+
#include "misc.h"
2913

3014
/* WARNING!!
3115
* This code is compiled with -fPIC and it is relocated dynamically
@@ -123,15 +107,13 @@ static void error(char *m);
123107
/*
124108
* This is set up by the setup-routine at boot-time
125109
*/
126-
static struct boot_params *real_mode; /* Pointer to real-mode data */
110+
struct boot_params *real_mode; /* Pointer to real-mode data */
127111
static int quiet;
112+
static int debug;
128113

129114
void *memset(void *s, int c, size_t n);
130115
void *memcpy(void *dest, const void *src, size_t n);
131116

132-
static void __putstr(int, const char *);
133-
#define putstr(__x) __putstr(0, __x)
134-
135117
#ifdef CONFIG_X86_64
136118
#define memptr long
137119
#else
@@ -170,7 +152,21 @@ static void scroll(void)
170152
vidmem[i] = ' ';
171153
}
172154

173-
static void __putstr(int error, const char *s)
155+
#define XMTRDY 0x20
156+
157+
#define TXR 0 /* Transmit register (WRITE) */
158+
#define LSR 5 /* Line Status */
159+
static void serial_putchar(int ch)
160+
{
161+
unsigned timeout = 0xffff;
162+
163+
while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout)
164+
cpu_relax();
165+
166+
outb(ch, early_serial_base + TXR);
167+
}
168+
169+
void __putstr(int error, const char *s)
174170
{
175171
int x, y, pos;
176172
char c;
@@ -179,6 +175,14 @@ static void __putstr(int error, const char *s)
179175
if (!error)
180176
return;
181177
#endif
178+
if (early_serial_base) {
179+
const char *str = s;
180+
while (*str) {
181+
if (*str == '\n')
182+
serial_putchar('\r');
183+
serial_putchar(*str++);
184+
}
185+
}
182186

183187
if (real_mode->screen_info.orig_video_mode == 0 &&
184188
lines == 0 && cols == 0)
@@ -305,8 +309,10 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
305309
{
306310
real_mode = rmode;
307311

308-
if (real_mode->hdr.loadflags & QUIET_FLAG)
312+
if (cmdline_find_option_bool("quiet"))
309313
quiet = 1;
314+
if (cmdline_find_option_bool("debug"))
315+
debug = 1;
310316

311317
if (real_mode->screen_info.orig_video_mode == 7) {
312318
vidmem = (char *) 0xb0000;
@@ -319,6 +325,10 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
319325
lines = real_mode->screen_info.orig_video_lines;
320326
cols = real_mode->screen_info.orig_video_cols;
321327

328+
console_init();
329+
if (debug)
330+
putstr("early console in decompress_kernel\n");
331+
322332
free_mem_ptr = heap; /* Heap */
323333
free_mem_end_ptr = heap + BOOT_HEAP_SIZE;
324334

arch/x86/boot/compressed/misc.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef BOOT_COMPRESSED_MISC_H
2+
#define BOOT_COMPRESSED_MISC_H
3+
4+
/*
5+
* we have to be careful, because no indirections are allowed here, and
6+
* paravirt_ops is a kind of one. As it will only run in baremetal anyway,
7+
* we just keep it from happening
8+
*/
9+
#undef CONFIG_PARAVIRT
10+
#ifdef CONFIG_X86_32
11+
#define _ASM_X86_DESC_H 1
12+
#endif
13+
14+
#include <linux/linkage.h>
15+
#include <linux/screen_info.h>
16+
#include <linux/elf.h>
17+
#include <linux/io.h>
18+
#include <asm/page.h>
19+
#include <asm/boot.h>
20+
#include <asm/bootparam.h>
21+
22+
#define BOOT_BOOT_H
23+
24+
/* misc.c */
25+
extern struct boot_params *real_mode; /* Pointer to real-mode data */
26+
void __putstr(int error, const char *s);
27+
#define putstr(__x) __putstr(0, __x)
28+
#define puts(__x) __putstr(0, __x)
29+
30+
/* cmdline.c */
31+
int cmdline_find_option(const char *option, char *buffer, int bufsize);
32+
int cmdline_find_option_bool(const char *option);
33+
34+
/* early_serial_console.c */
35+
extern int early_serial_base;
36+
void console_init(void);
37+
38+
#endif

arch/x86/boot/compressed/string.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#include "misc.h"
2+
3+
#include "../isdigit.h"
4+
#include "../string.c"

arch/x86/boot/main.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ void main(void)
132132

133133
/* Initialize the early-boot console */
134134
console_init();
135+
if (cmdline_find_option_bool("debug"))
136+
puts("early console in setup code\n");
135137

136138
/* End of heap check */
137139
init_heap();
@@ -171,10 +173,6 @@ void main(void)
171173
/* Set the video mode */
172174
set_video();
173175

174-
/* Parse command line for 'quiet' and pass it to decompressor. */
175-
if (cmdline_find_option_bool("quiet"))
176-
boot_params.hdr.loadflags |= QUIET_FLAG;
177-
178176
/* Do the last things and invoke protected mode */
179177
go_to_protected_mode();
180178
}

0 commit comments

Comments
 (0)