diff options
| author | H. Peter Anvin <hpa@zytor.com> | 2007-07-11 12:18:57 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-12 10:55:55 -0700 | 
| commit | 91a6c462b02d8dc02dbe95e5a407d78078a38d01 (patch) | |
| tree | 46ad95267332ca895b3af2d40def2e89e18aafd8 | |
| parent | 4fd06960f120e02e9abc802a09f9511c400042a5 (diff) | |
| download | olio-linux-3.10-91a6c462b02d8dc02dbe95e5a407d78078a38d01.tar.xz olio-linux-3.10-91a6c462b02d8dc02dbe95e5a407d78078a38d01.zip  | |
Use the new x86 setup code for x86-64; unify with i386
This unifies arch/*/boot (except arch/*/boot/compressed) between
i386 and x86-64, and uses the new x86 setup code for x86-64 as well.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/x86_64/boot/Makefile | 136 | ||||
| -rw-r--r-- | arch/x86_64/boot/bootsect.S | 98 | ||||
| -rw-r--r-- | arch/x86_64/boot/compressed/Makefile | 9 | ||||
| -rw-r--r-- | arch/x86_64/boot/install.sh | 2 | ||||
| -rw-r--r-- | arch/x86_64/boot/mtools.conf.in | 17 | ||||
| -rw-r--r-- | arch/x86_64/boot/setup.S | 826 | ||||
| -rw-r--r-- | arch/x86_64/boot/tools/build.c | 185 | 
7 files changed, 10 insertions, 1263 deletions
diff --git a/arch/x86_64/boot/Makefile b/arch/x86_64/boot/Makefile index ee6f6505f95..67096389de1 100644 --- a/arch/x86_64/boot/Makefile +++ b/arch/x86_64/boot/Makefile @@ -1,135 +1,9 @@  #  # arch/x86_64/boot/Makefile  # -# This file is subject to the terms and conditions of the GNU General Public -# License.  See the file "COPYING" in the main directory of this archive -# for more details. -# -# Copyright (C) 1994 by Linus Torvalds -# - -# ROOT_DEV specifies the default root-device when making the image. -# This can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case -# the default of FLOPPY is used by 'build'. - -ROOT_DEV := CURRENT - -# If you want to preset the SVGA mode, uncomment the next line and -# set SVGA_MODE to whatever number you want. -# Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode. -# The number is the same as you would ordinarily press at bootup. - -SVGA_MODE := -DSVGA_MODE=NORMAL_VGA - -# If you want the RAM disk device, define this to be the size in blocks. - -#RAMDISK := -DRAMDISK=512 - -targets		:= vmlinux.bin bootsect bootsect.o \ -		   setup setup.o bzImage mtools.conf - -EXTRA_CFLAGS := -m32 - -hostprogs-y	:= tools/build -HOST_EXTRACFLAGS += $(LINUXINCLUDE) -subdir-		:= compressed/	#Let make clean descend in compressed/ -# --------------------------------------------------------------------------- - -$(obj)/bzImage: IMAGE_OFFSET := 0x100000 -$(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)/bootsect $(obj)/setup \ -	    $(obj)/vmlinux.bin $(ROOT_DEV) > $@ - -$(obj)/bzImage: $(obj)/bootsect $(obj)/setup \ -			      $(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) - -LDFLAGS_bootsect := -Ttext 0x0 -s --oformat binary -LDFLAGS_setup	 := -Ttext 0x0 -s --oformat binary -e begtext - -$(obj)/setup $(obj)/bootsect: %: %.o FORCE -	$(call if_changed,ld) - -$(obj)/compressed/vmlinux: FORCE -	$(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@ - -# Set this if you want to pass append arguments to the zdisk/fdimage/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=$(obj)/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 +# The actual boot code is shared with i386 including the Makefile. +# So tell kbuild that we fetch the code from i386 and include the +# Makefile from i386 too. -install: -	sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)" +src := arch/i386/boot +include $(src)/Makefile diff --git a/arch/x86_64/boot/bootsect.S b/arch/x86_64/boot/bootsect.S deleted file mode 100644 index 011b7a4993d..00000000000 --- a/arch/x86_64/boot/bootsect.S +++ /dev/null @@ -1,98 +0,0 @@ -/* - *	bootsect.S		Copyright (C) 1991, 1992 Linus Torvalds - * - *	modified by Drew Eckhardt - *	modified by Bruce Evans (bde) - *	modified by Chris Noe (May 1999) (as86 -> gas) - *	gutted by H. Peter Anvin (Jan 2003) - * - * BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment - * addresses must be multiplied by 16 to obtain their respective linear - * addresses. To avoid confusion, linear addresses are written using leading - * hex while segment addresses are written as segment:offset. - * - */ - -#include <asm/boot.h> - -SETUPSECTS	= 4			/* default nr of setup-sectors */ -BOOTSEG		= 0x07C0		/* original address of boot-sector */ -INITSEG		= DEF_INITSEG		/* we move boot here - out of the way */ -SETUPSEG	= DEF_SETUPSEG		/* setup starts here */ -SYSSEG		= DEF_SYSSEG		/* system loaded at 0x10000 (65536) */ -SYSSIZE		= DEF_SYSSIZE		/* system size: # of 16-byte clicks */ -					/* to be loaded */ -ROOT_DEV	= 0 			/* ROOT_DEV is now written by "build" */ -SWAP_DEV	= 0			/* SWAP_DEV is now written by "build" */ - -#ifndef SVGA_MODE -#define SVGA_MODE ASK_VGA -#endif - -#ifndef RAMDISK -#define RAMDISK 0 -#endif - -#ifndef ROOT_RDONLY -#define ROOT_RDONLY 1 -#endif - -.code16 -.text - -.global _start -_start: - -	# Normalize the start address -	jmpl	$BOOTSEG, $start2 - -start2: -	movw	%cs, %ax -	movw	%ax, %ds -	movw	%ax, %es -	movw	%ax, %ss -	movw	$0x7c00, %sp -	sti -	cld - -	movw	$bugger_off_msg, %si - -msg_loop: -	lodsb -	andb	%al, %al -	jz	die -	movb	$0xe, %ah -	movw	$7, %bx -	int	$0x10 -	jmp	msg_loop - -die: -	# Allow the user to press a key, then reboot -	xorw	%ax, %ax -	int	$0x16 -	int	$0x19 - -	# int 0x19 should never return.  In case it does anyway, -	# invoke the BIOS reset code... -	ljmp	$0xf000,$0xfff0 - - -bugger_off_msg: -	.ascii	"Direct booting from floppy is no longer supported.\r\n" -	.ascii	"Please use a boot loader program instead.\r\n" -	.ascii	"\n" -	.ascii	"Remove disk and press any key to reboot . . .\r\n" -	.byte	0 - - -	# Kernel attributes; used by setup - -	.org 497 -setup_sects:	.byte SETUPSECTS -root_flags:	.word ROOT_RDONLY -syssize:	.word SYSSIZE -swap_dev:	.word SWAP_DEV -ram_size:	.word RAMDISK -vid_mode:	.word SVGA_MODE -root_dev:	.word ROOT_DEV -boot_flag:	.word 0xAA55 diff --git a/arch/x86_64/boot/compressed/Makefile b/arch/x86_64/boot/compressed/Makefile index 705a3e33d7e..c9f2da7496c 100644 --- a/arch/x86_64/boot/compressed/Makefile +++ b/arch/x86_64/boot/compressed/Makefile @@ -7,11 +7,12 @@  #  targets		:= vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o piggy.o -EXTRA_AFLAGS	:= -traditional -# cannot use EXTRA_CFLAGS because base CFLAGS contains -mkernel which conflicts with -# -m32 -CFLAGS := -m64 -D__KERNEL__ -Iinclude -O2  -fno-strict-aliasing -fPIC -mcmodel=small -fno-builtin +CFLAGS := -m64 -D__KERNEL__ $(LINUXINCLUDE) -O2  \ +	  -fno-strict-aliasing -fPIC -mcmodel=small \ +	   $(call cc-option, -ffreestanding) \ +	   $(call cc-option, -fno-stack-protector) +AFLAGS  := $(CFLAGS) -D__ASSEMBLY__  LDFLAGS := -m elf_x86_64  LDFLAGS_vmlinux := -T diff --git a/arch/x86_64/boot/install.sh b/arch/x86_64/boot/install.sh deleted file mode 100644 index baaa2369bdb..00000000000 --- a/arch/x86_64/boot/install.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -. $srctree/arch/i386/boot/install.sh diff --git a/arch/x86_64/boot/mtools.conf.in b/arch/x86_64/boot/mtools.conf.in deleted file mode 100644 index efd6d2490c1..00000000000 --- a/arch/x86_64/boot/mtools.conf.in +++ /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/x86_64/boot/setup.S b/arch/x86_64/boot/setup.S deleted file mode 100644 index e9e33f94969..00000000000 --- a/arch/x86_64/boot/setup.S +++ /dev/null @@ -1,826 +0,0 @@ -/* - *	setup.S		Copyright (C) 1991, 1992 Linus Torvalds - * - * setup.s is responsible for getting the system data from the BIOS, - * and putting them into the appropriate places in system memory. - * both setup.s and system has been loaded by the bootblock. - * - * This code asks the bios for memory/disk/other parameters, and - * puts them in a "safe" place: 0x90000-0x901FF, ie where the - * boot-block used to be. It is then up to the protected mode - * system to read them from there before the area is overwritten - * for buffer-blocks. - * - * Move PS/2 aux init code to psaux.c - * (troyer@saifr00.cfsat.Honeywell.COM) 03Oct92 - * - * some changes and additional features by Christoph Niemann, - * March 1993/June 1994 (Christoph.Niemann@linux.org) - * - * add APM BIOS checking by Stephen Rothwell, May 1994 - * (sfr@canb.auug.org.au) - * - * High load stuff, initrd support and position independency - * by Hans Lermen & Werner Almesberger, February 1996 - * <lermen@elserv.ffm.fgan.de>, <almesber@lrc.epfl.ch> - * - * Video handling moved to video.S by Martin Mares, March 1996 - * <mj@k332.feld.cvut.cz> - * - * Extended memory detection scheme retwiddled by orc@pell.chi.il.us (david - * parsons) to avoid loadlin confusion, July 1997 - * - * Transcribed from Intel (as86) -> AT&T (gas) by Chris Noe, May 1999. - * <stiker@northlink.com> - * - * Fix to work around buggy BIOSes which don't use carry bit correctly - * and/or report extended memory in CX/DX for e801h memory size detection  - * call.  As a result the kernel got wrong figures.  The int15/e801h docs - * from Ralf Brown interrupt list seem to indicate AX/BX should be used - * anyway.  So to avoid breaking many machines (presumably there was a reason - * to orginally use CX/DX instead of AX/BX), we do a kludge to see - * if CX/DX have been changed in the e801 call and if so use AX/BX . - * Michael Miller, April 2001 <michaelm@mjmm.org> - * - * Added long mode checking and SSE force. March 2003, Andi Kleen.		 - */ - -#include <asm/segment.h> -#include <linux/utsrelease.h> -#include <linux/compile.h> -#include <asm/boot.h> -#include <asm/e820.h> -#include <asm/page.h> -#include <asm/setup.h> - -/* Signature words to ensure LILO loaded us right */ -#define SIG1	0xAA55 -#define SIG2	0x5A5A - -INITSEG  = DEF_INITSEG		# 0x9000, we move boot here, out of the way -SYSSEG   = DEF_SYSSEG		# 0x1000, system loaded at 0x10000 (65536). -SETUPSEG = DEF_SETUPSEG		# 0x9020, this is the current segment -				# ... and the former contents of CS - -DELTA_INITSEG = SETUPSEG - INITSEG	# 0x0020 - -.code16 -.globl begtext, begdata, begbss, endtext, enddata, endbss - -.text -begtext: -.data -begdata: -.bss -begbss: -.text - -start: -	jmp	trampoline - -# This is the setup header, and it must start at %cs:2 (old 0x9020:2) - -		.ascii	"HdrS"		# header signature -		.word	0x0206		# header version number (>= 0x0105) -					# or else old loadlin-1.5 will fail) -realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG -start_sys_seg:	.word	SYSSEG -		.word	kernel_version	# 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	modelist+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 0xffffffff -kernel_alignment:  .long 0x200000       # physical addr alignment required for -					# protected mode relocatable 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 - -trampoline:	call	start_of_setup -		.align 16 -					# The offset at this point is 0x240 -		.space  (0xeff-0x240+1)	# E820 & EDD space (ending at 0xeff) -# End of setup header ##################################################### - -start_of_setup: -# Bootlin depends on this being done early -	movw	$0x01500, %ax -	movb	$0x81, %dl -	int	$0x13 - -#ifdef SAFE_RESET_DISK_CONTROLLER -# Reset the disk controller. -	movw	$0x0000, %ax -	movb	$0x80, %dl -	int	$0x13 -#endif - -# Set %ds = %cs, we know that SETUPSEG = %cs at this point -	movw	%cs, %ax		# aka SETUPSEG -	movw	%ax, %ds -# Check signature at end of setup -	cmpw	$SIG1, setup_sig1 -	jne	bad_sig - -	cmpw	$SIG2, setup_sig2 -	jne	bad_sig - -	jmp	good_sig1 - -# Routine to print asciiz string at ds:si -prtstr: -	lodsb -	andb	%al, %al -	jz	fin - -	call	prtchr -	jmp	prtstr - -fin:	ret - -# Space printing -prtsp2:	call	prtspc		# Print double space -prtspc:	movb	$0x20, %al	# Print single space (note: fall-thru) - -prtchr:	 -	pushw	%ax -	pushw	%cx -	movw	$0007,%bx -	movw	$0x01, %cx -	movb	$0x0e, %ah -	int	$0x10 -	popw	%cx -	popw	%ax -	ret - -beep:	movb	$0x07, %al -	jmp	prtchr -	 -no_sig_mess: .string	"No setup signature found ..." - -good_sig1: -	jmp	good_sig - -# We now have to find the rest of the setup code/data -bad_sig: -	movw	%cs, %ax			# SETUPSEG -	subw	$DELTA_INITSEG, %ax		# INITSEG -	movw	%ax, %ds -	xorb	%bh, %bh -	movb	(497), %bl			# get setup sect from bootsect -	subw	$4, %bx				# LILO loads 4 sectors of setup -	shlw	$8, %bx				# convert to words (1sect=2^8 words) -	movw	%bx, %cx -	shrw	$3, %bx				# convert to segment -	addw	$SYSSEG, %bx -	movw	%bx, %cs:start_sys_seg -# Move rest of setup code/data to here -	movw	$2048, %di			# four sectors loaded by LILO -	subw	%si, %si -	movw	%cs, %ax			# aka SETUPSEG -	movw	%ax, %es -	movw	$SYSSEG, %ax -	movw	%ax, %ds -	rep -	movsw -	movw	%cs, %ax			# aka SETUPSEG -	movw	%ax, %ds -	cmpw	$SIG1, setup_sig1 -	jne	no_sig - -	cmpw	$SIG2, setup_sig2 -	jne	no_sig - -	jmp	good_sig - -no_sig: -	lea	no_sig_mess, %si -	call	prtstr - -no_sig_loop: -	jmp	no_sig_loop - -good_sig: -	movw	%cs, %ax			# aka SETUPSEG -	subw	$DELTA_INITSEG, %ax 		# aka INITSEG -	movw	%ax, %ds -# Check if an old loader tries to load a big-kernel -	testb	$LOADED_HIGH, %cs:loadflags	# Do we have a big kernel? -	jz	loader_ok			# No, no danger for old loaders. - -	cmpb	$0, %cs:type_of_loader 		# Do we have a loader that -						# can deal with us? -	jnz	loader_ok			# Yes, continue. - -	pushw	%cs				# No, we have an old loader, -	popw	%ds				# die.  -	lea	loader_panic_mess, %si -	call	prtstr - -	jmp	no_sig_loop - -loader_panic_mess: .string "Wrong loader, giving up..." - -loader_ok: -	/* check for long mode. */ -	/* we have to do this before the VESA setup, otherwise the user -	   can't see the error message. */ -	 -	pushw	%ds -	movw	%cs,%ax -	movw	%ax,%ds -	 -	call verify_cpu -	testl %eax,%eax -	jz sse_ok - -no_longmode: -	call	beep -	lea	long_mode_panic,%si -	call	prtstr -no_longmode_loop:		 -	jmp	no_longmode_loop -long_mode_panic: -	.string "Your CPU does not support long mode. Use a 32bit distribution." -	.byte 0 - -#include "../kernel/verify_cpu.S" -sse_ok: -	popw	%ds -	 -# tell BIOS we want to go to long mode -	movl  $0xec00,%eax	# declare target operating mode -	movl  $2,%ebx		# long mode -	int $0x15			 -	 -# Get memory size (extended mem, kB) - -	xorl	%eax, %eax -	movl	%eax, (0x1e0) -#ifndef STANDARD_MEMORY_BIOS_CALL -	movb	%al, (E820NR) -# Try three different memory detection schemes.  First, try -# e820h, which lets us assemble a memory map, then try e801h, -# which returns a 32-bit memory size, and finally 88h, which -# returns 0-64m - -# method E820H: -# the memory map from hell.  e820h returns memory classified into -# a whole bunch of different types, and allows memory holes and -# everything.  We scan through this memory map and build a list -# of the first 32 memory areas, which we return at [E820MAP]. -# This is documented at http://www.acpi.info/, in the ACPI 2.0 specification. - -#define SMAP  0x534d4150 - -meme820: -	xorl	%ebx, %ebx			# continuation counter -	movw	$E820MAP, %di			# point into the whitelist -						# so we can have the bios -						# directly write into it. - -jmpe820: -	movl	$0x0000e820, %eax		# e820, upper word zeroed -	movl	$SMAP, %edx			# ascii 'SMAP' -	movl	$20, %ecx			# size of the e820rec -	pushw	%ds				# data record. -	popw	%es -	int	$0x15				# make the call -	jc	bail820				# fall to e801 if it fails - -	cmpl	$SMAP, %eax			# check the return is `SMAP' -	jne	bail820				# fall to e801 if it fails - -#	cmpl	$1, 16(%di)			# is this usable memory? -#	jne	again820 - -	# If this is usable memory, we save it by simply advancing %di by -	# sizeof(e820rec). -	# -good820: -	movb	(E820NR), %al			# up to 128 entries -	cmpb	$E820MAX, %al -	jae	bail820 - -	incb	(E820NR) -	movw	%di, %ax -	addw	$20, %ax -	movw	%ax, %di -again820: -	cmpl	$0, %ebx			# check to see if -	jne	jmpe820				# %ebx is set to EOF -bail820: - - -# method E801H: -# memory size is in 1k chunksizes, to avoid confusing loadlin. -# we store the 0xe801 memory size in a completely different place, -# because it will most likely be longer than 16 bits. -# (use 1e0 because that's what Larry Augustine uses in his -# alternative new memory detection scheme, and it's sensible -# to write everything into the same place.) - -meme801: -	stc					# fix to work around buggy -	xorw	%cx,%cx				# BIOSes which don't clear/set -	xorw	%dx,%dx				# carry on pass/error of -						# e801h memory size call -						# or merely pass cx,dx though -						# without changing them. -	movw	$0xe801, %ax -	int	$0x15 -	jc	mem88 - -	cmpw	$0x0, %cx			# Kludge to handle BIOSes -	jne	e801usecxdx			# which report their extended -	cmpw	$0x0, %dx			# memory in AX/BX rather than -	jne	e801usecxdx			# CX/DX.  The spec I have read -	movw	%ax, %cx			# seems to indicate AX/BX  -	movw	%bx, %dx			# are more reasonable anyway... - -e801usecxdx: -	andl	$0xffff, %edx			# clear sign extend -	shll	$6, %edx			# and go from 64k to 1k chunks -	movl	%edx, (0x1e0)			# store extended memory size -	andl	$0xffff, %ecx			# clear sign extend - 	addl	%ecx, (0x1e0)			# and add lower memory into -						# total size. - -# Ye Olde Traditional Methode.  Returns the memory size (up to 16mb or -# 64mb, depending on the bios) in ax. -mem88: - -#endif -	movb	$0x88, %ah -	int	$0x15 -	movw	%ax, (2) - -# Set the keyboard repeat rate to the max -	movw	$0x0305, %ax -	xorw	%bx, %bx -	int	$0x16 - -# Check for video adapter and its parameters and allow the -# user to browse video modes. -	call	video				# NOTE: we need %ds pointing -						# to bootsector - -# Get hd0 data... -	xorw	%ax, %ax -	movw	%ax, %ds -	ldsw	(4 * 0x41), %si -	movw	%cs, %ax			# aka SETUPSEG -	subw	$DELTA_INITSEG, %ax		# aka INITSEG -	pushw	%ax -	movw	%ax, %es -	movw	$0x0080, %di -	movw	$0x10, %cx -	pushw	%cx -	cld -	rep - 	movsb -# Get hd1 data... -	xorw	%ax, %ax -	movw	%ax, %ds -	ldsw	(4 * 0x46), %si -	popw	%cx -	popw	%es -	movw	$0x0090, %di -	rep -	movsb -# Check that there IS a hd1 :-) -	movw	$0x01500, %ax -	movb	$0x81, %dl -	int	$0x13 -	jc	no_disk1 -	 -	cmpb	$3, %ah -	je	is_disk1 - -no_disk1: -	movw	%cs, %ax			# aka SETUPSEG -	subw	$DELTA_INITSEG, %ax 		# aka INITSEG -	movw	%ax, %es -	movw	$0x0090, %di -	movw	$0x10, %cx -	xorw	%ax, %ax -	cld -	rep -	stosb -is_disk1: - -# Check for PS/2 pointing device -	movw	%cs, %ax			# aka SETUPSEG -	subw	$DELTA_INITSEG, %ax		# aka INITSEG -	movw	%ax, %ds -	movb	$0, (0x1ff)			# default is no pointing device -	int	$0x11				# int 0x11: equipment list -	testb	$0x04, %al			# check if mouse installed -	jz	no_psmouse - -	movb	$0xAA, (0x1ff)			# device present -no_psmouse: - -#include "../../i386/boot/edd.S" - -# Now we want to move to protected mode ... -	cmpw	$0, %cs:realmode_swtch -	jz	rmodeswtch_normal - -	lcall	*%cs:realmode_swtch - -	jmp	rmodeswtch_end - -rmodeswtch_normal: -        pushw	%cs -	call	default_switch - -rmodeswtch_end: -# we get the code32 start address and modify the below 'jmpi' -# (loader may have changed it) -	movl	%cs:code32_start, %eax -	movl	%eax, %cs:code32 - -# Now we move the system to its rightful place ... but we check if we have a -# big-kernel. In that case we *must* not move it ... -	testb	$LOADED_HIGH, %cs:loadflags -	jz	do_move0			# .. then we have a normal low -						# loaded zImage -						# .. or else we have a high -						# loaded bzImage -	jmp	end_move			# ... and we skip moving - -do_move0: -	movw	$0x100, %ax			# start of destination segment -	movw	%cs, %bp			# aka SETUPSEG -	subw	$DELTA_INITSEG, %bp		# aka INITSEG -	movw	%cs:start_sys_seg, %bx		# start of source segment -	cld -do_move: -	movw	%ax, %es			# destination segment -	incb	%ah				# instead of add ax,#0x100 -	movw	%bx, %ds			# source segment -	addw	$0x100, %bx -	subw	%di, %di -	subw	%si, %si -	movw 	$0x800, %cx -	rep -	movsw -	cmpw	%bp, %bx			# assume start_sys_seg > 0x200, -						# so we will perhaps read one -						# page more than needed, but -						# never overwrite INITSEG -						# because destination is a -						# minimum one page below source -	jb	do_move - -end_move: -# then we load the segment descriptors -	movw	%cs, %ax			# aka SETUPSEG -	movw	%ax, %ds -		 -# Check whether we need to be downward compatible with version <=201 -	cmpl	$0, cmd_line_ptr -	jne	end_move_self		# loader uses version >=202 features -	cmpb	$0x20, type_of_loader -	je	end_move_self		# bootsect loader, we know of it - -# Boot loader doesnt support boot protocol version 2.02. -# If we have our code not at 0x90000, we need to move it there now. -# We also then need to move the params behind it (commandline) -# Because we would overwrite the code on the current IP, we move -# it in two steps, jumping high after the first one. -	movw	%cs, %ax -	cmpw	$SETUPSEG, %ax -	je	end_move_self - -	cli					# make sure we really have -						# interrupts disabled ! -						# because after this the stack -						# should not be used -	subw	$DELTA_INITSEG, %ax		# aka INITSEG -	movw	%ss, %dx -	cmpw	%ax, %dx -	jb	move_self_1 - -	addw	$INITSEG, %dx -	subw	%ax, %dx			# this will go into %ss after -						# the move -move_self_1: -	movw	%ax, %ds -	movw	$INITSEG, %ax			# real INITSEG -	movw	%ax, %es -	movw	%cs:setup_move_size, %cx -	std					# we have to move up, so we use -						# direction down because the -						# areas may overlap -	movw	%cx, %di -	decw	%di -	movw	%di, %si -	subw	$move_self_here+0x200, %cx -	rep -	movsb -	ljmp	$SETUPSEG, $move_self_here - -move_self_here: -	movw	$move_self_here+0x200, %cx -	rep -	movsb -	movw	$SETUPSEG, %ax -	movw	%ax, %ds -	movw	%dx, %ss -end_move_self:					# now we are at the right place -	lidt	idt_48				# load idt with 0,0 -	xorl	%eax, %eax			# Compute gdt_base -	movw	%ds, %ax			# (Convert %ds:gdt to a linear ptr) -	shll	$4, %eax -	addl	$gdt, %eax -	movl	%eax, (gdt_48+2) -	lgdt	gdt_48				# load gdt with whatever is -						# appropriate - -# that was painless, now we enable a20 -	call	empty_8042 - -	movb	$0xD1, %al			# command write -	outb	%al, $0x64 -	call	empty_8042 - -	movb	$0xDF, %al			# A20 on -	outb	%al, $0x60 -	call	empty_8042 - -# -#	You must preserve the other bits here. Otherwise embarrasing things -#	like laptops powering off on boot happen. Corrected version by Kira -#	Brown from Linux 2.2 -# -	inb	$0x92, %al			#  -	orb	$02, %al			# "fast A20" version -	outb	%al, $0x92			# some chips have only this - -# wait until a20 really *is* enabled; it can take a fair amount of -# time on certain systems; Toshiba Tecras are known to have this -# problem.  The memory location used here (0x200) is the int 0x80 -# vector, which should be safe to use. - -	xorw	%ax, %ax			# segment 0x0000 -	movw	%ax, %fs -	decw	%ax				# segment 0xffff (HMA) -	movw	%ax, %gs -a20_wait: -	incw	%ax				# unused memory location <0xfff0 -	movw	%ax, %fs:(0x200)		# we use the "int 0x80" vector -	cmpw	%gs:(0x210), %ax		# and its corresponding HMA addr -	je	a20_wait			# loop until no longer aliased - -# make sure any possible coprocessor is properly reset.. -	xorw	%ax, %ax -	outb	%al, $0xf0 -	call	delay - -	outb	%al, $0xf1 -	call	delay - -# well, that went ok, I hope. Now we mask all interrupts - the rest -# is done in init_IRQ(). -	movb	$0xFF, %al			# mask all interrupts for now -	outb	%al, $0xA1 -	call	delay -	 -	movb	$0xFB, %al			# mask all irq's but irq2 which -	outb	%al, $0x21			# is cascaded - -# Well, that certainly wasn't fun :-(. Hopefully it works, and we don't -# need no steenking BIOS anyway (except for the initial loading :-). -# The BIOS-routine wants lots of unnecessary data, and it's less -# "interesting" anyway. This is how REAL programmers do it. -# -# Well, now's the time to actually move into protected mode. To make -# things as simple as possible, we do no register set-up or anything, -# we let the gnu-compiled 32-bit programs do that. We just jump to -# absolute address 0x1000 (or the loader supplied one), -# in 32-bit protected mode. -# -# Note that the short jump isn't strictly needed, although there are -# reasons why it might be a good idea. It won't hurt in any case. -	movw	$1, %ax				# protected mode (PE) bit -	lmsw	%ax				# This is it! -	jmp	flush_instr - -flush_instr: -	xorw	%bx, %bx			# Flag to indicate a boot -	xorl	%esi, %esi			# Pointer to real-mode code -	movw	%cs, %si -	subw	$DELTA_INITSEG, %si -	shll	$4, %esi			# Convert to 32-bit pointer -# NOTE: For high loaded big kernels we need a -#	jmpi    0x100000,__KERNEL_CS -# -#	but we yet haven't reloaded the CS register, so the default size  -#	of the target offset still is 16 bit. -#	However, using an operand prefix (0x66), the CPU will properly -#	take our 48 bit far pointer. (INTeL 80386 Programmer's Reference -#	Manual, Mixing 16-bit and 32-bit code, page 16-6) - -	.byte 0x66, 0xea			# prefix + jmpi-opcode -code32:	.long	0x1000				# will be set to 0x100000 -						# for big kernels -	.word	__KERNEL_CS - -# Here's a bunch of information about your current kernel.. -kernel_version:	.ascii	UTS_RELEASE -		.ascii	" (" -		.ascii	LINUX_COMPILE_BY -		.ascii	"@" -		.ascii	LINUX_COMPILE_HOST -		.ascii	") " -		.ascii	UTS_VERSION -		.byte	0 - -# This is the default real mode switch routine. -# to be called just before protected mode transition -default_switch: -	cli					# no interrupts allowed ! -	movb	$0x80, %al			# disable NMI for bootup -						# sequence -	outb	%al, $0x70 -	lret - - -# This routine checks that the keyboard command queue is empty -# (after emptying the output buffers) -# -# Some machines have delusions that the keyboard buffer is always full -# with no keyboard attached... -# -# If there is no keyboard controller, we will usually get 0xff -# to all the reads.  With each IO taking a microsecond and -# a timeout of 100,000 iterations, this can take about half a -# second ("delay" == outb to port 0x80). That should be ok, -# and should also be plenty of time for a real keyboard controller -# to empty. -# - -empty_8042: -	pushl	%ecx -	movl	$100000, %ecx - -empty_8042_loop: -	decl	%ecx -	jz	empty_8042_end_loop - -	call	delay - -	inb	$0x64, %al			# 8042 status port -	testb	$1, %al				# output buffer? -	jz	no_output - -	call	delay -	inb	$0x60, %al			# read it -	jmp	empty_8042_loop - -no_output: -	testb	$2, %al				# is input buffer full? -	jnz	empty_8042_loop			# yes - loop -empty_8042_end_loop: -	popl	%ecx -	ret - -# Read the cmos clock. Return the seconds in al -gettime: -	pushw	%cx -	movb	$0x02, %ah -	int	$0x1a -	movb	%dh, %al			# %dh contains the seconds -	andb	$0x0f, %al -	movb	%dh, %ah -	movb	$0x04, %cl -	shrb	%cl, %ah -	aad -	popw	%cx -	ret - -# Delay is needed after doing I/O -delay: -	outb	%al,$0x80 -	ret - -# Descriptor tables -gdt: -	.word	0, 0, 0, 0			# dummy - -	.word	0, 0, 0, 0			# unused - -	.word	0xFFFF				# 4Gb - (0x100000*0x1000 = 4Gb) -	.word	0				# base address = 0 -	.word	0x9A00				# code read/exec -	.word	0x00CF				# granularity = 4096, 386 -						#  (+5th nibble of limit) - -	.word	0xFFFF				# 4Gb - (0x100000*0x1000 = 4Gb) -	.word	0				# base address = 0 -	.word	0x9200				# data read/write -	.word	0x00CF				# granularity = 4096, 386 -						#  (+5th nibble of limit) -gdt_end: -idt_48: -	.word	0				# idt limit = 0 -	.word	0, 0				# idt base = 0L -gdt_48: -	.word	gdt_end-gdt-1			# gdt limit -	.word	0, 0				# gdt base (filled in later) - -# Include video setup & detection code - -#include "../../i386/boot/video.S" - -# Setup signature -- must be last -setup_sig1:	.word	SIG1 -setup_sig2:	.word	SIG2 - -# After this point, there is some free space which is used by the video mode -# handling code to store the temporary mode table (not used by the kernel). - -modelist: - -.text -endtext: -.data -enddata: -.bss -endbss: diff --git a/arch/x86_64/boot/tools/build.c b/arch/x86_64/boot/tools/build.c deleted file mode 100644 index eae86691709..00000000000 --- a/arch/x86_64/boot/tools/build.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - *  Copyright (C) 1991, 1992  Linus Torvalds - *  Copyright (C) 1997 Martin Mares - */ - -/* - * This file builds a disk-image from three different files: - * - * - bootsect: compatibility mbr which prints an error message if - *             someone tries to boot the kernel directly. - * - setup: 8086 machine code, sets up system parm - * - system: 80386 code for actual system - * - * It does some checking that all files are of the correct type, and - * just writes the result to stdout, removing headers and padding to - * the right amount. It also writes some system data to stderr. - */ - -/* - * Changes by tytso to allow root device specification - * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996 - * Cross compiling fixes by Gertjan van Wingerde, July 1996 - * Rewritten by Martin Mares, April 1997 - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/sysmacros.h> -#include <unistd.h> -#include <fcntl.h> -#include <asm/boot.h> - -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned long u32; - -#define DEFAULT_MAJOR_ROOT 0 -#define DEFAULT_MINOR_ROOT 0 - -/* Minimal number of setup sectors (see also bootsect.S) */ -#define SETUP_SECTS 4 - -byte buf[1024]; -int fd; -int is_big_kernel; - -void die(const char * str, ...) -{ -	va_list args; -	va_start(args, str); -	vfprintf(stderr, str, args); -	fputc('\n', stderr); -	exit(1); -} - -void file_open(const char *name) -{ -	if ((fd = open(name, O_RDONLY, 0)) < 0) -		die("Unable to open `%s': %m", name); -} - -void usage(void) -{ -	die("Usage: build [-b] bootsect setup system [rootdev] [> image]"); -} - -int main(int argc, char ** argv) -{ -	unsigned int i, c, sz, setup_sectors; -	u32 sys_size; -	byte major_root, minor_root; -	struct stat sb; - -	if (argc > 2 && !strcmp(argv[1], "-b")) -	  { -	    is_big_kernel = 1; -	    argc--, argv++; -	  } -	if ((argc < 4) || (argc > 5)) -		usage(); -	if (argc > 4) { -		if (!strcmp(argv[4], "CURRENT")) { -			if (stat("/", &sb)) { -				perror("/"); -				die("Couldn't stat /"); -			} -			major_root = major(sb.st_dev); -			minor_root = minor(sb.st_dev); -		} else if (strcmp(argv[4], "FLOPPY")) { -			if (stat(argv[4], &sb)) { -				perror(argv[4]); -				die("Couldn't stat root device."); -			} -			major_root = major(sb.st_rdev); -			minor_root = minor(sb.st_rdev); -		} else { -			major_root = 0; -			minor_root = 0; -		} -	} else { -		major_root = DEFAULT_MAJOR_ROOT; -		minor_root = DEFAULT_MINOR_ROOT; -	} -	fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root); - -	file_open(argv[1]); -	i = read(fd, buf, sizeof(buf)); -	fprintf(stderr,"Boot sector %d bytes.\n",i); -	if (i != 512) -		die("Boot block must be exactly 512 bytes"); -	if (buf[510] != 0x55 || buf[511] != 0xaa) -		die("Boot block hasn't got boot flag (0xAA55)"); -	buf[508] = minor_root; -	buf[509] = major_root; -	if (write(1, buf, 512) != 512) -		die("Write call failed"); -	close (fd); - -	file_open(argv[2]);				    /* Copy the setup code */ -	for (i=0 ; (c=read(fd, buf, sizeof(buf)))>0 ; i+=c ) -		if (write(1, buf, c) != c) -			die("Write call failed"); -	if (c != 0) -		die("read-error on `setup'"); -	close (fd); - -	setup_sectors = (i + 511) / 512;	/* Pad unused space with zeros */ -	/* for compatibility with ancient versions of LILO. */ -	if (setup_sectors < SETUP_SECTS) -		setup_sectors = SETUP_SECTS; -	fprintf(stderr, "Setup is %d bytes.\n", i); -	memset(buf, 0, sizeof(buf)); -	while (i < setup_sectors * 512) { -		c = setup_sectors * 512 - i; -		if (c > sizeof(buf)) -			c = sizeof(buf); -		if (write(1, buf, c) != c) -			die("Write call failed"); -		i += c; -	} - -	file_open(argv[3]); -	if (fstat (fd, &sb)) -		die("Unable to stat `%s': %m", argv[3]); -	sz = sb.st_size; -	fprintf (stderr, "System is %d kB\n", sz/1024); -	sys_size = (sz + 15) / 16; -	if (!is_big_kernel && sys_size > DEF_SYSSIZE) -		die("System is too big. Try using bzImage or modules."); -	while (sz > 0) { -		int l, n; - -		l = (sz > sizeof(buf)) ? sizeof(buf) : sz; -		if ((n=read(fd, buf, l)) != l) { -			if (n < 0) -				die("Error reading %s: %m", argv[3]); -			else -				die("%s: Unexpected EOF", argv[3]); -		} -		if (write(1, buf, l) != l) -			die("Write failed"); -		sz -= l; -	} -	close(fd); - -	if (lseek(1, 497, SEEK_SET) != 497)		    /* Write sizes to the bootsector */ -		die("Output: seek failed"); -	buf[0] = setup_sectors; -	if (write(1, buf, 1) != 1) -		die("Write of setup sector count failed"); -	if (lseek(1, 500, SEEK_SET) != 500) -		die("Output: seek failed"); -	buf[0] = (sys_size & 0xff); -	buf[1] = ((sys_size >> 8) & 0xff); -	buf[2] = ((sys_size >> 16) & 0xff); -	buf[3] = ((sys_size >> 24) & 0xff); -	if (write(1, buf, 4) != 4) -		die("Write of image length failed"); - -	return 0;					    /* Everything is OK */ -}  |