Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
This commit is contained in:
104
arch/i386/boot/Makefile
Normal file
104
arch/i386/boot/Makefile
Normal file
@@ -0,0 +1,104 @@
|
||||
#
|
||||
# arch/i386/boot/Makefile
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
#
|
||||
# Copyright (C) 1994 by Linus Torvalds
|
||||
#
|
||||
|
||||
# ROOT_DEV specifies the default root-device when making the image.
|
||||
# This can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case
|
||||
# the default of FLOPPY is used by 'build'.
|
||||
|
||||
ROOT_DEV := CURRENT
|
||||
|
||||
# If you want to preset the SVGA mode, uncomment the next line and
|
||||
# set SVGA_MODE to whatever number you want.
|
||||
# Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode.
|
||||
# The number is the same as you would ordinarily press at bootup.
|
||||
|
||||
SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
|
||||
|
||||
# If you want the RAM disk device, define this to be the size in blocks.
|
||||
|
||||
#RAMDISK := -DRAMDISK=512
|
||||
|
||||
targets := vmlinux.bin bootsect bootsect.o setup setup.o \
|
||||
zImage bzImage
|
||||
subdir- := compressed
|
||||
|
||||
hostprogs-y := tools/build
|
||||
|
||||
HOSTCFLAGS_build.o := $(LINUXINCLUDE)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
$(obj)/zImage: IMAGE_OFFSET := 0x1000
|
||||
$(obj)/zImage: EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK)
|
||||
$(obj)/bzImage: IMAGE_OFFSET := 0x100000
|
||||
$(obj)/bzImage: EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__
|
||||
$(obj)/bzImage: BUILDFLAGS := -b
|
||||
|
||||
quiet_cmd_image = BUILD $@
|
||||
cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/bootsect $(obj)/setup \
|
||||
$(obj)/vmlinux.bin $(ROOT_DEV) > $@
|
||||
|
||||
$(obj)/zImage $(obj)/bzImage: $(obj)/bootsect $(obj)/setup \
|
||||
$(obj)/vmlinux.bin $(obj)/tools/build FORCE
|
||||
$(call if_changed,image)
|
||||
@echo 'Kernel: $@ is ready'
|
||||
|
||||
$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
LDFLAGS_bootsect := -Ttext 0x0 -s --oformat binary
|
||||
LDFLAGS_setup := -Ttext 0x0 -s --oformat binary -e begtext
|
||||
|
||||
$(obj)/setup $(obj)/bootsect: %: %.o FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
$(obj)/compressed/vmlinux: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@
|
||||
|
||||
# Set this if you want to pass append arguments to the zdisk/fdimage kernel
|
||||
FDARGS =
|
||||
|
||||
$(obj)/mtools.conf: $(src)/mtools.conf.in
|
||||
sed -e 's|@OBJ@|$(obj)|g' < $< > $@
|
||||
|
||||
# This requires write access to /dev/fd0
|
||||
zdisk: $(BOOTIMAGE) $(obj)/mtools.conf
|
||||
MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync
|
||||
syslinux /dev/fd0 ; sync
|
||||
echo 'default linux $(FDARGS)' | \
|
||||
MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg
|
||||
MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) a:linux ; sync
|
||||
|
||||
# These require being root or having syslinux 2.02 or higher installed
|
||||
fdimage fdimage144: $(BOOTIMAGE) $(obj)/mtools.conf
|
||||
dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440
|
||||
MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync
|
||||
syslinux $(obj)/fdimage ; sync
|
||||
echo 'default linux $(FDARGS)' | \
|
||||
MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg
|
||||
MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) v:linux ; sync
|
||||
|
||||
fdimage288: $(BOOTIMAGE) $(obj)/mtools.conf
|
||||
dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880
|
||||
MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync
|
||||
syslinux $(obj)/fdimage ; sync
|
||||
echo 'default linux $(FDARGS)' | \
|
||||
MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg
|
||||
MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux ; sync
|
||||
|
||||
zlilo: $(BOOTIMAGE)
|
||||
if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi
|
||||
if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi
|
||||
cat $(BOOTIMAGE) > $(INSTALL_PATH)/vmlinuz
|
||||
cp System.map $(INSTALL_PATH)/
|
||||
if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
|
||||
|
||||
install: $(BOOTIMAGE)
|
||||
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $< System.map "$(INSTALL_PATH)"
|
98
arch/i386/boot/bootsect.S
Normal file
98
arch/i386/boot/bootsect.S
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* bootsect.S Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*
|
||||
* modified by Drew Eckhardt
|
||||
* modified by Bruce Evans (bde)
|
||||
* modified by Chris Noe (May 1999) (as86 -> gas)
|
||||
* gutted by H. Peter Anvin (Jan 2003)
|
||||
*
|
||||
* BIG FAT NOTE: We're in real mode using 64k segments. Therefore segment
|
||||
* addresses must be multiplied by 16 to obtain their respective linear
|
||||
* addresses. To avoid confusion, linear addresses are written using leading
|
||||
* hex while segment addresses are written as segment:offset.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/boot.h>
|
||||
|
||||
SETUPSECTS = 4 /* default nr of setup-sectors */
|
||||
BOOTSEG = 0x07C0 /* original address of boot-sector */
|
||||
INITSEG = DEF_INITSEG /* we move boot here - out of the way */
|
||||
SETUPSEG = DEF_SETUPSEG /* setup starts here */
|
||||
SYSSEG = DEF_SYSSEG /* system loaded at 0x10000 (65536) */
|
||||
SYSSIZE = DEF_SYSSIZE /* system size: # of 16-byte clicks */
|
||||
/* to be loaded */
|
||||
ROOT_DEV = 0 /* ROOT_DEV is now written by "build" */
|
||||
SWAP_DEV = 0 /* SWAP_DEV is now written by "build" */
|
||||
|
||||
#ifndef SVGA_MODE
|
||||
#define SVGA_MODE ASK_VGA
|
||||
#endif
|
||||
|
||||
#ifndef RAMDISK
|
||||
#define RAMDISK 0
|
||||
#endif
|
||||
|
||||
#ifndef ROOT_RDONLY
|
||||
#define ROOT_RDONLY 1
|
||||
#endif
|
||||
|
||||
.code16
|
||||
.text
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
|
||||
# Normalize the start address
|
||||
jmpl $BOOTSEG, $start2
|
||||
|
||||
start2:
|
||||
movw %cs, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
movw $0x7c00, %sp
|
||||
sti
|
||||
cld
|
||||
|
||||
movw $bugger_off_msg, %si
|
||||
|
||||
msg_loop:
|
||||
lodsb
|
||||
andb %al, %al
|
||||
jz die
|
||||
movb $0xe, %ah
|
||||
movw $7, %bx
|
||||
int $0x10
|
||||
jmp msg_loop
|
||||
|
||||
die:
|
||||
# Allow the user to press a key, then reboot
|
||||
xorw %ax, %ax
|
||||
int $0x16
|
||||
int $0x19
|
||||
|
||||
# int 0x19 should never return. In case it does anyway,
|
||||
# invoke the BIOS reset code...
|
||||
ljmp $0xf000,$0xfff0
|
||||
|
||||
|
||||
bugger_off_msg:
|
||||
.ascii "Direct booting from floppy is no longer supported.\r\n"
|
||||
.ascii "Please use a boot loader program instead.\r\n"
|
||||
.ascii "\n"
|
||||
.ascii "Remove disk and press any key to reboot . . .\r\n"
|
||||
.byte 0
|
||||
|
||||
|
||||
# Kernel attributes; used by setup
|
||||
|
||||
.org 497
|
||||
setup_sects: .byte SETUPSECTS
|
||||
root_flags: .word ROOT_RDONLY
|
||||
syssize: .word SYSSIZE
|
||||
swap_dev: .word SWAP_DEV
|
||||
ram_size: .word RAMDISK
|
||||
vid_mode: .word SVGA_MODE
|
||||
root_dev: .word ROOT_DEV
|
||||
boot_flag: .word 0xAA55
|
25
arch/i386/boot/compressed/Makefile
Normal file
25
arch/i386/boot/compressed/Makefile
Normal file
@@ -0,0 +1,25 @@
|
||||
#
|
||||
# linux/arch/i386/boot/compressed/Makefile
|
||||
#
|
||||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -e startup_32
|
||||
|
||||
$(obj)/vmlinux: $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
LDFLAGS_piggy.o := -r --format binary --oformat elf32-i386 -T
|
||||
|
||||
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE
|
||||
$(call if_changed,ld)
|
128
arch/i386/boot/compressed/head.S
Normal file
128
arch/i386/boot/compressed/head.S
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* linux/boot/head.S
|
||||
*
|
||||
* Copyright (C) 1991, 1992, 1993 Linus Torvalds
|
||||
*/
|
||||
|
||||
/*
|
||||
* head.S contains the 32-bit startup code.
|
||||
*
|
||||
* NOTE!!! Startup happens at absolute address 0x00001000, which is also where
|
||||
* the page directory will exist. The startup code will be overwritten by
|
||||
* the page directory. [According to comments etc elsewhere on a compressed
|
||||
* kernel it will end up at 0x1000 + 1Mb I hope so as I assume this. - AC]
|
||||
*
|
||||
* Page 0 is deliberately kept safe, since System Management Mode code in
|
||||
* laptops may need to access the BIOS data stored there. This is also
|
||||
* useful for future device drivers that either access the BIOS via VM86
|
||||
* mode.
|
||||
*/
|
||||
|
||||
/*
|
||||
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
|
||||
*/
|
||||
.text
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
|
||||
.globl startup_32
|
||||
|
||||
startup_32:
|
||||
cld
|
||||
cli
|
||||
movl $(__BOOT_DS),%eax
|
||||
movl %eax,%ds
|
||||
movl %eax,%es
|
||||
movl %eax,%fs
|
||||
movl %eax,%gs
|
||||
|
||||
lss stack_start,%esp
|
||||
xorl %eax,%eax
|
||||
1: incl %eax # check that A20 really IS enabled
|
||||
movl %eax,0x000000 # loop forever if it isn't
|
||||
cmpl %eax,0x100000
|
||||
je 1b
|
||||
|
||||
/*
|
||||
* Initialize eflags. Some BIOS's leave bits like NT set. This would
|
||||
* confuse the debugger if this code is traced.
|
||||
* XXX - best to initialize before switching to protected mode.
|
||||
*/
|
||||
pushl $0
|
||||
popfl
|
||||
/*
|
||||
* Clear BSS
|
||||
*/
|
||||
xorl %eax,%eax
|
||||
movl $_edata,%edi
|
||||
movl $_end,%ecx
|
||||
subl %edi,%ecx
|
||||
cld
|
||||
rep
|
||||
stosb
|
||||
/*
|
||||
* Do the decompression, and jump to the new kernel..
|
||||
*/
|
||||
subl $16,%esp # place for structure on the stack
|
||||
movl %esp,%eax
|
||||
pushl %esi # real mode pointer as second arg
|
||||
pushl %eax # address of structure as first arg
|
||||
call decompress_kernel
|
||||
orl %eax,%eax
|
||||
jnz 3f
|
||||
popl %esi # discard address
|
||||
popl %esi # real mode pointer
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__BOOT_CS), $0x100000
|
||||
|
||||
/*
|
||||
* We come here, if we were loaded high.
|
||||
* We need to move the move-in-place routine down to 0x1000
|
||||
* and then start it with the buffer addresses in registers,
|
||||
* which we got from the stack.
|
||||
*/
|
||||
3:
|
||||
movl $move_routine_start,%esi
|
||||
movl $0x1000,%edi
|
||||
movl $move_routine_end,%ecx
|
||||
subl %esi,%ecx
|
||||
addl $3,%ecx
|
||||
shrl $2,%ecx
|
||||
cld
|
||||
rep
|
||||
movsl
|
||||
|
||||
popl %esi # discard the address
|
||||
popl %ebx # real mode pointer
|
||||
popl %esi # low_buffer_start
|
||||
popl %ecx # lcount
|
||||
popl %edx # high_buffer_start
|
||||
popl %eax # hcount
|
||||
movl $0x100000,%edi
|
||||
cli # make sure we don't get interrupted
|
||||
ljmp $(__BOOT_CS), $0x1000 # and jump to the move routine
|
||||
|
||||
/*
|
||||
* Routine (template) for moving the decompressed kernel in place,
|
||||
* if we were high loaded. This _must_ PIC-code !
|
||||
*/
|
||||
move_routine_start:
|
||||
movl %ecx,%ebp
|
||||
shrl $2,%ecx
|
||||
rep
|
||||
movsl
|
||||
movl %ebp,%ecx
|
||||
andl $3,%ecx
|
||||
rep
|
||||
movsb
|
||||
movl %edx,%esi
|
||||
movl %eax,%ecx # NOTE: rep movsb won't move if %ecx == 0
|
||||
addl $3,%ecx
|
||||
shrl $2,%ecx
|
||||
rep
|
||||
movsl
|
||||
movl %ebx,%esi # Restore setup pointer
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__BOOT_CS), $0x100000
|
||||
move_routine_end:
|
382
arch/i386/boot/compressed/misc.c
Normal file
382
arch/i386/boot/compressed/misc.c
Normal file
@@ -0,0 +1,382 @@
|
||||
/*
|
||||
* misc.c
|
||||
*
|
||||
* This is a collection of several routines from gzip-1.0.3
|
||||
* adapted for Linux.
|
||||
*
|
||||
* malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
|
||||
* puts by Nick Holloway 1993, better puts by Martin Mares 1995
|
||||
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/tty.h>
|
||||
#include <video/edid.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
* gzip declarations
|
||||
*/
|
||||
|
||||
#define OF(args) args
|
||||
#define STATIC static
|
||||
|
||||
#undef memset
|
||||
#undef memcpy
|
||||
|
||||
/*
|
||||
* Why do we do this? Don't ask me..
|
||||
*
|
||||
* Incomprehensible are the ways of bootloaders.
|
||||
*/
|
||||
static void* memset(void *, int, size_t);
|
||||
static void* memcpy(void *, __const void *, size_t);
|
||||
#define memzero(s, n) memset ((s), 0, (n))
|
||||
|
||||
typedef unsigned char uch;
|
||||
typedef unsigned short ush;
|
||||
typedef unsigned long ulg;
|
||||
|
||||
#define WSIZE 0x8000 /* Window size must be at least 32k, */
|
||||
/* and a power of two */
|
||||
|
||||
static uch *inbuf; /* input buffer */
|
||||
static uch window[WSIZE]; /* Sliding window buffer */
|
||||
|
||||
static unsigned insize = 0; /* valid bytes in inbuf */
|
||||
static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
|
||||
static unsigned outcnt = 0; /* bytes in output buffer */
|
||||
|
||||
/* gzip flag byte */
|
||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
|
||||
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
||||
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||||
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
|
||||
#define RESERVED 0xC0 /* bit 6,7: reserved */
|
||||
|
||||
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
|
||||
|
||||
/* Diagnostic functions */
|
||||
#ifdef DEBUG
|
||||
# define Assert(cond,msg) {if(!(cond)) error(msg);}
|
||||
# define Trace(x) fprintf x
|
||||
# define Tracev(x) {if (verbose) fprintf x ;}
|
||||
# define Tracevv(x) {if (verbose>1) fprintf x ;}
|
||||
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
|
||||
# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
|
||||
#else
|
||||
# define Assert(cond,msg)
|
||||
# define Trace(x)
|
||||
# define Tracev(x)
|
||||
# define Tracevv(x)
|
||||
# define Tracec(c,x)
|
||||
# define Tracecv(c,x)
|
||||
#endif
|
||||
|
||||
static int fill_inbuf(void);
|
||||
static void flush_window(void);
|
||||
static void error(char *m);
|
||||
static void gzip_mark(void **);
|
||||
static void gzip_release(void **);
|
||||
|
||||
/*
|
||||
* This is set up by the setup-routine at boot-time
|
||||
*/
|
||||
static unsigned char *real_mode; /* Pointer to real-mode data */
|
||||
|
||||
#define RM_EXT_MEM_K (*(unsigned short *)(real_mode + 0x2))
|
||||
#ifndef STANDARD_MEMORY_BIOS_CALL
|
||||
#define RM_ALT_MEM_K (*(unsigned long *)(real_mode + 0x1e0))
|
||||
#endif
|
||||
#define RM_SCREEN_INFO (*(struct screen_info *)(real_mode+0))
|
||||
|
||||
extern char input_data[];
|
||||
extern int input_len;
|
||||
|
||||
static long bytes_out = 0;
|
||||
static uch *output_data;
|
||||
static unsigned long output_ptr = 0;
|
||||
|
||||
static void *malloc(int size);
|
||||
static void free(void *where);
|
||||
|
||||
static void putstr(const char *);
|
||||
|
||||
extern int end;
|
||||
static long free_mem_ptr = (long)&end;
|
||||
static long free_mem_end_ptr;
|
||||
|
||||
#define INPLACE_MOVE_ROUTINE 0x1000
|
||||
#define LOW_BUFFER_START 0x2000
|
||||
#define LOW_BUFFER_MAX 0x90000
|
||||
#define HEAP_SIZE 0x3000
|
||||
static unsigned int low_buffer_end, low_buffer_size;
|
||||
static int high_loaded =0;
|
||||
static uch *high_buffer_start /* = (uch *)(((ulg)&end) + HEAP_SIZE)*/;
|
||||
|
||||
static char *vidmem = (char *)0xb8000;
|
||||
static int vidport;
|
||||
static int lines, cols;
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
static void * xquad_portio = NULL;
|
||||
#endif
|
||||
|
||||
#include "../../../../lib/inflate.c"
|
||||
|
||||
static void *malloc(int size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (size <0) error("Malloc error");
|
||||
if (free_mem_ptr <= 0) error("Memory error");
|
||||
|
||||
free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
|
||||
|
||||
p = (void *)free_mem_ptr;
|
||||
free_mem_ptr += size;
|
||||
|
||||
if (free_mem_ptr >= free_mem_end_ptr)
|
||||
error("Out of memory");
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static void free(void *where)
|
||||
{ /* Don't care */
|
||||
}
|
||||
|
||||
static void gzip_mark(void **ptr)
|
||||
{
|
||||
*ptr = (void *) free_mem_ptr;
|
||||
}
|
||||
|
||||
static void gzip_release(void **ptr)
|
||||
{
|
||||
free_mem_ptr = (long) *ptr;
|
||||
}
|
||||
|
||||
static void scroll(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
memcpy ( vidmem, vidmem + cols * 2, ( lines - 1 ) * cols * 2 );
|
||||
for ( i = ( lines - 1 ) * cols * 2; i < lines * cols * 2; i += 2 )
|
||||
vidmem[i] = ' ';
|
||||
}
|
||||
|
||||
static void putstr(const char *s)
|
||||
{
|
||||
int x,y,pos;
|
||||
char c;
|
||||
|
||||
x = RM_SCREEN_INFO.orig_x;
|
||||
y = RM_SCREEN_INFO.orig_y;
|
||||
|
||||
while ( ( c = *s++ ) != '\0' ) {
|
||||
if ( c == '\n' ) {
|
||||
x = 0;
|
||||
if ( ++y >= lines ) {
|
||||
scroll();
|
||||
y--;
|
||||
}
|
||||
} else {
|
||||
vidmem [ ( x + cols * y ) * 2 ] = c;
|
||||
if ( ++x >= cols ) {
|
||||
x = 0;
|
||||
if ( ++y >= lines ) {
|
||||
scroll();
|
||||
y--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RM_SCREEN_INFO.orig_x = x;
|
||||
RM_SCREEN_INFO.orig_y = y;
|
||||
|
||||
pos = (x + cols * y) * 2; /* Update cursor position */
|
||||
outb_p(14, vidport);
|
||||
outb_p(0xff & (pos >> 9), vidport+1);
|
||||
outb_p(15, vidport);
|
||||
outb_p(0xff & (pos >> 1), vidport+1);
|
||||
}
|
||||
|
||||
static void* memset(void* s, int c, size_t n)
|
||||
{
|
||||
int i;
|
||||
char *ss = (char*)s;
|
||||
|
||||
for (i=0;i<n;i++) ss[i] = c;
|
||||
return s;
|
||||
}
|
||||
|
||||
static void* memcpy(void* __dest, __const void* __src,
|
||||
size_t __n)
|
||||
{
|
||||
int i;
|
||||
char *d = (char *)__dest, *s = (char *)__src;
|
||||
|
||||
for (i=0;i<__n;i++) d[i] = s[i];
|
||||
return __dest;
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Fill the input buffer. This is called only when the buffer is empty
|
||||
* and at least one byte is really needed.
|
||||
*/
|
||||
static int fill_inbuf(void)
|
||||
{
|
||||
if (insize != 0) {
|
||||
error("ran out of input data");
|
||||
}
|
||||
|
||||
inbuf = input_data;
|
||||
insize = input_len;
|
||||
inptr = 1;
|
||||
return inbuf[0];
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Write the output window window[0..outcnt-1] and update crc and bytes_out.
|
||||
* (Used for the decompressed data only.)
|
||||
*/
|
||||
static void flush_window_low(void)
|
||||
{
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, *out, ch;
|
||||
|
||||
in = window;
|
||||
out = &output_data[output_ptr];
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *out++ = *in++;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
output_ptr += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void flush_window_high(void)
|
||||
{
|
||||
ulg c = crc; /* temporary variable */
|
||||
unsigned n;
|
||||
uch *in, ch;
|
||||
in = window;
|
||||
for (n = 0; n < outcnt; n++) {
|
||||
ch = *output_data++ = *in++;
|
||||
if ((ulg)output_data == low_buffer_end) output_data=high_buffer_start;
|
||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
||||
}
|
||||
crc = c;
|
||||
bytes_out += (ulg)outcnt;
|
||||
outcnt = 0;
|
||||
}
|
||||
|
||||
static void flush_window(void)
|
||||
{
|
||||
if (high_loaded) flush_window_high();
|
||||
else flush_window_low();
|
||||
}
|
||||
|
||||
static void error(char *x)
|
||||
{
|
||||
putstr("\n\n");
|
||||
putstr(x);
|
||||
putstr("\n\n -- System halted");
|
||||
|
||||
while(1); /* Halt */
|
||||
}
|
||||
|
||||
#define STACK_SIZE (4096)
|
||||
|
||||
long user_stack [STACK_SIZE];
|
||||
|
||||
struct {
|
||||
long * a;
|
||||
short b;
|
||||
} stack_start = { & user_stack [STACK_SIZE] , __BOOT_DS };
|
||||
|
||||
static void setup_normal_output_buffer(void)
|
||||
{
|
||||
#ifdef STANDARD_MEMORY_BIOS_CALL
|
||||
if (RM_EXT_MEM_K < 1024) error("Less than 2MB of memory");
|
||||
#else
|
||||
if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < 1024) error("Less than 2MB of memory");
|
||||
#endif
|
||||
output_data = (char *)0x100000; /* Points to 1M */
|
||||
free_mem_end_ptr = (long)real_mode;
|
||||
}
|
||||
|
||||
struct moveparams {
|
||||
uch *low_buffer_start; int lcount;
|
||||
uch *high_buffer_start; int hcount;
|
||||
};
|
||||
|
||||
static void setup_output_buffer_if_we_run_high(struct moveparams *mv)
|
||||
{
|
||||
high_buffer_start = (uch *)(((ulg)&end) + HEAP_SIZE);
|
||||
#ifdef STANDARD_MEMORY_BIOS_CALL
|
||||
if (RM_EXT_MEM_K < (3*1024)) error("Less than 4MB of memory");
|
||||
#else
|
||||
if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) <
|
||||
(3*1024))
|
||||
error("Less than 4MB of memory");
|
||||
#endif
|
||||
mv->low_buffer_start = output_data = (char *)LOW_BUFFER_START;
|
||||
low_buffer_end = ((unsigned int)real_mode > LOW_BUFFER_MAX
|
||||
? LOW_BUFFER_MAX : (unsigned int)real_mode) & ~0xfff;
|
||||
low_buffer_size = low_buffer_end - LOW_BUFFER_START;
|
||||
high_loaded = 1;
|
||||
free_mem_end_ptr = (long)high_buffer_start;
|
||||
if ( (0x100000 + low_buffer_size) > ((ulg)high_buffer_start)) {
|
||||
high_buffer_start = (uch *)(0x100000 + low_buffer_size);
|
||||
mv->hcount = 0; /* say: we need not to move high_buffer */
|
||||
}
|
||||
else mv->hcount = -1;
|
||||
mv->high_buffer_start = high_buffer_start;
|
||||
}
|
||||
|
||||
static void close_output_buffer_if_we_run_high(struct moveparams *mv)
|
||||
{
|
||||
if (bytes_out > low_buffer_size) {
|
||||
mv->lcount = low_buffer_size;
|
||||
if (mv->hcount)
|
||||
mv->hcount = bytes_out - low_buffer_size;
|
||||
} else {
|
||||
mv->lcount = bytes_out;
|
||||
mv->hcount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
asmlinkage int decompress_kernel(struct moveparams *mv, void *rmode)
|
||||
{
|
||||
real_mode = rmode;
|
||||
|
||||
if (RM_SCREEN_INFO.orig_video_mode == 7) {
|
||||
vidmem = (char *) 0xb0000;
|
||||
vidport = 0x3b4;
|
||||
} else {
|
||||
vidmem = (char *) 0xb8000;
|
||||
vidport = 0x3d4;
|
||||
}
|
||||
|
||||
lines = RM_SCREEN_INFO.orig_video_lines;
|
||||
cols = RM_SCREEN_INFO.orig_video_cols;
|
||||
|
||||
if (free_mem_ptr < 0x100000) setup_normal_output_buffer();
|
||||
else setup_output_buffer_if_we_run_high(mv);
|
||||
|
||||
makecrc();
|
||||
putstr("Uncompressing Linux... ");
|
||||
gunzip();
|
||||
putstr("Ok, booting the kernel.\n");
|
||||
if (high_loaded) close_output_buffer_if_we_run_high(mv);
|
||||
return high_loaded;
|
||||
}
|
9
arch/i386/boot/compressed/vmlinux.scr
Normal file
9
arch/i386/boot/compressed/vmlinux.scr
Normal file
@@ -0,0 +1,9 @@
|
||||
SECTIONS
|
||||
{
|
||||
.data : {
|
||||
input_len = .;
|
||||
LONG(input_data_end - input_data) input_data = .;
|
||||
*(.data)
|
||||
input_data_end = .;
|
||||
}
|
||||
}
|
176
arch/i386/boot/edd.S
Normal file
176
arch/i386/boot/edd.S
Normal file
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* BIOS Enhanced Disk Drive support
|
||||
* Copyright (C) 2002, 2003, 2004 Dell, Inc.
|
||||
* by Matt Domsch <Matt_Domsch@dell.com> October 2002
|
||||
* conformant to T13 Committee www.t13.org
|
||||
* projects 1572D, 1484D, 1386D, 1226DT
|
||||
* disk signature read by Matt Domsch <Matt_Domsch@dell.com>
|
||||
* and Andrew Wilks <Andrew_Wilks@dell.com> September 2003, June 2004
|
||||
* legacy CHS retreival by Patrick J. LoPresti <patl@users.sourceforge.net>
|
||||
* March 2004
|
||||
* Command line option parsing, Matt Domsch, November 2004
|
||||
*/
|
||||
|
||||
#include <linux/edd.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
|
||||
movb $0, (EDD_MBR_SIG_NR_BUF)
|
||||
movb $0, (EDDNR)
|
||||
|
||||
# Check the command line for two options:
|
||||
# edd=of disables EDD completely (edd=off)
|
||||
# edd=sk skips the MBR test (edd=skipmbr)
|
||||
pushl %esi
|
||||
cmpl $0, %cs:cmd_line_ptr
|
||||
jz done_cl
|
||||
movl %cs:(cmd_line_ptr), %esi
|
||||
# ds:esi has the pointer to the command line now
|
||||
movl $(COMMAND_LINE_SIZE-7), %ecx
|
||||
# loop through kernel command line one byte at a time
|
||||
cl_loop:
|
||||
cmpl $EDD_CL_EQUALS, (%si)
|
||||
jz found_edd_equals
|
||||
incl %esi
|
||||
loop cl_loop
|
||||
jmp done_cl
|
||||
found_edd_equals:
|
||||
# only looking at first two characters after equals
|
||||
addl $4, %esi
|
||||
cmpw $EDD_CL_OFF, (%si) # edd=of
|
||||
jz do_edd_off
|
||||
cmpw $EDD_CL_SKIP, (%si) # edd=sk
|
||||
jz do_edd_skipmbr
|
||||
jmp done_cl
|
||||
do_edd_skipmbr:
|
||||
popl %esi
|
||||
jmp edd_start
|
||||
do_edd_off:
|
||||
popl %esi
|
||||
jmp edd_done
|
||||
done_cl:
|
||||
popl %esi
|
||||
|
||||
|
||||
# Read the first sector of each BIOS disk device and store the 4-byte signature
|
||||
edd_mbr_sig_start:
|
||||
movb $0x80, %dl # from device 80
|
||||
movw $EDD_MBR_SIG_BUF, %bx # store buffer ptr in bx
|
||||
edd_mbr_sig_read:
|
||||
movl $0xFFFFFFFF, %eax
|
||||
movl %eax, (%bx) # assume failure
|
||||
pushw %bx
|
||||
movb $READ_SECTORS, %ah
|
||||
movb $1, %al # read 1 sector
|
||||
movb $0, %dh # at head 0
|
||||
movw $1, %cx # cylinder 0, sector 0
|
||||
pushw %es
|
||||
pushw %ds
|
||||
popw %es
|
||||
movw $EDDBUF, %bx # disk's data goes into EDDBUF
|
||||
pushw %dx # work around buggy BIOSes
|
||||
stc # work around buggy BIOSes
|
||||
int $0x13
|
||||
sti # work around buggy BIOSes
|
||||
popw %dx
|
||||
popw %es
|
||||
popw %bx
|
||||
jc edd_mbr_sig_done # on failure, we're done.
|
||||
movl (EDDBUF+EDD_MBR_SIG_OFFSET), %eax # read sig out of the MBR
|
||||
movl %eax, (%bx) # store success
|
||||
incb (EDD_MBR_SIG_NR_BUF) # note that we stored something
|
||||
incb %dl # increment to next device
|
||||
addw $4, %bx # increment sig buffer ptr
|
||||
cmpb $EDD_MBR_SIG_MAX, (EDD_MBR_SIG_NR_BUF) # Out of space?
|
||||
jb edd_mbr_sig_read # keep looping
|
||||
edd_mbr_sig_done:
|
||||
|
||||
# Do the BIOS Enhanced Disk Drive calls
|
||||
# This consists of two calls:
|
||||
# int 13h ah=41h "Check Extensions Present"
|
||||
# int 13h ah=48h "Get Device Parameters"
|
||||
# int 13h ah=08h "Legacy Get Device Parameters"
|
||||
#
|
||||
# A buffer of size EDDMAXNR*(EDDEXTSIZE+EDDPARMSIZE) is reserved for our use
|
||||
# in the boot_params at EDDBUF. The first four bytes of which are
|
||||
# used to store the device number, interface support map and version
|
||||
# results from fn41. The next four bytes are used to store the legacy
|
||||
# cylinders, heads, and sectors from fn08. The following 74 bytes are used to
|
||||
# store the results from fn48. Starting from device 80h, fn41, then fn48
|
||||
# are called and their results stored in EDDBUF+n*(EDDEXTSIZE+EDDPARMIZE).
|
||||
# Then the pointer is incremented to store the data for the next call.
|
||||
# This repeats until either a device doesn't exist, or until EDDMAXNR
|
||||
# devices have been stored.
|
||||
# The one tricky part is that ds:si always points EDDEXTSIZE bytes into
|
||||
# the structure, and the fn41 and fn08 results are stored at offsets
|
||||
# from there. This removes the need to increment the pointer for
|
||||
# every store, and leaves it ready for the fn48 call.
|
||||
# A second one-byte buffer, EDDNR, in the boot_params stores
|
||||
# the number of BIOS devices which exist, up to EDDMAXNR.
|
||||
# In setup.c, copy_edd() stores both boot_params buffers away
|
||||
# for later use, as they would get overwritten otherwise.
|
||||
# This code is sensitive to the size of the structs in edd.h
|
||||
edd_start:
|
||||
# %ds points to the bootsector
|
||||
# result buffer for fn48
|
||||
movw $EDDBUF+EDDEXTSIZE, %si # in ds:si, fn41 results
|
||||
# kept just before that
|
||||
movb $0x80, %dl # BIOS device 0x80
|
||||
|
||||
edd_check_ext:
|
||||
movb $CHECKEXTENSIONSPRESENT, %ah # Function 41
|
||||
movw $EDDMAGIC1, %bx # magic
|
||||
int $0x13 # make the call
|
||||
jc edd_done # no more BIOS devices
|
||||
|
||||
cmpw $EDDMAGIC2, %bx # is magic right?
|
||||
jne edd_next # nope, next...
|
||||
|
||||
movb %dl, %ds:-8(%si) # store device number
|
||||
movb %ah, %ds:-7(%si) # store version
|
||||
movw %cx, %ds:-6(%si) # store extensions
|
||||
incb (EDDNR) # note that we stored something
|
||||
|
||||
edd_get_device_params:
|
||||
movw $EDDPARMSIZE, %ds:(%si) # put size
|
||||
movw $0x0, %ds:2(%si) # work around buggy BIOSes
|
||||
movb $GETDEVICEPARAMETERS, %ah # Function 48
|
||||
int $0x13 # make the call
|
||||
# Don't check for fail return
|
||||
# it doesn't matter.
|
||||
edd_get_legacy_chs:
|
||||
xorw %ax, %ax
|
||||
movw %ax, %ds:-4(%si)
|
||||
movw %ax, %ds:-2(%si)
|
||||
# Ralf Brown's Interrupt List says to set ES:DI to
|
||||
# 0000h:0000h "to guard against BIOS bugs"
|
||||
pushw %es
|
||||
movw %ax, %es
|
||||
movw %ax, %di
|
||||
pushw %dx # legacy call clobbers %dl
|
||||
movb $LEGACYGETDEVICEPARAMETERS, %ah # Function 08
|
||||
int $0x13 # make the call
|
||||
jc edd_legacy_done # failed
|
||||
movb %cl, %al # Low 6 bits are max
|
||||
andb $0x3F, %al # sector number
|
||||
movb %al, %ds:-1(%si) # Record max sect
|
||||
movb %dh, %ds:-2(%si) # Record max head number
|
||||
movb %ch, %al # Low 8 bits of max cyl
|
||||
shr $6, %cl
|
||||
movb %cl, %ah # High 2 bits of max cyl
|
||||
movw %ax, %ds:-4(%si)
|
||||
|
||||
edd_legacy_done:
|
||||
popw %dx
|
||||
popw %es
|
||||
movw %si, %ax # increment si
|
||||
addw $EDDPARMSIZE+EDDEXTSIZE, %ax
|
||||
movw %ax, %si
|
||||
|
||||
edd_next:
|
||||
incb %dl # increment to next device
|
||||
cmpb $EDDMAXNR, (EDDNR) # Out of space?
|
||||
jb edd_check_ext # keep looping
|
||||
|
||||
edd_done:
|
||||
#endif
|
40
arch/i386/boot/install.sh
Normal file
40
arch/i386/boot/install.sh
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/i386/boot/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
#
|
||||
# Copyright (C) 1995 by Linus Torvalds
|
||||
#
|
||||
# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
|
||||
#
|
||||
# "make install" script for i386 architecture
|
||||
#
|
||||
# Arguments:
|
||||
# $1 - kernel version
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/installkernel ]; then exec ~/bin/installkernel "$@"; fi
|
||||
if [ -x /sbin/installkernel ]; then exec /sbin/installkernel "$@"; fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
if [ -f $4/vmlinuz ]; then
|
||||
mv $4/vmlinuz $4/vmlinuz.old
|
||||
fi
|
||||
|
||||
if [ -f $4/System.map ]; then
|
||||
mv $4/System.map $4/System.old
|
||||
fi
|
||||
|
||||
cat $2 > $4/vmlinuz
|
||||
cp $3 $4/System.map
|
||||
|
||||
if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
|
17
arch/i386/boot/mtools.conf.in
Normal file
17
arch/i386/boot/mtools.conf.in
Normal file
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# mtools configuration file for "make (b)zdisk"
|
||||
#
|
||||
|
||||
# Actual floppy drive
|
||||
drive a:
|
||||
file="/dev/fd0"
|
||||
|
||||
# 1.44 MB floppy disk image
|
||||
drive v:
|
||||
file="@OBJ@/fdimage" cylinders=80 heads=2 sectors=18 filter
|
||||
|
||||
# 2.88 MB floppy disk image (mostly for virtual uses)
|
||||
drive w:
|
||||
file="@OBJ@/fdimage" cylinders=80 heads=2 sectors=36 filter
|
||||
|
||||
|
1028
arch/i386/boot/setup.S
Normal file
1028
arch/i386/boot/setup.S
Normal file
File diff suppressed because it is too large
Load Diff
184
arch/i386/boot/tools/build.c
Normal file
184
arch/i386/boot/tools/build.c
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* $Id: build.c,v 1.5 1997/05/19 12:29:58 mj Exp $
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
* Copyright (C) 1997 Martin Mares
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file builds a disk-image from three different files:
|
||||
*
|
||||
* - bootsect: exactly 512 bytes of 8086 machine code, loads the rest
|
||||
* - setup: 8086 machine code, sets up system parm
|
||||
* - system: 80386 code for actual system
|
||||
*
|
||||
* It does some checking that all files are of the correct type, and
|
||||
* just writes the result to stdout, removing headers and padding to
|
||||
* the right amount. It also writes some system data to stderr.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Changes by tytso to allow root device specification
|
||||
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
|
||||
* Cross compiling fixes by Gertjan van Wingerde, July 1996
|
||||
* Rewritten by Martin Mares, April 1997
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <asm/boot.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
typedef unsigned short word;
|
||||
typedef unsigned long u32;
|
||||
|
||||
#define DEFAULT_MAJOR_ROOT 0
|
||||
#define DEFAULT_MINOR_ROOT 0
|
||||
|
||||
/* Minimal number of setup sectors (see also bootsect.S) */
|
||||
#define SETUP_SECTS 4
|
||||
|
||||
byte buf[1024];
|
||||
int fd;
|
||||
int is_big_kernel;
|
||||
|
||||
void die(const char * str, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, str);
|
||||
vfprintf(stderr, str, args);
|
||||
fputc('\n', stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void file_open(const char *name)
|
||||
{
|
||||
if ((fd = open(name, O_RDONLY, 0)) < 0)
|
||||
die("Unable to open `%s': %m", name);
|
||||
}
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
die("Usage: build [-b] bootsect setup system [rootdev] [> image]");
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
unsigned int i, c, sz, setup_sectors;
|
||||
u32 sys_size;
|
||||
byte major_root, minor_root;
|
||||
struct stat sb;
|
||||
|
||||
if (argc > 2 && !strcmp(argv[1], "-b"))
|
||||
{
|
||||
is_big_kernel = 1;
|
||||
argc--, argv++;
|
||||
}
|
||||
if ((argc < 4) || (argc > 5))
|
||||
usage();
|
||||
if (argc > 4) {
|
||||
if (!strcmp(argv[4], "CURRENT")) {
|
||||
if (stat("/", &sb)) {
|
||||
perror("/");
|
||||
die("Couldn't stat /");
|
||||
}
|
||||
major_root = major(sb.st_dev);
|
||||
minor_root = minor(sb.st_dev);
|
||||
} else if (strcmp(argv[4], "FLOPPY")) {
|
||||
if (stat(argv[4], &sb)) {
|
||||
perror(argv[4]);
|
||||
die("Couldn't stat root device.");
|
||||
}
|
||||
major_root = major(sb.st_rdev);
|
||||
minor_root = minor(sb.st_rdev);
|
||||
} else {
|
||||
major_root = 0;
|
||||
minor_root = 0;
|
||||
}
|
||||
} else {
|
||||
major_root = DEFAULT_MAJOR_ROOT;
|
||||
minor_root = DEFAULT_MINOR_ROOT;
|
||||
}
|
||||
fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
|
||||
|
||||
file_open(argv[1]);
|
||||
i = read(fd, buf, sizeof(buf));
|
||||
fprintf(stderr,"Boot sector %d bytes.\n",i);
|
||||
if (i != 512)
|
||||
die("Boot block must be exactly 512 bytes");
|
||||
if (buf[510] != 0x55 || buf[511] != 0xaa)
|
||||
die("Boot block hasn't got boot flag (0xAA55)");
|
||||
buf[508] = minor_root;
|
||||
buf[509] = major_root;
|
||||
if (write(1, buf, 512) != 512)
|
||||
die("Write call failed");
|
||||
close (fd);
|
||||
|
||||
file_open(argv[2]); /* Copy the setup code */
|
||||
for (i=0 ; (c=read(fd, buf, sizeof(buf)))>0 ; i+=c )
|
||||
if (write(1, buf, c) != c)
|
||||
die("Write call failed");
|
||||
if (c != 0)
|
||||
die("read-error on `setup'");
|
||||
close (fd);
|
||||
|
||||
setup_sectors = (i + 511) / 512; /* Pad unused space with zeros */
|
||||
/* for compatibility with ancient versions of LILO. */
|
||||
if (setup_sectors < SETUP_SECTS)
|
||||
setup_sectors = SETUP_SECTS;
|
||||
fprintf(stderr, "Setup is %d bytes.\n", i);
|
||||
memset(buf, 0, sizeof(buf));
|
||||
while (i < setup_sectors * 512) {
|
||||
c = setup_sectors * 512 - i;
|
||||
if (c > sizeof(buf))
|
||||
c = sizeof(buf);
|
||||
if (write(1, buf, c) != c)
|
||||
die("Write call failed");
|
||||
i += c;
|
||||
}
|
||||
|
||||
file_open(argv[3]);
|
||||
if (fstat (fd, &sb))
|
||||
die("Unable to stat `%s': %m", argv[3]);
|
||||
sz = sb.st_size;
|
||||
fprintf (stderr, "System is %d kB\n", sz/1024);
|
||||
sys_size = (sz + 15) / 16;
|
||||
if (!is_big_kernel && sys_size > DEF_SYSSIZE)
|
||||
die("System is too big. Try using bzImage or modules.");
|
||||
while (sz > 0) {
|
||||
int l, n;
|
||||
|
||||
l = (sz > sizeof(buf)) ? sizeof(buf) : sz;
|
||||
if ((n=read(fd, buf, l)) != l) {
|
||||
if (n < 0)
|
||||
die("Error reading %s: %m", argv[3]);
|
||||
else
|
||||
die("%s: Unexpected EOF", argv[3]);
|
||||
}
|
||||
if (write(1, buf, l) != l)
|
||||
die("Write failed");
|
||||
sz -= l;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
if (lseek(1, 497, SEEK_SET) != 497) /* Write sizes to the bootsector */
|
||||
die("Output: seek failed");
|
||||
buf[0] = setup_sectors;
|
||||
if (write(1, buf, 1) != 1)
|
||||
die("Write of setup sector count failed");
|
||||
if (lseek(1, 500, SEEK_SET) != 500)
|
||||
die("Output: seek failed");
|
||||
buf[0] = (sys_size & 0xff);
|
||||
buf[1] = ((sys_size >> 8) & 0xff);
|
||||
if (write(1, buf, 2) != 2)
|
||||
die("Write of image length failed");
|
||||
|
||||
return 0; /* Everything is OK */
|
||||
}
|
2007
arch/i386/boot/video.S
Normal file
2007
arch/i386/boot/video.S
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user