Date: Fri, 30 Jul 1999 23:05:05 +0200 To: linux-kernel@vger.rutgers.edu From: Yann Droneaud <lch@multimania.com> Subject: Boot code rewritten for GAS Here are the bootloader, setup and video code for GNU as. It is quite the same than for as86. Changes: -------- Some string have been changed tools/build.c has been updated to support binary file made by objcopy -O binary Added svga.h and some define for SVGA detection compressed/head.S -> changed some %ax to %eax (search for XXX) Why: ---- I hate as86/ld86 :-) Seriously the bin86 distribution is quite poor of documentation... And since GNU as have support for writing 16bits code, we don't need those old tools... Tests: ------ It work well on my systems. (IBM PS/VP 486DX/2 66, S3 chip integrated and Pentium 200,Bios Award,Matrox Millennium) zdisk/bzdisk boot correctly. LILO/Loadlin/GRUB load zImage/bzImage correctly VESA VGA and S3 video card detection ok Video mode selection is ok. It work with binutils-2.9.1.0.11 and binutils-2.9.5.0.3 (NOTE with binutils-2.9.5.0.3 a lot of warning occurs during the compilation of the kernel 16bits register use instead of 32bits example movl %cx,%fs instead of movl %ecx,%fs ) How to install: --------------- Untargz the archive in your kernel source tree # cd /usr/src/linux # tar xvvzf <boot-gas.tar.gz> # cd arch/i386 # mv boot boot-as86 # ln -s boot-gas/ boot If you choose to use it, make a symlink 'boot' to boot-gas/ Others: ------- Here are patches for arch/i386/kernel/{entry.S,head.S} ======================================================== --- head.S~ Fri Jan 15 07:57:25 1999 +++ head.S Tue Jul 27 18:49:44 1999 @@ -45,10 +45,10 @@ */ cld movl $(__KERNEL_DS),%eax - movl %ax,%ds - movl %ax,%es - movl %ax,%fs - movl %ax,%gs + movl %eax,%ds /* XXX movl %ax,%ds */ + movl %eax,%es /* XXX movl %ax,%es */ + movl %eax,%fs /* XXX movl %ax,%fs */ + movl %eax,%gs /* XXX movl %ax,%gs */ #ifdef __SMP__ orw %bx,%bx jz 1f @@ -229,18 +229,18 @@ lidt idt_descr ljmp $(__KERNEL_CS),$1f 1: movl $(__KERNEL_DS),%eax # reload all the segment registers - movl %ax,%ds # after changing gdt. - movl %ax,%es - movl %ax,%fs - movl %ax,%gs + movl %eax,%ds # after changing gdt. /* XXX movl %ax,%ds */ + movl %eax,%es /* XXX movl %ax,%es */ + movl %eax,%fs /* XXX movl %ax,%fs */ + movl %eax,%gs /* XXX movl %ax,%gs */ #ifdef __SMP__ movl $(__KERNEL_DS), %eax - mov %ax,%ss # Reload the stack pointer (segment only) + mov %ax,%ss # Reload the stack pointer (segment only) /* XXX 16bits or 32bits ? */ #else lss stack_start,%esp # Load processor stack #endif xorl %eax,%eax - lldt %ax + lldt %ax /* XXX %ax or %eax ? */ cld # gcc2 wants the direction flag cleared at all times call SYMBOL_NAME(start_kernel) L6: @@ -312,8 +312,8 @@ pushl %es pushl %ds movl $(__KERNEL_DS),%eax - movl %ax,%ds - movl %ax,%es + movl %eax,%ds /* XXX movl %ax,%ds */ + movl %eax,%es /* XXX movl %ax,%es */ pushl $int_msg call SYMBOL_NAME(printk) popl %eax --- entry.S~ Tue Jul 27 18:38:56 1999 +++ entry.S Tue Jul 27 18:39:29 1999 @@ -92,8 +92,8 @@ pushl %ecx; \ pushl %ebx; \ movl $(__KERNEL_DS),%edx; \ - movl %dx,%ds; \ - movl %dx,%es; + movl %edx,%ds; \ /* XXX movl %dx,%ds */ + movl %edx,%es; /* XXX movl %dx,%es */ #define RESTORE_ALL \ popl %ebx; \