Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 205504
b: refs/heads/master
c: 8fee13a
h: refs/heads/master
v: v3
  • Loading branch information
Yinghai Lu authored and H. Peter Anvin committed Aug 3, 2010
1 parent 90e8af1 commit 59cf5ba
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f4ed2877b16e8146427306aea8819adac5c88374
refs/heads/master: 8fee13a48e4879fba57725f6d9513df4bfa8e9f3
4 changes: 2 additions & 2 deletions trunk/arch/x86/boot/compressed/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# create a compressed vmlinux image from the original vmlinux
#

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

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

hostprogs-y := mkpiggy

$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o $(obj)/piggy.o FORCE
$(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
$(call if_changed,ld)
@:

Expand Down
21 changes: 21 additions & 0 deletions trunk/arch/x86/boot/compressed/cmdline.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include "misc.h"

static unsigned long fs;
static inline void set_fs(unsigned long seg)
{
fs = seg << 4; /* shift it back */
}
typedef unsigned long addr_t;
static inline char rdfs8(addr_t addr)
{
return *((char *)(fs + addr));
}
#include "../cmdline.c"
int cmdline_find_option(const char *option, char *buffer, int bufsize)
{
return __cmdline_find_option(real_mode->hdr.cmd_line_ptr, option, buffer, bufsize);
}
int cmdline_find_option_bool(const char *option)
{
return __cmdline_find_option_bool(real_mode->hdr.cmd_line_ptr, option);
}
5 changes: 5 additions & 0 deletions trunk/arch/x86/boot/compressed/early_serial_console.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#include "misc.h"

int early_serial_base;

#include "../early_serial_console.c"
56 changes: 33 additions & 23 deletions trunk/arch/x86/boot/compressed/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand Down
38 changes: 38 additions & 0 deletions trunk/arch/x86/boot/compressed/misc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#ifndef BOOT_COMPRESSED_MISC_H
#define BOOT_COMPRESSED_MISC_H

/*
* 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>

#define BOOT_BOOT_H

/* misc.c */
extern struct boot_params *real_mode; /* Pointer to real-mode data */
void __putstr(int error, const char *s);
#define putstr(__x) __putstr(0, __x)
#define puts(__x) __putstr(0, __x)

/* cmdline.c */
int cmdline_find_option(const char *option, char *buffer, int bufsize);
int cmdline_find_option_bool(const char *option);

/* early_serial_console.c */
extern int early_serial_base;
void console_init(void);

#endif
4 changes: 4 additions & 0 deletions trunk/arch/x86/boot/compressed/string.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "misc.h"

#include "../isdigit.h"
#include "../string.c"
6 changes: 2 additions & 4 deletions trunk/arch/x86/boot/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ void main(void)

/* Initialize the early-boot console */
console_init();
if (cmdline_find_option_bool("debug"))
puts("early console in setup code\n");

/* End of heap check */
init_heap();
Expand Down Expand Up @@ -171,10 +173,6 @@ void main(void)
/* Set the video mode */
set_video();

/* Parse command line for 'quiet' and pass it to decompressor. */
if (cmdline_find_option_bool("quiet"))
boot_params.hdr.loadflags |= QUIET_FLAG;

/* Do the last things and invoke protected mode */
go_to_protected_mode();
}

0 comments on commit 59cf5ba

Please sign in to comment.