i386: move boot
authorThomas Gleixner <tglx@linutronix.de>
Thu, 11 Oct 2007 09:16:45 +0000 (11:16 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Oct 2007 09:16:45 +0000 (11:16 +0200)
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
66 files changed:
arch/i386/Makefile
arch/i386/boot/.gitignore [deleted file]
arch/i386/boot/Makefile [deleted file]
arch/i386/boot/a20.c [deleted file]
arch/i386/boot/apm.c [deleted file]
arch/i386/boot/bitops.h [deleted file]
arch/i386/boot/boot.h [deleted file]
arch/i386/boot/cmdline.c [deleted file]
arch/i386/boot/code16gcc.h [deleted file]
arch/i386/boot/copy.S [deleted file]
arch/i386/boot/cpu.c [deleted file]
arch/i386/boot/cpucheck.c [deleted file]
arch/i386/boot/edd.c [deleted file]
arch/i386/boot/header.S [deleted file]
arch/i386/boot/install.sh [deleted file]
arch/i386/boot/main.c [deleted file]
arch/i386/boot/mca.c [deleted file]
arch/i386/boot/memory.c [deleted file]
arch/i386/boot/mtools.conf.in [deleted file]
arch/i386/boot/pm.c [deleted file]
arch/i386/boot/pmjump.S [deleted file]
arch/i386/boot/printf.c [deleted file]
arch/i386/boot/setup.ld [deleted file]
arch/i386/boot/string.c [deleted file]
arch/i386/boot/tty.c [deleted file]
arch/i386/boot/version.c [deleted file]
arch/i386/boot/vesa.h [deleted file]
arch/i386/boot/video-bios.c [deleted file]
arch/i386/boot/video-vesa.c [deleted file]
arch/i386/boot/video-vga.c [deleted file]
arch/i386/boot/video.c [deleted file]
arch/i386/boot/video.h [deleted file]
arch/i386/boot/voyager.c [deleted file]
arch/x86/boot/.gitignore [new file with mode: 0644]
arch/x86/boot/Makefile [new file with mode: 0644]
arch/x86/boot/a20.c [new file with mode: 0644]
arch/x86/boot/apm.c [new file with mode: 0644]
arch/x86/boot/bitops.h [new file with mode: 0644]
arch/x86/boot/boot.h [new file with mode: 0644]
arch/x86/boot/cmdline.c [new file with mode: 0644]
arch/x86/boot/code16gcc.h [new file with mode: 0644]
arch/x86/boot/copy.S [new file with mode: 0644]
arch/x86/boot/cpu.c [new file with mode: 0644]
arch/x86/boot/cpucheck.c [new file with mode: 0644]
arch/x86/boot/edd.c [new file with mode: 0644]
arch/x86/boot/header.S [new file with mode: 0644]
arch/x86/boot/install.sh [new file with mode: 0644]
arch/x86/boot/main.c [new file with mode: 0644]
arch/x86/boot/mca.c [new file with mode: 0644]
arch/x86/boot/memory.c [new file with mode: 0644]
arch/x86/boot/mtools.conf.in [new file with mode: 0644]
arch/x86/boot/pm.c [new file with mode: 0644]
arch/x86/boot/pmjump.S [new file with mode: 0644]
arch/x86/boot/printf.c [new file with mode: 0644]
arch/x86/boot/setup.ld [new file with mode: 0644]
arch/x86/boot/string.c [new file with mode: 0644]
arch/x86/boot/tty.c [new file with mode: 0644]
arch/x86/boot/version.c [new file with mode: 0644]
arch/x86/boot/vesa.h [new file with mode: 0644]
arch/x86/boot/video-bios.c [new file with mode: 0644]
arch/x86/boot/video-vesa.c [new file with mode: 0644]
arch/x86/boot/video-vga.c [new file with mode: 0644]
arch/x86/boot/video.c [new file with mode: 0644]
arch/x86/boot/video.h [new file with mode: 0644]
arch/x86/boot/voyager.c [new file with mode: 0644]
arch/x86_64/boot/Makefile

index 510df782f940c720e9aa7add9b9b762e250fc52f..776d8dcf2340e65b80cc1474b39441f94c769b0e 100644 (file)
@@ -116,7 +116,7 @@ drivers-$(CONFIG_FB)                    += arch/i386/video/
 CFLAGS += $(mflags-y)
 AFLAGS += $(mflags-y)
 
-boot := arch/i386/boot
+boot := arch/x86/boot
 
 PHONY += zImage bzImage compressed zlilo bzlilo \
          zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install
@@ -125,9 +125,11 @@ all: bzImage
 
 # KBUILD_IMAGE specify target image being built
                     KBUILD_IMAGE := $(boot)/bzImage
-zImage zlilo zdisk: KBUILD_IMAGE := arch/i386/boot/zImage
+zImage zlilo zdisk: KBUILD_IMAGE := arch/x86/boot/zImage
 
 zImage bzImage: vmlinux
+       $(Q)mkdir -p $(objtree)/arch/i386/boot
+       $(Q)ln -fsn $(objtree)/arch/x86/boot/bzImage $(objtree)/arch/i386/boot/bzImage
        $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
 
 compressed: zImage
@@ -145,7 +147,8 @@ install:
        $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
 
 archclean:
-       $(Q)$(MAKE) $(clean)=arch/i386/boot
+       $(Q)rm -rf $(objtree)/arch/i386/boot
+       $(Q)$(MAKE) $(clean)=arch/x86/boot
 
 define archhelp
   echo  '* bzImage     - Compressed kernel image (arch/$(ARCH)/boot/bzImage)'
diff --git a/arch/i386/boot/.gitignore b/arch/i386/boot/.gitignore
deleted file mode 100644 (file)
index 1846514..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-bootsect
-bzImage
-setup
-setup.bin
-setup.elf
diff --git a/arch/i386/boot/Makefile b/arch/i386/boot/Makefile
deleted file mode 100644 (file)
index 93386a4..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-#
-# 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 setup.bin setup.elf zImage bzImage
-subdir-        := compressed
-
-setup-y                += a20.o apm.o cmdline.o copy.o cpu.o cpucheck.o edd.o
-setup-y                += header.o main.o mca.o memory.o pm.o pmjump.o
-setup-y                += printf.o string.o tty.o video.o version.o voyager.o
-
-# The link order of the video-*.o modules can matter.  In particular,
-# video-vga.o *must* be listed first, followed by video-vesa.o.
-# Hardware-specific drivers should follow in the order they should be
-# probed, and video-bios.o should typically be last.
-setup-y                += video-vga.o
-setup-y                += video-vesa.o
-setup-y                += video-bios.o
-targets                += $(setup-y)
-hostprogs-y    := tools/build
-
-HOSTCFLAGS_build.o := $(LINUXINCLUDE)
-
-# ---------------------------------------------------------------------------
-
-# How to compile the 16-bit code.  Note we always compile for -march=i386,
-# that way we can complain to the user if the CPU is insufficient.
-cflags-i386   := 
-cflags-x86_64 := -m32
-CFLAGS         := $(LINUXINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \
-                  $(cflags-$(ARCH)) \
-                  -Wall -Wstrict-prototypes \
-                  -march=i386 -mregparm=3 \
-                  -include $(srctree)/$(src)/code16gcc.h \
-                  -fno-strict-aliasing -fomit-frame-pointer \
-                  $(call cc-option, -ffreestanding) \
-                  $(call cc-option, -fno-toplevel-reorder,\
-                       $(call cc-option, -fno-unit-at-a-time)) \
-                  $(call cc-option, -fno-stack-protector) \
-                  $(call cc-option, -mpreferred-stack-boundary=2)
-AFLAGS         := $(CFLAGS) -D__ASSEMBLY__
-
-$(obj)/zImage:  IMAGE_OFFSET := 0x1000
-$(obj)/zImage:  EXTRA_AFLAGS := $(SVGA_MODE) $(RAMDISK)
-$(obj)/bzImage: IMAGE_OFFSET := 0x100000
-$(obj)/bzImage: EXTRA_CFLAGS := -D__BIG_KERNEL__
-$(obj)/bzImage: EXTRA_AFLAGS := $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__
-$(obj)/bzImage: BUILDFLAGS   := -b
-
-quiet_cmd_image = BUILD   $@
-cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/setup.bin \
-           $(obj)/vmlinux.bin $(ROOT_DEV) > $@
-
-$(obj)/zImage $(obj)/bzImage: $(obj)/setup.bin \
-                             $(obj)/vmlinux.bin $(obj)/tools/build FORCE
-       $(call if_changed,image)
-       @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
-
-$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
-       $(call if_changed,objcopy)
-
-SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
-
-LDFLAGS_setup.elf      := -T
-$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
-       $(call if_changed,ld)
-
-OBJCOPYFLAGS_setup.bin := -O binary
-
-$(obj)/setup.bin: $(obj)/setup.elf FORCE
-       $(call if_changed,objcopy)
-
-$(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/isoimage kernel
-FDARGS = 
-# Set this if you want an initrd included with the zdisk/fdimage/isoimage kernel
-FDINITRD =
-
-image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,)
-
-$(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 '$(image_cmdline)' | \
-               MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg
-       if [ -f '$(FDINITRD)' ] ; then \
-               MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \
-       fi
-       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 '$(image_cmdline)' | \
-               MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg
-       if [ -f '$(FDINITRD)' ] ; then \
-               MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \
-       fi
-       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 '$(image_cmdline)' | \
-               MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg
-       if [ -f '$(FDINITRD)' ] ; then \
-               MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \
-       fi
-       MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux  ; sync
-
-isoimage: $(BOOTIMAGE)
-       -rm -rf $(obj)/isoimage
-       mkdir $(obj)/isoimage
-       for i in lib lib64 share end ; do \
-               if [ -f /usr/$$i/syslinux/isolinux.bin ] ; then \
-                       cp /usr/$$i/syslinux/isolinux.bin $(obj)/isoimage ; \
-                       break ; \
-               fi ; \
-               if [ $$i = end ] ; then exit 1 ; fi ; \
-       done
-       cp $(BOOTIMAGE) $(obj)/isoimage/linux
-       echo '$(image_cmdline)' > $(obj)/isoimage/isolinux.cfg
-       if [ -f '$(FDINITRD)' ] ; then \
-               cp '$(FDINITRD)' $(obj)/isoimage/initrd.img ; \
-       fi
-       mkisofs -J -r -o $(obj)/image.iso -b isolinux.bin -c boot.cat \
-               -no-emul-boot -boot-load-size 4 -boot-info-table \
-               $(obj)/isoimage
-       rm -rf $(obj)/isoimage
-
-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:
-       sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
diff --git a/arch/i386/boot/a20.c b/arch/i386/boot/a20.c
deleted file mode 100644 (file)
index 31348d0..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/a20.c
- *
- * Enable A20 gate (return -1 on failure)
- */
-
-#include "boot.h"
-
-#define MAX_8042_LOOPS 100000
-
-static int empty_8042(void)
-{
-       u8 status;
-       int loops = MAX_8042_LOOPS;
-
-       while (loops--) {
-               io_delay();
-
-               status = inb(0x64);
-               if (status & 1) {
-                       /* Read and discard input data */
-                       io_delay();
-                       (void)inb(0x60);
-               } else if (!(status & 2)) {
-                       /* Buffers empty, finished! */
-                       return 0;
-               }
-       }
-
-       return -1;
-}
-
-/* Returns nonzero if the A20 line is enabled.  The memory address
-   used as a test is the int $0x80 vector, which should be safe. */
-
-#define A20_TEST_ADDR  (4*0x80)
-#define A20_TEST_SHORT  32
-#define A20_TEST_LONG  2097152 /* 2^21 */
-
-static int a20_test(int loops)
-{
-       int ok = 0;
-       int saved, ctr;
-
-       set_fs(0x0000);
-       set_gs(0xffff);
-
-       saved = ctr = rdfs32(A20_TEST_ADDR);
-
-       while (loops--) {
-               wrfs32(++ctr, A20_TEST_ADDR);
-               io_delay();     /* Serialize and make delay constant */
-               ok = rdgs32(A20_TEST_ADDR+0x10) ^ ctr;
-               if (ok)
-                       break;
-       }
-
-       wrfs32(saved, A20_TEST_ADDR);
-       return ok;
-}
-
-/* Quick test to see if A20 is already enabled */
-static int a20_test_short(void)
-{
-       return a20_test(A20_TEST_SHORT);
-}
-
-/* Longer test that actually waits for A20 to come on line; this
-   is useful when dealing with the KBC or other slow external circuitry. */
-static int a20_test_long(void)
-{
-       return a20_test(A20_TEST_LONG);
-}
-
-static void enable_a20_bios(void)
-{
-       asm volatile("pushfl; int $0x15; popfl"
-                    : : "a" ((u16)0x2401));
-}
-
-static void enable_a20_kbc(void)
-{
-       empty_8042();
-
-       outb(0xd1, 0x64);       /* Command write */
-       empty_8042();
-
-       outb(0xdf, 0x60);       /* A20 on */
-       empty_8042();
-}
-
-static void enable_a20_fast(void)
-{
-       u8 port_a;
-
-       port_a = inb(0x92);     /* Configuration port A */
-       port_a |=  0x02;        /* Enable A20 */
-       port_a &= ~0x01;        /* Do not reset machine */
-       outb(port_a, 0x92);
-}
-
-/*
- * Actual routine to enable A20; return 0 on ok, -1 on failure
- */
-
-#define A20_ENABLE_LOOPS 255   /* Number of times to try */
-
-int enable_a20(void)
-{
-       int loops = A20_ENABLE_LOOPS;
-
-#if defined(CONFIG_X86_ELAN)
-       /* Elan croaks if we try to touch the KBC */
-       enable_a20_fast();
-       while (!a20_test_long())
-               ;
-       return 0;
-#elif defined(CONFIG_X86_VOYAGER)
-       /* On Voyager, a20_test() is unsafe? */
-       enable_a20_kbc();
-       return 0;
-#else
-       while (loops--) {
-               /* First, check to see if A20 is already enabled
-                  (legacy free, etc.) */
-               if (a20_test_short())
-                       return 0;
-
-               /* Next, try the BIOS (INT 0x15, AX=0x2401) */
-               enable_a20_bios();
-               if (a20_test_short())
-                       return 0;
-
-               /* Try enabling A20 through the keyboard controller */
-               empty_8042();
-               if (a20_test_short())
-                       return 0; /* BIOS worked, but with delayed reaction */
-
-               enable_a20_kbc();
-               if (a20_test_long())
-                       return 0;
-
-               /* Finally, try enabling the "fast A20 gate" */
-               enable_a20_fast();
-               if (a20_test_long())
-                       return 0;
-       }
-
-       return -1;
-#endif
-}
diff --git a/arch/i386/boot/apm.c b/arch/i386/boot/apm.c
deleted file mode 100644 (file)
index eab50c5..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   Original APM BIOS checking by Stephen Rothwell, May 1994
- *   (sfr@canb.auug.org.au)
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/apm.c
- *
- * Get APM BIOS information
- */
-
-#include "boot.h"
-
-#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
-
-int query_apm_bios(void)
-{
-       u16 ax, bx, cx, dx, di;
-       u32 ebx, esi;
-       u8 err;
-
-       /* APM BIOS installation check */
-       ax = 0x5300;
-       bx = cx = 0;
-       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp ; setc %0"
-                    : "=d" (err), "+a" (ax), "+b" (bx), "+c" (cx)
-                    : : "esi", "edi");
-
-       if (err)
-               return -1;              /* No APM BIOS */
-
-       if (bx != 0x504d)       /* "PM" signature */
-               return -1;
-
-       if (!(cx & 0x02))               /* 32 bits supported? */
-               return -1;
-
-       /* Disconnect first, just in case */
-       ax = 0x5304;
-       bx = 0;
-       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp"
-                    : "+a" (ax), "+b" (bx)
-                    : : "ecx", "edx", "esi", "edi");
-
-       /* Paranoia */
-       ebx = esi = 0;
-       cx = dx = di = 0;
-
-       /* 32-bit connect */
-       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp ; setc %6"
-                    : "=a" (ax), "+b" (ebx), "+c" (cx), "+d" (dx),
-                      "+S" (esi), "+D" (di), "=m" (err)
-                    : "a" (0x5303));
-
-       boot_params.apm_bios_info.cseg = ax;
-       boot_params.apm_bios_info.offset = ebx;
-       boot_params.apm_bios_info.cseg_16 = cx;
-       boot_params.apm_bios_info.dseg = dx;
-       boot_params.apm_bios_info.cseg_len = (u16)esi;
-       boot_params.apm_bios_info.cseg_16_len = esi >> 16;
-       boot_params.apm_bios_info.dseg_len = di;
-
-       if (err)
-               return -1;
-
-       /* Redo the installation check as the 32-bit connect;
-          some BIOSes return different flags this way... */
-
-       ax = 0x5300;
-       bx = cx = 0;
-       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp ; setc %0"
-                    : "=d" (err), "+a" (ax), "+b" (bx), "+c" (cx)
-                    : : "esi", "edi");
-
-       if (err || bx != 0x504d) {
-               /* Failure with 32-bit connect, try to disconect and ignore */
-               ax = 0x5304;
-               bx = 0;
-               asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp"
-                            : "+a" (ax), "+b" (bx)
-                            : : "ecx", "edx", "esi", "edi");
-               return -1;
-       }
-
-       boot_params.apm_bios_info.version = ax;
-       boot_params.apm_bios_info.flags = cx;
-       return 0;
-}
-
-#endif
diff --git a/arch/i386/boot/bitops.h b/arch/i386/boot/bitops.h
deleted file mode 100644 (file)
index 8dcc8dc..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/bitops.h
- *
- * Very simple bitops for the boot code.
- */
-
-#ifndef BOOT_BITOPS_H
-#define BOOT_BITOPS_H
-#define _LINUX_BITOPS_H                /* Inhibit inclusion of <linux/bitops.h> */
-
-static inline int constant_test_bit(int nr, const void *addr)
-{
-       const u32 *p = (const u32 *)addr;
-       return ((1UL << (nr & 31)) & (p[nr >> 5])) != 0;
-}
-static inline int variable_test_bit(int nr, const void *addr)
-{
-       u8 v;
-       const u32 *p = (const u32 *)addr;
-
-       asm("btl %2,%1; setc %0" : "=qm" (v) : "m" (*p), "Ir" (nr));
-       return v;
-}
-
-#define test_bit(nr,addr) \
-(__builtin_constant_p(nr) ? \
- constant_test_bit((nr),(addr)) : \
- variable_test_bit((nr),(addr)))
-
-static inline void set_bit(int nr, void *addr)
-{
-       asm("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr));
-}
-
-#endif /* BOOT_BITOPS_H */
diff --git a/arch/i386/boot/boot.h b/arch/i386/boot/boot.h
deleted file mode 100644 (file)
index 20bab94..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/boot.h
- *
- * Header file for the real-mode kernel code
- */
-
-#ifndef BOOT_BOOT_H
-#define BOOT_BOOT_H
-
-#ifndef __ASSEMBLY__
-
-#include <stdarg.h>
-#include <linux/types.h>
-#include <linux/edd.h>
-#include <asm/boot.h>
-#include <asm/bootparam.h>
-
-/* Useful macros */
-#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
-
-extern struct setup_header hdr;
-extern struct boot_params boot_params;
-
-/* Basic port I/O */
-static inline void outb(u8 v, u16 port)
-{
-       asm volatile("outb %0,%1" : : "a" (v), "dN" (port));
-}
-static inline u8 inb(u16 port)
-{
-       u8 v;
-       asm volatile("inb %1,%0" : "=a" (v) : "dN" (port));
-       return v;
-}
-
-static inline void outw(u16 v, u16 port)
-{
-       asm volatile("outw %0,%1" : : "a" (v), "dN" (port));
-}
-static inline u16 inw(u16 port)
-{
-       u16 v;
-       asm volatile("inw %1,%0" : "=a" (v) : "dN" (port));
-       return v;
-}
-
-static inline void outl(u32 v, u16 port)
-{
-       asm volatile("outl %0,%1" : : "a" (v), "dN" (port));
-}
-static inline u32 inl(u32 port)
-{
-       u32 v;
-       asm volatile("inl %1,%0" : "=a" (v) : "dN" (port));
-       return v;
-}
-
-static inline void io_delay(void)
-{
-       const u16 DELAY_PORT = 0x80;
-       asm volatile("outb %%al,%0" : : "dN" (DELAY_PORT));
-}
-
-/* These functions are used to reference data in other segments. */
-
-static inline u16 ds(void)
-{
-       u16 seg;
-       asm("movw %%ds,%0" : "=rm" (seg));
-       return seg;
-}
-
-static inline void set_fs(u16 seg)
-{
-       asm volatile("movw %0,%%fs" : : "rm" (seg));
-}
-static inline u16 fs(void)
-{
-       u16 seg;
-       asm volatile("movw %%fs,%0" : "=rm" (seg));
-       return seg;
-}
-
-static inline void set_gs(u16 seg)
-{
-       asm volatile("movw %0,%%gs" : : "rm" (seg));
-}
-static inline u16 gs(void)
-{
-       u16 seg;
-       asm volatile("movw %%gs,%0" : "=rm" (seg));
-       return seg;
-}
-
-typedef unsigned int addr_t;
-
-static inline u8 rdfs8(addr_t addr)
-{
-       u8 v;
-       asm volatile("movb %%fs:%1,%0" : "=r" (v) : "m" (*(u8 *)addr));
-       return v;
-}
-static inline u16 rdfs16(addr_t addr)
-{
-       u16 v;
-       asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
-       return v;
-}
-static inline u32 rdfs32(addr_t addr)
-{
-       u32 v;
-       asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
-       return v;
-}
-
-static inline void wrfs8(u8 v, addr_t addr)
-{
-       asm volatile("movb %1,%%fs:%0" : "+m" (*(u8 *)addr) : "r" (v));
-}
-static inline void wrfs16(u16 v, addr_t addr)
-{
-       asm volatile("movw %1,%%fs:%0" : "+m" (*(u16 *)addr) : "r" (v));
-}
-static inline void wrfs32(u32 v, addr_t addr)
-{
-       asm volatile("movl %1,%%fs:%0" : "+m" (*(u32 *)addr) : "r" (v));
-}
-
-static inline u8 rdgs8(addr_t addr)
-{
-       u8 v;
-       asm volatile("movb %%gs:%1,%0" : "=r" (v) : "m" (*(u8 *)addr));
-       return v;
-}
-static inline u16 rdgs16(addr_t addr)
-{
-       u16 v;
-       asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
-       return v;
-}
-static inline u32 rdgs32(addr_t addr)
-{
-       u32 v;
-       asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
-       return v;
-}
-
-static inline void wrgs8(u8 v, addr_t addr)
-{
-       asm volatile("movb %1,%%gs:%0" : "+m" (*(u8 *)addr) : "r" (v));
-}
-static inline void wrgs16(u16 v, addr_t addr)
-{
-       asm volatile("movw %1,%%gs:%0" : "+m" (*(u16 *)addr) : "r" (v));
-}
-static inline void wrgs32(u32 v, addr_t addr)
-{
-       asm volatile("movl %1,%%gs:%0" : "+m" (*(u32 *)addr) : "r" (v));
-}
-
-/* Note: these only return true/false, not a signed return value! */
-static inline int memcmp(const void *s1, const void *s2, size_t len)
-{
-       u8 diff;
-       asm("repe; cmpsb; setnz %0"
-           : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
-       return diff;
-}
-
-static inline int memcmp_fs(const void *s1, addr_t s2, size_t len)
-{
-       u8 diff;
-       asm volatile("fs; repe; cmpsb; setnz %0"
-                    : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
-       return diff;
-}
-static inline int memcmp_gs(const void *s1, addr_t s2, size_t len)
-{
-       u8 diff;
-       asm volatile("gs; repe; cmpsb; setnz %0"
-                    : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
-       return diff;
-}
-
-static inline int isdigit(int ch)
-{
-       return (ch >= '0') && (ch <= '9');
-}
-
-/* Heap -- available for dynamic lists. */
-#define STACK_SIZE     512     /* Minimum number of bytes for stack */
-
-extern char _end[];
-extern char *HEAP;
-extern char *heap_end;
-#define RESET_HEAP() ((void *)( HEAP = _end ))
-static inline char *__get_heap(size_t s, size_t a, size_t n)
-{
-       char *tmp;
-
-       HEAP = (char *)(((size_t)HEAP+(a-1)) & ~(a-1));
-       tmp = HEAP;
-       HEAP += s*n;
-       return tmp;
-}
-#define GET_HEAP(type, n) \
-       ((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
-
-static inline int heap_free(void)
-{
-       return heap_end-HEAP;
-}
-
-/* copy.S */
-
-void copy_to_fs(addr_t dst, void *src, size_t len);
-void *copy_from_fs(void *dst, addr_t src, size_t len);
-void copy_to_gs(addr_t dst, void *src, size_t len);
-void *copy_from_gs(void *dst, addr_t src, size_t len);
-void *memcpy(void *dst, void *src, size_t len);
-void *memset(void *dst, int c, size_t len);
-
-#define memcpy(d,s,l) __builtin_memcpy(d,s,l)
-#define memset(d,c,l) __builtin_memset(d,c,l)
-
-/* a20.c */
-int enable_a20(void);
-
-/* apm.c */
-int query_apm_bios(void);
-
-/* cmdline.c */
-int cmdline_find_option(const char *option, char *buffer, int bufsize);
-
-/* cpu.c, cpucheck.c */
-int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr);
-int validate_cpu(void);
-
-/* edd.c */
-void query_edd(void);
-
-/* header.S */
-void __attribute__((noreturn)) die(void);
-
-/* mca.c */
-int query_mca(void);
-
-/* memory.c */
-int detect_memory(void);
-
-/* pm.c */
-void __attribute__((noreturn)) go_to_protected_mode(void);
-
-/* pmjump.S */
-void __attribute__((noreturn))
-       protected_mode_jump(u32 entrypoint, u32 bootparams);
-
-/* printf.c */
-int sprintf(char *buf, const char *fmt, ...);
-int vsprintf(char *buf, const char *fmt, va_list args);
-int printf(const char *fmt, ...);
-
-/* string.c */
-int strcmp(const char *str1, const char *str2);
-size_t strnlen(const char *s, size_t maxlen);
-unsigned int atou(const char *s);
-
-/* tty.c */
-void puts(const char *);
-void putchar(int);
-int getchar(void);
-void kbd_flush(void);
-int getchar_timeout(void);
-
-/* video.c */
-void set_video(void);
-
-/* video-vesa.c */
-void vesa_store_edid(void);
-
-/* voyager.c */
-int query_voyager(void);
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* BOOT_BOOT_H */
diff --git a/arch/i386/boot/cmdline.c b/arch/i386/boot/cmdline.c
deleted file mode 100644 (file)
index 34bb778..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/cmdline.c
- *
- * Simple command-line parser for early boot.
- */
-
-#include "boot.h"
-
-static inline int myisspace(u8 c)
-{
-       return c <= ' ';        /* Close enough approximation */
-}
-
-/*
- * Find a non-boolean option, that is, "option=argument".  In accordance
- * with standard Linux practice, if this option is repeated, this returns
- * the last instance on the command line.
- *
- * Returns the length of the argument (regardless of if it was
- * truncated to fit in the buffer), or -1 on not found.
- */
-int cmdline_find_option(const char *option, char *buffer, int bufsize)
-{
-       u32 cmdline_ptr = boot_params.hdr.cmd_line_ptr;
-       addr_t cptr;
-       char c;
-       int len = -1;
-       const char *opptr = NULL;
-       char *bufptr = buffer;
-       enum {
-               st_wordstart,   /* Start of word/after whitespace */
-               st_wordcmp,     /* Comparing this word */
-               st_wordskip,    /* Miscompare, skip */
-               st_bufcpy       /* Copying this to buffer */
-       } state = st_wordstart;
-
-       if (!cmdline_ptr || cmdline_ptr >= 0x100000)
-               return -1;      /* No command line, or inaccessible */
-
-       cptr = cmdline_ptr & 0xf;
-       set_fs(cmdline_ptr >> 4);
-
-       while (cptr < 0x10000 && (c = rdfs8(cptr++))) {
-               switch (state) {
-               case st_wordstart:
-                       if (myisspace(c))
-                               break;
-
-                       /* else */
-                       state = st_wordcmp;
-                       opptr = option;
-                       /* fall through */
-
-               case st_wordcmp:
-                       if (c == '=' && !*opptr) {
-                               len = 0;
-                               bufptr = buffer;
-                               state = st_bufcpy;
-                       } else if (myisspace(c)) {
-                               state = st_wordstart;
-                       } else if (c != *opptr++) {
-                               state = st_wordskip;
-                       }
-                       break;
-
-               case st_wordskip:
-                       if (myisspace(c))
-                               state = st_wordstart;
-                       break;
-
-               case st_bufcpy:
-                       if (myisspace(c)) {
-                               state = st_wordstart;
-                       } else {
-                               if (len < bufsize-1)
-                                       *bufptr++ = c;
-                               len++;
-                       }
-                       break;
-               }
-       }
-
-       if (bufsize)
-               *bufptr = '\0';
-
-       return len;
-}
diff --git a/arch/i386/boot/code16gcc.h b/arch/i386/boot/code16gcc.h
deleted file mode 100644 (file)
index d93e480..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * code16gcc.h
- *
- * This file is -include'd when compiling 16-bit C code.
- * Note: this asm() needs to be emitted before gcc emits any code.
- * Depending on gcc version, this requires -fno-unit-at-a-time or
- * -fno-toplevel-reorder.
- *
- * Hopefully gcc will eventually have a real -m16 option so we can
- * drop this hack long term.
- */
-
-#ifndef __ASSEMBLY__
-asm(".code16gcc");
-#endif
diff --git a/arch/i386/boot/copy.S b/arch/i386/boot/copy.S
deleted file mode 100644 (file)
index ef127e5..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/copy.S
- *
- * Memory copy routines
- */
-
-       .code16gcc
-       .text
-
-       .globl  memcpy
-       .type   memcpy, @function
-memcpy:
-       pushw   %si
-       pushw   %di
-       movw    %ax, %di
-       movw    %dx, %si
-       pushw   %cx
-       shrw    $2, %cx
-       rep; movsl
-       popw    %cx
-       andw    $3, %cx
-       rep; movsb
-       popw    %di
-       popw    %si
-       ret
-       .size   memcpy, .-memcpy
-
-       .globl  memset
-       .type   memset, @function
-memset:
-       pushw   %di
-       movw    %ax, %di
-       movzbl  %dl, %eax
-       imull   $0x01010101,%eax
-       pushw   %cx
-       shrw    $2, %cx
-       rep; stosl
-       popw    %cx
-       andw    $3, %cx
-       rep; stosb
-       popw    %di
-       ret
-       .size   memset, .-memset
-
-       .globl  copy_from_fs
-       .type   copy_from_fs, @function
-copy_from_fs:
-       pushw   %ds
-       pushw   %fs
-       popw    %ds
-       call    memcpy
-       popw    %ds
-       ret
-       .size   copy_from_fs, .-copy_from_fs
-
-       .globl  copy_to_fs
-       .type   copy_to_fs, @function
-copy_to_fs:
-       pushw   %es
-       pushw   %fs
-       popw    %es
-       call    memcpy
-       popw    %es
-       ret
-       .size   copy_to_fs, .-copy_to_fs
-
-#if 0 /* Not currently used, but can be enabled as needed */
-
-       .globl  copy_from_gs
-       .type   copy_from_gs, @function
-copy_from_gs:
-       pushw   %ds
-       pushw   %gs
-       popw    %ds
-       call    memcpy
-       popw    %ds
-       ret
-       .size   copy_from_gs, .-copy_from_gs
-       .globl  copy_to_gs
-
-       .type   copy_to_gs, @function
-copy_to_gs:
-       pushw   %es
-       pushw   %gs
-       popw    %es
-       call    memcpy
-       popw    %es
-       ret
-       .size   copy_to_gs, .-copy_to_gs
-
-#endif
diff --git a/arch/i386/boot/cpu.c b/arch/i386/boot/cpu.c
deleted file mode 100644 (file)
index 2a5c32d..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/cpu.c
- *
- * Check for obligatory CPU features and abort if the features are not
- * present.
- */
-
-#include "boot.h"
-#include "bitops.h"
-#include <asm/cpufeature.h>
-
-static char *cpu_name(int level)
-{
-       static char buf[6];
-
-       if (level == 64) {
-               return "x86-64";
-       } else {
-               sprintf(buf, "i%d86", level);
-               return buf;
-       }
-}
-
-int validate_cpu(void)
-{
-       u32 *err_flags;
-       int cpu_level, req_level;
-
-       check_cpu(&cpu_level, &req_level, &err_flags);
-
-       if (cpu_level < req_level) {
-               printf("This kernel requires an %s CPU, ",
-                      cpu_name(req_level));
-               printf("but only detected an %s CPU.\n",
-                      cpu_name(cpu_level));
-               return -1;
-       }
-
-       if (err_flags) {
-               int i, j;
-               puts("This kernel requires the following features "
-                    "not present on the CPU:\n");
-
-               for (i = 0; i < NCAPINTS; i++) {
-                       u32 e = err_flags[i];
-
-                       for (j = 0; j < 32; j++) {
-                               if (e & 1)
-                                       printf("%d:%d ", i, j);
-
-                               e >>= 1;
-                       }
-               }
-               putchar('\n');
-               return -1;
-       } else {
-               return 0;
-       }
-}
diff --git a/arch/i386/boot/cpucheck.c b/arch/i386/boot/cpucheck.c
deleted file mode 100644 (file)
index e655a89..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/cpucheck.c
- *
- * Check for obligatory CPU features and abort if the features are not
- * present.  This code should be compilable as 16-, 32- or 64-bit
- * code, so be very careful with types and inline assembly.
- *
- * This code should not contain any messages; that requires an
- * additional wrapper.
- *
- * As written, this code is not safe for inclusion into the kernel
- * proper (after FPU initialization, in particular).
- */
-
-#ifdef _SETUP
-# include "boot.h"
-# include "bitops.h"
-#endif
-#include <linux/types.h>
-#include <asm/cpufeature.h>
-#include <asm/processor-flags.h>
-#include <asm/required-features.h>
-#include <asm/msr-index.h>
-
-struct cpu_features {
-       int level;              /* Family, or 64 for x86-64 */
-       int model;
-       u32 flags[NCAPINTS];
-};
-
-static struct cpu_features cpu;
-static u32 cpu_vendor[3];
-static u32 err_flags[NCAPINTS];
-
-#ifdef CONFIG_X86_64
-static const int req_level = 64;
-#elif defined(CONFIG_X86_MINIMUM_CPU_FAMILY)
-static const int req_level = CONFIG_X86_MINIMUM_CPU_FAMILY;
-#else
-static const int req_level = 3;
-#endif
-
-static const u32 req_flags[NCAPINTS] =
-{
-       REQUIRED_MASK0,
-       REQUIRED_MASK1,
-       REQUIRED_MASK2,
-       REQUIRED_MASK3,
-       REQUIRED_MASK4,
-       REQUIRED_MASK5,
-       REQUIRED_MASK6,
-       REQUIRED_MASK7,
-};
-
-#define A32(a,b,c,d) (((d) << 24)+((c) << 16)+((b) << 8)+(a))
-
-static int is_amd(void)
-{
-       return cpu_vendor[0] == A32('A','u','t','h') &&
-              cpu_vendor[1] == A32('e','n','t','i') &&
-              cpu_vendor[2] == A32('c','A','M','D');
-}
-
-static int is_centaur(void)
-{
-       return cpu_vendor[0] == A32('C','e','n','t') &&
-              cpu_vendor[1] == A32('a','u','r','H') &&
-              cpu_vendor[2] == A32('a','u','l','s');
-}
-
-static int is_transmeta(void)
-{
-       return cpu_vendor[0] == A32('G','e','n','u') &&
-              cpu_vendor[1] == A32('i','n','e','T') &&
-              cpu_vendor[2] == A32('M','x','8','6');
-}
-
-static int has_fpu(void)
-{
-       u16 fcw = -1, fsw = -1;
-       u32 cr0;
-
-       asm("movl %%cr0,%0" : "=r" (cr0));
-       if (cr0 & (X86_CR0_EM|X86_CR0_TS)) {
-               cr0 &= ~(X86_CR0_EM|X86_CR0_TS);
-               asm volatile("movl %0,%%cr0" : : "r" (cr0));
-       }
-
-       asm volatile("fninit ; fnstsw %0 ; fnstcw %1"
-                    : "+m" (fsw), "+m" (fcw));
-
-       return fsw == 0 && (fcw & 0x103f) == 0x003f;
-}
-
-static int has_eflag(u32 mask)
-{
-       u32 f0, f1;
-
-       asm("pushfl ; "
-           "pushfl ; "
-           "popl %0 ; "
-           "movl %0,%1 ; "
-           "xorl %2,%1 ; "
-           "pushl %1 ; "
-           "popfl ; "
-           "pushfl ; "
-           "popl %1 ; "
-           "popfl"
-           : "=&r" (f0), "=&r" (f1)
-           : "ri" (mask));
-
-       return !!((f0^f1) & mask);
-}
-
-static void get_flags(void)
-{
-       u32 max_intel_level, max_amd_level;
-       u32 tfms;
-
-       if (has_fpu())
-               set_bit(X86_FEATURE_FPU, cpu.flags);
-
-       if (has_eflag(X86_EFLAGS_ID)) {
-               asm("cpuid"
-                   : "=a" (max_intel_level),
-                     "=b" (cpu_vendor[0]),
-                     "=d" (cpu_vendor[1]),
-                     "=c" (cpu_vendor[2])
-                   : "a" (0));
-
-               if (max_intel_level >= 0x00000001 &&
-                   max_intel_level <= 0x0000ffff) {
-                       asm("cpuid"
-                           : "=a" (tfms),
-                             "=c" (cpu.flags[4]),
-                             "=d" (cpu.flags[0])
-                           : "a" (0x00000001)
-                           : "ebx");
-                       cpu.level = (tfms >> 8) & 15;
-                       cpu.model = (tfms >> 4) & 15;
-                       if (cpu.level >= 6)
-                               cpu.model += ((tfms >> 16) & 0xf) << 4;
-               }
-
-               asm("cpuid"
-                   : "=a" (max_amd_level)
-                   : "a" (0x80000000)
-                   : "ebx", "ecx", "edx");
-
-               if (max_amd_level >= 0x80000001 &&
-                   max_amd_level <= 0x8000ffff) {
-                       u32 eax = 0x80000001;
-                       asm("cpuid"
-                           : "+a" (eax),
-                             "=c" (cpu.flags[6]),
-                             "=d" (cpu.flags[1])
-                           : : "ebx");
-               }
-       }
-}
-
-/* Returns a bitmask of which words we have error bits in */
-static int check_flags(void)
-{
-       u32 err;
-       int i;
-
-       err = 0;
-       for (i = 0; i < NCAPINTS; i++) {
-               err_flags[i] = req_flags[i] & ~cpu.flags[i];
-               if (err_flags[i])
-                       err |= 1 << i;
-       }
-
-       return err;
-}
-
-/*
- * Returns -1 on error.
- *
- * *cpu_level is set to the current CPU level; *req_level to the required
- * level.  x86-64 is considered level 64 for this purpose.
- *
- * *err_flags_ptr is set to the flags error array if there are flags missing.
- */
-int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
-{
-       int err;
-
-       memset(&cpu.flags, 0, sizeof cpu.flags);
-       cpu.level = 3;
-
-       if (has_eflag(X86_EFLAGS_AC))
-               cpu.level = 4;
-
-       get_flags();
-       err = check_flags();
-
-       if (test_bit(X86_FEATURE_LM, cpu.flags))
-               cpu.level = 64;
-
-       if (err == 0x01 &&
-           !(err_flags[0] &
-             ~((1 << X86_FEATURE_XMM)|(1 << X86_FEATURE_XMM2))) &&
-           is_amd()) {
-               /* If this is an AMD and we're only missing SSE+SSE2, try to
-                  turn them on */
-
-               u32 ecx = MSR_K7_HWCR;
-               u32 eax, edx;
-
-               asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx));
-               eax &= ~(1 << 15);
-               asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
-
-               get_flags();    /* Make sure it really did something */
-               err = check_flags();
-       } else if (err == 0x01 &&
-                  !(err_flags[0] & ~(1 << X86_FEATURE_CX8)) &&
-                  is_centaur() && cpu.model >= 6) {
-               /* If this is a VIA C3, we might have to enable CX8
-                  explicitly */
-
-               u32 ecx = MSR_VIA_FCR;
-               u32 eax, edx;
-
-               asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx));
-               eax |= (1<<1)|(1<<7);
-               asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
-
-               set_bit(X86_FEATURE_CX8, cpu.flags);
-               err = check_flags();
-       } else if (err == 0x01 && is_transmeta()) {
-               /* Transmeta might have masked feature bits in word 0 */
-
-               u32 ecx = 0x80860004;
-               u32 eax, edx;
-               u32 level = 1;
-
-               asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx));
-               asm("wrmsr" : : "a" (~0), "d" (edx), "c" (ecx));
-               asm("cpuid"
-                   : "+a" (level), "=d" (cpu.flags[0])
-                   : : "ecx", "ebx");
-               asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
-
-               err = check_flags();
-       }
-
-       if (err_flags_ptr)
-               *err_flags_ptr = err ? err_flags : NULL;
-       if (cpu_level_ptr)
-               *cpu_level_ptr = cpu.level;
-       if (req_level_ptr)
-               *req_level_ptr = req_level;
-
-       return (cpu.level < req_level || err) ? -1 : 0;
-}
diff --git a/arch/i386/boot/edd.c b/arch/i386/boot/edd.c
deleted file mode 100644 (file)
index bd138e4..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/edd.c
- *
- * Get EDD BIOS disk information
- */
-
-#include "boot.h"
-#include <linux/edd.h>
-
-#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-
-/*
- * Read the MBR (first sector) from a specific device.
- */
-static int read_mbr(u8 devno, void *buf)
-{
-       u16 ax, bx, cx, dx;
-
-       ax = 0x0201;            /* Legacy Read, one sector */
-       cx = 0x0001;            /* Sector 0-0-1 */
-       dx = devno;
-       bx = (size_t)buf;
-       asm volatile("pushfl; stc; int $0x13; setc %%al; popfl"
-                    : "+a" (ax), "+c" (cx), "+d" (dx), "+b" (bx)
-                    : : "esi", "edi", "memory");
-
-       return -(u8)ax;         /* 0 or -1 */
-}
-
-static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
-{
-       int sector_size;
-       char *mbrbuf_ptr, *mbrbuf_end;
-       u32 buf_base, mbr_base;
-       extern char _end[];
-
-       sector_size = ei->params.bytes_per_sector;
-       if (!sector_size)
-               sector_size = 512; /* Best available guess */
-
-       /* Produce a naturally aligned buffer on the heap */
-       buf_base = (ds() << 4) + (u32)&_end;
-       mbr_base = (buf_base+sector_size-1) & ~(sector_size-1);
-       mbrbuf_ptr = _end + (mbr_base-buf_base);
-       mbrbuf_end = mbrbuf_ptr + sector_size;
-
-       /* Make sure we actually have space on the heap... */
-       if (!(boot_params.hdr.loadflags & CAN_USE_HEAP))
-               return -1;
-       if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
-               return -1;
-
-       if (read_mbr(devno, mbrbuf_ptr))
-               return -1;
-
-       *mbrsig = *(u32 *)&mbrbuf_ptr[EDD_MBR_SIG_OFFSET];
-       return 0;
-}
-
-static int get_edd_info(u8 devno, struct edd_info *ei)
-{
-       u16 ax, bx, cx, dx, di;
-
-       memset(ei, 0, sizeof *ei);
-
-       /* Check Extensions Present */
-
-       ax = 0x4100;
-       bx = EDDMAGIC1;
-       dx = devno;
-       asm("pushfl; stc; int $0x13; setc %%al; popfl"
-           : "+a" (ax), "+b" (bx), "=c" (cx), "+d" (dx)
-           : : "esi", "edi");
-
-       if ((u8)ax)
-               return -1;      /* No extended information */
-
-       if (bx != EDDMAGIC2)
-               return -1;
-
-       ei->device  = devno;
-       ei->version = ax >> 8;  /* EDD version number */
-       ei->interface_support = cx; /* EDD functionality subsets */
-
-       /* Extended Get Device Parameters */
-
-       ei->params.length = sizeof(ei->params);
-       ax = 0x4800;
-       dx = devno;
-       asm("pushfl; int $0x13; popfl"
-           : "+a" (ax), "+d" (dx), "=m" (ei->params)
-           : "S" (&ei->params)
-           : "ebx", "ecx", "edi");
-
-       /* Get legacy CHS parameters */
-
-       /* Ralf Brown recommends setting ES:DI to 0:0 */
-       ax = 0x0800;
-       dx = devno;
-       di = 0;
-       asm("pushw %%es; "
-           "movw %%di,%%es; "
-           "pushfl; stc; int $0x13; setc %%al; popfl; "
-           "popw %%es"
-           : "+a" (ax), "=b" (bx), "=c" (cx), "+d" (dx), "+D" (di)
-           : : "esi");
-
-       if ((u8)ax == 0) {
-               ei->legacy_max_cylinder = (cx >> 8) + ((cx & 0xc0) << 2);
-               ei->legacy_max_head = dx >> 8;
-               ei->legacy_sectors_per_track = cx & 0x3f;
-       }
-
-       return 0;
-}
-
-void query_edd(void)
-{
-       char eddarg[8];
-       int do_mbr = 1;
-       int do_edd = 1;
-       int devno;
-       struct edd_info ei, *edp;
-       u32 *mbrptr;
-
-       if (cmdline_find_option("edd", eddarg, sizeof eddarg) > 0) {
-               if (!strcmp(eddarg, "skipmbr") || !strcmp(eddarg, "skip"))
-                       do_mbr = 0;
-               else if (!strcmp(eddarg, "off"))
-                       do_edd = 0;
-       }
-
-       edp    = boot_params.eddbuf;
-       mbrptr = boot_params.edd_mbr_sig_buffer;
-
-       if (!do_edd)
-               return;
-
-       for (devno = 0x80; devno < 0x80+EDD_MBR_SIG_MAX; devno++) {
-               /*
-                * Scan the BIOS-supported hard disks and query EDD
-                * information...
-                */
-               get_edd_info(devno, &ei);
-
-               if (boot_params.eddbuf_entries < EDDMAXNR) {
-                       memcpy(edp, &ei, sizeof ei);
-                       edp++;
-                       boot_params.eddbuf_entries++;
-               }
-
-               if (do_mbr && !read_mbr_sig(devno, &ei, mbrptr++))
-                       boot_params.edd_mbr_sig_buf_entries = devno-0x80+1;
-       }
-}
-
-#endif
diff --git a/arch/i386/boot/header.S b/arch/i386/boot/header.S
deleted file mode 100644 (file)
index f3140e5..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *     header.S
- *
- *     Copyright (C) 1991, 1992 Linus Torvalds
- *
- *     Based on bootsect.S and setup.S
- *     modified by more people than can be counted
- *
- *     Rewritten as a common file by H. Peter Anvin (Apr 2007)
- *
- * 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/segment.h>
-#include <linux/utsrelease.h>
-#include <asm/boot.h>
-#include <asm/e820.h>
-#include <asm/page.h>
-#include <asm/setup.h>
-#include "boot.h"
-
-SETUPSECTS     = 4                     /* default nr of setup-sectors */
-BOOTSEG                = 0x07C0                /* original address of boot-sector */
-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
-       .section ".bstext", "ax"
-
-       .global bootsect_start
-bootsect_start:
-
-       # Normalize the start address
-       ljmp    $BOOTSEG, $start2
-
-start2:
-       movw    %cs, %ax
-       movw    %ax, %ds
-       movw    %ax, %es
-       movw    %ax, %ss
-       xorw    %sp, %sp
-       sti
-       cld
-
-       movw    $bugger_off_msg, %si
-
-msg_loop:
-       lodsb
-       andb    %al, %al
-       jz      bs_die
-       movb    $0xe, %ah
-       movw    $7, %bx
-       int     $0x10
-       jmp     msg_loop
-
-bs_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
-
-       .section ".bsdata", "a"
-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.  This is part 1 of the
-       # header, from the old boot sector.
-
-       .section ".header", "a"
-       .globl  hdr
-hdr:
-setup_sects:   .byte SETUPSECTS
-root_flags:    .word ROOT_RDONLY
-syssize:       .long SYSSIZE
-ram_size:      .word RAMDISK
-vid_mode:      .word SVGA_MODE
-root_dev:      .word ROOT_DEV
-boot_flag:     .word 0xAA55
-
-       # offset 512, entry point
-
-       .globl  _start
-_start:
-               # Explicitly enter this as bytes, or the assembler
-               # tries to generate a 3-byte jump here, which causes
-               # everything else to push off to the wrong offset.
-               .byte   0xeb            # short (2-byte) jump
-               .byte   start_of_setup-1f
-1:
-
-       # Part 2 of the header, from the old setup.S
-
-               .ascii  "HdrS"          # header signature
-               .word   0x0206          # header version number (>= 0x0105)
-                                       # or else old loadlin-1.5 will fail)
-               .globl realmode_swtch
-realmode_swtch:        .word   0, 0            # default_switch, SETUPSEG
-start_sys_seg: .word   SYSSEG
-               .word   kernel_version-512 # pointing to kernel version string
-                                       # above section of header is compatible
-                                       # with loadlin-1.5 (header v1.5). Don't
-                                       # change it.
-
-type_of_loader:        .byte   0               # = 0, old one (LILO, Loadlin,
-                                       #      Bootlin, SYSLX, bootsect...)
-                                       # See Documentation/i386/boot.txt for
-                                       # assigned ids
-
-# flags, unused bits must be zero (RFU) bit within loadflags
-loadflags:
-LOADED_HIGH    = 1                     # If set, the kernel is loaded high
-CAN_USE_HEAP   = 0x80                  # If set, the loader also has set
-                                       # heap_end_ptr to tell how much
-                                       # space behind setup.S can be used for
-                                       # heap purposes.
-                                       # Only the loader knows what is free
-#ifndef __BIG_KERNEL__
-               .byte   0
-#else
-               .byte   LOADED_HIGH
-#endif
-
-setup_move_size: .word  0x8000         # size to move, when setup is not
-                                       # loaded at 0x90000. We will move setup
-                                       # to 0x90000 then just before jumping
-                                       # into the kernel. However, only the
-                                       # loader knows how much data behind
-                                       # us also needs to be loaded.
-
-code32_start:                          # here loaders can put a different
-                                       # start address for 32-bit code.
-#ifndef __BIG_KERNEL__
-               .long   0x1000          #   0x1000 = default for zImage
-#else
-               .long   0x100000        # 0x100000 = default for big kernel
-#endif
-
-ramdisk_image: .long   0               # address of loaded ramdisk image
-                                       # Here the loader puts the 32-bit
-                                       # address where it loaded the image.
-                                       # This only will be read by the kernel.
-
-ramdisk_size:  .long   0               # its size in bytes
-
-bootsect_kludge:
-               .long   0               # obsolete
-
-heap_end_ptr:  .word   _end+1024       # (Header version 0x0201 or later)
-                                       # space from here (exclusive) down to
-                                       # end of setup code can be used by setup
-                                       # for local heap purposes.
-
-pad1:          .word   0
-cmd_line_ptr:  .long   0               # (Header version 0x0202 or later)
-                                       # If nonzero, a 32-bit pointer
-                                       # to the kernel command line.
-                                       # The command line should be
-                                       # located between the start of
-                                       # setup and the end of low
-                                       # memory (0xa0000), or it may
-                                       # get overwritten before it
-                                       # gets read.  If this field is
-                                       # used, there is no longer
-                                       # anything magical about the
-                                       # 0x90000 segment; the setup
-                                       # can be located anywhere in
-                                       # low memory 0x10000 or higher.
-
-ramdisk_max:   .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
-                                       # (Header version 0x0203 or later)
-                                       # The highest safe address for
-                                       # the contents of an initrd
-
-kernel_alignment:  .long CONFIG_PHYSICAL_ALIGN #physical addr alignment
-                                               #required for protected mode
-                                               #kernel
-#ifdef CONFIG_RELOCATABLE
-relocatable_kernel:    .byte 1
-#else
-relocatable_kernel:    .byte 0
-#endif
-pad2:                  .byte 0
-pad3:                  .word 0
-
-cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
-                                                #added with boot protocol
-                                                #version 2.06
-
-# End of setup header #####################################################
-
-       .section ".inittext", "ax"
-start_of_setup:
-#ifdef SAFE_RESET_DISK_CONTROLLER
-# Reset the disk controller.
-       movw    $0x0000, %ax            # Reset disk controller
-       movb    $0x80, %dl              # All disks
-       int     $0x13
-#endif
-
-# We will have entered with %cs = %ds+0x20, normalize %cs so
-# it is on par with the other segments.
-       pushw   %ds
-       pushw   $setup2
-       lretw
-
-setup2:
-# Force %es = %ds
-       movw    %ds, %ax
-       movw    %ax, %es
-       cld
-
-# Stack paranoia: align the stack and make sure it is good
-# for both 16- and 32-bit references.  In particular, if we
-# were meant to have been using the full 16-bit segment, the
-# caller might have set %sp to zero, which breaks %esp-based
-# references.
-       andw    $~3, %sp        # dword align (might as well...)
-       jnz     1f
-       movw    $0xfffc, %sp    # Make sure we're not zero
-1:     movzwl  %sp, %esp       # Clear upper half of %esp
-       sti
-
-# Check signature at end of setup
-       cmpl    $0x5a5aaa55, setup_sig
-       jne     setup_bad
-
-# Zero the bss
-       movw    $__bss_start, %di
-       movw    $_end+3, %cx
-       xorl    %eax, %eax
-       subw    %di, %cx
-       shrw    $2, %cx
-       rep; stosl
-
-# Jump to C code (should not return)
-       calll   main
-
-# Setup corrupt somehow...
-setup_bad:
-       movl    $setup_corrupt, %eax
-       calll   puts
-       # Fall through...
-
-       .globl  die
-       .type   die, @function
-die:
-       hlt
-       jmp     die
-
-       .size   die, .-die
-
-       .section ".initdata", "a"
-setup_corrupt:
-       .byte   7
-       .string "No setup signature found...\n"
diff --git a/arch/i386/boot/install.sh b/arch/i386/boot/install.sh
deleted file mode 100644 (file)
index 88d7776..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/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)
-#
-
-verify () {
-       if [ ! -f "$1" ]; then
-               echo ""                                                   1>&2
-               echo " *** Missing file: $1"                              1>&2
-               echo ' *** You need to run "make" before "make install".' 1>&2
-               echo ""                                                   1>&2
-               exit 1
-       fi
-}
-
-# Make sure the files actually exist
-verify "$2"
-verify "$3"
-
-# User may have a custom install script
-
-if [ -x ~/bin/${CROSS_COMPILE}installkernel ]; then exec ~/bin/${CROSS_COMPILE}installkernel "$@"; fi
-if [ -x /sbin/${CROSS_COMPILE}installkernel ]; then exec /sbin/${CROSS_COMPILE}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
-elif [ -x /etc/lilo/install ]; then
-       /etc/lilo/install
-else
-       sync
-       echo "Cannot find LILO."
-fi
diff --git a/arch/i386/boot/main.c b/arch/i386/boot/main.c
deleted file mode 100644 (file)
index 0eeef39..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/main.c
- *
- * Main module for the real-mode kernel code
- */
-
-#include "boot.h"
-
-struct boot_params boot_params __attribute__((aligned(16)));
-
-char *HEAP = _end;
-char *heap_end = _end;         /* Default end of heap = no heap */
-
-/*
- * Copy the header into the boot parameter block.  Since this
- * screws up the old-style command line protocol, adjust by
- * filling in the new-style command line pointer instead.
- */
-#define OLD_CL_MAGIC   0xA33F
-#define OLD_CL_ADDRESS 0x20
-
-static void copy_boot_params(void)
-{
-       struct old_cmdline {
-               u16 cl_magic;
-               u16 cl_offset;
-       };
-       const struct old_cmdline * const oldcmd =
-               (const struct old_cmdline *)OLD_CL_ADDRESS;
-
-       BUILD_BUG_ON(sizeof boot_params != 4096);
-       memcpy(&boot_params.hdr, &hdr, sizeof hdr);
-
-       if (!boot_params.hdr.cmd_line_ptr &&
-           oldcmd->cl_magic == OLD_CL_MAGIC) {
-               /* Old-style command line protocol. */
-               u16 cmdline_seg;
-
-               /* Figure out if the command line falls in the region
-                  of memory that an old kernel would have copied up
-                  to 0x90000... */
-               if (oldcmd->cl_offset < boot_params.hdr.setup_move_size)
-                       cmdline_seg = ds();
-               else
-                       cmdline_seg = 0x9000;
-
-               boot_params.hdr.cmd_line_ptr =
-                       (cmdline_seg << 4) + oldcmd->cl_offset;
-       }
-}
-
-/*
- * Set the keyboard repeat rate to maximum.  Unclear why this
- * is done here; this might be possible to kill off as stale code.
- */
-static void keyboard_set_repeat(void)
-{
-       u16 ax = 0x0305;
-       u16 bx = 0;
-       asm volatile("int $0x16"
-                    : "+a" (ax), "+b" (bx)
-                    : : "ecx", "edx", "esi", "edi");
-}
-
-/*
- * Get Intel SpeedStep (IST) information.
- */
-static void query_ist(void)
-{
-       asm("int $0x15"
-           : "=a" (boot_params.ist_info.signature),
-             "=b" (boot_params.ist_info.command),
-             "=c" (boot_params.ist_info.event),
-             "=d" (boot_params.ist_info.perf_level)
-           : "a" (0x0000e980),  /* IST Support */
-             "d" (0x47534943)); /* Request value */
-}
-
-/*
- * Tell the BIOS what CPU mode we intend to run in.
- */
-static void set_bios_mode(void)
-{
-#ifdef CONFIG_X86_64
-       u32 eax, ebx;
-
-       eax = 0xec00;
-       ebx = 2;
-       asm volatile("int $0x15"
-                    : "+a" (eax), "+b" (ebx)
-                    : : "ecx", "edx", "esi", "edi");
-#endif
-}
-
-void main(void)
-{
-       /* First, copy the boot header into the "zeropage" */
-       copy_boot_params();
-
-       /* End of heap check */
-       if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
-               heap_end = (char *)(boot_params.hdr.heap_end_ptr
-                                   +0x200-STACK_SIZE);
-       } else {
-               /* Boot protocol 2.00 only, no heap available */
-               puts("WARNING: Ancient bootloader, some functionality "
-                    "may be limited!\n");
-       }
-
-       /* Make sure we have all the proper CPU support */
-       if (validate_cpu()) {
-               puts("Unable to boot - please use a kernel appropriate "
-                    "for your CPU.\n");
-               die();
-       }
-
-       /* Tell the BIOS what CPU mode we intend to run in. */
-       set_bios_mode();
-
-       /* Detect memory layout */
-       detect_memory();
-
-       /* Set keyboard repeat rate (why?) */
-       keyboard_set_repeat();
-
-       /* Set the video mode */
-       set_video();
-
-       /* Query MCA information */
-       query_mca();
-
-       /* Voyager */
-#ifdef CONFIG_X86_VOYAGER
-       query_voyager();
-#endif
-
-       /* Query Intel SpeedStep (IST) information */
-       query_ist();
-
-       /* Query APM information */
-#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
-       query_apm_bios();
-#endif
-
-       /* Query EDD information */
-#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-       query_edd();
-#endif
-       /* Do the last things and invoke protected mode */
-       go_to_protected_mode();
-}
diff --git a/arch/i386/boot/mca.c b/arch/i386/boot/mca.c
deleted file mode 100644 (file)
index 68222f2..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/mca.c
- *
- * Get the MCA system description table
- */
-
-#include "boot.h"
-
-int query_mca(void)
-{
-       u8 err;
-       u16 es, bx, len;
-
-       asm("pushw %%es ; "
-           "int $0x15 ; "
-           "setc %0 ; "
-           "movw %%es, %1 ; "
-           "popw %%es"
-           : "=acd" (err), "=acdSD" (es), "=b" (bx)
-           : "a" (0xc000));
-
-       if (err)
-               return -1;      /* No MCA present */
-
-       set_fs(es);
-       len = rdfs16(bx);
-
-       if (len > sizeof(boot_params.sys_desc_table))
-               len = sizeof(boot_params.sys_desc_table);
-
-       copy_from_fs(&boot_params.sys_desc_table, bx, len);
-       return 0;
-}
diff --git a/arch/i386/boot/memory.c b/arch/i386/boot/memory.c
deleted file mode 100644 (file)
index 3783539..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/memory.c
- *
- * Memory detection code
- */
-
-#include "boot.h"
-
-#define SMAP   0x534d4150      /* ASCII "SMAP" */
-
-static int detect_memory_e820(void)
-{
-       int count = 0;
-       u32 next = 0;
-       u32 size, id;
-       u8 err;
-       struct e820entry *desc = boot_params.e820_map;
-
-       do {
-               size = sizeof(struct e820entry);
-
-               /* Important: %edx is clobbered by some BIOSes,
-                  so it must be either used for the error output
-                  or explicitly marked clobbered. */
-               asm("int $0x15; setc %0"
-                   : "=d" (err), "+b" (next), "=a" (id), "+c" (size),
-                     "=m" (*desc)
-                   : "D" (desc), "d" (SMAP), "a" (0xe820));
-
-               /* Some BIOSes stop returning SMAP in the middle of
-                  the search loop.  We don't know exactly how the BIOS
-                  screwed up the map at that point, we might have a
-                  partial map, the full map, or complete garbage, so
-                  just return failure. */
-               if (id != SMAP) {
-                       count = 0;
-                       break;
-               }
-
-               if (err)
-                       break;
-
-               count++;
-               desc++;
-       } while (next && count < E820MAX);
-
-       return boot_params.e820_entries = count;
-}
-
-static int detect_memory_e801(void)
-{
-       u16 ax, bx, cx, dx;
-       u8 err;
-
-       bx = cx = dx = 0;
-       ax = 0xe801;
-       asm("stc; int $0x15; setc %0"
-           : "=m" (err), "+a" (ax), "+b" (bx), "+c" (cx), "+d" (dx));
-
-       if (err)
-               return -1;
-
-       /* Do we really need to do this? */
-       if (cx || dx) {
-               ax = cx;
-               bx = dx;
-       }
-
-       if (ax > 15*1024)
-               return -1;      /* Bogus! */
-
-       /* This ignores memory above 16MB if we have a memory hole
-          there.  If someone actually finds a machine with a memory
-          hole at 16MB and no support for 0E820h they should probably
-          generate a fake e820 map. */
-       boot_params.alt_mem_k = (ax == 15*1024) ? (dx << 6)+ax : ax;
-
-       return 0;
-}
-
-static int detect_memory_88(void)
-{
-       u16 ax;
-       u8 err;
-
-       ax = 0x8800;
-       asm("stc; int $0x15; setc %0" : "=bcdm" (err), "+a" (ax));
-
-       boot_params.screen_info.ext_mem_k = ax;
-
-       return -err;
-}
-
-int detect_memory(void)
-{
-       int err = -1;
-
-       if (detect_memory_e820() > 0)
-               err = 0;
-
-       if (!detect_memory_e801())
-               err = 0;
-
-       if (!detect_memory_88())
-               err = 0;
-
-       return err;
-}
diff --git a/arch/i386/boot/mtools.conf.in b/arch/i386/boot/mtools.conf.in
deleted file mode 100644 (file)
index efd6d24..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# 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
-
-
diff --git a/arch/i386/boot/pm.c b/arch/i386/boot/pm.c
deleted file mode 100644 (file)
index 09fb342..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/pm.c
- *
- * Prepare the machine for transition to protected mode.
- */
-
-#include "boot.h"
-#include <asm/segment.h>
-
-/*
- * Invoke the realmode switch hook if present; otherwise
- * disable all interrupts.
- */
-static void realmode_switch_hook(void)
-{
-       if (boot_params.hdr.realmode_swtch) {
-               asm volatile("lcallw *%0"
-                            : : "m" (boot_params.hdr.realmode_swtch)
-                            : "eax", "ebx", "ecx", "edx");
-       } else {
-               asm volatile("cli");
-               outb(0x80, 0x70); /* Disable NMI */
-               io_delay();
-       }
-}
-
-/*
- * A zImage kernel is loaded at 0x10000 but wants to run at 0x1000.
- * A bzImage kernel is loaded and runs at 0x100000.
- */
-static void move_kernel_around(void)
-{
-       /* Note: rely on the compile-time option here rather than
-          the LOADED_HIGH flag.  The Qemu kernel loader unconditionally
-          sets the loadflags to zero. */
-#ifndef __BIG_KERNEL__
-       u16 dst_seg, src_seg;
-       u32 syssize;
-
-       dst_seg =  0x1000 >> 4;
-       src_seg = 0x10000 >> 4;
-       syssize = boot_params.hdr.syssize; /* Size in 16-byte paragraphs */
-
-       while (syssize) {
-               int paras  = (syssize >= 0x1000) ? 0x1000 : syssize;
-               int dwords = paras << 2;
-
-               asm volatile("pushw %%es ; "
-                            "pushw %%ds ; "
-                            "movw %1,%%es ; "
-                            "movw %2,%%ds ; "
-                            "xorw %%di,%%di ; "
-                            "xorw %%si,%%si ; "
-                            "rep;movsl ; "
-                            "popw %%ds ; "
-                            "popw %%es"
-                            : "+c" (dwords)
-                            : "r" (dst_seg), "r" (src_seg)
-                            : "esi", "edi");
-
-               syssize -= paras;
-               dst_seg += paras;
-               src_seg += paras;
-       }
-#endif
-}
-
-/*
- * Disable all interrupts at the legacy PIC.
- */
-static void mask_all_interrupts(void)
-{
-       outb(0xff, 0xa1);       /* Mask all interrupts on the secondary PIC */
-       io_delay();
-       outb(0xfb, 0x21);       /* Mask all but cascade on the primary PIC */
-       io_delay();
-}
-
-/*
- * Reset IGNNE# if asserted in the FPU.
- */
-static void reset_coprocessor(void)
-{
-       outb(0, 0xf0);
-       io_delay();
-       outb(0, 0xf1);
-       io_delay();
-}
-
-/*
- * Set up the GDT
- */
-#define GDT_ENTRY(flags,base,limit)            \
-       (((u64)(base & 0xff000000) << 32) |     \
-        ((u64)flags << 40) |                   \
-        ((u64)(limit & 0x00ff0000) << 32) |    \
-        ((u64)(base & 0x00ffff00) << 16) |     \
-        ((u64)(limit & 0x0000ffff)))
-
-struct gdt_ptr {
-       u16 len;
-       u32 ptr;
-} __attribute__((packed));
-
-static void setup_gdt(void)
-{
-       /* There are machines which are known to not boot with the GDT
-          being 8-byte unaligned.  Intel recommends 16 byte alignment. */
-       static const u64 boot_gdt[] __attribute__((aligned(16))) = {
-               /* CS: code, read/execute, 4 GB, base 0 */
-               [GDT_ENTRY_BOOT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
-               /* DS: data, read/write, 4 GB, base 0 */
-               [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
-       };
-       /* Xen HVM incorrectly stores a pointer to the gdt_ptr, instead
-          of the gdt_ptr contents.  Thus, make it static so it will
-          stay in memory, at least long enough that we switch to the
-          proper kernel GDT. */
-       static struct gdt_ptr gdt;
-
-       gdt.len = sizeof(boot_gdt)-1;
-       gdt.ptr = (u32)&boot_gdt + (ds() << 4);
-
-       asm volatile("lgdtl %0" : : "m" (gdt));
-}
-
-/*
- * Set up the IDT
- */
-static void setup_idt(void)
-{
-       static const struct gdt_ptr null_idt = {0, 0};
-       asm volatile("lidtl %0" : : "m" (null_idt));
-}
-
-/*
- * Actual invocation sequence
- */
-void go_to_protected_mode(void)
-{
-       /* Hook before leaving real mode, also disables interrupts */
-       realmode_switch_hook();
-
-       /* Move the kernel/setup to their final resting places */
-       move_kernel_around();
-
-       /* Enable the A20 gate */
-       if (enable_a20()) {
-               puts("A20 gate not responding, unable to boot...\n");
-               die();
-       }
-
-       /* Reset coprocessor (IGNNE#) */
-       reset_coprocessor();
-
-       /* Mask all interrupts in the PIC */
-       mask_all_interrupts();
-
-       /* Actual transition to protected mode... */
-       setup_idt();
-       setup_gdt();
-       protected_mode_jump(boot_params.hdr.code32_start,
-                           (u32)&boot_params + (ds() << 4));
-}
diff --git a/arch/i386/boot/pmjump.S b/arch/i386/boot/pmjump.S
deleted file mode 100644 (file)
index 2e55923..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/pmjump.S
- *
- * The actual transition into protected mode
- */
-
-#include <asm/boot.h>
-#include <asm/segment.h>
-
-       .text
-
-       .globl  protected_mode_jump
-       .type   protected_mode_jump, @function
-
-       .code16
-
-/*
- * void protected_mode_jump(u32 entrypoint, u32 bootparams);
- */
-protected_mode_jump:
-       xorl    %ebx, %ebx              # Flag to indicate this is a boot
-       movl    %edx, %esi              # Pointer to boot_params table
-       movl    %eax, 2f                # Patch ljmpl instruction
-       jmp     1f                      # Short jump to flush instruction q.
-
-1:
-       movw    $__BOOT_DS, %cx
-
-       movl    %cr0, %edx
-       orb     $1, %dl                 # Protected mode (PE) bit
-       movl    %edx, %cr0
-
-       movw    %cx, %ds
-       movw    %cx, %es
-       movw    %cx, %fs
-       movw    %cx, %gs
-       movw    %cx, %ss
-
-       # Jump to the 32-bit entrypoint
-       .byte   0x66, 0xea              # ljmpl opcode
-2:     .long   0                       # offset
-       .word   __BOOT_CS               # segment
-
-       .size   protected_mode_jump, .-protected_mode_jump
diff --git a/arch/i386/boot/printf.c b/arch/i386/boot/printf.c
deleted file mode 100644 (file)
index 1a09f93..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/printf.c
- *
- * Oh, it's a waste of space, but oh-so-yummy for debugging.  This
- * version of printf() does not include 64-bit support.  "Live with
- * it."
- *
- */
-
-#include "boot.h"
-
-static int skip_atoi(const char **s)
-{
-       int i = 0;
-
-       while (isdigit(**s))
-               i = i * 10 + *((*s)++) - '0';
-       return i;
-}
-
-#define ZEROPAD        1               /* pad with zero */
-#define SIGN   2               /* unsigned/signed long */
-#define PLUS   4               /* show plus */
-#define SPACE  8               /* space if plus */
-#define LEFT   16              /* left justified */
-#define SPECIAL        32              /* 0x */
-#define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
-
-#define do_div(n,base) ({ \
-int __res; \
-__res = ((unsigned long) n) % (unsigned) base; \
-n = ((unsigned long) n) / (unsigned) base; \
-__res; })
-
-static char *number(char *str, long num, int base, int size, int precision,
-                   int type)
-{
-       char c, sign, tmp[66];
-       const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
-       int i;
-
-       if (type & LARGE)
-               digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-       if (type & LEFT)
-               type &= ~ZEROPAD;
-       if (base < 2 || base > 36)
-               return 0;
-       c = (type & ZEROPAD) ? '0' : ' ';
-       sign = 0;
-       if (type & SIGN) {
-               if (num < 0) {
-                       sign = '-';
-                       num = -num;
-                       size--;
-               } else if (type & PLUS) {
-                       sign = '+';
-                       size--;
-               } else if (type & SPACE) {
-                       sign = ' ';
-                       size--;
-               }
-       }
-       if (type & SPECIAL) {
-               if (base == 16)
-                       size -= 2;
-               else if (base == 8)
-                       size--;
-       }
-       i = 0;
-       if (num == 0)
-               tmp[i++] = '0';
-       else
-               while (num != 0)
-                       tmp[i++] = digits[do_div(num, base)];
-       if (i > precision)
-               precision = i;
-       size -= precision;
-       if (!(type & (ZEROPAD + LEFT)))
-               while (size-- > 0)
-                       *str++ = ' ';
-       if (sign)
-               *str++ = sign;
-       if (type & SPECIAL) {
-               if (base == 8)
-                       *str++ = '0';
-               else if (base == 16) {
-                       *str++ = '0';
-                       *str++ = digits[33];
-               }
-       }
-       if (!(type & LEFT))
-               while (size-- > 0)
-                       *str++ = c;
-       while (i < precision--)
-               *str++ = '0';
-       while (i-- > 0)
-               *str++ = tmp[i];
-       while (size-- > 0)
-               *str++ = ' ';
-       return str;
-}
-
-int vsprintf(char *buf, const char *fmt, va_list args)
-{
-       int len;
-       unsigned long num;
-       int i, base;
-       char *str;
-       const char *s;
-
-       int flags;              /* flags to number() */
-
-       int field_width;        /* width of output field */
-       int precision;          /* min. # of digits for integers; max
-                                  number of chars for from string */
-       int qualifier;          /* 'h', 'l', or 'L' for integer fields */
-
-       for (str = buf; *fmt; ++fmt) {
-               if (*fmt != '%') {
-                       *str++ = *fmt;
-                       continue;
-               }
-
-               /* process flags */
-               flags = 0;
-             repeat:
-               ++fmt;          /* this also skips first '%' */
-               switch (*fmt) {
-               case '-':
-                       flags |= LEFT;
-                       goto repeat;
-               case '+':
-                       flags |= PLUS;
-                       goto repeat;
-               case ' ':
-                       flags |= SPACE;
-                       goto repeat;
-               case '#':
-                       flags |= SPECIAL;
-                       goto repeat;
-               case '0':
-                       flags |= ZEROPAD;
-                       goto repeat;
-               }
-
-               /* get field width */
-               field_width = -1;
-               if (isdigit(*fmt))
-                       field_width = skip_atoi(&fmt);
-               else if (*fmt == '*') {
-                       ++fmt;
-                       /* it's the next argument */
-                       field_width = va_arg(args, int);
-                       if (field_width < 0) {
-                               field_width = -field_width;
-                               flags |= LEFT;
-                       }
-               }
-
-               /* get the precision */
-               precision = -1;
-               if (*fmt == '.') {
-                       ++fmt;
-                       if (isdigit(*fmt))
-                               precision = skip_atoi(&fmt);
-                       else if (*fmt == '*') {
-                               ++fmt;
-                               /* it's the next argument */
-                               precision = va_arg(args, int);
-                       }
-                       if (precision < 0)
-                               precision = 0;
-               }
-
-               /* get the conversion qualifier */
-               qualifier = -1;
-               if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
-                       qualifier = *fmt;
-                       ++fmt;
-               }
-
-               /* default base */
-               base = 10;
-
-               switch (*fmt) {
-               case 'c':
-                       if (!(flags & LEFT))
-                               while (--field_width > 0)
-                                       *str++ = ' ';
-                       *str++ = (unsigned char)va_arg(args, int);
-                       while (--field_width > 0)
-                               *str++ = ' ';
-                       continue;
-
-               case 's':
-                       s = va_arg(args, char *);
-                       len = strnlen(s, precision);
-
-                       if (!(flags & LEFT))
-                               while (len < field_width--)
-                                       *str++ = ' ';
-                       for (i = 0; i < len; ++i)
-                               *str++ = *s++;
-                       while (len < field_width--)
-                               *str++ = ' ';
-                       continue;
-
-               case 'p':
-                       if (field_width == -1) {
-                               field_width = 2 * sizeof(void *);
-                               flags |= ZEROPAD;
-                       }
-                       str = number(str,
-                                    (unsigned long)va_arg(args, void *), 16,
-                                    field_width, precision, flags);
-                       continue;
-
-               case 'n':
-                       if (qualifier == 'l') {
-                               long *ip = va_arg(args, long *);
-                               *ip = (str - buf);
-                       } else {
-                               int *ip = va_arg(args, int *);
-                               *ip = (str - buf);
-                       }
-                       continue;
-
-               case '%':
-                       *str++ = '%';
-                       continue;
-
-                       /* integer number formats - set up the flags and "break" */
-               case 'o':
-                       base = 8;
-                       break;
-
-               case 'X':
-                       flags |= LARGE;
-               case 'x':
-                       base = 16;
-                       break;
-
-               case 'd':
-               case 'i':
-                       flags |= SIGN;
-               case 'u':
-                       break;
-
-               default:
-                       *str++ = '%';
-                       if (*fmt)
-                               *str++ = *fmt;
-                       else
-                               --fmt;
-                       continue;
-               }
-               if (qualifier == 'l')
-                       num = va_arg(args, unsigned long);
-               else if (qualifier == 'h') {
-                       num = (unsigned short)va_arg(args, int);
-                       if (flags & SIGN)
-                               num = (short)num;
-               } else if (flags & SIGN)
-                       num = va_arg(args, int);
-               else
-                       num = va_arg(args, unsigned int);
-               str = number(str, num, base, field_width, precision, flags);
-       }
-       *str = '\0';
-       return str - buf;
-}
-
-int sprintf(char *buf, const char *fmt, ...)
-{
-       va_list args;
-       int i;
-
-       va_start(args, fmt);
-       i = vsprintf(buf, fmt, args);
-       va_end(args);
-       return i;
-}
-
-int printf(const char *fmt, ...)
-{
-       char printf_buf[1024];
-       va_list args;
-       int printed;
-
-       va_start(args, fmt);
-       printed = vsprintf(printf_buf, fmt, args);
-       va_end(args);
-
-       puts(printf_buf);
-
-       return printed;
-}
diff --git a/arch/i386/boot/setup.ld b/arch/i386/boot/setup.ld
deleted file mode 100644 (file)
index df9234b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * setup.ld
- *
- * Linker script for the i386 setup code
- */
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-       . = 0;
-       .bstext         : { *(.bstext) }
-       .bsdata         : { *(.bsdata) }
-
-       . = 497;
-       .header         : { *(.header) }
-       .inittext       : { *(.inittext) }
-       .initdata       : { *(.initdata) }
-       .text           : { *(.text*) }
-
-       . = ALIGN(16);
-       .rodata         : { *(.rodata*) }
-
-       .videocards     : {
-               video_cards = .;
-               *(.videocards)
-               video_cards_end = .;
-       }
-
-       . = ALIGN(16);
-       .data           : { *(.data*) }
-
-       .signature      : {
-               setup_sig = .;
-               LONG(0x5a5aaa55)
-       }
-
-
-       . = ALIGN(16);
-       .bss            :
-       {
-               __bss_start = .;
-               *(.bss)
-               __bss_end = .;
-       }
-       . = ALIGN(16);
-       _end = .;
-
-       /DISCARD/ : { *(.note*) }
-
-       . = ASSERT(_end <= 0x8000, "Setup too big!");
-       . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!");
-}
diff --git a/arch/i386/boot/string.c b/arch/i386/boot/string.c
deleted file mode 100644 (file)
index 481a220..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/string.c
- *
- * Very basic string functions
- */
-
-#include "boot.h"
-
-int strcmp(const char *str1, const char *str2)
-{
-       const unsigned char *s1 = (const unsigned char *)str1;
-       const unsigned char *s2 = (const unsigned char *)str2;
-       int delta = 0;
-
-       while (*s1 || *s2) {
-               delta = *s2 - *s1;
-               if (delta)
-                       return delta;
-               s1++;
-               s2++;
-       }
-       return 0;
-}
-
-size_t strnlen(const char *s, size_t maxlen)
-{
-       const char *es = s;
-       while (*es && maxlen) {
-               es++;
-               maxlen--;
-       }
-
-       return (es - s);
-}
-
-unsigned int atou(const char *s)
-{
-       unsigned int i = 0;
-       while (isdigit(*s))
-               i = i * 10 + (*s++ - '0');
-       return i;
-}
diff --git a/arch/i386/boot/tty.c b/arch/i386/boot/tty.c
deleted file mode 100644 (file)
index f3f14bd..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/tty.c
- *
- * Very simple screen I/O
- * XXX: Probably should add very simple serial I/O?
- */
-
-#include "boot.h"
-
-/*
- * These functions are in .inittext so they can be used to signal
- * error during initialization.
- */
-
-void __attribute__((section(".inittext"))) putchar(int ch)
-{
-       unsigned char c = ch;
-
-       if (c == '\n')
-               putchar('\r');  /* \n -> \r\n */
-
-       /* int $0x10 is known to have bugs involving touching registers
-          it shouldn't.  Be extra conservative... */
-       asm volatile("pushal; pushw %%ds; int $0x10; popw %%ds; popal"
-                    : : "b" (0x0007), "c" (0x0001), "a" (0x0e00|ch));
-}
-
-void __attribute__((section(".inittext"))) puts(const char *str)
-{
-       int n = 0;
-       while (*str) {
-               putchar(*str++);
-               n++;
-       }
-}
-
-/*
- * Read the CMOS clock through the BIOS, and return the
- * seconds in BCD.
- */
-
-static u8 gettime(void)
-{
-       u16 ax = 0x0200;
-       u16 cx, dx;
-
-       asm volatile("int $0x1a"
-                    : "+a" (ax), "=c" (cx), "=d" (dx)
-                    : : "ebx", "esi", "edi");
-
-       return dx >> 8;
-}
-
-/*
- * Read from the keyboard
- */
-int getchar(void)
-{
-       u16 ax = 0;
-       asm volatile("int $0x16" : "+a" (ax));
-
-       return ax & 0xff;
-}
-
-static int kbd_pending(void)
-{
-       u8 pending;
-       asm volatile("int $0x16; setnz %0"
-                    : "=rm" (pending)
-                    : "a" (0x0100));
-       return pending;
-}
-
-void kbd_flush(void)
-{
-       for (;;) {
-               if (!kbd_pending())
-                       break;
-               getchar();
-       }
-}
-
-int getchar_timeout(void)
-{
-       int cnt = 30;
-       int t0, t1;
-
-       t0 = gettime();
-
-       while (cnt) {
-               if (kbd_pending())
-                       return getchar();
-
-               t1 = gettime();
-               if (t0 != t1) {
-                       cnt--;
-                       t0 = t1;
-               }
-       }
-
-       return 0;               /* Timeout! */
-}
diff --git a/arch/i386/boot/version.c b/arch/i386/boot/version.c
deleted file mode 100644 (file)
index c61462f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/version.c
- *
- * Kernel version string
- */
-
-#include "boot.h"
-#include <linux/utsrelease.h>
-#include <linux/compile.h>
-
-const char kernel_version[] =
-       UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") "
-       UTS_VERSION;
diff --git a/arch/i386/boot/vesa.h b/arch/i386/boot/vesa.h
deleted file mode 100644 (file)
index ff5b73c..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 1999-2007 H. Peter Anvin - All Rights Reserved
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
- *   Boston MA 02111-1307, USA; either version 2 of the License, or
- *   (at your option) any later version; incorporated herein by reference.
- *
- * ----------------------------------------------------------------------- */
-
-#ifndef BOOT_VESA_H
-#define BOOT_VESA_H
-
-typedef struct {
-       u16 off, seg;
-} far_ptr;
-
-/* VESA General Information table */
-struct vesa_general_info {
-       u32 signature;          /* 0 Magic number = "VESA" */
-       u16 version;            /* 4 */
-       far_ptr vendor_string;  /* 6 */
-       u32 capabilities;       /* 10 */
-       far_ptr video_mode_ptr; /* 14 */
-       u16 total_memory;       /* 18 */
-
-       u16 oem_software_rev;   /* 20 */
-       far_ptr oem_vendor_name_ptr;    /* 22 */
-       far_ptr oem_product_name_ptr;   /* 26 */
-       far_ptr oem_product_rev_ptr;    /* 30 */
-
-       u8 reserved[222];       /* 34 */
-       u8 oem_data[256];       /* 256 */
-} __attribute__ ((packed));
-
-#define VESA_MAGIC ('V' + ('E' << 8) + ('S' << 16) + ('A' << 24))
-#define VBE2_MAGIC ('V' + ('B' << 8) + ('E' << 16) + ('2' << 24))
-
-struct vesa_mode_info {
-       u16 mode_attr;          /* 0 */
-       u8 win_attr[2];         /* 2 */
-       u16 win_grain;          /* 4 */
-       u16 win_size;           /* 6 */
-       u16 win_seg[2];         /* 8 */
-       far_ptr win_scheme;     /* 12 */
-       u16 logical_scan;       /* 16 */
-
-       u16 h_res;              /* 18 */
-       u16 v_res;              /* 20 */
-       u8 char_width;          /* 22 */
-       u8 char_height;         /* 23 */
-       u8 memory_planes;       /* 24 */
-       u8 bpp;                 /* 25 */
-       u8 banks;               /* 26 */
-       u8 memory_layout;       /* 27 */
-       u8 bank_size;           /* 28 */
-       u8 image_planes;        /* 29 */
-       u8 page_function;       /* 30 */
-
-       u8 rmask;               /* 31 */
-       u8 rpos;                /* 32 */
-       u8 gmask;               /* 33 */
-       u8 gpos;                /* 34 */
-       u8 bmask;               /* 35 */
-       u8 bpos;                /* 36 */
-       u8 resv_mask;           /* 37 */
-       u8 resv_pos;            /* 38 */
-       u8 dcm_info;            /* 39 */
-
-       u32 lfb_ptr;            /* 40 Linear frame buffer address */
-       u32 offscreen_ptr;      /* 44 Offscreen memory address */
-       u16 offscreen_size;     /* 48 */
-
-       u8 reserved[206];       /* 50 */
-} __attribute__ ((packed));
-
-#endif                         /* LIB_SYS_VESA_H */
diff --git a/arch/i386/boot/video-bios.c b/arch/i386/boot/video-bios.c
deleted file mode 100644 (file)
index 68e65d9..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/video-bios.c
- *
- * Standard video BIOS modes
- *
- * We have two options for this; silent and scanned.
- */
-
-#include "boot.h"
-#include "video.h"
-
-__videocard video_bios;
-
-/* Set a conventional BIOS mode */
-static int set_bios_mode(u8 mode);
-
-static int bios_set_mode(struct mode_info *mi)
-{
-       return set_bios_mode(mi->mode - VIDEO_FIRST_BIOS);
-}
-
-static int set_bios_mode(u8 mode)
-{
-       u16 ax;
-       u8 new_mode;
-
-       ax = mode;              /* AH=0x00 Set Video Mode */
-       asm volatile(INT10
-                    : "+a" (ax)
-                    : : "ebx", "ecx", "edx", "esi", "edi");
-
-       ax = 0x0f00;            /* Get Current Video Mode */
-       asm volatile(INT10
-                    : "+a" (ax)
-                    : : "ebx", "ecx", "edx", "esi", "edi");
-
-       do_restore = 1;         /* Assume video contents were lost */
-       new_mode = ax & 0x7f;   /* Not all BIOSes are clean with the top bit */
-
-       if (new_mode == mode)
-               return 0;       /* Mode change OK */
-
-       if (new_mode != boot_params.screen_info.orig_video_mode) {
-               /* Mode setting failed, but we didn't end up where we
-                  started.  That's bad.  Try to revert to the original
-                  video mode. */
-               ax = boot_params.screen_info.orig_video_mode;
-               asm volatile(INT10
-                            : "+a" (ax)
-                            : : "ebx", "ecx", "edx", "esi", "edi");
-       }
-       return -1;
-}
-
-static int bios_probe(void)
-{
-       u8 mode;
-       u8 saved_mode = boot_params.screen_info.orig_video_mode;
-       u16 crtc;
-       struct mode_info *mi;
-       int nmodes = 0;
-
-       if (adapter != ADAPTER_EGA && adapter != ADAPTER_VGA)
-               return 0;
-
-       set_fs(0);
-       crtc = vga_crtc();
-
-       video_bios.modes = GET_HEAP(struct mode_info, 0);
-
-       for (mode = 0x14; mode <= 0x7f; mode++) {
-               if (heap_free() < sizeof(struct mode_info))
-                       break;
-
-               if (mode_defined(VIDEO_FIRST_BIOS+mode))
-                       continue;
-
-               if (set_bios_mode(mode))
-                       continue;
-
-               /* Try to verify that it's a text mode. */
-
-               /* Attribute Controller: make graphics controller disabled */
-               if (in_idx(0x3c0, 0x10) & 0x01)
-                       continue;
-
-               /* Graphics Controller: verify Alpha addressing enabled */
-               if (in_idx(0x3ce, 0x06) & 0x01)
-                       continue;
-
-               /* CRTC cursor location low should be zero(?) */
-               if (in_idx(crtc, 0x0f))
-                       continue;
-
-               mi = GET_HEAP(struct mode_info, 1);
-               mi->mode = VIDEO_FIRST_BIOS+mode;
-               mi->x = rdfs16(0x44a);
-               mi->y = rdfs8(0x484)+1;
-               nmodes++;
-       }
-
-       set_bios_mode(saved_mode);
-
-       return nmodes;
-}
-
-__videocard video_bios =
-{
-       .card_name      = "BIOS (scanned)",
-       .probe          = bios_probe,
-       .set_mode       = bios_set_mode,
-       .unsafe         = 1,
-       .xmode_first    = VIDEO_FIRST_BIOS,
-       .xmode_n        = 0x80,
-};
diff --git a/arch/i386/boot/video-vesa.c b/arch/i386/boot/video-vesa.c
deleted file mode 100644 (file)
index 1921907..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/video-vesa.c
- *
- * VESA text modes
- */
-
-#include "boot.h"
-#include "video.h"
-#include "vesa.h"
-
-/* VESA information */
-static struct vesa_general_info vginfo;
-static struct vesa_mode_info vminfo;
-
-__videocard video_vesa;
-
-static void vesa_store_mode_params_graphics(void);
-
-static int vesa_probe(void)
-{
-#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
-       u16 ax, cx, di;
-       u16 mode;
-       addr_t mode_ptr;
-       struct mode_info *mi;
-       int nmodes = 0;
-
-       video_vesa.modes = GET_HEAP(struct mode_info, 0);
-
-       vginfo.signature = VBE2_MAGIC;
-
-       ax = 0x4f00;
-       di = (size_t)&vginfo;
-       asm(INT10
-           : "+a" (ax), "+D" (di), "=m" (vginfo)
-           : : "ebx", "ecx", "edx", "esi");
-
-       if (ax != 0x004f ||
-           vginfo.signature != VESA_MAGIC ||
-           vginfo.version < 0x0102)
-               return 0;       /* Not present */
-#endif /* CONFIG_VIDEO_VESA || CONFIG_FIRMWARE_EDID */
-#ifdef CONFIG_VIDEO_VESA
-       set_fs(vginfo.video_mode_ptr.seg);
-       mode_ptr = vginfo.video_mode_ptr.off;
-
-       while ((mode = rdfs16(mode_ptr)) != 0xffff) {
-               mode_ptr += 2;
-
-               if (heap_free() < sizeof(struct mode_info))
-                       break;  /* Heap full, can't save mode info */
-
-               if (mode & ~0x1ff)
-                       continue;
-
-               memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
-
-               ax = 0x4f01;
-               cx = mode;
-               di = (size_t)&vminfo;
-               asm(INT10
-                   : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
-                   : : "ebx", "edx", "esi");
-
-               if (ax != 0x004f)
-                       continue;
-
-               if ((vminfo.mode_attr & 0x15) == 0x05) {
-                       /* Text Mode, TTY BIOS supported,
-                          supported by hardware */
-                       mi = GET_HEAP(struct mode_info, 1);
-                       mi->mode = mode + VIDEO_FIRST_VESA;
-                       mi->x    = vminfo.h_res;
-                       mi->y    = vminfo.v_res;
-                       nmodes++;
-               } else if ((vminfo.mode_attr & 0x99) == 0x99) {
-#ifdef CONFIG_FB
-                       /* Graphics mode, color, linear frame buffer
-                          supported -- register the mode but hide from
-                          the menu.  Only do this if framebuffer is
-                          configured, however, otherwise the user will
-                          be left without a screen. */
-                       mi = GET_HEAP(struct mode_info, 1);
-                       mi->mode = mode + VIDEO_FIRST_VESA;
-                       mi->x = mi->y = 0;
-                       nmodes++;
-#endif
-               }
-       }
-
-       return nmodes;
-#else
-       return 0;
-#endif /* CONFIG_VIDEO_VESA */
-}
-
-static int vesa_set_mode(struct mode_info *mode)
-{
-       u16 ax, bx, cx, di;
-       int is_graphic;
-       u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA;
-
-       memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
-
-       ax = 0x4f01;
-       cx = vesa_mode;
-       di = (size_t)&vminfo;
-       asm(INT10
-           : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
-           : : "ebx", "edx", "esi");
-
-       if (ax != 0x004f)
-               return -1;
-
-       if ((vminfo.mode_attr & 0x15) == 0x05) {
-               /* It's a supported text mode */
-               is_graphic = 0;
-       } else if ((vminfo.mode_attr & 0x99) == 0x99) {
-               /* It's a graphics mode with linear frame buffer */
-               is_graphic = 1;
-               vesa_mode |= 0x4000; /* Request linear frame buffer */
-       } else {
-               return -1;      /* Invalid mode */
-       }
-
-
-       ax = 0x4f02;
-       bx = vesa_mode;
-       di = 0;
-       asm volatile(INT10
-                    : "+a" (ax), "+b" (bx), "+D" (di)
-                    : : "ecx", "edx", "esi");
-
-       if (ax != 0x004f)
-               return -1;
-
-       graphic_mode = is_graphic;
-       if (!is_graphic) {
-               /* Text mode */
-               force_x = mode->x;
-               force_y = mode->y;
-               do_restore = 1;
-       } else {
-               /* Graphics mode */
-               vesa_store_mode_params_graphics();
-       }
-
-       return 0;
-}
-
-
-/* Switch DAC to 8-bit mode */
-static void vesa_dac_set_8bits(void)
-{
-       u8 dac_size = 6;
-
-       /* If possible, switch the DAC to 8-bit mode */
-       if (vginfo.capabilities & 1) {
-               u16 ax, bx;
-
-               ax = 0x4f08;
-               bx = 0x0800;
-               asm volatile(INT10
-                            : "+a" (ax), "+b" (bx)
-                            : : "ecx", "edx", "esi", "edi");
-
-               if (ax == 0x004f)
-                       dac_size = bx >> 8;
-       }
-
-       /* Set the color sizes to the DAC size, and offsets to 0 */
-       boot_params.screen_info.red_size = dac_size;
-       boot_params.screen_info.green_size = dac_size;
-       boot_params.screen_info.blue_size = dac_size;
-       boot_params.screen_info.rsvd_size = dac_size;
-
-       boot_params.screen_info.red_pos = 0;
-       boot_params.screen_info.green_pos = 0;
-       boot_params.screen_info.blue_pos = 0;
-       boot_params.screen_info.rsvd_pos = 0;
-}
-
-/* Save the VESA protected mode info */
-static void vesa_store_pm_info(void)
-{
-       u16 ax, bx, di, es;
-
-       ax = 0x4f0a;
-       bx = di = 0;
-       asm("pushw %%es; "INT10"; movw %%es,%0; popw %%es"
-           : "=d" (es), "+a" (ax), "+b" (bx), "+D" (di)
-           : : "ecx", "esi");
-
-       if (ax != 0x004f)
-               return;
-
-       boot_params.screen_info.vesapm_seg = es;
-       boot_params.screen_info.vesapm_off = di;
-}
-
-/*
- * Save video mode parameters for graphics mode
- */
-static void vesa_store_mode_params_graphics(void)
-{
-       /* Tell the kernel we're in VESA graphics mode */
-       boot_params.screen_info.orig_video_isVGA = 0x23;
-
-       /* Mode parameters */
-       boot_params.screen_info.vesa_attributes = vminfo.mode_attr;
-       boot_params.screen_info.lfb_linelength = vminfo.logical_scan;
-       boot_params.screen_info.lfb_width = vminfo.h_res;
-       boot_params.screen_info.lfb_height = vminfo.v_res;
-       boot_params.screen_info.lfb_depth = vminfo.bpp;
-       boot_params.screen_info.pages = vminfo.image_planes;
-       boot_params.screen_info.lfb_base = vminfo.lfb_ptr;
-       memcpy(&boot_params.screen_info.red_size,
-              &vminfo.rmask, 8);
-
-       /* General parameters */
-       boot_params.screen_info.lfb_size = vginfo.total_memory;
-
-       if (vminfo.bpp <= 8)
-               vesa_dac_set_8bits();
-
-       vesa_store_pm_info();
-}
-
-/*
- * Save EDID information for the kernel; this is invoked, separately,
- * after mode-setting.
- */
-void vesa_store_edid(void)
-{
-#ifdef CONFIG_FIRMWARE_EDID
-       u16 ax, bx, cx, dx, di;
-
-       /* Apparently used as a nonsense token... */
-       memset(&boot_params.edid_info, 0x13, sizeof boot_params.edid_info);
-
-       if (vginfo.version < 0x0200)
-               return;         /* EDID requires VBE 2.0+ */
-
-       ax = 0x4f15;            /* VBE DDC */
-       bx = 0x0000;            /* Report DDC capabilities */
-       cx = 0;                 /* Controller 0 */
-       di = 0;                 /* ES:DI must be 0 by spec */
-
-       /* Note: The VBE DDC spec is different from the main VESA spec;
-          we genuinely have to assume all registers are destroyed here. */
-
-       asm("pushw %%es; movw %2,%%es; "INT10"; popw %%es"
-           : "+a" (ax), "+b" (bx)
-           :  "c" (cx), "D" (di)
-           : "esi");
-
-       if (ax != 0x004f)
-               return;         /* No EDID */
-
-       /* BH = time in seconds to transfer EDD information */
-       /* BL = DDC level supported */
-
-       ax = 0x4f15;            /* VBE DDC */
-       bx = 0x0001;            /* Read EDID */
-       cx = 0;                 /* Controller 0 */
-       dx = 0;                 /* EDID block number */
-       di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
-       asm(INT10
-           : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info)
-           : "c" (cx), "D" (di)
-           : "esi");
-#endif /* CONFIG_FIRMWARE_EDID */
-}
-
-__videocard video_vesa =
-{
-       .card_name      = "VESA",
-       .probe          = vesa_probe,
-       .set_mode       = vesa_set_mode,
-       .xmode_first    = VIDEO_FIRST_VESA,
-       .xmode_n        = 0x200,
-};
diff --git a/arch/i386/boot/video-vga.c b/arch/i386/boot/video-vga.c
deleted file mode 100644 (file)
index aef02f9..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/video-vga.c
- *
- * Common all-VGA modes
- */
-
-#include "boot.h"
-#include "video.h"
-
-static struct mode_info vga_modes[] = {
-       { VIDEO_80x25,  80, 25 },
-       { VIDEO_8POINT, 80, 50 },
-       { VIDEO_80x43,  80, 43 },
-       { VIDEO_80x28,  80, 28 },
-       { VIDEO_80x30,  80, 30 },
-       { VIDEO_80x34,  80, 34 },
-       { VIDEO_80x60,  80, 60 },
-};
-
-static struct mode_info ega_modes[] = {
-       { VIDEO_80x25,  80, 25 },
-       { VIDEO_8POINT, 80, 43 },
-};
-
-static struct mode_info cga_modes[] = {
-       { VIDEO_80x25,  80, 25 },
-};
-
-__videocard video_vga;
-
-/* Set basic 80x25 mode */
-static u8 vga_set_basic_mode(void)
-{
-       u16 ax;
-       u8 rows;
-       u8 mode;
-
-#ifdef CONFIG_VIDEO_400_HACK
-       if (adapter >= ADAPTER_VGA) {
-               asm volatile(INT10
-                            : : "a" (0x1202), "b" (0x0030)
-                            : "ecx", "edx", "esi", "edi");
-       }
-#endif
-
-       ax = 0x0f00;
-       asm volatile(INT10
-                    : "+a" (ax)
-                    : : "ebx", "ecx", "edx", "esi", "edi");
-
-       mode = (u8)ax;
-
-       set_fs(0);
-       rows = rdfs8(0x484);    /* rows minus one */
-
-#ifndef CONFIG_VIDEO_400_HACK
-       if ((ax == 0x5003 || ax == 0x5007) &&
-           (rows == 0 || rows == 24))
-               return mode;
-#endif
-
-       if (mode != 3 && mode != 7)
-               mode = 3;
-
-       /* Set the mode */
-       ax = mode;
-       asm volatile(INT10
-                    : "+a" (ax)
-                    : : "ebx", "ecx", "edx", "esi", "edi");
-       do_restore = 1;
-       return mode;
-}
-
-static void vga_set_8font(void)
-{
-       /* Set 8x8 font - 80x43 on EGA, 80x50 on VGA */
-
-       /* Set 8x8 font */
-       asm volatile(INT10 : : "a" (0x1112), "b" (0));
-
-       /* Use alternate print screen */
-       asm volatile(INT10 : : "a" (0x1200), "b" (0x20));
-
-       /* Turn off cursor emulation */
-       asm volatile(INT10 : : "a" (0x1201), "b" (0x34));
-
-       /* Cursor is scan lines 6-7 */
-       asm volatile(INT10 : : "a" (0x0100), "c" (0x0607));
-}
-
-static void vga_set_14font(void)
-{
-       /* Set 9x14 font - 80x28 on VGA */
-
-       /* Set 9x14 font */
-       asm volatile(INT10 : : "a" (0x1111), "b" (0));
-
-       /* Turn off cursor emulation */
-       asm volatile(INT10 : : "a" (0x1201), "b" (0x34));
-
-       /* Cursor is scan lines 11-12 */
-       asm volatile(INT10 : : "a" (0x0100), "c" (0x0b0c));
-}
-
-static void vga_set_80x43(void)
-{
-       /* Set 80x43 mode on VGA (not EGA) */
-
-       /* Set 350 scans */
-       asm volatile(INT10 : : "a" (0x1201), "b" (0x30));
-
-       /* Reset video mode */
-       asm volatile(INT10 : : "a" (0x0003));
-
-       vga_set_8font();
-}
-
-/* I/O address of the VGA CRTC */
-u16 vga_crtc(void)
-{
-       return (inb(0x3cc) & 1) ? 0x3d4 : 0x3b4;
-}
-
-static void vga_set_480_scanlines(int end)
-{
-       u16 crtc;
-       u8  csel;
-
-       crtc = vga_crtc();
-
-       out_idx(0x0c, crtc, 0x11); /* Vertical sync end, unlock CR0-7 */
-       out_idx(0x0b, crtc, 0x06); /* Vertical total */
-       out_idx(0x3e, crtc, 0x07); /* Vertical overflow */
-       out_idx(0xea, crtc, 0x10); /* Vertical sync start */
-       out_idx(end, crtc, 0x12); /* Vertical display end */
-       out_idx(0xe7, crtc, 0x15); /* Vertical blank start */
-       out_idx(0x04, crtc, 0x16); /* Vertical blank end */
-       csel = inb(0x3cc);
-       csel &= 0x0d;
-       csel |= 0xe2;
-       outb(csel, 0x3cc);
-}
-
-static void vga_set_80x30(void)
-{
-       vga_set_480_scanlines(0xdf);
-}
-
-static void vga_set_80x34(void)
-{
-       vga_set_14font();
-       vga_set_480_scanlines(0xdb);
-}
-
-static void vga_set_80x60(void)
-{
-       vga_set_8font();
-       vga_set_480_scanlines(0xdf);
-}
-
-static int vga_set_mode(struct mode_info *mode)
-{
-       /* Set the basic mode */
-       vga_set_basic_mode();
-
-       /* Override a possibly broken BIOS */
-       force_x = mode->x;
-       force_y = mode->y;
-
-       switch (mode->mode) {
-       case VIDEO_80x25:
-               break;
-       case VIDEO_8POINT:
-               vga_set_8font();
-               break;
-       case VIDEO_80x43:
-               vga_set_80x43();
-               break;
-       case VIDEO_80x28:
-               vga_set_14font();
-               break;
-       case VIDEO_80x30:
-               vga_set_80x30();
-               break;
-       case VIDEO_80x34:
-               vga_set_80x34();
-               break;
-       case VIDEO_80x60:
-               vga_set_80x60();
-               break;
-       }
-
-       return 0;
-}
-
-/*
- * Note: this probe includes basic information required by all
- * systems.  It should be executed first, by making sure
- * video-vga.c is listed first in the Makefile.
- */
-static int vga_probe(void)
-{
-       static const char *card_name[] = {
-               "CGA/MDA/HGC", "EGA", "VGA"
-       };
-       static struct mode_info *mode_lists[] = {
-               cga_modes,
-               ega_modes,
-               vga_modes,
-       };
-       static int mode_count[] = {
-               sizeof(cga_modes)/sizeof(struct mode_info),
-               sizeof(ega_modes)/sizeof(struct mode_info),
-               sizeof(vga_modes)/sizeof(struct mode_info),
-       };
-       u8 vga_flag;
-
-       asm(INT10
-           : "=b" (boot_params.screen_info.orig_video_ega_bx)
-           : "a" (0x1200), "b" (0x10) /* Check EGA/VGA */
-           : "ecx", "edx", "esi", "edi");
-
-       /* If we have MDA/CGA/HGC then BL will be unchanged at 0x10 */
-       if ((u8)boot_params.screen_info.orig_video_ega_bx != 0x10) {
-               /* EGA/VGA */
-               asm(INT10
-                   : "=a" (vga_flag)
-                   : "a" (0x1a00)
-                   : "ebx", "ecx", "edx", "esi", "edi");
-
-               if (vga_flag == 0x1a) {
-                       adapter = ADAPTER_VGA;
-                       boot_params.screen_info.orig_video_isVGA = 1;
-               } else {
-                       adapter = ADAPTER_EGA;
-               }
-       } else {
-               adapter = ADAPTER_CGA;
-       }
-
-       video_vga.modes = mode_lists[adapter];
-       video_vga.card_name = card_name[adapter];
-       return mode_count[adapter];
-}
-
-__videocard video_vga =
-{
-       .card_name      = "VGA",
-       .probe          = vga_probe,
-       .set_mode       = vga_set_mode,
-};
diff --git a/arch/i386/boot/video.c b/arch/i386/boot/video.c
deleted file mode 100644 (file)
index e4ba897..0000000
+++ /dev/null
@@ -1,467 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/video.c
- *
- * Select video mode
- */
-
-#include "boot.h"
-#include "video.h"
-#include "vesa.h"
-
-/*
- * Mode list variables
- */
-static struct card_info cards[];    /* List of cards to probe for */
-
-/*
- * Common variables
- */
-int adapter;                   /* 0=CGA/MDA/HGC, 1=EGA, 2=VGA+ */
-u16 video_segment;
-int force_x, force_y;  /* Don't query the BIOS for cols/rows */
-
-int do_restore = 0;    /* Screen contents changed during mode flip */
-int graphic_mode;      /* Graphic mode with linear frame buffer */
-
-static void store_cursor_position(void)
-{
-       u16 curpos;
-       u16 ax, bx;
-
-       ax = 0x0300;
-       bx = 0;
-       asm(INT10
-           : "=d" (curpos), "+a" (ax), "+b" (bx)
-           : : "ecx", "esi", "edi");
-
-       boot_params.screen_info.orig_x = curpos;
-       boot_params.screen_info.orig_y = curpos >> 8;
-}
-
-static void store_video_mode(void)
-{
-       u16 ax, page;
-
-       /* N.B.: the saving of the video page here is a bit silly,
-          since we pretty much assume page 0 everywhere. */
-       ax = 0x0f00;
-       asm(INT10
-           : "+a" (ax), "=b" (page)
-           : : "ecx", "edx", "esi", "edi");
-
-       /* Not all BIOSes are clean with respect to the top bit */
-       boot_params.screen_info.orig_video_mode = ax & 0x7f;
-       boot_params.screen_info.orig_video_page = page >> 8;
-}
-
-/*
- * Store the video mode parameters for later usage by the kernel.
- * This is done by asking the BIOS except for the rows/columns
- * parameters in the default 80x25 mode -- these are set directly,
- * because some very obscure BIOSes supply insane values.
- */
-static void store_mode_params(void)
-{
-       u16 font_size;
-       int x, y;
-
-       /* For graphics mode, it is up to the mode-setting driver
-          (currently only video-vesa.c) to store the parameters */
-       if (graphic_mode)
-               return;
-
-       store_cursor_position();
-       store_video_mode();
-
-       if (boot_params.screen_info.orig_video_mode == 0x07) {
-               /* MDA, HGC, or VGA in monochrome mode */
-               video_segment = 0xb000;
-       } else {
-               /* CGA, EGA, VGA and so forth */
-               video_segment = 0xb800;
-       }
-
-       set_fs(0);
-       font_size = rdfs16(0x485); /* Font size, BIOS area */
-       boot_params.screen_info.orig_video_points = font_size;
-
-       x = rdfs16(0x44a);
-       y = (adapter == ADAPTER_CGA) ? 25 : rdfs8(0x484)+1;
-
-       if (force_x)
-               x = force_x;
-       if (force_y)
-               y = force_y;
-
-       boot_params.screen_info.orig_video_cols  = x;
-       boot_params.screen_info.orig_video_lines = y;
-}
-
-/* Probe the video drivers and have them generate their mode lists. */
-static void probe_cards(int unsafe)
-{
-       struct card_info *card;
-       static u8 probed[2];
-
-       if (probed[unsafe])
-               return;
-
-       probed[unsafe] = 1;
-
-       for (card = video_cards; card < video_cards_end; card++) {
-               if (card->unsafe == unsafe) {
-                       if (card->probe)
-                               card->nmodes = card->probe();
-                       else
-                               card->nmodes = 0;
-               }
-       }
-}
-
-/* Test if a mode is defined */
-int mode_defined(u16 mode)
-{
-       struct card_info *card;
-       struct mode_info *mi;
-       int i;
-
-       for (card = video_cards; card < video_cards_end; card++) {
-               mi = card->modes;
-               for (i = 0; i < card->nmodes; i++, mi++) {
-                       if (mi->mode == mode)
-                               return 1;
-               }
-       }
-
-       return 0;
-}
-
-/* Set mode (without recalc) */
-static int raw_set_mode(u16 mode, u16 *real_mode)
-{
-       int nmode, i;
-       struct card_info *card;
-       struct mode_info *mi;
-
-       /* Drop the recalc bit if set */
-       mode &= ~VIDEO_RECALC;
-
-       /* Scan for mode based on fixed ID, position, or resolution */
-       nmode = 0;
-       for (card = video_cards; card < video_cards_end; card++) {
-               mi = card->modes;
-               for (i = 0; i < card->nmodes; i++, mi++) {
-                       int visible = mi->x || mi->y;
-
-                       if ((mode == nmode && visible) ||
-                           mode == mi->mode ||
-                           mode == (mi->y << 8)+mi->x) {
-                               *real_mode = mi->mode;
-                               return card->set_mode(mi);
-                       }
-
-                       if (visible)
-                               nmode++;
-               }
-       }
-
-       /* Nothing found?  Is it an "exceptional" (unprobed) mode? */
-       for (card = video_cards; card < video_cards_end; card++) {
-               if (mode >= card->xmode_first &&
-                   mode < card->xmode_first+card->xmode_n) {
-                       struct mode_info mix;
-                       *real_mode = mix.mode = mode;
-                       mix.x = mix.y = 0;
-                       return card->set_mode(&mix);
-               }
-       }
-
-       /* Otherwise, failure... */
-       return -1;
-}
-
-/*
- * Recalculate the vertical video cutoff (hack!)
- */
-static void vga_recalc_vertical(void)
-{
-       unsigned int font_size, rows;
-       u16 crtc;
-       u8 pt, ov;
-
-       set_fs(0);
-       font_size = rdfs8(0x485); /* BIOS: font size (pixels) */
-       rows = force_y ? force_y : rdfs8(0x484)+1; /* Text rows */
-
-       rows *= font_size;      /* Visible scan lines */
-       rows--;                 /* ... minus one */
-
-       crtc = vga_crtc();
-
-       pt = in_idx(crtc, 0x11);
-       pt &= ~0x80;            /* Unlock CR0-7 */
-       out_idx(pt, crtc, 0x11);
-
-       out_idx((u8)rows, crtc, 0x12); /* Lower height register */
-
-       ov = in_idx(crtc, 0x07); /* Overflow register */
-       ov &= 0xbd;
-       ov |= (rows >> (8-1)) & 0x02;
-       ov |= (rows >> (9-6)) & 0x40;
-       out_idx(ov, crtc, 0x07);
-}
-
-/* Set mode (with recalc if specified) */
-static int set_mode(u16 mode)
-{
-       int rv;
-       u16 real_mode;
-
-       /* Very special mode numbers... */
-       if (mode == VIDEO_CURRENT_MODE)
-               return 0;       /* Nothing to do... */
-       else if (mode == NORMAL_VGA)
-               mode = VIDEO_80x25;
-       else if (mode == EXTENDED_VGA)
-               mode = VIDEO_8POINT;
-
-       rv = raw_set_mode(mode, &real_mode);
-       if (rv)
-               return rv;
-
-       if (mode & VIDEO_RECALC)
-               vga_recalc_vertical();
-
-       /* Save the canonical mode number for the kernel, not
-          an alias, size specification or menu position */
-       boot_params.hdr.vid_mode = real_mode;
-       return 0;
-}
-
-static unsigned int get_entry(void)
-{
-       char entry_buf[4];
-       int i, len = 0;
-       int key;
-       unsigned int v;
-
-       do {
-               key = getchar();
-
-               if (key == '\b') {
-                       if (len > 0) {
-                               puts("\b \b");
-                               len--;
-                       }
-               } else if ((key >= '0' && key <= '9') ||
-                          (key >= 'A' && key <= 'Z') ||
-                          (key >= 'a' && key <= 'z')) {
-                       if (len < sizeof entry_buf) {
-                               entry_buf[len++] = key;
-                               putchar(key);
-                       }
-               }
-       } while (key != '\r');
-       putchar('\n');
-
-       if (len == 0)
-               return VIDEO_CURRENT_MODE; /* Default */
-
-       v = 0;
-       for (i = 0; i < len; i++) {
-               v <<= 4;
-               key = entry_buf[i] | 0x20;
-               v += (key > '9') ? key-'a'+10 : key-'0';
-       }
-
-       return v;
-}
-
-static void display_menu(void)
-{
-       struct card_info *card;
-       struct mode_info *mi;
-       char ch;
-       int i;
-
-       puts("Mode:    COLSxROWS:\n");
-
-       ch = '0';
-       for (card = video_cards; card < video_cards_end; card++) {
-               mi = card->modes;
-               for (i = 0; i < card->nmodes; i++, mi++) {
-                       int visible = mi->x && mi->y;
-                       u16 mode_id = mi->mode ? mi->mode :
-                               (mi->y << 8)+mi->x;
-
-                       if (!visible)
-                               continue; /* Hidden mode */
-
-                       printf("%c  %04X  %3dx%-3d  %s\n",
-                              ch, mode_id, mi->x, mi->y, card->card_name);
-
-                       if (ch == '9')
-                               ch = 'a';
-                       else if (ch == 'z' || ch == ' ')
-                               ch = ' '; /* Out of keys... */
-                       else
-                               ch++;
-               }
-       }
-}
-
-#define H(x)   ((x)-'a'+10)
-#define SCAN   ((H('s')<<12)+(H('c')<<8)+(H('a')<<4)+H('n'))
-
-static unsigned int mode_menu(void)
-{
-       int key;
-       unsigned int sel;
-
-       puts("Press <ENTER> to see video modes available, "
-            "<SPACE> to continue, or wait 30 sec\n");
-
-       kbd_flush();
-       while (1) {
-               key = getchar_timeout();
-               if (key == ' ' || key == 0)
-                       return VIDEO_CURRENT_MODE; /* Default */
-               if (key == '\r')
-                       break;
-               putchar('\a');  /* Beep! */
-       }
-
-
-       for (;;) {
-               display_menu();
-
-               puts("Enter a video mode or \"scan\" to scan for "
-                    "additional modes: ");
-               sel = get_entry();
-               if (sel != SCAN)
-                       return sel;
-
-               probe_cards(1);
-       }
-}
-
-#ifdef CONFIG_VIDEO_RETAIN
-/* Save screen content to the heap */
-struct saved_screen {
-       int x, y;
-       int curx, cury;
-       u16 *data;
-} saved;
-
-static void save_screen(void)
-{
-       /* Should be called after store_mode_params() */
-       saved.x = boot_params.screen_info.orig_video_cols;
-       saved.y = boot_params.screen_info.orig_video_lines;
-       saved.curx = boot_params.screen_info.orig_x;
-       saved.cury = boot_params.screen_info.orig_y;
-
-       if (heap_free() < saved.x*saved.y*sizeof(u16)+512)
-               return;         /* Not enough heap to save the screen */
-
-       saved.data = GET_HEAP(u16, saved.x*saved.y);
-
-       set_fs(video_segment);
-       copy_from_fs(saved.data, 0, saved.x*saved.y*sizeof(u16));
-}
-
-static void restore_screen(void)
-{
-       /* Should be called after store_mode_params() */
-       int xs = boot_params.screen_info.orig_video_cols;
-       int ys = boot_params.screen_info.orig_video_lines;
-       int y;
-       addr_t dst = 0;
-       u16 *src = saved.data;
-       u16 ax, bx, dx;
-
-       if (graphic_mode)
-               return;         /* Can't restore onto a graphic mode */
-
-       if (!src)
-               return;         /* No saved screen contents */
-
-       /* Restore screen contents */
-
-       set_fs(video_segment);
-       for (y = 0; y < ys; y++) {
-               int npad;
-
-               if (y < saved.y) {
-                       int copy = (xs < saved.x) ? xs : saved.x;
-                       copy_to_fs(dst, src, copy*sizeof(u16));
-                       dst += copy*sizeof(u16);
-                       src += saved.x;
-                       npad = (xs < saved.x) ? 0 : xs-saved.x;
-               } else {
-                       npad = xs;
-               }
-
-               /* Writes "npad" blank characters to
-                  video_segment:dst and advances dst */
-               asm volatile("pushw %%es ; "
-                            "movw %2,%%es ; "
-                            "shrw %%cx ; "
-                            "jnc 1f ; "
-                            "stosw \n\t"
-                            "1: rep;stosl ; "
-                            "popw %%es"
-                            : "+D" (dst), "+c" (npad)
-                            : "bdS" (video_segment),
-                              "a" (0x07200720));
-       }
-
-       /* Restore cursor position */
-       ax = 0x0200;            /* Set cursor position */
-       bx = 0;                 /* Page number (<< 8) */
-       dx = (saved.cury << 8)+saved.curx;
-       asm volatile(INT10
-                    : "+a" (ax), "+b" (bx), "+d" (dx)
-                    : : "ecx", "esi", "edi");
-}
-#else
-#define save_screen()          ((void)0)
-#define restore_screen()       ((void)0)
-#endif
-
-void set_video(void)
-{
-       u16 mode = boot_params.hdr.vid_mode;
-
-       RESET_HEAP();
-
-       store_mode_params();
-       save_screen();
-       probe_cards(0);
-
-       for (;;) {
-               if (mode == ASK_VGA)
-                       mode = mode_menu();
-
-               if (!set_mode(mode))
-                       break;
-
-               printf("Undefined video mode number: %x\n", mode);
-               mode = ASK_VGA;
-       }
-       vesa_store_edid();
-       store_mode_params();
-
-       if (do_restore)
-               restore_screen();
-}
diff --git a/arch/i386/boot/video.h b/arch/i386/boot/video.h
deleted file mode 100644 (file)
index b92447d..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/video.h
- *
- * Header file for the real-mode video probing code
- */
-
-#ifndef BOOT_VIDEO_H
-#define BOOT_VIDEO_H
-
-#include <linux/types.h>
-
-/* Enable autodetection of SVGA adapters and modes. */
-#undef CONFIG_VIDEO_SVGA
-
-/* Enable autodetection of VESA modes */
-#define CONFIG_VIDEO_VESA
-
-/* Retain screen contents when switching modes */
-#define CONFIG_VIDEO_RETAIN
-
-/* Force 400 scan lines for standard modes (hack to fix bad BIOS behaviour */
-#undef CONFIG_VIDEO_400_HACK
-
-/* This code uses an extended set of video mode numbers. These include:
- * Aliases for standard modes
- *      NORMAL_VGA (-1)
- *      EXTENDED_VGA (-2)
- *      ASK_VGA (-3)
- * Video modes numbered by menu position -- NOT RECOMMENDED because of lack
- * of compatibility when extending the table. These are between 0x00 and 0xff.
- */
-#define VIDEO_FIRST_MENU 0x0000
-
-/* Standard BIOS video modes (BIOS number + 0x0100) */
-#define VIDEO_FIRST_BIOS 0x0100
-
-/* VESA BIOS video modes (VESA number + 0x0200) */
-#define VIDEO_FIRST_VESA 0x0200
-
-/* Video7 special modes (BIOS number + 0x0900) */
-#define VIDEO_FIRST_V7 0x0900
-
-/* Special video modes */
-#define VIDEO_FIRST_SPECIAL 0x0f00
-#define VIDEO_80x25 0x0f00
-#define VIDEO_8POINT 0x0f01
-#define VIDEO_80x43 0x0f02
-#define VIDEO_80x28 0x0f03
-#define VIDEO_CURRENT_MODE 0x0f04
-#define VIDEO_80x30 0x0f05
-#define VIDEO_80x34 0x0f06
-#define VIDEO_80x60 0x0f07
-#define VIDEO_GFX_HACK 0x0f08
-#define VIDEO_LAST_SPECIAL 0x0f09
-
-/* Video modes given by resolution */
-#define VIDEO_FIRST_RESOLUTION 0x1000
-
-/* The "recalculate timings" flag */
-#define VIDEO_RECALC 0x8000
-
-/* Define DO_STORE according to CONFIG_VIDEO_RETAIN */
-#ifdef CONFIG_VIDEO_RETAIN
-void store_screen(void);
-#define DO_STORE() store_screen()
-#else
-#define DO_STORE() ((void)0)
-#endif /* CONFIG_VIDEO_RETAIN */
-
-/*
- * Mode table structures
- */
-
-struct mode_info {
-       u16 mode;               /* Mode number (vga= style) */
-       u8  x, y;               /* Width, height */
-};
-
-struct card_info {
-       const char *card_name;
-       int (*set_mode)(struct mode_info *mode);
-       int (*probe)(void);
-       struct mode_info *modes;
-       int nmodes;             /* Number of probed modes so far */
-       int unsafe;             /* Probing is unsafe, only do after "scan" */
-       u16 xmode_first;        /* Unprobed modes to try to call anyway */
-       u16 xmode_n;            /* Size of unprobed mode range */
-};
-
-#define __videocard struct card_info __attribute__((section(".videocards")))
-extern struct card_info video_cards[], video_cards_end[];
-
-int mode_defined(u16 mode);    /* video.c */
-
-/* Basic video information */
-#define ADAPTER_CGA    0       /* CGA/MDA/HGC */
-#define ADAPTER_EGA    1
-#define ADAPTER_VGA    2
-
-extern int adapter;
-extern u16 video_segment;
-extern int force_x, force_y;   /* Don't query the BIOS for cols/rows */
-extern int do_restore;         /* Restore screen contents */
-extern int graphic_mode;       /* Graphics mode with linear frame buffer */
-
-/*
- * int $0x10 is notorious for touching registers it shouldn't.
- * gcc doesn't like %ebp being clobbered, so define it as a push/pop
- * sequence here.
- *
- * A number of systems, including the original PC can clobber %bp in
- * certain circumstances, like when scrolling.  There exists at least
- * one Trident video card which could clobber DS under a set of
- * circumstances that we are unlikely to encounter (scrolling when
- * using an extended graphics mode of more than 800x600 pixels), but
- * it's cheap insurance to deal with that here.
- */
-#define INT10 "pushl %%ebp; pushw %%ds; int $0x10; popw %%ds; popl %%ebp"
-
-/* Accessing VGA indexed registers */
-static inline u8 in_idx(u16 port, u8 index)
-{
-       outb(index, port);
-       return inb(port+1);
-}
-
-static inline void out_idx(u8 v, u16 port, u8 index)
-{
-       outw(index+(v << 8), port);
-}
-
-/* Writes a value to an indexed port and then reads the port again */
-static inline u8 tst_idx(u8 v, u16 port, u8 index)
-{
-       out_idx(port, index, v);
-       return in_idx(port, index);
-}
-
-/* Get the I/O port of the VGA CRTC */
-u16 vga_crtc(void);            /* video-vga.c */
-
-#endif /* BOOT_VIDEO_H */
diff --git a/arch/i386/boot/voyager.c b/arch/i386/boot/voyager.c
deleted file mode 100644 (file)
index 61c8fe0..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- linux-c -*- ------------------------------------------------------- *
- *
- *   Copyright (C) 1991, 1992 Linus Torvalds
- *   Copyright 2007 rPath, Inc. - All Rights Reserved
- *
- *   This file is part of the Linux kernel, and is made available under
- *   the terms of the GNU General Public License version 2.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * arch/i386/boot/voyager.c
- *
- * Get the Voyager config information
- */
-
-#include "boot.h"
-
-#ifdef CONFIG_X86_VOYAGER
-
-int query_voyager(void)
-{
-       u8 err;
-       u16 es, di;
-       /* Abuse the apm_bios_info area for this */
-       u8 *data_ptr = (u8 *)&boot_params.apm_bios_info;
-
-       data_ptr[0] = 0xff;     /* Flag on config not found(?) */
-
-       asm("pushw %%es ; "
-           "int $0x15 ; "
-           "setc %0 ; "
-           "movw %%es, %1 ; "
-           "popw %%es"
-           : "=q" (err), "=r" (es), "=D" (di)
-           : "a" (0xffc0));
-
-       if (err)
-               return -1;      /* Not Voyager */
-
-       set_fs(es);
-       copy_from_fs(data_ptr, di, 7);  /* Table is 7 bytes apparently */
-       return 0;
-}
-
-#endif /* CONFIG_X86_VOYAGER */
diff --git a/arch/x86/boot/.gitignore b/arch/x86/boot/.gitignore
new file mode 100644 (file)
index 0000000..1846514
--- /dev/null
@@ -0,0 +1,5 @@
+bootsect
+bzImage
+setup
+setup.bin
+setup.elf
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
new file mode 100644 (file)
index 0000000..cb1035f
--- /dev/null
@@ -0,0 +1,171 @@
+#
+# arch/x86/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 setup.bin setup.elf zImage bzImage
+subdir-        := compressed
+
+setup-y                += a20.o apm.o cmdline.o copy.o cpu.o cpucheck.o edd.o
+setup-y                += header.o main.o mca.o memory.o pm.o pmjump.o
+setup-y                += printf.o string.o tty.o video.o version.o voyager.o
+
+# The link order of the video-*.o modules can matter.  In particular,
+# video-vga.o *must* be listed first, followed by video-vesa.o.
+# Hardware-specific drivers should follow in the order they should be
+# probed, and video-bios.o should typically be last.
+setup-y                += video-vga.o
+setup-y                += video-vesa.o
+setup-y                += video-bios.o
+targets                += $(setup-y)
+hostprogs-y    := tools/build
+
+HOSTCFLAGS_build.o := $(LINUXINCLUDE)
+
+# ---------------------------------------------------------------------------
+
+# How to compile the 16-bit code.  Note we always compile for -march=i386,
+# that way we can complain to the user if the CPU is insufficient.
+cflags-i386   := 
+cflags-x86_64 := -m32
+CFLAGS         := $(LINUXINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \
+                  $(cflags-$(ARCH)) \
+                  -Wall -Wstrict-prototypes \
+                  -march=i386 -mregparm=3 \
+                  -include $(srctree)/$(src)/code16gcc.h \
+                  -fno-strict-aliasing -fomit-frame-pointer \
+                  $(call cc-option, -ffreestanding) \
+                  $(call cc-option, -fno-toplevel-reorder,\
+                       $(call cc-option, -fno-unit-at-a-time)) \
+                  $(call cc-option, -fno-stack-protector) \
+                  $(call cc-option, -mpreferred-stack-boundary=2)
+AFLAGS         := $(CFLAGS) -D__ASSEMBLY__
+
+$(obj)/zImage:  IMAGE_OFFSET := 0x1000
+$(obj)/zImage:  EXTRA_AFLAGS := $(SVGA_MODE) $(RAMDISK)
+$(obj)/bzImage: IMAGE_OFFSET := 0x100000
+$(obj)/bzImage: EXTRA_CFLAGS := -D__BIG_KERNEL__
+$(obj)/bzImage: EXTRA_AFLAGS := $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__
+$(obj)/bzImage: BUILDFLAGS   := -b
+
+quiet_cmd_image = BUILD   $@
+cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/setup.bin \
+           $(obj)/vmlinux.bin $(ROOT_DEV) > $@
+
+$(obj)/zImage $(obj)/bzImage: $(obj)/setup.bin \
+                             $(obj)/vmlinux.bin $(obj)/tools/build FORCE
+       $(call if_changed,image)
+       @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
+
+$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
+       $(call if_changed,objcopy)
+
+SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
+
+LDFLAGS_setup.elf      := -T
+$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
+       $(call if_changed,ld)
+
+OBJCOPYFLAGS_setup.bin := -O binary
+
+$(obj)/setup.bin: $(obj)/setup.elf FORCE
+       $(call if_changed,objcopy)
+
+$(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/isoimage kernel
+FDARGS = 
+# Set this if you want an initrd included with the zdisk/fdimage/isoimage kernel
+FDINITRD =
+
+image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,)
+
+$(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 '$(image_cmdline)' | \
+               MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg
+       if [ -f '$(FDINITRD)' ] ; then \
+               MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \
+       fi
+       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 '$(image_cmdline)' | \
+               MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg
+       if [ -f '$(FDINITRD)' ] ; then \
+               MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \
+       fi
+       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 '$(image_cmdline)' | \
+               MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg
+       if [ -f '$(FDINITRD)' ] ; then \
+               MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \
+       fi
+       MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux  ; sync
+
+isoimage: $(BOOTIMAGE)
+       -rm -rf $(obj)/isoimage
+       mkdir $(obj)/isoimage
+       for i in lib lib64 share end ; do \
+               if [ -f /usr/$$i/syslinux/isolinux.bin ] ; then \
+                       cp /usr/$$i/syslinux/isolinux.bin $(obj)/isoimage ; \
+                       break ; \
+               fi ; \
+               if [ $$i = end ] ; then exit 1 ; fi ; \
+       done
+       cp $(BOOTIMAGE) $(obj)/isoimage/linux
+       echo '$(image_cmdline)' > $(obj)/isoimage/isolinux.cfg
+       if [ -f '$(FDINITRD)' ] ; then \
+               cp '$(FDINITRD)' $(obj)/isoimage/initrd.img ; \
+       fi
+       mkisofs -J -r -o $(obj)/image.iso -b isolinux.bin -c boot.cat \
+               -no-emul-boot -boot-load-size 4 -boot-info-table \
+               $(obj)/isoimage
+       rm -rf $(obj)/isoimage
+
+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:
+       sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
diff --git a/arch/x86/boot/a20.c b/arch/x86/boot/a20.c
new file mode 100644 (file)
index 0000000..31348d0
--- /dev/null
@@ -0,0 +1,161 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/a20.c
+ *
+ * Enable A20 gate (return -1 on failure)
+ */
+
+#include "boot.h"
+
+#define MAX_8042_LOOPS 100000
+
+static int empty_8042(void)
+{
+       u8 status;
+       int loops = MAX_8042_LOOPS;
+
+       while (loops--) {
+               io_delay();
+
+               status = inb(0x64);
+               if (status & 1) {
+                       /* Read and discard input data */
+                       io_delay();
+                       (void)inb(0x60);
+               } else if (!(status & 2)) {
+                       /* Buffers empty, finished! */
+                       return 0;
+               }
+       }
+
+       return -1;
+}
+
+/* Returns nonzero if the A20 line is enabled.  The memory address
+   used as a test is the int $0x80 vector, which should be safe. */
+
+#define A20_TEST_ADDR  (4*0x80)
+#define A20_TEST_SHORT  32
+#define A20_TEST_LONG  2097152 /* 2^21 */
+
+static int a20_test(int loops)
+{
+       int ok = 0;
+       int saved, ctr;
+
+       set_fs(0x0000);
+       set_gs(0xffff);
+
+       saved = ctr = rdfs32(A20_TEST_ADDR);
+
+       while (loops--) {
+               wrfs32(++ctr, A20_TEST_ADDR);
+               io_delay();     /* Serialize and make delay constant */
+               ok = rdgs32(A20_TEST_ADDR+0x10) ^ ctr;
+               if (ok)
+                       break;
+       }
+
+       wrfs32(saved, A20_TEST_ADDR);
+       return ok;
+}
+
+/* Quick test to see if A20 is already enabled */
+static int a20_test_short(void)
+{
+       return a20_test(A20_TEST_SHORT);
+}
+
+/* Longer test that actually waits for A20 to come on line; this
+   is useful when dealing with the KBC or other slow external circuitry. */
+static int a20_test_long(void)
+{
+       return a20_test(A20_TEST_LONG);
+}
+
+static void enable_a20_bios(void)
+{
+       asm volatile("pushfl; int $0x15; popfl"
+                    : : "a" ((u16)0x2401));
+}
+
+static void enable_a20_kbc(void)
+{
+       empty_8042();
+
+       outb(0xd1, 0x64);       /* Command write */
+       empty_8042();
+
+       outb(0xdf, 0x60);       /* A20 on */
+       empty_8042();
+}
+
+static void enable_a20_fast(void)
+{
+       u8 port_a;
+
+       port_a = inb(0x92);     /* Configuration port A */
+       port_a |=  0x02;        /* Enable A20 */
+       port_a &= ~0x01;        /* Do not reset machine */
+       outb(port_a, 0x92);
+}
+
+/*
+ * Actual routine to enable A20; return 0 on ok, -1 on failure
+ */
+
+#define A20_ENABLE_LOOPS 255   /* Number of times to try */
+
+int enable_a20(void)
+{
+       int loops = A20_ENABLE_LOOPS;
+
+#if defined(CONFIG_X86_ELAN)
+       /* Elan croaks if we try to touch the KBC */
+       enable_a20_fast();
+       while (!a20_test_long())
+               ;
+       return 0;
+#elif defined(CONFIG_X86_VOYAGER)
+       /* On Voyager, a20_test() is unsafe? */
+       enable_a20_kbc();
+       return 0;
+#else
+       while (loops--) {
+               /* First, check to see if A20 is already enabled
+                  (legacy free, etc.) */
+               if (a20_test_short())
+                       return 0;
+
+               /* Next, try the BIOS (INT 0x15, AX=0x2401) */
+               enable_a20_bios();
+               if (a20_test_short())
+                       return 0;
+
+               /* Try enabling A20 through the keyboard controller */
+               empty_8042();
+               if (a20_test_short())
+                       return 0; /* BIOS worked, but with delayed reaction */
+
+               enable_a20_kbc();
+               if (a20_test_long())
+                       return 0;
+
+               /* Finally, try enabling the "fast A20 gate" */
+               enable_a20_fast();
+               if (a20_test_long())
+                       return 0;
+       }
+
+       return -1;
+#endif
+}
diff --git a/arch/x86/boot/apm.c b/arch/x86/boot/apm.c
new file mode 100644 (file)
index 0000000..eab50c5
--- /dev/null
@@ -0,0 +1,98 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   Original APM BIOS checking by Stephen Rothwell, May 1994
+ *   (sfr@canb.auug.org.au)
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/apm.c
+ *
+ * Get APM BIOS information
+ */
+
+#include "boot.h"
+
+#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
+
+int query_apm_bios(void)
+{
+       u16 ax, bx, cx, dx, di;
+       u32 ebx, esi;
+       u8 err;
+
+       /* APM BIOS installation check */
+       ax = 0x5300;
+       bx = cx = 0;
+       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp ; setc %0"
+                    : "=d" (err), "+a" (ax), "+b" (bx), "+c" (cx)
+                    : : "esi", "edi");
+
+       if (err)
+               return -1;              /* No APM BIOS */
+
+       if (bx != 0x504d)       /* "PM" signature */
+               return -1;
+
+       if (!(cx & 0x02))               /* 32 bits supported? */
+               return -1;
+
+       /* Disconnect first, just in case */
+       ax = 0x5304;
+       bx = 0;
+       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp"
+                    : "+a" (ax), "+b" (bx)
+                    : : "ecx", "edx", "esi", "edi");
+
+       /* Paranoia */
+       ebx = esi = 0;
+       cx = dx = di = 0;
+
+       /* 32-bit connect */
+       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp ; setc %6"
+                    : "=a" (ax), "+b" (ebx), "+c" (cx), "+d" (dx),
+                      "+S" (esi), "+D" (di), "=m" (err)
+                    : "a" (0x5303));
+
+       boot_params.apm_bios_info.cseg = ax;
+       boot_params.apm_bios_info.offset = ebx;
+       boot_params.apm_bios_info.cseg_16 = cx;
+       boot_params.apm_bios_info.dseg = dx;
+       boot_params.apm_bios_info.cseg_len = (u16)esi;
+       boot_params.apm_bios_info.cseg_16_len = esi >> 16;
+       boot_params.apm_bios_info.dseg_len = di;
+
+       if (err)
+               return -1;
+
+       /* Redo the installation check as the 32-bit connect;
+          some BIOSes return different flags this way... */
+
+       ax = 0x5300;
+       bx = cx = 0;
+       asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp ; setc %0"
+                    : "=d" (err), "+a" (ax), "+b" (bx), "+c" (cx)
+                    : : "esi", "edi");
+
+       if (err || bx != 0x504d) {
+               /* Failure with 32-bit connect, try to disconect and ignore */
+               ax = 0x5304;
+               bx = 0;
+               asm volatile("pushl %%ebp ; int $0x15 ; popl %%ebp"
+                            : "+a" (ax), "+b" (bx)
+                            : : "ecx", "edx", "esi", "edi");
+               return -1;
+       }
+
+       boot_params.apm_bios_info.version = ax;
+       boot_params.apm_bios_info.flags = cx;
+       return 0;
+}
+
+#endif
diff --git a/arch/x86/boot/bitops.h b/arch/x86/boot/bitops.h
new file mode 100644 (file)
index 0000000..8dcc8dc
--- /dev/null
@@ -0,0 +1,45 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/bitops.h
+ *
+ * Very simple bitops for the boot code.
+ */
+
+#ifndef BOOT_BITOPS_H
+#define BOOT_BITOPS_H
+#define _LINUX_BITOPS_H                /* Inhibit inclusion of <linux/bitops.h> */
+
+static inline int constant_test_bit(int nr, const void *addr)
+{
+       const u32 *p = (const u32 *)addr;
+       return ((1UL << (nr & 31)) & (p[nr >> 5])) != 0;
+}
+static inline int variable_test_bit(int nr, const void *addr)
+{
+       u8 v;
+       const u32 *p = (const u32 *)addr;
+
+       asm("btl %2,%1; setc %0" : "=qm" (v) : "m" (*p), "Ir" (nr));
+       return v;
+}
+
+#define test_bit(nr,addr) \
+(__builtin_constant_p(nr) ? \
+ constant_test_bit((nr),(addr)) : \
+ variable_test_bit((nr),(addr)))
+
+static inline void set_bit(int nr, void *addr)
+{
+       asm("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr));
+}
+
+#endif /* BOOT_BITOPS_H */
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h
new file mode 100644 (file)
index 0000000..20bab94
--- /dev/null
@@ -0,0 +1,296 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/boot.h
+ *
+ * Header file for the real-mode kernel code
+ */
+
+#ifndef BOOT_BOOT_H
+#define BOOT_BOOT_H
+
+#ifndef __ASSEMBLY__
+
+#include <stdarg.h>
+#include <linux/types.h>
+#include <linux/edd.h>
+#include <asm/boot.h>
+#include <asm/bootparam.h>
+
+/* Useful macros */
+#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
+
+extern struct setup_header hdr;
+extern struct boot_params boot_params;
+
+/* Basic port I/O */
+static inline void outb(u8 v, u16 port)
+{
+       asm volatile("outb %0,%1" : : "a" (v), "dN" (port));
+}
+static inline u8 inb(u16 port)
+{
+       u8 v;
+       asm volatile("inb %1,%0" : "=a" (v) : "dN" (port));
+       return v;
+}
+
+static inline void outw(u16 v, u16 port)
+{
+       asm volatile("outw %0,%1" : : "a" (v), "dN" (port));
+}
+static inline u16 inw(u16 port)
+{
+       u16 v;
+       asm volatile("inw %1,%0" : "=a" (v) : "dN" (port));
+       return v;
+}
+
+static inline void outl(u32 v, u16 port)
+{
+       asm volatile("outl %0,%1" : : "a" (v), "dN" (port));
+}
+static inline u32 inl(u32 port)
+{
+       u32 v;
+       asm volatile("inl %1,%0" : "=a" (v) : "dN" (port));
+       return v;
+}
+
+static inline void io_delay(void)
+{
+       const u16 DELAY_PORT = 0x80;
+       asm volatile("outb %%al,%0" : : "dN" (DELAY_PORT));
+}
+
+/* These functions are used to reference data in other segments. */
+
+static inline u16 ds(void)
+{
+       u16 seg;
+       asm("movw %%ds,%0" : "=rm" (seg));
+       return seg;
+}
+
+static inline void set_fs(u16 seg)
+{
+       asm volatile("movw %0,%%fs" : : "rm" (seg));
+}
+static inline u16 fs(void)
+{
+       u16 seg;
+       asm volatile("movw %%fs,%0" : "=rm" (seg));
+       return seg;
+}
+
+static inline void set_gs(u16 seg)
+{
+       asm volatile("movw %0,%%gs" : : "rm" (seg));
+}
+static inline u16 gs(void)
+{
+       u16 seg;
+       asm volatile("movw %%gs,%0" : "=rm" (seg));
+       return seg;
+}
+
+typedef unsigned int addr_t;
+
+static inline u8 rdfs8(addr_t addr)
+{
+       u8 v;
+       asm volatile("movb %%fs:%1,%0" : "=r" (v) : "m" (*(u8 *)addr));
+       return v;
+}
+static inline u16 rdfs16(addr_t addr)
+{
+       u16 v;
+       asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
+       return v;
+}
+static inline u32 rdfs32(addr_t addr)
+{
+       u32 v;
+       asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
+       return v;
+}
+
+static inline void wrfs8(u8 v, addr_t addr)
+{
+       asm volatile("movb %1,%%fs:%0" : "+m" (*(u8 *)addr) : "r" (v));
+}
+static inline void wrfs16(u16 v, addr_t addr)
+{
+       asm volatile("movw %1,%%fs:%0" : "+m" (*(u16 *)addr) : "r" (v));
+}
+static inline void wrfs32(u32 v, addr_t addr)
+{
+       asm volatile("movl %1,%%fs:%0" : "+m" (*(u32 *)addr) : "r" (v));
+}
+
+static inline u8 rdgs8(addr_t addr)
+{
+       u8 v;
+       asm volatile("movb %%gs:%1,%0" : "=r" (v) : "m" (*(u8 *)addr));
+       return v;
+}
+static inline u16 rdgs16(addr_t addr)
+{
+       u16 v;
+       asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
+       return v;
+}
+static inline u32 rdgs32(addr_t addr)
+{
+       u32 v;
+       asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
+       return v;
+}
+
+static inline void wrgs8(u8 v, addr_t addr)
+{
+       asm volatile("movb %1,%%gs:%0" : "+m" (*(u8 *)addr) : "r" (v));
+}
+static inline void wrgs16(u16 v, addr_t addr)
+{
+       asm volatile("movw %1,%%gs:%0" : "+m" (*(u16 *)addr) : "r" (v));
+}
+static inline void wrgs32(u32 v, addr_t addr)
+{
+       asm volatile("movl %1,%%gs:%0" : "+m" (*(u32 *)addr) : "r" (v));
+}
+
+/* Note: these only return true/false, not a signed return value! */
+static inline int memcmp(const void *s1, const void *s2, size_t len)
+{
+       u8 diff;
+       asm("repe; cmpsb; setnz %0"
+           : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
+       return diff;
+}
+
+static inline int memcmp_fs(const void *s1, addr_t s2, size_t len)
+{
+       u8 diff;
+       asm volatile("fs; repe; cmpsb; setnz %0"
+                    : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
+       return diff;
+}
+static inline int memcmp_gs(const void *s1, addr_t s2, size_t len)
+{
+       u8 diff;
+       asm volatile("gs; repe; cmpsb; setnz %0"
+                    : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
+       return diff;
+}
+
+static inline int isdigit(int ch)
+{
+       return (ch >= '0') && (ch <= '9');
+}
+
+/* Heap -- available for dynamic lists. */
+#define STACK_SIZE     512     /* Minimum number of bytes for stack */
+
+extern char _end[];
+extern char *HEAP;
+extern char *heap_end;
+#define RESET_HEAP() ((void *)( HEAP = _end ))
+static inline char *__get_heap(size_t s, size_t a, size_t n)
+{
+       char *tmp;
+
+       HEAP = (char *)(((size_t)HEAP+(a-1)) & ~(a-1));
+       tmp = HEAP;
+       HEAP += s*n;
+       return tmp;
+}
+#define GET_HEAP(type, n) \
+       ((type *)__get_heap(sizeof(type),__alignof__(type),(n)))
+
+static inline int heap_free(void)
+{
+       return heap_end-HEAP;
+}
+
+/* copy.S */
+
+void copy_to_fs(addr_t dst, void *src, size_t len);
+void *copy_from_fs(void *dst, addr_t src, size_t len);
+void copy_to_gs(addr_t dst, void *src, size_t len);
+void *copy_from_gs(void *dst, addr_t src, size_t len);
+void *memcpy(void *dst, void *src, size_t len);
+void *memset(void *dst, int c, size_t len);
+
+#define memcpy(d,s,l) __builtin_memcpy(d,s,l)
+#define memset(d,c,l) __builtin_memset(d,c,l)
+
+/* a20.c */
+int enable_a20(void);
+
+/* apm.c */
+int query_apm_bios(void);
+
+/* cmdline.c */
+int cmdline_find_option(const char *option, char *buffer, int bufsize);
+
+/* cpu.c, cpucheck.c */
+int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr);
+int validate_cpu(void);
+
+/* edd.c */
+void query_edd(void);
+
+/* header.S */
+void __attribute__((noreturn)) die(void);
+
+/* mca.c */
+int query_mca(void);
+
+/* memory.c */
+int detect_memory(void);
+
+/* pm.c */
+void __attribute__((noreturn)) go_to_protected_mode(void);
+
+/* pmjump.S */
+void __attribute__((noreturn))
+       protected_mode_jump(u32 entrypoint, u32 bootparams);
+
+/* printf.c */
+int sprintf(char *buf, const char *fmt, ...);
+int vsprintf(char *buf, const char *fmt, va_list args);
+int printf(const char *fmt, ...);
+
+/* string.c */
+int strcmp(const char *str1, const char *str2);
+size_t strnlen(const char *s, size_t maxlen);
+unsigned int atou(const char *s);
+
+/* tty.c */
+void puts(const char *);
+void putchar(int);
+int getchar(void);
+void kbd_flush(void);
+int getchar_timeout(void);
+
+/* video.c */
+void set_video(void);
+
+/* video-vesa.c */
+void vesa_store_edid(void);
+
+/* voyager.c */
+int query_voyager(void);
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* BOOT_BOOT_H */
diff --git a/arch/x86/boot/cmdline.c b/arch/x86/boot/cmdline.c
new file mode 100644 (file)
index 0000000..34bb778
--- /dev/null
@@ -0,0 +1,97 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/cmdline.c
+ *
+ * Simple command-line parser for early boot.
+ */
+
+#include "boot.h"
+
+static inline int myisspace(u8 c)
+{
+       return c <= ' ';        /* Close enough approximation */
+}
+
+/*
+ * Find a non-boolean option, that is, "option=argument".  In accordance
+ * with standard Linux practice, if this option is repeated, this returns
+ * the last instance on the command line.
+ *
+ * Returns the length of the argument (regardless of if it was
+ * truncated to fit in the buffer), or -1 on not found.
+ */
+int cmdline_find_option(const char *option, char *buffer, int bufsize)
+{
+       u32 cmdline_ptr = boot_params.hdr.cmd_line_ptr;
+       addr_t cptr;
+       char c;
+       int len = -1;
+       const char *opptr = NULL;
+       char *bufptr = buffer;
+       enum {
+               st_wordstart,   /* Start of word/after whitespace */
+               st_wordcmp,     /* Comparing this word */
+               st_wordskip,    /* Miscompare, skip */
+               st_bufcpy       /* Copying this to buffer */
+       } state = st_wordstart;
+
+       if (!cmdline_ptr || cmdline_ptr >= 0x100000)
+               return -1;      /* No command line, or inaccessible */
+
+       cptr = cmdline_ptr & 0xf;
+       set_fs(cmdline_ptr >> 4);
+
+       while (cptr < 0x10000 && (c = rdfs8(cptr++))) {
+               switch (state) {
+               case st_wordstart:
+                       if (myisspace(c))
+                               break;
+
+                       /* else */
+                       state = st_wordcmp;
+                       opptr = option;
+                       /* fall through */
+
+               case st_wordcmp:
+                       if (c == '=' && !*opptr) {
+                               len = 0;
+                               bufptr = buffer;
+                               state = st_bufcpy;
+                       } else if (myisspace(c)) {
+                               state = st_wordstart;
+                       } else if (c != *opptr++) {
+                               state = st_wordskip;
+                       }
+                       break;
+
+               case st_wordskip:
+                       if (myisspace(c))
+                               state = st_wordstart;
+                       break;
+
+               case st_bufcpy:
+                       if (myisspace(c)) {
+                               state = st_wordstart;
+                       } else {
+                               if (len < bufsize-1)
+                                       *bufptr++ = c;
+                               len++;
+                       }
+                       break;
+               }
+       }
+
+       if (bufsize)
+               *bufptr = '\0';
+
+       return len;
+}
diff --git a/arch/x86/boot/code16gcc.h b/arch/x86/boot/code16gcc.h
new file mode 100644 (file)
index 0000000..d93e480
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * code16gcc.h
+ *
+ * This file is -include'd when compiling 16-bit C code.
+ * Note: this asm() needs to be emitted before gcc emits any code.
+ * Depending on gcc version, this requires -fno-unit-at-a-time or
+ * -fno-toplevel-reorder.
+ *
+ * Hopefully gcc will eventually have a real -m16 option so we can
+ * drop this hack long term.
+ */
+
+#ifndef __ASSEMBLY__
+asm(".code16gcc");
+#endif
diff --git a/arch/x86/boot/copy.S b/arch/x86/boot/copy.S
new file mode 100644 (file)
index 0000000..ef127e5
--- /dev/null
@@ -0,0 +1,101 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/copy.S
+ *
+ * Memory copy routines
+ */
+
+       .code16gcc
+       .text
+
+       .globl  memcpy
+       .type   memcpy, @function
+memcpy:
+       pushw   %si
+       pushw   %di
+       movw    %ax, %di
+       movw    %dx, %si
+       pushw   %cx
+       shrw    $2, %cx
+       rep; movsl
+       popw    %cx
+       andw    $3, %cx
+       rep; movsb
+       popw    %di
+       popw    %si
+       ret
+       .size   memcpy, .-memcpy
+
+       .globl  memset
+       .type   memset, @function
+memset:
+       pushw   %di
+       movw    %ax, %di
+       movzbl  %dl, %eax
+       imull   $0x01010101,%eax
+       pushw   %cx
+       shrw    $2, %cx
+       rep; stosl
+       popw    %cx
+       andw    $3, %cx
+       rep; stosb
+       popw    %di
+       ret
+       .size   memset, .-memset
+
+       .globl  copy_from_fs
+       .type   copy_from_fs, @function
+copy_from_fs:
+       pushw   %ds
+       pushw   %fs
+       popw    %ds
+       call    memcpy
+       popw    %ds
+       ret
+       .size   copy_from_fs, .-copy_from_fs
+
+       .globl  copy_to_fs
+       .type   copy_to_fs, @function
+copy_to_fs:
+       pushw   %es
+       pushw   %fs
+       popw    %es
+       call    memcpy
+       popw    %es
+       ret
+       .size   copy_to_fs, .-copy_to_fs
+
+#if 0 /* Not currently used, but can be enabled as needed */
+
+       .globl  copy_from_gs
+       .type   copy_from_gs, @function
+copy_from_gs:
+       pushw   %ds
+       pushw   %gs
+       popw    %ds
+       call    memcpy
+       popw    %ds
+       ret
+       .size   copy_from_gs, .-copy_from_gs
+       .globl  copy_to_gs
+
+       .type   copy_to_gs, @function
+copy_to_gs:
+       pushw   %es
+       pushw   %gs
+       popw    %es
+       call    memcpy
+       popw    %es
+       ret
+       .size   copy_to_gs, .-copy_to_gs
+
+#endif
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c
new file mode 100644 (file)
index 0000000..2a5c32d
--- /dev/null
@@ -0,0 +1,69 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/cpu.c
+ *
+ * Check for obligatory CPU features and abort if the features are not
+ * present.
+ */
+
+#include "boot.h"
+#include "bitops.h"
+#include <asm/cpufeature.h>
+
+static char *cpu_name(int level)
+{
+       static char buf[6];
+
+       if (level == 64) {
+               return "x86-64";
+       } else {
+               sprintf(buf, "i%d86", level);
+               return buf;
+       }
+}
+
+int validate_cpu(void)
+{
+       u32 *err_flags;
+       int cpu_level, req_level;
+
+       check_cpu(&cpu_level, &req_level, &err_flags);
+
+       if (cpu_level < req_level) {
+               printf("This kernel requires an %s CPU, ",
+                      cpu_name(req_level));
+               printf("but only detected an %s CPU.\n",
+                      cpu_name(cpu_level));
+               return -1;
+       }
+
+       if (err_flags) {
+               int i, j;
+               puts("This kernel requires the following features "
+                    "not present on the CPU:\n");
+
+               for (i = 0; i < NCAPINTS; i++) {
+                       u32 e = err_flags[i];
+
+                       for (j = 0; j < 32; j++) {
+                               if (e & 1)
+                                       printf("%d:%d ", i, j);
+
+                               e >>= 1;
+                       }
+               }
+               putchar('\n');
+               return -1;
+       } else {
+               return 0;
+       }
+}
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
new file mode 100644 (file)
index 0000000..e655a89
--- /dev/null
@@ -0,0 +1,268 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/cpucheck.c
+ *
+ * Check for obligatory CPU features and abort if the features are not
+ * present.  This code should be compilable as 16-, 32- or 64-bit
+ * code, so be very careful with types and inline assembly.
+ *
+ * This code should not contain any messages; that requires an
+ * additional wrapper.
+ *
+ * As written, this code is not safe for inclusion into the kernel
+ * proper (after FPU initialization, in particular).
+ */
+
+#ifdef _SETUP
+# include "boot.h"
+# include "bitops.h"
+#endif
+#include <linux/types.h>
+#include <asm/cpufeature.h>
+#include <asm/processor-flags.h>
+#include <asm/required-features.h>
+#include <asm/msr-index.h>
+
+struct cpu_features {
+       int level;              /* Family, or 64 for x86-64 */
+       int model;
+       u32 flags[NCAPINTS];
+};
+
+static struct cpu_features cpu;
+static u32 cpu_vendor[3];
+static u32 err_flags[NCAPINTS];
+
+#ifdef CONFIG_X86_64
+static const int req_level = 64;
+#elif defined(CONFIG_X86_MINIMUM_CPU_FAMILY)
+static const int req_level = CONFIG_X86_MINIMUM_CPU_FAMILY;
+#else
+static const int req_level = 3;
+#endif
+
+static const u32 req_flags[NCAPINTS] =
+{
+       REQUIRED_MASK0,
+       REQUIRED_MASK1,
+       REQUIRED_MASK2,
+       REQUIRED_MASK3,
+       REQUIRED_MASK4,
+       REQUIRED_MASK5,
+       REQUIRED_MASK6,
+       REQUIRED_MASK7,
+};
+
+#define A32(a,b,c,d) (((d) << 24)+((c) << 16)+((b) << 8)+(a))
+
+static int is_amd(void)
+{
+       return cpu_vendor[0] == A32('A','u','t','h') &&
+              cpu_vendor[1] == A32('e','n','t','i') &&
+              cpu_vendor[2] == A32('c','A','M','D');
+}
+
+static int is_centaur(void)
+{
+       return cpu_vendor[0] == A32('C','e','n','t') &&
+              cpu_vendor[1] == A32('a','u','r','H') &&
+              cpu_vendor[2] == A32('a','u','l','s');
+}
+
+static int is_transmeta(void)
+{
+       return cpu_vendor[0] == A32('G','e','n','u') &&
+              cpu_vendor[1] == A32('i','n','e','T') &&
+              cpu_vendor[2] == A32('M','x','8','6');
+}
+
+static int has_fpu(void)
+{
+       u16 fcw = -1, fsw = -1;
+       u32 cr0;
+
+       asm("movl %%cr0,%0" : "=r" (cr0));
+       if (cr0 & (X86_CR0_EM|X86_CR0_TS)) {
+               cr0 &= ~(X86_CR0_EM|X86_CR0_TS);
+               asm volatile("movl %0,%%cr0" : : "r" (cr0));
+       }
+
+       asm volatile("fninit ; fnstsw %0 ; fnstcw %1"
+                    : "+m" (fsw), "+m" (fcw));
+
+       return fsw == 0 && (fcw & 0x103f) == 0x003f;
+}
+
+static int has_eflag(u32 mask)
+{
+       u32 f0, f1;
+
+       asm("pushfl ; "
+           "pushfl ; "
+           "popl %0 ; "
+           "movl %0,%1 ; "
+           "xorl %2,%1 ; "
+           "pushl %1 ; "
+           "popfl ; "
+           "pushfl ; "
+           "popl %1 ; "
+           "popfl"
+           : "=&r" (f0), "=&r" (f1)
+           : "ri" (mask));
+
+       return !!((f0^f1) & mask);
+}
+
+static void get_flags(void)
+{
+       u32 max_intel_level, max_amd_level;
+       u32 tfms;
+
+       if (has_fpu())
+               set_bit(X86_FEATURE_FPU, cpu.flags);
+
+       if (has_eflag(X86_EFLAGS_ID)) {
+               asm("cpuid"
+                   : "=a" (max_intel_level),
+                     "=b" (cpu_vendor[0]),
+                     "=d" (cpu_vendor[1]),
+                     "=c" (cpu_vendor[2])
+                   : "a" (0));
+
+               if (max_intel_level >= 0x00000001 &&
+                   max_intel_level <= 0x0000ffff) {
+                       asm("cpuid"
+                           : "=a" (tfms),
+                             "=c" (cpu.flags[4]),
+                             "=d" (cpu.flags[0])
+                           : "a" (0x00000001)
+                           : "ebx");
+                       cpu.level = (tfms >> 8) & 15;
+                       cpu.model = (tfms >> 4) & 15;
+                       if (cpu.level >= 6)
+                               cpu.model += ((tfms >> 16) & 0xf) << 4;
+               }
+
+               asm("cpuid"
+                   : "=a" (max_amd_level)
+                   : "a" (0x80000000)
+                   : "ebx", "ecx", "edx");
+
+               if (max_amd_level >= 0x80000001 &&
+                   max_amd_level <= 0x8000ffff) {
+                       u32 eax = 0x80000001;
+                       asm("cpuid"
+                           : "+a" (eax),
+                             "=c" (cpu.flags[6]),
+                             "=d" (cpu.flags[1])
+                           : : "ebx");
+               }
+       }
+}
+
+/* Returns a bitmask of which words we have error bits in */
+static int check_flags(void)
+{
+       u32 err;
+       int i;
+
+       err = 0;
+       for (i = 0; i < NCAPINTS; i++) {
+               err_flags[i] = req_flags[i] & ~cpu.flags[i];
+               if (err_flags[i])
+                       err |= 1 << i;
+       }
+
+       return err;
+}
+
+/*
+ * Returns -1 on error.
+ *
+ * *cpu_level is set to the current CPU level; *req_level to the required
+ * level.  x86-64 is considered level 64 for this purpose.
+ *
+ * *err_flags_ptr is set to the flags error array if there are flags missing.
+ */
+int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
+{
+       int err;
+
+       memset(&cpu.flags, 0, sizeof cpu.flags);
+       cpu.level = 3;
+
+       if (has_eflag(X86_EFLAGS_AC))
+               cpu.level = 4;
+
+       get_flags();
+       err = check_flags();
+
+       if (test_bit(X86_FEATURE_LM, cpu.flags))
+               cpu.level = 64;
+
+       if (err == 0x01 &&
+           !(err_flags[0] &
+             ~((1 << X86_FEATURE_XMM)|(1 << X86_FEATURE_XMM2))) &&
+           is_amd()) {
+               /* If this is an AMD and we're only missing SSE+SSE2, try to
+                  turn them on */
+
+               u32 ecx = MSR_K7_HWCR;
+               u32 eax, edx;
+
+               asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx));
+               eax &= ~(1 << 15);
+               asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
+
+               get_flags();    /* Make sure it really did something */
+               err = check_flags();
+       } else if (err == 0x01 &&
+                  !(err_flags[0] & ~(1 << X86_FEATURE_CX8)) &&
+                  is_centaur() && cpu.model >= 6) {
+               /* If this is a VIA C3, we might have to enable CX8
+                  explicitly */
+
+               u32 ecx = MSR_VIA_FCR;
+               u32 eax, edx;
+
+               asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx));
+               eax |= (1<<1)|(1<<7);
+               asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
+
+               set_bit(X86_FEATURE_CX8, cpu.flags);
+               err = check_flags();
+       } else if (err == 0x01 && is_transmeta()) {
+               /* Transmeta might have masked feature bits in word 0 */
+
+               u32 ecx = 0x80860004;
+               u32 eax, edx;
+               u32 level = 1;
+
+               asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx));
+               asm("wrmsr" : : "a" (~0), "d" (edx), "c" (ecx));
+               asm("cpuid"
+                   : "+a" (level), "=d" (cpu.flags[0])
+                   : : "ecx", "ebx");
+               asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
+
+               err = check_flags();
+       }
+
+       if (err_flags_ptr)
+               *err_flags_ptr = err ? err_flags : NULL;
+       if (cpu_level_ptr)
+               *cpu_level_ptr = cpu.level;
+       if (req_level_ptr)
+               *req_level_ptr = req_level;
+
+       return (cpu.level < req_level || err) ? -1 : 0;
+}
diff --git a/arch/x86/boot/edd.c b/arch/x86/boot/edd.c
new file mode 100644 (file)
index 0000000..bd138e4
--- /dev/null
@@ -0,0 +1,167 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/edd.c
+ *
+ * Get EDD BIOS disk information
+ */
+
+#include "boot.h"
+#include <linux/edd.h>
+
+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
+
+/*
+ * Read the MBR (first sector) from a specific device.
+ */
+static int read_mbr(u8 devno, void *buf)
+{
+       u16 ax, bx, cx, dx;
+
+       ax = 0x0201;            /* Legacy Read, one sector */
+       cx = 0x0001;            /* Sector 0-0-1 */
+       dx = devno;
+       bx = (size_t)buf;
+       asm volatile("pushfl; stc; int $0x13; setc %%al; popfl"
+                    : "+a" (ax), "+c" (cx), "+d" (dx), "+b" (bx)
+                    : : "esi", "edi", "memory");
+
+       return -(u8)ax;         /* 0 or -1 */
+}
+
+static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
+{
+       int sector_size;
+       char *mbrbuf_ptr, *mbrbuf_end;
+       u32 buf_base, mbr_base;
+       extern char _end[];
+
+       sector_size = ei->params.bytes_per_sector;
+       if (!sector_size)
+               sector_size = 512; /* Best available guess */
+
+       /* Produce a naturally aligned buffer on the heap */
+       buf_base = (ds() << 4) + (u32)&_end;
+       mbr_base = (buf_base+sector_size-1) & ~(sector_size-1);
+       mbrbuf_ptr = _end + (mbr_base-buf_base);
+       mbrbuf_end = mbrbuf_ptr + sector_size;
+
+       /* Make sure we actually have space on the heap... */
+       if (!(boot_params.hdr.loadflags & CAN_USE_HEAP))
+               return -1;
+       if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
+               return -1;
+
+       if (read_mbr(devno, mbrbuf_ptr))
+               return -1;
+
+       *mbrsig = *(u32 *)&mbrbuf_ptr[EDD_MBR_SIG_OFFSET];
+       return 0;
+}
+
+static int get_edd_info(u8 devno, struct edd_info *ei)
+{
+       u16 ax, bx, cx, dx, di;
+
+       memset(ei, 0, sizeof *ei);
+
+       /* Check Extensions Present */
+
+       ax = 0x4100;
+       bx = EDDMAGIC1;
+       dx = devno;
+       asm("pushfl; stc; int $0x13; setc %%al; popfl"
+           : "+a" (ax), "+b" (bx), "=c" (cx), "+d" (dx)
+           : : "esi", "edi");
+
+       if ((u8)ax)
+               return -1;      /* No extended information */
+
+       if (bx != EDDMAGIC2)
+               return -1;
+
+       ei->device  = devno;
+       ei->version = ax >> 8;  /* EDD version number */
+       ei->interface_support = cx; /* EDD functionality subsets */
+
+       /* Extended Get Device Parameters */
+
+       ei->params.length = sizeof(ei->params);
+       ax = 0x4800;
+       dx = devno;
+       asm("pushfl; int $0x13; popfl"
+           : "+a" (ax), "+d" (dx), "=m" (ei->params)
+           : "S" (&ei->params)
+           : "ebx", "ecx", "edi");
+
+       /* Get legacy CHS parameters */
+
+       /* Ralf Brown recommends setting ES:DI to 0:0 */
+       ax = 0x0800;
+       dx = devno;
+       di = 0;
+       asm("pushw %%es; "
+           "movw %%di,%%es; "
+           "pushfl; stc; int $0x13; setc %%al; popfl; "
+           "popw %%es"
+           : "+a" (ax), "=b" (bx), "=c" (cx), "+d" (dx), "+D" (di)
+           : : "esi");
+
+       if ((u8)ax == 0) {
+               ei->legacy_max_cylinder = (cx >> 8) + ((cx & 0xc0) << 2);
+               ei->legacy_max_head = dx >> 8;
+               ei->legacy_sectors_per_track = cx & 0x3f;
+       }
+
+       return 0;
+}
+
+void query_edd(void)
+{
+       char eddarg[8];
+       int do_mbr = 1;
+       int do_edd = 1;
+       int devno;
+       struct edd_info ei, *edp;
+       u32 *mbrptr;
+
+       if (cmdline_find_option("edd", eddarg, sizeof eddarg) > 0) {
+               if (!strcmp(eddarg, "skipmbr") || !strcmp(eddarg, "skip"))
+                       do_mbr = 0;
+               else if (!strcmp(eddarg, "off"))
+                       do_edd = 0;
+       }
+
+       edp    = boot_params.eddbuf;
+       mbrptr = boot_params.edd_mbr_sig_buffer;
+
+       if (!do_edd)
+               return;
+
+       for (devno = 0x80; devno < 0x80+EDD_MBR_SIG_MAX; devno++) {
+               /*
+                * Scan the BIOS-supported hard disks and query EDD
+                * information...
+                */
+               get_edd_info(devno, &ei);
+
+               if (boot_params.eddbuf_entries < EDDMAXNR) {
+                       memcpy(edp, &ei, sizeof ei);
+                       edp++;
+                       boot_params.eddbuf_entries++;
+               }
+
+               if (do_mbr && !read_mbr_sig(devno, &ei, mbrptr++))
+                       boot_params.edd_mbr_sig_buf_entries = devno-0x80+1;
+       }
+}
+
+#endif
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
new file mode 100644 (file)
index 0000000..f3140e5
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ *     header.S
+ *
+ *     Copyright (C) 1991, 1992 Linus Torvalds
+ *
+ *     Based on bootsect.S and setup.S
+ *     modified by more people than can be counted
+ *
+ *     Rewritten as a common file by H. Peter Anvin (Apr 2007)
+ *
+ * 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/segment.h>
+#include <linux/utsrelease.h>
+#include <asm/boot.h>
+#include <asm/e820.h>
+#include <asm/page.h>
+#include <asm/setup.h>
+#include "boot.h"
+
+SETUPSECTS     = 4                     /* default nr of setup-sectors */
+BOOTSEG                = 0x07C0                /* original address of boot-sector */
+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
+       .section ".bstext", "ax"
+
+       .global bootsect_start
+bootsect_start:
+
+       # Normalize the start address
+       ljmp    $BOOTSEG, $start2
+
+start2:
+       movw    %cs, %ax
+       movw    %ax, %ds
+       movw    %ax, %es
+       movw    %ax, %ss
+       xorw    %sp, %sp
+       sti
+       cld
+
+       movw    $bugger_off_msg, %si
+
+msg_loop:
+       lodsb
+       andb    %al, %al
+       jz      bs_die
+       movb    $0xe, %ah
+       movw    $7, %bx
+       int     $0x10
+       jmp     msg_loop
+
+bs_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
+
+       .section ".bsdata", "a"
+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.  This is part 1 of the
+       # header, from the old boot sector.
+
+       .section ".header", "a"
+       .globl  hdr
+hdr:
+setup_sects:   .byte SETUPSECTS
+root_flags:    .word ROOT_RDONLY
+syssize:       .long SYSSIZE
+ram_size:      .word RAMDISK
+vid_mode:      .word SVGA_MODE
+root_dev:      .word ROOT_DEV
+boot_flag:     .word 0xAA55
+
+       # offset 512, entry point
+
+       .globl  _start
+_start:
+               # Explicitly enter this as bytes, or the assembler
+               # tries to generate a 3-byte jump here, which causes
+               # everything else to push off to the wrong offset.
+               .byte   0xeb            # short (2-byte) jump
+               .byte   start_of_setup-1f
+1:
+
+       # Part 2 of the header, from the old setup.S
+
+               .ascii  "HdrS"          # header signature
+               .word   0x0206          # header version number (>= 0x0105)
+                                       # or else old loadlin-1.5 will fail)
+               .globl realmode_swtch
+realmode_swtch:        .word   0, 0            # default_switch, SETUPSEG
+start_sys_seg: .word   SYSSEG
+               .word   kernel_version-512 # pointing to kernel version string
+                                       # above section of header is compatible
+                                       # with loadlin-1.5 (header v1.5). Don't
+                                       # change it.
+
+type_of_loader:        .byte   0               # = 0, old one (LILO, Loadlin,
+                                       #      Bootlin, SYSLX, bootsect...)
+                                       # See Documentation/i386/boot.txt for
+                                       # assigned ids
+
+# flags, unused bits must be zero (RFU) bit within loadflags
+loadflags:
+LOADED_HIGH    = 1                     # If set, the kernel is loaded high
+CAN_USE_HEAP   = 0x80                  # If set, the loader also has set
+                                       # heap_end_ptr to tell how much
+                                       # space behind setup.S can be used for
+                                       # heap purposes.
+                                       # Only the loader knows what is free
+#ifndef __BIG_KERNEL__
+               .byte   0
+#else
+               .byte   LOADED_HIGH
+#endif
+
+setup_move_size: .word  0x8000         # size to move, when setup is not
+                                       # loaded at 0x90000. We will move setup
+                                       # to 0x90000 then just before jumping
+                                       # into the kernel. However, only the
+                                       # loader knows how much data behind
+                                       # us also needs to be loaded.
+
+code32_start:                          # here loaders can put a different
+                                       # start address for 32-bit code.
+#ifndef __BIG_KERNEL__
+               .long   0x1000          #   0x1000 = default for zImage
+#else
+               .long   0x100000        # 0x100000 = default for big kernel
+#endif
+
+ramdisk_image: .long   0               # address of loaded ramdisk image
+                                       # Here the loader puts the 32-bit
+                                       # address where it loaded the image.
+                                       # This only will be read by the kernel.
+
+ramdisk_size:  .long   0               # its size in bytes
+
+bootsect_kludge:
+               .long   0               # obsolete
+
+heap_end_ptr:  .word   _end+1024       # (Header version 0x0201 or later)
+                                       # space from here (exclusive) down to
+                                       # end of setup code can be used by setup
+                                       # for local heap purposes.
+
+pad1:          .word   0
+cmd_line_ptr:  .long   0               # (Header version 0x0202 or later)
+                                       # If nonzero, a 32-bit pointer
+                                       # to the kernel command line.
+                                       # The command line should be
+                                       # located between the start of
+                                       # setup and the end of low
+                                       # memory (0xa0000), or it may
+                                       # get overwritten before it
+                                       # gets read.  If this field is
+                                       # used, there is no longer
+                                       # anything magical about the
+                                       # 0x90000 segment; the setup
+                                       # can be located anywhere in
+                                       # low memory 0x10000 or higher.
+
+ramdisk_max:   .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
+                                       # (Header version 0x0203 or later)
+                                       # The highest safe address for
+                                       # the contents of an initrd
+
+kernel_alignment:  .long CONFIG_PHYSICAL_ALIGN #physical addr alignment
+                                               #required for protected mode
+                                               #kernel
+#ifdef CONFIG_RELOCATABLE
+relocatable_kernel:    .byte 1
+#else
+relocatable_kernel:    .byte 0
+#endif
+pad2:                  .byte 0
+pad3:                  .word 0
+
+cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
+                                                #added with boot protocol
+                                                #version 2.06
+
+# End of setup header #####################################################
+
+       .section ".inittext", "ax"
+start_of_setup:
+#ifdef SAFE_RESET_DISK_CONTROLLER
+# Reset the disk controller.
+       movw    $0x0000, %ax            # Reset disk controller
+       movb    $0x80, %dl              # All disks
+       int     $0x13
+#endif
+
+# We will have entered with %cs = %ds+0x20, normalize %cs so
+# it is on par with the other segments.
+       pushw   %ds
+       pushw   $setup2
+       lretw
+
+setup2:
+# Force %es = %ds
+       movw    %ds, %ax
+       movw    %ax, %es
+       cld
+
+# Stack paranoia: align the stack and make sure it is good
+# for both 16- and 32-bit references.  In particular, if we
+# were meant to have been using the full 16-bit segment, the
+# caller might have set %sp to zero, which breaks %esp-based
+# references.
+       andw    $~3, %sp        # dword align (might as well...)
+       jnz     1f
+       movw    $0xfffc, %sp    # Make sure we're not zero
+1:     movzwl  %sp, %esp       # Clear upper half of %esp
+       sti
+
+# Check signature at end of setup
+       cmpl    $0x5a5aaa55, setup_sig
+       jne     setup_bad
+
+# Zero the bss
+       movw    $__bss_start, %di
+       movw    $_end+3, %cx
+       xorl    %eax, %eax
+       subw    %di, %cx
+       shrw    $2, %cx
+       rep; stosl
+
+# Jump to C code (should not return)
+       calll   main
+
+# Setup corrupt somehow...
+setup_bad:
+       movl    $setup_corrupt, %eax
+       calll   puts
+       # Fall through...
+
+       .globl  die
+       .type   die, @function
+die:
+       hlt
+       jmp     die
+
+       .size   die, .-die
+
+       .section ".initdata", "a"
+setup_corrupt:
+       .byte   7
+       .string "No setup signature found...\n"
diff --git a/arch/x86/boot/install.sh b/arch/x86/boot/install.sh
new file mode 100644 (file)
index 0000000..88d7776
--- /dev/null
@@ -0,0 +1,61 @@
+#!/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)
+#
+
+verify () {
+       if [ ! -f "$1" ]; then
+               echo ""                                                   1>&2
+               echo " *** Missing file: $1"                              1>&2
+               echo ' *** You need to run "make" before "make install".' 1>&2
+               echo ""                                                   1>&2
+               exit 1
+       fi
+}
+
+# Make sure the files actually exist
+verify "$2"
+verify "$3"
+
+# User may have a custom install script
+
+if [ -x ~/bin/${CROSS_COMPILE}installkernel ]; then exec ~/bin/${CROSS_COMPILE}installkernel "$@"; fi
+if [ -x /sbin/${CROSS_COMPILE}installkernel ]; then exec /sbin/${CROSS_COMPILE}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
+elif [ -x /etc/lilo/install ]; then
+       /etc/lilo/install
+else
+       sync
+       echo "Cannot find LILO."
+fi
diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c
new file mode 100644 (file)
index 0000000..0eeef39
--- /dev/null
@@ -0,0 +1,161 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/main.c
+ *
+ * Main module for the real-mode kernel code
+ */
+
+#include "boot.h"
+
+struct boot_params boot_params __attribute__((aligned(16)));
+
+char *HEAP = _end;
+char *heap_end = _end;         /* Default end of heap = no heap */
+
+/*
+ * Copy the header into the boot parameter block.  Since this
+ * screws up the old-style command line protocol, adjust by
+ * filling in the new-style command line pointer instead.
+ */
+#define OLD_CL_MAGIC   0xA33F
+#define OLD_CL_ADDRESS 0x20
+
+static void copy_boot_params(void)
+{
+       struct old_cmdline {
+               u16 cl_magic;
+               u16 cl_offset;
+       };
+       const struct old_cmdline * const oldcmd =
+               (const struct old_cmdline *)OLD_CL_ADDRESS;
+
+       BUILD_BUG_ON(sizeof boot_params != 4096);
+       memcpy(&boot_params.hdr, &hdr, sizeof hdr);
+
+       if (!boot_params.hdr.cmd_line_ptr &&
+           oldcmd->cl_magic == OLD_CL_MAGIC) {
+               /* Old-style command line protocol. */
+               u16 cmdline_seg;
+
+               /* Figure out if the command line falls in the region
+                  of memory that an old kernel would have copied up
+                  to 0x90000... */
+               if (oldcmd->cl_offset < boot_params.hdr.setup_move_size)
+                       cmdline_seg = ds();
+               else
+                       cmdline_seg = 0x9000;
+
+               boot_params.hdr.cmd_line_ptr =
+                       (cmdline_seg << 4) + oldcmd->cl_offset;
+       }
+}
+
+/*
+ * Set the keyboard repeat rate to maximum.  Unclear why this
+ * is done here; this might be possible to kill off as stale code.
+ */
+static void keyboard_set_repeat(void)
+{
+       u16 ax = 0x0305;
+       u16 bx = 0;
+       asm volatile("int $0x16"
+                    : "+a" (ax), "+b" (bx)
+                    : : "ecx", "edx", "esi", "edi");
+}
+
+/*
+ * Get Intel SpeedStep (IST) information.
+ */
+static void query_ist(void)
+{
+       asm("int $0x15"
+           : "=a" (boot_params.ist_info.signature),
+             "=b" (boot_params.ist_info.command),
+             "=c" (boot_params.ist_info.event),
+             "=d" (boot_params.ist_info.perf_level)
+           : "a" (0x0000e980),  /* IST Support */
+             "d" (0x47534943)); /* Request value */
+}
+
+/*
+ * Tell the BIOS what CPU mode we intend to run in.
+ */
+static void set_bios_mode(void)
+{
+#ifdef CONFIG_X86_64
+       u32 eax, ebx;
+
+       eax = 0xec00;
+       ebx = 2;
+       asm volatile("int $0x15"
+                    : "+a" (eax), "+b" (ebx)
+                    : : "ecx", "edx", "esi", "edi");
+#endif
+}
+
+void main(void)
+{
+       /* First, copy the boot header into the "zeropage" */
+       copy_boot_params();
+
+       /* End of heap check */
+       if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
+               heap_end = (char *)(boot_params.hdr.heap_end_ptr
+                                   +0x200-STACK_SIZE);
+       } else {
+               /* Boot protocol 2.00 only, no heap available */
+               puts("WARNING: Ancient bootloader, some functionality "
+                    "may be limited!\n");
+       }
+
+       /* Make sure we have all the proper CPU support */
+       if (validate_cpu()) {
+               puts("Unable to boot - please use a kernel appropriate "
+                    "for your CPU.\n");
+               die();
+       }
+
+       /* Tell the BIOS what CPU mode we intend to run in. */
+       set_bios_mode();
+
+       /* Detect memory layout */
+       detect_memory();
+
+       /* Set keyboard repeat rate (why?) */
+       keyboard_set_repeat();
+
+       /* Set the video mode */
+       set_video();
+
+       /* Query MCA information */
+       query_mca();
+
+       /* Voyager */
+#ifdef CONFIG_X86_VOYAGER
+       query_voyager();
+#endif
+
+       /* Query Intel SpeedStep (IST) information */
+       query_ist();
+
+       /* Query APM information */
+#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
+       query_apm_bios();
+#endif
+
+       /* Query EDD information */
+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
+       query_edd();
+#endif
+       /* Do the last things and invoke protected mode */
+       go_to_protected_mode();
+}
diff --git a/arch/x86/boot/mca.c b/arch/x86/boot/mca.c
new file mode 100644 (file)
index 0000000..68222f2
--- /dev/null
@@ -0,0 +1,43 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/mca.c
+ *
+ * Get the MCA system description table
+ */
+
+#include "boot.h"
+
+int query_mca(void)
+{
+       u8 err;
+       u16 es, bx, len;
+
+       asm("pushw %%es ; "
+           "int $0x15 ; "
+           "setc %0 ; "
+           "movw %%es, %1 ; "
+           "popw %%es"
+           : "=acd" (err), "=acdSD" (es), "=b" (bx)
+           : "a" (0xc000));
+
+       if (err)
+               return -1;      /* No MCA present */
+
+       set_fs(es);
+       len = rdfs16(bx);
+
+       if (len > sizeof(boot_params.sys_desc_table))
+               len = sizeof(boot_params.sys_desc_table);
+
+       copy_from_fs(&boot_params.sys_desc_table, bx, len);
+       return 0;
+}
diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c
new file mode 100644 (file)
index 0000000..3783539
--- /dev/null
@@ -0,0 +1,118 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/memory.c
+ *
+ * Memory detection code
+ */
+
+#include "boot.h"
+
+#define SMAP   0x534d4150      /* ASCII "SMAP" */
+
+static int detect_memory_e820(void)
+{
+       int count = 0;
+       u32 next = 0;
+       u32 size, id;
+       u8 err;
+       struct e820entry *desc = boot_params.e820_map;
+
+       do {
+               size = sizeof(struct e820entry);
+
+               /* Important: %edx is clobbered by some BIOSes,
+                  so it must be either used for the error output
+                  or explicitly marked clobbered. */
+               asm("int $0x15; setc %0"
+                   : "=d" (err), "+b" (next), "=a" (id), "+c" (size),
+                     "=m" (*desc)
+                   : "D" (desc), "d" (SMAP), "a" (0xe820));
+
+               /* Some BIOSes stop returning SMAP in the middle of
+                  the search loop.  We don't know exactly how the BIOS
+                  screwed up the map at that point, we might have a
+                  partial map, the full map, or complete garbage, so
+                  just return failure. */
+               if (id != SMAP) {
+                       count = 0;
+                       break;
+               }
+
+               if (err)
+                       break;
+
+               count++;
+               desc++;
+       } while (next && count < E820MAX);
+
+       return boot_params.e820_entries = count;
+}
+
+static int detect_memory_e801(void)
+{
+       u16 ax, bx, cx, dx;
+       u8 err;
+
+       bx = cx = dx = 0;
+       ax = 0xe801;
+       asm("stc; int $0x15; setc %0"
+           : "=m" (err), "+a" (ax), "+b" (bx), "+c" (cx), "+d" (dx));
+
+       if (err)
+               return -1;
+
+       /* Do we really need to do this? */
+       if (cx || dx) {
+               ax = cx;
+               bx = dx;
+       }
+
+       if (ax > 15*1024)
+               return -1;      /* Bogus! */
+
+       /* This ignores memory above 16MB if we have a memory hole
+          there.  If someone actually finds a machine with a memory
+          hole at 16MB and no support for 0E820h they should probably
+          generate a fake e820 map. */
+       boot_params.alt_mem_k = (ax == 15*1024) ? (dx << 6)+ax : ax;
+
+       return 0;
+}
+
+static int detect_memory_88(void)
+{
+       u16 ax;
+       u8 err;
+
+       ax = 0x8800;
+       asm("stc; int $0x15; setc %0" : "=bcdm" (err), "+a" (ax));
+
+       boot_params.screen_info.ext_mem_k = ax;
+
+       return -err;
+}
+
+int detect_memory(void)
+{
+       int err = -1;
+
+       if (detect_memory_e820() > 0)
+               err = 0;
+
+       if (!detect_memory_e801())
+               err = 0;
+
+       if (!detect_memory_88())
+               err = 0;
+
+       return err;
+}
diff --git a/arch/x86/boot/mtools.conf.in b/arch/x86/boot/mtools.conf.in
new file mode 100644 (file)
index 0000000..efd6d24
--- /dev/null
@@ -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
+
+
diff --git a/arch/x86/boot/pm.c b/arch/x86/boot/pm.c
new file mode 100644 (file)
index 0000000..09fb342
--- /dev/null
@@ -0,0 +1,174 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/pm.c
+ *
+ * Prepare the machine for transition to protected mode.
+ */
+
+#include "boot.h"
+#include <asm/segment.h>
+
+/*
+ * Invoke the realmode switch hook if present; otherwise
+ * disable all interrupts.
+ */
+static void realmode_switch_hook(void)
+{
+       if (boot_params.hdr.realmode_swtch) {
+               asm volatile("lcallw *%0"
+                            : : "m" (boot_params.hdr.realmode_swtch)
+                            : "eax", "ebx", "ecx", "edx");
+       } else {
+               asm volatile("cli");
+               outb(0x80, 0x70); /* Disable NMI */
+               io_delay();
+       }
+}
+
+/*
+ * A zImage kernel is loaded at 0x10000 but wants to run at 0x1000.
+ * A bzImage kernel is loaded and runs at 0x100000.
+ */
+static void move_kernel_around(void)
+{
+       /* Note: rely on the compile-time option here rather than
+          the LOADED_HIGH flag.  The Qemu kernel loader unconditionally
+          sets the loadflags to zero. */
+#ifndef __BIG_KERNEL__
+       u16 dst_seg, src_seg;
+       u32 syssize;
+
+       dst_seg =  0x1000 >> 4;
+       src_seg = 0x10000 >> 4;
+       syssize = boot_params.hdr.syssize; /* Size in 16-byte paragraphs */
+
+       while (syssize) {
+               int paras  = (syssize >= 0x1000) ? 0x1000 : syssize;
+               int dwords = paras << 2;
+
+               asm volatile("pushw %%es ; "
+                            "pushw %%ds ; "
+                            "movw %1,%%es ; "
+                            "movw %2,%%ds ; "
+                            "xorw %%di,%%di ; "
+                            "xorw %%si,%%si ; "
+                            "rep;movsl ; "
+                            "popw %%ds ; "
+                            "popw %%es"
+                            : "+c" (dwords)
+                            : "r" (dst_seg), "r" (src_seg)
+                            : "esi", "edi");
+
+               syssize -= paras;
+               dst_seg += paras;
+               src_seg += paras;
+       }
+#endif
+}
+
+/*
+ * Disable all interrupts at the legacy PIC.
+ */
+static void mask_all_interrupts(void)
+{
+       outb(0xff, 0xa1);       /* Mask all interrupts on the secondary PIC */
+       io_delay();
+       outb(0xfb, 0x21);       /* Mask all but cascade on the primary PIC */
+       io_delay();
+}
+
+/*
+ * Reset IGNNE# if asserted in the FPU.
+ */
+static void reset_coprocessor(void)
+{
+       outb(0, 0xf0);
+       io_delay();
+       outb(0, 0xf1);
+       io_delay();
+}
+
+/*
+ * Set up the GDT
+ */
+#define GDT_ENTRY(flags,base,limit)            \
+       (((u64)(base & 0xff000000) << 32) |     \
+        ((u64)flags << 40) |                   \
+        ((u64)(limit & 0x00ff0000) << 32) |    \
+        ((u64)(base & 0x00ffff00) << 16) |     \
+        ((u64)(limit & 0x0000ffff)))
+
+struct gdt_ptr {
+       u16 len;
+       u32 ptr;
+} __attribute__((packed));
+
+static void setup_gdt(void)
+{
+       /* There are machines which are known to not boot with the GDT
+          being 8-byte unaligned.  Intel recommends 16 byte alignment. */
+       static const u64 boot_gdt[] __attribute__((aligned(16))) = {
+               /* CS: code, read/execute, 4 GB, base 0 */
+               [GDT_ENTRY_BOOT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
+               /* DS: data, read/write, 4 GB, base 0 */
+               [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
+       };
+       /* Xen HVM incorrectly stores a pointer to the gdt_ptr, instead
+          of the gdt_ptr contents.  Thus, make it static so it will
+          stay in memory, at least long enough that we switch to the
+          proper kernel GDT. */
+       static struct gdt_ptr gdt;
+
+       gdt.len = sizeof(boot_gdt)-1;
+       gdt.ptr = (u32)&boot_gdt + (ds() << 4);
+
+       asm volatile("lgdtl %0" : : "m" (gdt));
+}
+
+/*
+ * Set up the IDT
+ */
+static void setup_idt(void)
+{
+       static const struct gdt_ptr null_idt = {0, 0};
+       asm volatile("lidtl %0" : : "m" (null_idt));
+}
+
+/*
+ * Actual invocation sequence
+ */
+void go_to_protected_mode(void)
+{
+       /* Hook before leaving real mode, also disables interrupts */
+       realmode_switch_hook();
+
+       /* Move the kernel/setup to their final resting places */
+       move_kernel_around();
+
+       /* Enable the A20 gate */
+       if (enable_a20()) {
+               puts("A20 gate not responding, unable to boot...\n");
+               die();
+       }
+
+       /* Reset coprocessor (IGNNE#) */
+       reset_coprocessor();
+
+       /* Mask all interrupts in the PIC */
+       mask_all_interrupts();
+
+       /* Actual transition to protected mode... */
+       setup_idt();
+       setup_gdt();
+       protected_mode_jump(boot_params.hdr.code32_start,
+                           (u32)&boot_params + (ds() << 4));
+}
diff --git a/arch/x86/boot/pmjump.S b/arch/x86/boot/pmjump.S
new file mode 100644 (file)
index 0000000..2e55923
--- /dev/null
@@ -0,0 +1,54 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/pmjump.S
+ *
+ * The actual transition into protected mode
+ */
+
+#include <asm/boot.h>
+#include <asm/segment.h>
+
+       .text
+
+       .globl  protected_mode_jump
+       .type   protected_mode_jump, @function
+
+       .code16
+
+/*
+ * void protected_mode_jump(u32 entrypoint, u32 bootparams);
+ */
+protected_mode_jump:
+       xorl    %ebx, %ebx              # Flag to indicate this is a boot
+       movl    %edx, %esi              # Pointer to boot_params table
+       movl    %eax, 2f                # Patch ljmpl instruction
+       jmp     1f                      # Short jump to flush instruction q.
+
+1:
+       movw    $__BOOT_DS, %cx
+
+       movl    %cr0, %edx
+       orb     $1, %dl                 # Protected mode (PE) bit
+       movl    %edx, %cr0
+
+       movw    %cx, %ds
+       movw    %cx, %es
+       movw    %cx, %fs
+       movw    %cx, %gs
+       movw    %cx, %ss
+
+       # Jump to the 32-bit entrypoint
+       .byte   0x66, 0xea              # ljmpl opcode
+2:     .long   0                       # offset
+       .word   __BOOT_CS               # segment
+
+       .size   protected_mode_jump, .-protected_mode_jump
diff --git a/arch/x86/boot/printf.c b/arch/x86/boot/printf.c
new file mode 100644 (file)
index 0000000..1a09f93
--- /dev/null
@@ -0,0 +1,307 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/printf.c
+ *
+ * Oh, it's a waste of space, but oh-so-yummy for debugging.  This
+ * version of printf() does not include 64-bit support.  "Live with
+ * it."
+ *
+ */
+
+#include "boot.h"
+
+static int skip_atoi(const char **s)
+{
+       int i = 0;
+
+       while (isdigit(**s))
+               i = i * 10 + *((*s)++) - '0';
+       return i;
+}
+
+#define ZEROPAD        1               /* pad with zero */
+#define SIGN   2               /* unsigned/signed long */
+#define PLUS   4               /* show plus */
+#define SPACE  8               /* space if plus */
+#define LEFT   16              /* left justified */
+#define SPECIAL        32              /* 0x */
+#define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
+
+#define do_div(n,base) ({ \
+int __res; \
+__res = ((unsigned long) n) % (unsigned) base; \
+n = ((unsigned long) n) / (unsigned) base; \
+__res; })
+
+static char *number(char *str, long num, int base, int size, int precision,
+                   int type)
+{
+       char c, sign, tmp[66];
+       const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
+       int i;
+
+       if (type & LARGE)
+               digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+       if (type & LEFT)
+               type &= ~ZEROPAD;
+       if (base < 2 || base > 36)
+               return 0;
+       c = (type & ZEROPAD) ? '0' : ' ';
+       sign = 0;
+       if (type & SIGN) {
+               if (num < 0) {
+                       sign = '-';
+                       num = -num;
+                       size--;
+               } else if (type & PLUS) {
+                       sign = '+';
+                       size--;
+               } else if (type & SPACE) {
+                       sign = ' ';
+                       size--;
+               }
+       }
+       if (type & SPECIAL) {
+               if (base == 16)
+                       size -= 2;
+               else if (base == 8)
+                       size--;
+       }
+       i = 0;
+       if (num == 0)
+               tmp[i++] = '0';
+       else
+               while (num != 0)
+                       tmp[i++] = digits[do_div(num, base)];
+       if (i > precision)
+               precision = i;
+       size -= precision;
+       if (!(type & (ZEROPAD + LEFT)))
+               while (size-- > 0)
+                       *str++ = ' ';
+       if (sign)
+               *str++ = sign;
+       if (type & SPECIAL) {
+               if (base == 8)
+                       *str++ = '0';
+               else if (base == 16) {
+                       *str++ = '0';
+                       *str++ = digits[33];
+               }
+       }
+       if (!(type & LEFT))
+               while (size-- > 0)
+                       *str++ = c;
+       while (i < precision--)
+               *str++ = '0';
+       while (i-- > 0)
+               *str++ = tmp[i];
+       while (size-- > 0)
+               *str++ = ' ';
+       return str;
+}
+
+int vsprintf(char *buf, const char *fmt, va_list args)
+{
+       int len;
+       unsigned long num;
+       int i, base;
+       char *str;
+       const char *s;
+
+       int flags;              /* flags to number() */
+
+       int field_width;        /* width of output field */
+       int precision;          /* min. # of digits for integers; max
+                                  number of chars for from string */
+       int qualifier;          /* 'h', 'l', or 'L' for integer fields */
+
+       for (str = buf; *fmt; ++fmt) {
+               if (*fmt != '%') {
+                       *str++ = *fmt;
+                       continue;
+               }
+
+               /* process flags */
+               flags = 0;
+             repeat:
+               ++fmt;          /* this also skips first '%' */
+               switch (*fmt) {
+               case '-':
+                       flags |= LEFT;
+                       goto repeat;
+               case '+':
+                       flags |= PLUS;
+                       goto repeat;
+               case ' ':
+                       flags |= SPACE;
+                       goto repeat;
+               case '#':
+                       flags |= SPECIAL;
+                       goto repeat;
+               case '0':
+                       flags |= ZEROPAD;
+                       goto repeat;
+               }
+
+               /* get field width */
+               field_width = -1;
+               if (isdigit(*fmt))
+                       field_width = skip_atoi(&fmt);
+               else if (*fmt == '*') {
+                       ++fmt;
+                       /* it's the next argument */
+                       field_width = va_arg(args, int);
+                       if (field_width < 0) {
+                               field_width = -field_width;
+                               flags |= LEFT;
+                       }
+               }
+
+               /* get the precision */
+               precision = -1;
+               if (*fmt == '.') {
+                       ++fmt;
+                       if (isdigit(*fmt))
+                               precision = skip_atoi(&fmt);
+                       else if (*fmt == '*') {
+                               ++fmt;
+                               /* it's the next argument */
+                               precision = va_arg(args, int);
+                       }
+                       if (precision < 0)
+                               precision = 0;
+               }
+
+               /* get the conversion qualifier */
+               qualifier = -1;
+               if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
+                       qualifier = *fmt;
+                       ++fmt;
+               }
+
+               /* default base */
+               base = 10;
+
+               switch (*fmt) {
+               case 'c':
+                       if (!(flags & LEFT))
+                               while (--field_width > 0)
+                                       *str++ = ' ';
+                       *str++ = (unsigned char)va_arg(args, int);
+                       while (--field_width > 0)
+                               *str++ = ' ';
+                       continue;
+
+               case 's':
+                       s = va_arg(args, char *);
+                       len = strnlen(s, precision);
+
+                       if (!(flags & LEFT))
+                               while (len < field_width--)
+                                       *str++ = ' ';
+                       for (i = 0; i < len; ++i)
+                               *str++ = *s++;
+                       while (len < field_width--)
+                               *str++ = ' ';
+                       continue;
+
+               case 'p':
+                       if (field_width == -1) {
+                               field_width = 2 * sizeof(void *);
+                               flags |= ZEROPAD;
+                       }
+                       str = number(str,
+                                    (unsigned long)va_arg(args, void *), 16,
+                                    field_width, precision, flags);
+                       continue;
+
+               case 'n':
+                       if (qualifier == 'l') {
+                               long *ip = va_arg(args, long *);
+                               *ip = (str - buf);
+                       } else {
+                               int *ip = va_arg(args, int *);
+                               *ip = (str - buf);
+                       }
+                       continue;
+
+               case '%':
+                       *str++ = '%';
+                       continue;
+
+                       /* integer number formats - set up the flags and "break" */
+               case 'o':
+                       base = 8;
+                       break;
+
+               case 'X':
+                       flags |= LARGE;
+               case 'x':
+                       base = 16;
+                       break;
+
+               case 'd':
+               case 'i':
+                       flags |= SIGN;
+               case 'u':
+                       break;
+
+               default:
+                       *str++ = '%';
+                       if (*fmt)
+                               *str++ = *fmt;
+                       else
+                               --fmt;
+                       continue;
+               }
+               if (qualifier == 'l')
+                       num = va_arg(args, unsigned long);
+               else if (qualifier == 'h') {
+                       num = (unsigned short)va_arg(args, int);
+                       if (flags & SIGN)
+                               num = (short)num;
+               } else if (flags & SIGN)
+                       num = va_arg(args, int);
+               else
+                       num = va_arg(args, unsigned int);
+               str = number(str, num, base, field_width, precision, flags);
+       }
+       *str = '\0';
+       return str - buf;
+}
+
+int sprintf(char *buf, const char *fmt, ...)
+{
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+       i = vsprintf(buf, fmt, args);
+       va_end(args);
+       return i;
+}
+
+int printf(const char *fmt, ...)
+{
+       char printf_buf[1024];
+       va_list args;
+       int printed;
+
+       va_start(args, fmt);
+       printed = vsprintf(printf_buf, fmt, args);
+       va_end(args);
+
+       puts(printf_buf);
+
+       return printed;
+}
diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld
new file mode 100644 (file)
index 0000000..df9234b
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * setup.ld
+ *
+ * Linker script for the i386 setup code
+ */
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+       . = 0;
+       .bstext         : { *(.bstext) }
+       .bsdata         : { *(.bsdata) }
+
+       . = 497;
+       .header         : { *(.header) }
+       .inittext       : { *(.inittext) }
+       .initdata       : { *(.initdata) }
+       .text           : { *(.text*) }
+
+       . = ALIGN(16);
+       .rodata         : { *(.rodata*) }
+
+       .videocards     : {
+               video_cards = .;
+               *(.videocards)
+               video_cards_end = .;
+       }
+
+       . = ALIGN(16);
+       .data           : { *(.data*) }
+
+       .signature      : {
+               setup_sig = .;
+               LONG(0x5a5aaa55)
+       }
+
+
+       . = ALIGN(16);
+       .bss            :
+       {
+               __bss_start = .;
+               *(.bss)
+               __bss_end = .;
+       }
+       . = ALIGN(16);
+       _end = .;
+
+       /DISCARD/ : { *(.note*) }
+
+       . = ASSERT(_end <= 0x8000, "Setup too big!");
+       . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!");
+}
diff --git a/arch/x86/boot/string.c b/arch/x86/boot/string.c
new file mode 100644 (file)
index 0000000..481a220
--- /dev/null
@@ -0,0 +1,52 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/string.c
+ *
+ * Very basic string functions
+ */
+
+#include "boot.h"
+
+int strcmp(const char *str1, const char *str2)
+{
+       const unsigned char *s1 = (const unsigned char *)str1;
+       const unsigned char *s2 = (const unsigned char *)str2;
+       int delta = 0;
+
+       while (*s1 || *s2) {
+               delta = *s2 - *s1;
+               if (delta)
+                       return delta;
+               s1++;
+               s2++;
+       }
+       return 0;
+}
+
+size_t strnlen(const char *s, size_t maxlen)
+{
+       const char *es = s;
+       while (*es && maxlen) {
+               es++;
+               maxlen--;
+       }
+
+       return (es - s);
+}
+
+unsigned int atou(const char *s)
+{
+       unsigned int i = 0;
+       while (isdigit(*s))
+               i = i * 10 + (*s++ - '0');
+       return i;
+}
diff --git a/arch/x86/boot/tty.c b/arch/x86/boot/tty.c
new file mode 100644 (file)
index 0000000..f3f14bd
--- /dev/null
@@ -0,0 +1,112 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/tty.c
+ *
+ * Very simple screen I/O
+ * XXX: Probably should add very simple serial I/O?
+ */
+
+#include "boot.h"
+
+/*
+ * These functions are in .inittext so they can be used to signal
+ * error during initialization.
+ */
+
+void __attribute__((section(".inittext"))) putchar(int ch)
+{
+       unsigned char c = ch;
+
+       if (c == '\n')
+               putchar('\r');  /* \n -> \r\n */
+
+       /* int $0x10 is known to have bugs involving touching registers
+          it shouldn't.  Be extra conservative... */
+       asm volatile("pushal; pushw %%ds; int $0x10; popw %%ds; popal"
+                    : : "b" (0x0007), "c" (0x0001), "a" (0x0e00|ch));
+}
+
+void __attribute__((section(".inittext"))) puts(const char *str)
+{
+       int n = 0;
+       while (*str) {
+               putchar(*str++);
+               n++;
+       }
+}
+
+/*
+ * Read the CMOS clock through the BIOS, and return the
+ * seconds in BCD.
+ */
+
+static u8 gettime(void)
+{
+       u16 ax = 0x0200;
+       u16 cx, dx;
+
+       asm volatile("int $0x1a"
+                    : "+a" (ax), "=c" (cx), "=d" (dx)
+                    : : "ebx", "esi", "edi");
+
+       return dx >> 8;
+}
+
+/*
+ * Read from the keyboard
+ */
+int getchar(void)
+{
+       u16 ax = 0;
+       asm volatile("int $0x16" : "+a" (ax));
+
+       return ax & 0xff;
+}
+
+static int kbd_pending(void)
+{
+       u8 pending;
+       asm volatile("int $0x16; setnz %0"
+                    : "=rm" (pending)
+                    : "a" (0x0100));
+       return pending;
+}
+
+void kbd_flush(void)
+{
+       for (;;) {
+               if (!kbd_pending())
+                       break;
+               getchar();
+       }
+}
+
+int getchar_timeout(void)
+{
+       int cnt = 30;
+       int t0, t1;
+
+       t0 = gettime();
+
+       while (cnt) {
+               if (kbd_pending())
+                       return getchar();
+
+               t1 = gettime();
+               if (t0 != t1) {
+                       cnt--;
+                       t0 = t1;
+               }
+       }
+
+       return 0;               /* Timeout! */
+}
diff --git a/arch/x86/boot/version.c b/arch/x86/boot/version.c
new file mode 100644 (file)
index 0000000..c61462f
--- /dev/null
@@ -0,0 +1,23 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/version.c
+ *
+ * Kernel version string
+ */
+
+#include "boot.h"
+#include <linux/utsrelease.h>
+#include <linux/compile.h>
+
+const char kernel_version[] =
+       UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") "
+       UTS_VERSION;
diff --git a/arch/x86/boot/vesa.h b/arch/x86/boot/vesa.h
new file mode 100644 (file)
index 0000000..ff5b73c
--- /dev/null
@@ -0,0 +1,79 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 1999-2007 H. Peter Anvin - All Rights Reserved
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
+ *   Boston MA 02111-1307, USA; either version 2 of the License, or
+ *   (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef BOOT_VESA_H
+#define BOOT_VESA_H
+
+typedef struct {
+       u16 off, seg;
+} far_ptr;
+
+/* VESA General Information table */
+struct vesa_general_info {
+       u32 signature;          /* 0 Magic number = "VESA" */
+       u16 version;            /* 4 */
+       far_ptr vendor_string;  /* 6 */
+       u32 capabilities;       /* 10 */
+       far_ptr video_mode_ptr; /* 14 */
+       u16 total_memory;       /* 18 */
+
+       u16 oem_software_rev;   /* 20 */
+       far_ptr oem_vendor_name_ptr;    /* 22 */
+       far_ptr oem_product_name_ptr;   /* 26 */
+       far_ptr oem_product_rev_ptr;    /* 30 */
+
+       u8 reserved[222];       /* 34 */
+       u8 oem_data[256];       /* 256 */
+} __attribute__ ((packed));
+
+#define VESA_MAGIC ('V' + ('E' << 8) + ('S' << 16) + ('A' << 24))
+#define VBE2_MAGIC ('V' + ('B' << 8) + ('E' << 16) + ('2' << 24))
+
+struct vesa_mode_info {
+       u16 mode_attr;          /* 0 */
+       u8 win_attr[2];         /* 2 */
+       u16 win_grain;          /* 4 */
+       u16 win_size;           /* 6 */
+       u16 win_seg[2];         /* 8 */
+       far_ptr win_scheme;     /* 12 */
+       u16 logical_scan;       /* 16 */
+
+       u16 h_res;              /* 18 */
+       u16 v_res;              /* 20 */
+       u8 char_width;          /* 22 */
+       u8 char_height;         /* 23 */
+       u8 memory_planes;       /* 24 */
+       u8 bpp;                 /* 25 */
+       u8 banks;               /* 26 */
+       u8 memory_layout;       /* 27 */
+       u8 bank_size;           /* 28 */
+       u8 image_planes;        /* 29 */
+       u8 page_function;       /* 30 */
+
+       u8 rmask;               /* 31 */
+       u8 rpos;                /* 32 */
+       u8 gmask;               /* 33 */
+       u8 gpos;                /* 34 */
+       u8 bmask;               /* 35 */
+       u8 bpos;                /* 36 */
+       u8 resv_mask;           /* 37 */
+       u8 resv_pos;            /* 38 */
+       u8 dcm_info;            /* 39 */
+
+       u32 lfb_ptr;            /* 40 Linear frame buffer address */
+       u32 offscreen_ptr;      /* 44 Offscreen memory address */
+       u16 offscreen_size;     /* 48 */
+
+       u8 reserved[206];       /* 50 */
+} __attribute__ ((packed));
+
+#endif                         /* LIB_SYS_VESA_H */
diff --git a/arch/x86/boot/video-bios.c b/arch/x86/boot/video-bios.c
new file mode 100644 (file)
index 0000000..68e65d9
--- /dev/null
@@ -0,0 +1,125 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/video-bios.c
+ *
+ * Standard video BIOS modes
+ *
+ * We have two options for this; silent and scanned.
+ */
+
+#include "boot.h"
+#include "video.h"
+
+__videocard video_bios;
+
+/* Set a conventional BIOS mode */
+static int set_bios_mode(u8 mode);
+
+static int bios_set_mode(struct mode_info *mi)
+{
+       return set_bios_mode(mi->mode - VIDEO_FIRST_BIOS);
+}
+
+static int set_bios_mode(u8 mode)
+{
+       u16 ax;
+       u8 new_mode;
+
+       ax = mode;              /* AH=0x00 Set Video Mode */
+       asm volatile(INT10
+                    : "+a" (ax)
+                    : : "ebx", "ecx", "edx", "esi", "edi");
+
+       ax = 0x0f00;            /* Get Current Video Mode */
+       asm volatile(INT10
+                    : "+a" (ax)
+                    : : "ebx", "ecx", "edx", "esi", "edi");
+
+       do_restore = 1;         /* Assume video contents were lost */
+       new_mode = ax & 0x7f;   /* Not all BIOSes are clean with the top bit */
+
+       if (new_mode == mode)
+               return 0;       /* Mode change OK */
+
+       if (new_mode != boot_params.screen_info.orig_video_mode) {
+               /* Mode setting failed, but we didn't end up where we
+                  started.  That's bad.  Try to revert to the original
+                  video mode. */
+               ax = boot_params.screen_info.orig_video_mode;
+               asm volatile(INT10
+                            : "+a" (ax)
+                            : : "ebx", "ecx", "edx", "esi", "edi");
+       }
+       return -1;
+}
+
+static int bios_probe(void)
+{
+       u8 mode;
+       u8 saved_mode = boot_params.screen_info.orig_video_mode;
+       u16 crtc;
+       struct mode_info *mi;
+       int nmodes = 0;
+
+       if (adapter != ADAPTER_EGA && adapter != ADAPTER_VGA)
+               return 0;
+
+       set_fs(0);
+       crtc = vga_crtc();
+
+       video_bios.modes = GET_HEAP(struct mode_info, 0);
+
+       for (mode = 0x14; mode <= 0x7f; mode++) {
+               if (heap_free() < sizeof(struct mode_info))
+                       break;
+
+               if (mode_defined(VIDEO_FIRST_BIOS+mode))
+                       continue;
+
+               if (set_bios_mode(mode))
+                       continue;
+
+               /* Try to verify that it's a text mode. */
+
+               /* Attribute Controller: make graphics controller disabled */
+               if (in_idx(0x3c0, 0x10) & 0x01)
+                       continue;
+
+               /* Graphics Controller: verify Alpha addressing enabled */
+               if (in_idx(0x3ce, 0x06) & 0x01)
+                       continue;
+
+               /* CRTC cursor location low should be zero(?) */
+               if (in_idx(crtc, 0x0f))
+                       continue;
+
+               mi = GET_HEAP(struct mode_info, 1);
+               mi->mode = VIDEO_FIRST_BIOS+mode;
+               mi->x = rdfs16(0x44a);
+               mi->y = rdfs8(0x484)+1;
+               nmodes++;
+       }
+
+       set_bios_mode(saved_mode);
+
+       return nmodes;
+}
+
+__videocard video_bios =
+{
+       .card_name      = "BIOS (scanned)",
+       .probe          = bios_probe,
+       .set_mode       = bios_set_mode,
+       .unsafe         = 1,
+       .xmode_first    = VIDEO_FIRST_BIOS,
+       .xmode_n        = 0x80,
+};
diff --git a/arch/x86/boot/video-vesa.c b/arch/x86/boot/video-vesa.c
new file mode 100644 (file)
index 0000000..1921907
--- /dev/null
@@ -0,0 +1,292 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/video-vesa.c
+ *
+ * VESA text modes
+ */
+
+#include "boot.h"
+#include "video.h"
+#include "vesa.h"
+
+/* VESA information */
+static struct vesa_general_info vginfo;
+static struct vesa_mode_info vminfo;
+
+__videocard video_vesa;
+
+static void vesa_store_mode_params_graphics(void);
+
+static int vesa_probe(void)
+{
+#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
+       u16 ax, cx, di;
+       u16 mode;
+       addr_t mode_ptr;
+       struct mode_info *mi;
+       int nmodes = 0;
+
+       video_vesa.modes = GET_HEAP(struct mode_info, 0);
+
+       vginfo.signature = VBE2_MAGIC;
+
+       ax = 0x4f00;
+       di = (size_t)&vginfo;
+       asm(INT10
+           : "+a" (ax), "+D" (di), "=m" (vginfo)
+           : : "ebx", "ecx", "edx", "esi");
+
+       if (ax != 0x004f ||
+           vginfo.signature != VESA_MAGIC ||
+           vginfo.version < 0x0102)
+               return 0;       /* Not present */
+#endif /* CONFIG_VIDEO_VESA || CONFIG_FIRMWARE_EDID */
+#ifdef CONFIG_VIDEO_VESA
+       set_fs(vginfo.video_mode_ptr.seg);
+       mode_ptr = vginfo.video_mode_ptr.off;
+
+       while ((mode = rdfs16(mode_ptr)) != 0xffff) {
+               mode_ptr += 2;
+
+               if (heap_free() < sizeof(struct mode_info))
+                       break;  /* Heap full, can't save mode info */
+
+               if (mode & ~0x1ff)
+                       continue;
+
+               memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
+
+               ax = 0x4f01;
+               cx = mode;
+               di = (size_t)&vminfo;
+               asm(INT10
+                   : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
+                   : : "ebx", "edx", "esi");
+
+               if (ax != 0x004f)
+                       continue;
+
+               if ((vminfo.mode_attr & 0x15) == 0x05) {
+                       /* Text Mode, TTY BIOS supported,
+                          supported by hardware */
+                       mi = GET_HEAP(struct mode_info, 1);
+                       mi->mode = mode + VIDEO_FIRST_VESA;
+                       mi->x    = vminfo.h_res;
+                       mi->y    = vminfo.v_res;
+                       nmodes++;
+               } else if ((vminfo.mode_attr & 0x99) == 0x99) {
+#ifdef CONFIG_FB
+                       /* Graphics mode, color, linear frame buffer
+                          supported -- register the mode but hide from
+                          the menu.  Only do this if framebuffer is
+                          configured, however, otherwise the user will
+                          be left without a screen. */
+                       mi = GET_HEAP(struct mode_info, 1);
+                       mi->mode = mode + VIDEO_FIRST_VESA;
+                       mi->x = mi->y = 0;
+                       nmodes++;
+#endif
+               }
+       }
+
+       return nmodes;
+#else
+       return 0;
+#endif /* CONFIG_VIDEO_VESA */
+}
+
+static int vesa_set_mode(struct mode_info *mode)
+{
+       u16 ax, bx, cx, di;
+       int is_graphic;
+       u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA;
+
+       memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
+
+       ax = 0x4f01;
+       cx = vesa_mode;
+       di = (size_t)&vminfo;
+       asm(INT10
+           : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
+           : : "ebx", "edx", "esi");
+
+       if (ax != 0x004f)
+               return -1;
+
+       if ((vminfo.mode_attr & 0x15) == 0x05) {
+               /* It's a supported text mode */
+               is_graphic = 0;
+       } else if ((vminfo.mode_attr & 0x99) == 0x99) {
+               /* It's a graphics mode with linear frame buffer */
+               is_graphic = 1;
+               vesa_mode |= 0x4000; /* Request linear frame buffer */
+       } else {
+               return -1;      /* Invalid mode */
+       }
+
+
+       ax = 0x4f02;
+       bx = vesa_mode;
+       di = 0;
+       asm volatile(INT10
+                    : "+a" (ax), "+b" (bx), "+D" (di)
+                    : : "ecx", "edx", "esi");
+
+       if (ax != 0x004f)
+               return -1;
+
+       graphic_mode = is_graphic;
+       if (!is_graphic) {
+               /* Text mode */
+               force_x = mode->x;
+               force_y = mode->y;
+               do_restore = 1;
+       } else {
+               /* Graphics mode */
+               vesa_store_mode_params_graphics();
+       }
+
+       return 0;
+}
+
+
+/* Switch DAC to 8-bit mode */
+static void vesa_dac_set_8bits(void)
+{
+       u8 dac_size = 6;
+
+       /* If possible, switch the DAC to 8-bit mode */
+       if (vginfo.capabilities & 1) {
+               u16 ax, bx;
+
+               ax = 0x4f08;
+               bx = 0x0800;
+               asm volatile(INT10
+                            : "+a" (ax), "+b" (bx)
+                            : : "ecx", "edx", "esi", "edi");
+
+               if (ax == 0x004f)
+                       dac_size = bx >> 8;
+       }
+
+       /* Set the color sizes to the DAC size, and offsets to 0 */
+       boot_params.screen_info.red_size = dac_size;
+       boot_params.screen_info.green_size = dac_size;
+       boot_params.screen_info.blue_size = dac_size;
+       boot_params.screen_info.rsvd_size = dac_size;
+
+       boot_params.screen_info.red_pos = 0;
+       boot_params.screen_info.green_pos = 0;
+       boot_params.screen_info.blue_pos = 0;
+       boot_params.screen_info.rsvd_pos = 0;
+}
+
+/* Save the VESA protected mode info */
+static void vesa_store_pm_info(void)
+{
+       u16 ax, bx, di, es;
+
+       ax = 0x4f0a;
+       bx = di = 0;
+       asm("pushw %%es; "INT10"; movw %%es,%0; popw %%es"
+           : "=d" (es), "+a" (ax), "+b" (bx), "+D" (di)
+           : : "ecx", "esi");
+
+       if (ax != 0x004f)
+               return;
+
+       boot_params.screen_info.vesapm_seg = es;
+       boot_params.screen_info.vesapm_off = di;
+}
+
+/*
+ * Save video mode parameters for graphics mode
+ */
+static void vesa_store_mode_params_graphics(void)
+{
+       /* Tell the kernel we're in VESA graphics mode */
+       boot_params.screen_info.orig_video_isVGA = 0x23;
+
+       /* Mode parameters */
+       boot_params.screen_info.vesa_attributes = vminfo.mode_attr;
+       boot_params.screen_info.lfb_linelength = vminfo.logical_scan;
+       boot_params.screen_info.lfb_width = vminfo.h_res;
+       boot_params.screen_info.lfb_height = vminfo.v_res;
+       boot_params.screen_info.lfb_depth = vminfo.bpp;
+       boot_params.screen_info.pages = vminfo.image_planes;
+       boot_params.screen_info.lfb_base = vminfo.lfb_ptr;
+       memcpy(&boot_params.screen_info.red_size,
+              &vminfo.rmask, 8);
+
+       /* General parameters */
+       boot_params.screen_info.lfb_size = vginfo.total_memory;
+
+       if (vminfo.bpp <= 8)
+               vesa_dac_set_8bits();
+
+       vesa_store_pm_info();
+}
+
+/*
+ * Save EDID information for the kernel; this is invoked, separately,
+ * after mode-setting.
+ */
+void vesa_store_edid(void)
+{
+#ifdef CONFIG_FIRMWARE_EDID
+       u16 ax, bx, cx, dx, di;
+
+       /* Apparently used as a nonsense token... */
+       memset(&boot_params.edid_info, 0x13, sizeof boot_params.edid_info);
+
+       if (vginfo.version < 0x0200)
+               return;         /* EDID requires VBE 2.0+ */
+
+       ax = 0x4f15;            /* VBE DDC */
+       bx = 0x0000;            /* Report DDC capabilities */
+       cx = 0;                 /* Controller 0 */
+       di = 0;                 /* ES:DI must be 0 by spec */
+
+       /* Note: The VBE DDC spec is different from the main VESA spec;
+          we genuinely have to assume all registers are destroyed here. */
+
+       asm("pushw %%es; movw %2,%%es; "INT10"; popw %%es"
+           : "+a" (ax), "+b" (bx)
+           :  "c" (cx), "D" (di)
+           : "esi");
+
+       if (ax != 0x004f)
+               return;         /* No EDID */
+
+       /* BH = time in seconds to transfer EDD information */
+       /* BL = DDC level supported */
+
+       ax = 0x4f15;            /* VBE DDC */
+       bx = 0x0001;            /* Read EDID */
+       cx = 0;                 /* Controller 0 */
+       dx = 0;                 /* EDID block number */
+       di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
+       asm(INT10
+           : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info)
+           : "c" (cx), "D" (di)
+           : "esi");
+#endif /* CONFIG_FIRMWARE_EDID */
+}
+
+__videocard video_vesa =
+{
+       .card_name      = "VESA",
+       .probe          = vesa_probe,
+       .set_mode       = vesa_set_mode,
+       .xmode_first    = VIDEO_FIRST_VESA,
+       .xmode_n        = 0x200,
+};
diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c
new file mode 100644 (file)
index 0000000..aef02f9
--- /dev/null
@@ -0,0 +1,261 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/video-vga.c
+ *
+ * Common all-VGA modes
+ */
+
+#include "boot.h"
+#include "video.h"
+
+static struct mode_info vga_modes[] = {
+       { VIDEO_80x25,  80, 25 },
+       { VIDEO_8POINT, 80, 50 },
+       { VIDEO_80x43,  80, 43 },
+       { VIDEO_80x28,  80, 28 },
+       { VIDEO_80x30,  80, 30 },
+       { VIDEO_80x34,  80, 34 },
+       { VIDEO_80x60,  80, 60 },
+};
+
+static struct mode_info ega_modes[] = {
+       { VIDEO_80x25,  80, 25 },
+       { VIDEO_8POINT, 80, 43 },
+};
+
+static struct mode_info cga_modes[] = {
+       { VIDEO_80x25,  80, 25 },
+};
+
+__videocard video_vga;
+
+/* Set basic 80x25 mode */
+static u8 vga_set_basic_mode(void)
+{
+       u16 ax;
+       u8 rows;
+       u8 mode;
+
+#ifdef CONFIG_VIDEO_400_HACK
+       if (adapter >= ADAPTER_VGA) {
+               asm volatile(INT10
+                            : : "a" (0x1202), "b" (0x0030)
+                            : "ecx", "edx", "esi", "edi");
+       }
+#endif
+
+       ax = 0x0f00;
+       asm volatile(INT10
+                    : "+a" (ax)
+                    : : "ebx", "ecx", "edx", "esi", "edi");
+
+       mode = (u8)ax;
+
+       set_fs(0);
+       rows = rdfs8(0x484);    /* rows minus one */
+
+#ifndef CONFIG_VIDEO_400_HACK
+       if ((ax == 0x5003 || ax == 0x5007) &&
+           (rows == 0 || rows == 24))
+               return mode;
+#endif
+
+       if (mode != 3 && mode != 7)
+               mode = 3;
+
+       /* Set the mode */
+       ax = mode;
+       asm volatile(INT10
+                    : "+a" (ax)
+                    : : "ebx", "ecx", "edx", "esi", "edi");
+       do_restore = 1;
+       return mode;
+}
+
+static void vga_set_8font(void)
+{
+       /* Set 8x8 font - 80x43 on EGA, 80x50 on VGA */
+
+       /* Set 8x8 font */
+       asm volatile(INT10 : : "a" (0x1112), "b" (0));
+
+       /* Use alternate print screen */
+       asm volatile(INT10 : : "a" (0x1200), "b" (0x20));
+
+       /* Turn off cursor emulation */
+       asm volatile(INT10 : : "a" (0x1201), "b" (0x34));
+
+       /* Cursor is scan lines 6-7 */
+       asm volatile(INT10 : : "a" (0x0100), "c" (0x0607));
+}
+
+static void vga_set_14font(void)
+{
+       /* Set 9x14 font - 80x28 on VGA */
+
+       /* Set 9x14 font */
+       asm volatile(INT10 : : "a" (0x1111), "b" (0));
+
+       /* Turn off cursor emulation */
+       asm volatile(INT10 : : "a" (0x1201), "b" (0x34));
+
+       /* Cursor is scan lines 11-12 */
+       asm volatile(INT10 : : "a" (0x0100), "c" (0x0b0c));
+}
+
+static void vga_set_80x43(void)
+{
+       /* Set 80x43 mode on VGA (not EGA) */
+
+       /* Set 350 scans */
+       asm volatile(INT10 : : "a" (0x1201), "b" (0x30));
+
+       /* Reset video mode */
+       asm volatile(INT10 : : "a" (0x0003));
+
+       vga_set_8font();
+}
+
+/* I/O address of the VGA CRTC */
+u16 vga_crtc(void)
+{
+       return (inb(0x3cc) & 1) ? 0x3d4 : 0x3b4;
+}
+
+static void vga_set_480_scanlines(int end)
+{
+       u16 crtc;
+       u8  csel;
+
+       crtc = vga_crtc();
+
+       out_idx(0x0c, crtc, 0x11); /* Vertical sync end, unlock CR0-7 */
+       out_idx(0x0b, crtc, 0x06); /* Vertical total */
+       out_idx(0x3e, crtc, 0x07); /* Vertical overflow */
+       out_idx(0xea, crtc, 0x10); /* Vertical sync start */
+       out_idx(end, crtc, 0x12); /* Vertical display end */
+       out_idx(0xe7, crtc, 0x15); /* Vertical blank start */
+       out_idx(0x04, crtc, 0x16); /* Vertical blank end */
+       csel = inb(0x3cc);
+       csel &= 0x0d;
+       csel |= 0xe2;
+       outb(csel, 0x3cc);
+}
+
+static void vga_set_80x30(void)
+{
+       vga_set_480_scanlines(0xdf);
+}
+
+static void vga_set_80x34(void)
+{
+       vga_set_14font();
+       vga_set_480_scanlines(0xdb);
+}
+
+static void vga_set_80x60(void)
+{
+       vga_set_8font();
+       vga_set_480_scanlines(0xdf);
+}
+
+static int vga_set_mode(struct mode_info *mode)
+{
+       /* Set the basic mode */
+       vga_set_basic_mode();
+
+       /* Override a possibly broken BIOS */
+       force_x = mode->x;
+       force_y = mode->y;
+
+       switch (mode->mode) {
+       case VIDEO_80x25:
+               break;
+       case VIDEO_8POINT:
+               vga_set_8font();
+               break;
+       case VIDEO_80x43:
+               vga_set_80x43();
+               break;
+       case VIDEO_80x28:
+               vga_set_14font();
+               break;
+       case VIDEO_80x30:
+               vga_set_80x30();
+               break;
+       case VIDEO_80x34:
+               vga_set_80x34();
+               break;
+       case VIDEO_80x60:
+               vga_set_80x60();
+               break;
+       }
+
+       return 0;
+}
+
+/*
+ * Note: this probe includes basic information required by all
+ * systems.  It should be executed first, by making sure
+ * video-vga.c is listed first in the Makefile.
+ */
+static int vga_probe(void)
+{
+       static const char *card_name[] = {
+               "CGA/MDA/HGC", "EGA", "VGA"
+       };
+       static struct mode_info *mode_lists[] = {
+               cga_modes,
+               ega_modes,
+               vga_modes,
+       };
+       static int mode_count[] = {
+               sizeof(cga_modes)/sizeof(struct mode_info),
+               sizeof(ega_modes)/sizeof(struct mode_info),
+               sizeof(vga_modes)/sizeof(struct mode_info),
+       };
+       u8 vga_flag;
+
+       asm(INT10
+           : "=b" (boot_params.screen_info.orig_video_ega_bx)
+           : "a" (0x1200), "b" (0x10) /* Check EGA/VGA */
+           : "ecx", "edx", "esi", "edi");
+
+       /* If we have MDA/CGA/HGC then BL will be unchanged at 0x10 */
+       if ((u8)boot_params.screen_info.orig_video_ega_bx != 0x10) {
+               /* EGA/VGA */
+               asm(INT10
+                   : "=a" (vga_flag)
+                   : "a" (0x1a00)
+                   : "ebx", "ecx", "edx", "esi", "edi");
+
+               if (vga_flag == 0x1a) {
+                       adapter = ADAPTER_VGA;
+                       boot_params.screen_info.orig_video_isVGA = 1;
+               } else {
+                       adapter = ADAPTER_EGA;
+               }
+       } else {
+               adapter = ADAPTER_CGA;
+       }
+
+       video_vga.modes = mode_lists[adapter];
+       video_vga.card_name = card_name[adapter];
+       return mode_count[adapter];
+}
+
+__videocard video_vga =
+{
+       .card_name      = "VGA",
+       .probe          = vga_probe,
+       .set_mode       = vga_set_mode,
+};
diff --git a/arch/x86/boot/video.c b/arch/x86/boot/video.c
new file mode 100644 (file)
index 0000000..e4ba897
--- /dev/null
@@ -0,0 +1,467 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/video.c
+ *
+ * Select video mode
+ */
+
+#include "boot.h"
+#include "video.h"
+#include "vesa.h"
+
+/*
+ * Mode list variables
+ */
+static struct card_info cards[];    /* List of cards to probe for */
+
+/*
+ * Common variables
+ */
+int adapter;                   /* 0=CGA/MDA/HGC, 1=EGA, 2=VGA+ */
+u16 video_segment;
+int force_x, force_y;  /* Don't query the BIOS for cols/rows */
+
+int do_restore = 0;    /* Screen contents changed during mode flip */
+int graphic_mode;      /* Graphic mode with linear frame buffer */
+
+static void store_cursor_position(void)
+{
+       u16 curpos;
+       u16 ax, bx;
+
+       ax = 0x0300;
+       bx = 0;
+       asm(INT10
+           : "=d" (curpos), "+a" (ax), "+b" (bx)
+           : : "ecx", "esi", "edi");
+
+       boot_params.screen_info.orig_x = curpos;
+       boot_params.screen_info.orig_y = curpos >> 8;
+}
+
+static void store_video_mode(void)
+{
+       u16 ax, page;
+
+       /* N.B.: the saving of the video page here is a bit silly,
+          since we pretty much assume page 0 everywhere. */
+       ax = 0x0f00;
+       asm(INT10
+           : "+a" (ax), "=b" (page)
+           : : "ecx", "edx", "esi", "edi");
+
+       /* Not all BIOSes are clean with respect to the top bit */
+       boot_params.screen_info.orig_video_mode = ax & 0x7f;
+       boot_params.screen_info.orig_video_page = page >> 8;
+}
+
+/*
+ * Store the video mode parameters for later usage by the kernel.
+ * This is done by asking the BIOS except for the rows/columns
+ * parameters in the default 80x25 mode -- these are set directly,
+ * because some very obscure BIOSes supply insane values.
+ */
+static void store_mode_params(void)
+{
+       u16 font_size;
+       int x, y;
+
+       /* For graphics mode, it is up to the mode-setting driver
+          (currently only video-vesa.c) to store the parameters */
+       if (graphic_mode)
+               return;
+
+       store_cursor_position();
+       store_video_mode();
+
+       if (boot_params.screen_info.orig_video_mode == 0x07) {
+               /* MDA, HGC, or VGA in monochrome mode */
+               video_segment = 0xb000;
+       } else {
+               /* CGA, EGA, VGA and so forth */
+               video_segment = 0xb800;
+       }
+
+       set_fs(0);
+       font_size = rdfs16(0x485); /* Font size, BIOS area */
+       boot_params.screen_info.orig_video_points = font_size;
+
+       x = rdfs16(0x44a);
+       y = (adapter == ADAPTER_CGA) ? 25 : rdfs8(0x484)+1;
+
+       if (force_x)
+               x = force_x;
+       if (force_y)
+               y = force_y;
+
+       boot_params.screen_info.orig_video_cols  = x;
+       boot_params.screen_info.orig_video_lines = y;
+}
+
+/* Probe the video drivers and have them generate their mode lists. */
+static void probe_cards(int unsafe)
+{
+       struct card_info *card;
+       static u8 probed[2];
+
+       if (probed[unsafe])
+               return;
+
+       probed[unsafe] = 1;
+
+       for (card = video_cards; card < video_cards_end; card++) {
+               if (card->unsafe == unsafe) {
+                       if (card->probe)
+                               card->nmodes = card->probe();
+                       else
+                               card->nmodes = 0;
+               }
+       }
+}
+
+/* Test if a mode is defined */
+int mode_defined(u16 mode)
+{
+       struct card_info *card;
+       struct mode_info *mi;
+       int i;
+
+       for (card = video_cards; card < video_cards_end; card++) {
+               mi = card->modes;
+               for (i = 0; i < card->nmodes; i++, mi++) {
+                       if (mi->mode == mode)
+                               return 1;
+               }
+       }
+
+       return 0;
+}
+
+/* Set mode (without recalc) */
+static int raw_set_mode(u16 mode, u16 *real_mode)
+{
+       int nmode, i;
+       struct card_info *card;
+       struct mode_info *mi;
+
+       /* Drop the recalc bit if set */
+       mode &= ~VIDEO_RECALC;
+
+       /* Scan for mode based on fixed ID, position, or resolution */
+       nmode = 0;
+       for (card = video_cards; card < video_cards_end; card++) {
+               mi = card->modes;
+               for (i = 0; i < card->nmodes; i++, mi++) {
+                       int visible = mi->x || mi->y;
+
+                       if ((mode == nmode && visible) ||
+                           mode == mi->mode ||
+                           mode == (mi->y << 8)+mi->x) {
+                               *real_mode = mi->mode;
+                               return card->set_mode(mi);
+                       }
+
+                       if (visible)
+                               nmode++;
+               }
+       }
+
+       /* Nothing found?  Is it an "exceptional" (unprobed) mode? */
+       for (card = video_cards; card < video_cards_end; card++) {
+               if (mode >= card->xmode_first &&
+                   mode < card->xmode_first+card->xmode_n) {
+                       struct mode_info mix;
+                       *real_mode = mix.mode = mode;
+                       mix.x = mix.y = 0;
+                       return card->set_mode(&mix);
+               }
+       }
+
+       /* Otherwise, failure... */
+       return -1;
+}
+
+/*
+ * Recalculate the vertical video cutoff (hack!)
+ */
+static void vga_recalc_vertical(void)
+{
+       unsigned int font_size, rows;
+       u16 crtc;
+       u8 pt, ov;
+
+       set_fs(0);
+       font_size = rdfs8(0x485); /* BIOS: font size (pixels) */
+       rows = force_y ? force_y : rdfs8(0x484)+1; /* Text rows */
+
+       rows *= font_size;      /* Visible scan lines */
+       rows--;                 /* ... minus one */
+
+       crtc = vga_crtc();
+
+       pt = in_idx(crtc, 0x11);
+       pt &= ~0x80;            /* Unlock CR0-7 */
+       out_idx(pt, crtc, 0x11);
+
+       out_idx((u8)rows, crtc, 0x12); /* Lower height register */
+
+       ov = in_idx(crtc, 0x07); /* Overflow register */
+       ov &= 0xbd;
+       ov |= (rows >> (8-1)) & 0x02;
+       ov |= (rows >> (9-6)) & 0x40;
+       out_idx(ov, crtc, 0x07);
+}
+
+/* Set mode (with recalc if specified) */
+static int set_mode(u16 mode)
+{
+       int rv;
+       u16 real_mode;
+
+       /* Very special mode numbers... */
+       if (mode == VIDEO_CURRENT_MODE)
+               return 0;       /* Nothing to do... */
+       else if (mode == NORMAL_VGA)
+               mode = VIDEO_80x25;
+       else if (mode == EXTENDED_VGA)
+               mode = VIDEO_8POINT;
+
+       rv = raw_set_mode(mode, &real_mode);
+       if (rv)
+               return rv;
+
+       if (mode & VIDEO_RECALC)
+               vga_recalc_vertical();
+
+       /* Save the canonical mode number for the kernel, not
+          an alias, size specification or menu position */
+       boot_params.hdr.vid_mode = real_mode;
+       return 0;
+}
+
+static unsigned int get_entry(void)
+{
+       char entry_buf[4];
+       int i, len = 0;
+       int key;
+       unsigned int v;
+
+       do {
+               key = getchar();
+
+               if (key == '\b') {
+                       if (len > 0) {
+                               puts("\b \b");
+                               len--;
+                       }
+               } else if ((key >= '0' && key <= '9') ||
+                          (key >= 'A' && key <= 'Z') ||
+                          (key >= 'a' && key <= 'z')) {
+                       if (len < sizeof entry_buf) {
+                               entry_buf[len++] = key;
+                               putchar(key);
+                       }
+               }
+       } while (key != '\r');
+       putchar('\n');
+
+       if (len == 0)
+               return VIDEO_CURRENT_MODE; /* Default */
+
+       v = 0;
+       for (i = 0; i < len; i++) {
+               v <<= 4;
+               key = entry_buf[i] | 0x20;
+               v += (key > '9') ? key-'a'+10 : key-'0';
+       }
+
+       return v;
+}
+
+static void display_menu(void)
+{
+       struct card_info *card;
+       struct mode_info *mi;
+       char ch;
+       int i;
+
+       puts("Mode:    COLSxROWS:\n");
+
+       ch = '0';
+       for (card = video_cards; card < video_cards_end; card++) {
+               mi = card->modes;
+               for (i = 0; i < card->nmodes; i++, mi++) {
+                       int visible = mi->x && mi->y;
+                       u16 mode_id = mi->mode ? mi->mode :
+                               (mi->y << 8)+mi->x;
+
+                       if (!visible)
+                               continue; /* Hidden mode */
+
+                       printf("%c  %04X  %3dx%-3d  %s\n",
+                              ch, mode_id, mi->x, mi->y, card->card_name);
+
+                       if (ch == '9')
+                               ch = 'a';
+                       else if (ch == 'z' || ch == ' ')
+                               ch = ' '; /* Out of keys... */
+                       else
+                               ch++;
+               }
+       }
+}
+
+#define H(x)   ((x)-'a'+10)
+#define SCAN   ((H('s')<<12)+(H('c')<<8)+(H('a')<<4)+H('n'))
+
+static unsigned int mode_menu(void)
+{
+       int key;
+       unsigned int sel;
+
+       puts("Press <ENTER> to see video modes available, "
+            "<SPACE> to continue, or wait 30 sec\n");
+
+       kbd_flush();
+       while (1) {
+               key = getchar_timeout();
+               if (key == ' ' || key == 0)
+                       return VIDEO_CURRENT_MODE; /* Default */
+               if (key == '\r')
+                       break;
+               putchar('\a');  /* Beep! */
+       }
+
+
+       for (;;) {
+               display_menu();
+
+               puts("Enter a video mode or \"scan\" to scan for "
+                    "additional modes: ");
+               sel = get_entry();
+               if (sel != SCAN)
+                       return sel;
+
+               probe_cards(1);
+       }
+}
+
+#ifdef CONFIG_VIDEO_RETAIN
+/* Save screen content to the heap */
+struct saved_screen {
+       int x, y;
+       int curx, cury;
+       u16 *data;
+} saved;
+
+static void save_screen(void)
+{
+       /* Should be called after store_mode_params() */
+       saved.x = boot_params.screen_info.orig_video_cols;
+       saved.y = boot_params.screen_info.orig_video_lines;
+       saved.curx = boot_params.screen_info.orig_x;
+       saved.cury = boot_params.screen_info.orig_y;
+
+       if (heap_free() < saved.x*saved.y*sizeof(u16)+512)
+               return;         /* Not enough heap to save the screen */
+
+       saved.data = GET_HEAP(u16, saved.x*saved.y);
+
+       set_fs(video_segment);
+       copy_from_fs(saved.data, 0, saved.x*saved.y*sizeof(u16));
+}
+
+static void restore_screen(void)
+{
+       /* Should be called after store_mode_params() */
+       int xs = boot_params.screen_info.orig_video_cols;
+       int ys = boot_params.screen_info.orig_video_lines;
+       int y;
+       addr_t dst = 0;
+       u16 *src = saved.data;
+       u16 ax, bx, dx;
+
+       if (graphic_mode)
+               return;         /* Can't restore onto a graphic mode */
+
+       if (!src)
+               return;         /* No saved screen contents */
+
+       /* Restore screen contents */
+
+       set_fs(video_segment);
+       for (y = 0; y < ys; y++) {
+               int npad;
+
+               if (y < saved.y) {
+                       int copy = (xs < saved.x) ? xs : saved.x;
+                       copy_to_fs(dst, src, copy*sizeof(u16));
+                       dst += copy*sizeof(u16);
+                       src += saved.x;
+                       npad = (xs < saved.x) ? 0 : xs-saved.x;
+               } else {
+                       npad = xs;
+               }
+
+               /* Writes "npad" blank characters to
+                  video_segment:dst and advances dst */
+               asm volatile("pushw %%es ; "
+                            "movw %2,%%es ; "
+                            "shrw %%cx ; "
+                            "jnc 1f ; "
+                            "stosw \n\t"
+                            "1: rep;stosl ; "
+                            "popw %%es"
+                            : "+D" (dst), "+c" (npad)
+                            : "bdS" (video_segment),
+                              "a" (0x07200720));
+       }
+
+       /* Restore cursor position */
+       ax = 0x0200;            /* Set cursor position */
+       bx = 0;                 /* Page number (<< 8) */
+       dx = (saved.cury << 8)+saved.curx;
+       asm volatile(INT10
+                    : "+a" (ax), "+b" (bx), "+d" (dx)
+                    : : "ecx", "esi", "edi");
+}
+#else
+#define save_screen()          ((void)0)
+#define restore_screen()       ((void)0)
+#endif
+
+void set_video(void)
+{
+       u16 mode = boot_params.hdr.vid_mode;
+
+       RESET_HEAP();
+
+       store_mode_params();
+       save_screen();
+       probe_cards(0);
+
+       for (;;) {
+               if (mode == ASK_VGA)
+                       mode = mode_menu();
+
+               if (!set_mode(mode))
+                       break;
+
+               printf("Undefined video mode number: %x\n", mode);
+               mode = ASK_VGA;
+       }
+       vesa_store_edid();
+       store_mode_params();
+
+       if (do_restore)
+               restore_screen();
+}
diff --git a/arch/x86/boot/video.h b/arch/x86/boot/video.h
new file mode 100644 (file)
index 0000000..b92447d
--- /dev/null
@@ -0,0 +1,152 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/video.h
+ *
+ * Header file for the real-mode video probing code
+ */
+
+#ifndef BOOT_VIDEO_H
+#define BOOT_VIDEO_H
+
+#include <linux/types.h>
+
+/* Enable autodetection of SVGA adapters and modes. */
+#undef CONFIG_VIDEO_SVGA
+
+/* Enable autodetection of VESA modes */
+#define CONFIG_VIDEO_VESA
+
+/* Retain screen contents when switching modes */
+#define CONFIG_VIDEO_RETAIN
+
+/* Force 400 scan lines for standard modes (hack to fix bad BIOS behaviour */
+#undef CONFIG_VIDEO_400_HACK
+
+/* This code uses an extended set of video mode numbers. These include:
+ * Aliases for standard modes
+ *      NORMAL_VGA (-1)
+ *      EXTENDED_VGA (-2)
+ *      ASK_VGA (-3)
+ * Video modes numbered by menu position -- NOT RECOMMENDED because of lack
+ * of compatibility when extending the table. These are between 0x00 and 0xff.
+ */
+#define VIDEO_FIRST_MENU 0x0000
+
+/* Standard BIOS video modes (BIOS number + 0x0100) */
+#define VIDEO_FIRST_BIOS 0x0100
+
+/* VESA BIOS video modes (VESA number + 0x0200) */
+#define VIDEO_FIRST_VESA 0x0200
+
+/* Video7 special modes (BIOS number + 0x0900) */
+#define VIDEO_FIRST_V7 0x0900
+
+/* Special video modes */
+#define VIDEO_FIRST_SPECIAL 0x0f00
+#define VIDEO_80x25 0x0f00
+#define VIDEO_8POINT 0x0f01
+#define VIDEO_80x43 0x0f02
+#define VIDEO_80x28 0x0f03
+#define VIDEO_CURRENT_MODE 0x0f04
+#define VIDEO_80x30 0x0f05
+#define VIDEO_80x34 0x0f06
+#define VIDEO_80x60 0x0f07
+#define VIDEO_GFX_HACK 0x0f08
+#define VIDEO_LAST_SPECIAL 0x0f09
+
+/* Video modes given by resolution */
+#define VIDEO_FIRST_RESOLUTION 0x1000
+
+/* The "recalculate timings" flag */
+#define VIDEO_RECALC 0x8000
+
+/* Define DO_STORE according to CONFIG_VIDEO_RETAIN */
+#ifdef CONFIG_VIDEO_RETAIN
+void store_screen(void);
+#define DO_STORE() store_screen()
+#else
+#define DO_STORE() ((void)0)
+#endif /* CONFIG_VIDEO_RETAIN */
+
+/*
+ * Mode table structures
+ */
+
+struct mode_info {
+       u16 mode;               /* Mode number (vga= style) */
+       u8  x, y;               /* Width, height */
+};
+
+struct card_info {
+       const char *card_name;
+       int (*set_mode)(struct mode_info *mode);
+       int (*probe)(void);
+       struct mode_info *modes;
+       int nmodes;             /* Number of probed modes so far */
+       int unsafe;             /* Probing is unsafe, only do after "scan" */
+       u16 xmode_first;        /* Unprobed modes to try to call anyway */
+       u16 xmode_n;            /* Size of unprobed mode range */
+};
+
+#define __videocard struct card_info __attribute__((section(".videocards")))
+extern struct card_info video_cards[], video_cards_end[];
+
+int mode_defined(u16 mode);    /* video.c */
+
+/* Basic video information */
+#define ADAPTER_CGA    0       /* CGA/MDA/HGC */
+#define ADAPTER_EGA    1
+#define ADAPTER_VGA    2
+
+extern int adapter;
+extern u16 video_segment;
+extern int force_x, force_y;   /* Don't query the BIOS for cols/rows */
+extern int do_restore;         /* Restore screen contents */
+extern int graphic_mode;       /* Graphics mode with linear frame buffer */
+
+/*
+ * int $0x10 is notorious for touching registers it shouldn't.
+ * gcc doesn't like %ebp being clobbered, so define it as a push/pop
+ * sequence here.
+ *
+ * A number of systems, including the original PC can clobber %bp in
+ * certain circumstances, like when scrolling.  There exists at least
+ * one Trident video card which could clobber DS under a set of
+ * circumstances that we are unlikely to encounter (scrolling when
+ * using an extended graphics mode of more than 800x600 pixels), but
+ * it's cheap insurance to deal with that here.
+ */
+#define INT10 "pushl %%ebp; pushw %%ds; int $0x10; popw %%ds; popl %%ebp"
+
+/* Accessing VGA indexed registers */
+static inline u8 in_idx(u16 port, u8 index)
+{
+       outb(index, port);
+       return inb(port+1);
+}
+
+static inline void out_idx(u8 v, u16 port, u8 index)
+{
+       outw(index+(v << 8), port);
+}
+
+/* Writes a value to an indexed port and then reads the port again */
+static inline u8 tst_idx(u8 v, u16 port, u8 index)
+{
+       out_idx(port, index, v);
+       return in_idx(port, index);
+}
+
+/* Get the I/O port of the VGA CRTC */
+u16 vga_crtc(void);            /* video-vga.c */
+
+#endif /* BOOT_VIDEO_H */
diff --git a/arch/x86/boot/voyager.c b/arch/x86/boot/voyager.c
new file mode 100644 (file)
index 0000000..61c8fe0
--- /dev/null
@@ -0,0 +1,46 @@
+/* -*- linux-c -*- ------------------------------------------------------- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * arch/i386/boot/voyager.c
+ *
+ * Get the Voyager config information
+ */
+
+#include "boot.h"
+
+#ifdef CONFIG_X86_VOYAGER
+
+int query_voyager(void)
+{
+       u8 err;
+       u16 es, di;
+       /* Abuse the apm_bios_info area for this */
+       u8 *data_ptr = (u8 *)&boot_params.apm_bios_info;
+
+       data_ptr[0] = 0xff;     /* Flag on config not found(?) */
+
+       asm("pushw %%es ; "
+           "int $0x15 ; "
+           "setc %0 ; "
+           "movw %%es, %1 ; "
+           "popw %%es"
+           : "=q" (err), "=r" (es), "=D" (di)
+           : "a" (0xffc0));
+
+       if (err)
+               return -1;      /* Not Voyager */
+
+       set_fs(es);
+       copy_from_fs(data_ptr, di, 7);  /* Table is 7 bytes apparently */
+       return 0;
+}
+
+#endif /* CONFIG_X86_VOYAGER */
index 67096389de1f1f7d1323f9ef6bead27e284c742c..0f7b6c2cfa58193b34fd57d04de72ed14329f9a4 100644 (file)
@@ -5,5 +5,5 @@
 # So tell kbuild that we fetch the code from i386 and include the
 # Makefile from i386 too.
 
-src := arch/i386/boot
+src := arch/x86/boot
 include $(src)/Makefile