Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Jun 1998 13:08:08 -0500 (CDT)
From:      "Roger P. Johnson" <rpj@fep.hirshfields.com>
To:        igorfinkiel@gameshighway.com
Cc:        freebsd-questions@FreeBSD.ORG
Subject:   Re: Compatibility of Adaptec AIC7880.
Message-ID:  <199806031808.NAA11501@fep.hirshfields.com>
In-Reply-To: <35754078.1F669FD1@we.lc.ehu.es> from "Jose M. Alcaide" at "Jun 3, 98 02:24:24 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
> Ignacio Gorfinkiel <igorfinkiel@gameshighway.com> wrote:
> > We are trying to install Freebsd 2.2.5 on a PC with a Adaptec AIC 7880
> > ultra-wide on board SCSI controller revision 1.26 sP7, and we are
> > getting s read error after succesful install.
> > Has anyone had any luck with this controller?, or can explain the read
> > error?.
> 
> Please, give more details about that "read error", i.e., the exact
> messages. 
> 

Oh jeez. IF you are getting "Read error" after you shutdown and reboot,
then you have to apply a patch to your boot1 program as described below.

I posted this back in March. Here is the repost of how to fix it.

BTW, who's BIOS is yours manufactured by ??  I have had 2 major hold
ups due to using the Phoenix BIOS, I highly recommend not even buying
any machines that use it. FWIW.

   Roger

==================================================================================
Here is the answer to "Read error" part:
==================================================================================

   For all of you that have encountered this annoyance of a problem, I have
good news for you! Below are the hows and whys of the "Read error" message
that you receive on boot after installing FreeBSD.

   I have been trying to get an answer to this for the last 6-9+ months, and
have been unable to get an explanation of what this problem is and how to
_really_ fix it.

   Finally I started looking at the startup code and found the problem.
Isn't having the source code available wonderful?  :)

   I checked the FreeBSD homepage pertaining to FAQ Question #103 which
only mentions the "Read error" in passing, but to no use.

   A similar post to this has been submitted to the FAQ maintainers. Maybe
it can be put in the FAQ for the next poor soul that encounter this.

   OK. Here's the stuff you want to know:




Q: I've just installed FreeBSD on my hard disk, and now when I boot, all
   I get is "Read error". Now what?


   Chances are, you have a SCSI controller card, a SCSI hard disk as the boot
device, and you've installed FreeBSD dedicating the whole drive so as not
to remain "cooperative" with other OS's.

   First of all, let me say this: This is problem ...
      is NOT a "geometry" problem,
      is NOT an "fdisk" problem,
      is NOT a "disklabel" problem,
      and you did NOT install FreeBSD incorrectly on the disk (at this point).


   So here is what I am going to cover:  What circumstances does this occur
under? Where does the message come from ? Why does it occur? and finally,
What's the solution ?



1.  Circumstances:
    ==============

       As mention earlier, you probably have a SCSI controller, a SCSI hard
disk that you are using to boot from, you dedicated FreeBSD to the whole
drive, and just some bad luck. I Don't believe this happens with IDE drives.

       I have all Phoenix BIOS's, Adaptec controllers and all Seagate SCSI
hard drives and this happens to me. And other posters don't give all the
complete hardware details of their system to compare with.

(I don't believe that the BIOS in the PC ROM is the BIOS that boots the system,
but the BIOS in your SCSI Controller card that is performing the boot. (Just
try turning off the DOS INT 13H stuff on the SCSI card and see what you get).
Thus I don't know if it matters whether you have a Phoenix BIOS (like all
my machines do) or whether you are using maybe AMI etc. etc. and
encountering this.)



2. Where does the message come from ?
   ==================================

    The message indeed comes from not the BIOS, but FreeBSD, namely the
"boot1" program which lies on sector 0 of the hard disk. This first sector
of the hard disk is commonly known as the "boot block" and also as the
"Master Boot Record" or "MBR" for short.

    This boot block is the first block that is read off of the hard disk,
placed into memory, and jumped to by the bootstrapping microcode in the BIOS.
 
    Buried in the boot code is the "Read error" message, along with another
message "No bootable partition".

    This boot code also holds the fdisk partion table. When dedicating the
whole drive to FreeBSD, this is just a "dummy" fdisk table.



3. Why does it occur ?
   ===================
    
    The reason this is occurs is because the FreeBSD boot1 program expects
the BIOS boot device number to be passed to it in the "dl" register by the
BIOS bootstrap code. 

    A note here, is that ALL disk i/o activity is handled by the system BIOS
UNTIL the kernel is loaded and started. Then the disk i/o bypasses the BIOS
through the SCSI sub-system. (The BIOS calls are the int 13h stuff ...)

    Apparently, and I do not know why, there are circumstances in which the
BIOS bootstrap code fails to place the BIOS boot device number into this
register.  Without this device number in register dl, the boot1 program doesn't
branch to the normal booting off the hard drive code. But instead, it tries to
boot off of the floppy disk. Yes the floppy disk. But since their isn't a
bootable floppy disk in the dirve, the BIOS call to read the boot block off of
the floppy disk fails, and finally boot1 issues a "Read error" and terminates
(actually, it "terminates" by puting itself into an endless loop). 

    So when you get "Read error", it has absolutely nothing to do with your hard
drive! Very misleading!



4. What's the solution ?
   =======================

    There are 2 options. Both easy to do.

    1. You can do a "shared" or cooperative installation and live with it. Yuck.
   -or-
    2. You can apply two lines of assembler code to the boot1 program, compile
       and install it on your hard drive. (You don't have to know assembler
       to fix this folks).

    I won't discuss option number 1, so here is how to do option 2.

    Enclosed at the end of this post is my complete fixed boot1 program
    and a listing of just the diffs.

    How to fix:
    ----------=

    1. Since you are getting a "Read error", boot off of the floppy boot disk
       and at the "Boot:" prompt type:   0:sd(0,a)/kernel
       This will load the kernel from the hard disk and get you going like you
       didn't have any problem booting.
    2. Make sure the kernel source is installed.
    3. Become the super user.
    4. # cd /usr/mdec
       This is where a copy your boot code lies. boot1 and boot2 is the code
       that lies on sector 0 and sector 1 respectively.
       Do a "strings boot1" and you will see the "Read error" message in it.
    5. Make a backup copy of boot1 and boot2 so you can always restore the
       boot code back.
    6. # cd /usr/src/sys/i386/boot/biosboot
       This is the source code directory for boot1 and boot2. The files here
       are all prety much in assembler.
    7. Make a backup copy of "start.S"
       This is a small program written in assembler. When it gets compiled,
       it will become the boot1 prograrm. This is the file we want to modify.
    8. Either use my "start.S" file enclosed, or edit your own start.S file and
       put following code in right below the "fd:" label in start.S:

<------- snip here ------------------->
        mov     $0x0080, %edx
        jmp     hd
<------- end snip ------------------->


       If you want boot1 to display a message to your console, saying something
       like it can't boot properly and it's taking this catch all branch
       instead, tailor this to your liking and place below the "fd:" label
       vs. using the code just above:


<------- snip here ------------------->
        data32
        mov     $msg1, %esi
        data32
        call    message
        data32
        mov     $msg2, %esi     
        data32                  
        call    message
        data32                  
        
        mov     $0x0080, %edx
        jmp     hd
 
msg1: String "boot1: BIOS bootstrap code failed to specify drive.\r\n\0"
msg2: String "boot1: using hard coded boot device as hard disk (0x80).\r\n\0"
<------- end snip ------------------->
      
       DON'T get to message happy, as the whole boot1 program has to fit into
       one 512 byte sector size.

    9. Save your changes
   10. # make
   11. # make install
       This will overwrite boot1 and boot2 in /usr/mdec.
   12. # disklabel -B -b boot1 sd0
       This will install /usr/mdec/boot1 onto sector 0 of the hard drive
       for booting. 
   13. Remove the floppy from the drive if you haven't done so.
   14. # reboot
       Now your message should appear (if you had put one in start.S) and then
       should see the FreeBSD "Boot:" prompt on your screen. This "Boot:" 
       prompt is from sector 1 of your hard disk, which is boot2, so you now
       know that boot1 is working!
       Yeah.  :)



4.  Comments
    =========

      I say that this is a BIOS/Hard drive combonation problem, and NOT just a
BIOS quirk as some say. This is why: 
    
         Given one machine of mine, if I install FreeBSD onto a 1.1 GB SCSI HD
using an Adaptec 2940U SCSI-2 controller, I get "Read error". Now, take that
drive out. Replace it with a 2.1 GB SCSI HD, install FreeBSD and it boots and
works correctly! Seeing how the ONLY change in the system was the hard drives
(both where Seagate by the way), it is not isolated to _just_ the BIOS itself.
Weird.

      I have been through so many combonations of drives (old and new), 
controllers and PC's that I can't even count them. I can sum it up this way:
  Adaptec 2940 series with Seagate 1.1GB hard drives --> Read error.
  Adaptec 1542 series with Seagate 1.1GB hard drives --> OK.

      One thing that is nice about the way the code is patched in start.S is
that you can use that boot1 code on any dedicated FreeBSD machine you have.
If you have a "normal" booting machine, it will never hit the patched code.
If you have a "Read error" machine, then the patch will catch it and still
let you boot. This solved a dilema I had in that I have a bunch of production
machines using the 1542 series, but I am slowly upgrading them to the 2940AU
series. Well, now I can have one hot spare disk with the patched boot code on
it for when/if I have a hard disk crash, I know that the drive will boot with
either controller on it. It also answers my question of the SCSI formats and
how backward compatable SCSI is. I can put in a 2940AU and run FreeBSD that was
installed on the disk via an old 1542B card and run with it. 

      What causes the BIOS to pass the BIOS boot drive number into register dl
in one situation and not the next, I don't know why. Maybe there is a
BIOS/assembler guru out there that can answer this ;) ?
                 
    I would like to know if Linux does/would have this problem as well. I am
real tempted to buy a copy of Linux to test it out this hardware setup that
I have.

    I hope I have helped others with this post. Maybe the FreeBSD team can redo
the startup code to address this in some way?

    Good luck,

       Roger "getting into the hardware more that I wanna" Johnson
       rjohnson@hirshfields.com

<----------------- here is my "start.S" file ---------------------------------->
/*
 * Mach Operating System
 * Copyright (c) 1992, 1991 Carnegie Mellon University
 * All Rights Reserved.
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 * 
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 * 
 * Carnegie Mellon requests users of this software to return to
 * 
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 * 
 * any improvements or extensions that they make and grant Carnegie Mellon
 * the rights to redistribute these changes.
 *
 *	from: Mach, Revision 2.2  92/04/04  11:36:29  rpd
 *	$Id: start.S,v 1.8 1996/07/12 05:42:02 bde Exp $
 */

/*
  Copyright 1988, 1989, 1990, 1991, 1992 
   by Intel Corporation, Santa Clara, California.

                All Rights Reserved

Permission to use, copy, modify, and distribute this software and
its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appears in all
copies and that both the copyright notice and this permission notice
appear in supporting documentation, and that the name of Intel
not be used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission.

INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include	"asm.h"

	.file	"start.S"

SIGNATURE=	0xaa55
LOADSZ=		15	/* size of unix boot */
PARTSTART=	0x1be	/* starting address of partition table */
NUMPART=	4	/* number of partitions in partition table */
PARTSZ=		16	/* each partition table entry is 16 bytes */
BSDPART=	0xA5	/* value of boot_ind, means bootable partition */
BOOTABLE=	0x80	/* value of boot_ind, means bootable partition */
NAMEBLOCKMAGIC=	0xfadefeed /* value of magicnumebr for block2 	*/

/*
 * This DEBUGMSG(msg) macro may be useful for debugging.  Its use is
 * restricted to this file since it only works in real mode.
 */
#define DEBUGMSG(msg)		\
	data32			; \
	mov	$msg, %esi	; \
	data32			; \
	call	message

	.text	

ENTRY(boot1)
	/*
	 * start (aka boot1) is loaded at 0x0:0x7c00 but we want 0x7c0:0
	 * ljmp to the next instruction to adjust %cs
	 */
	data32
	ljmp $0x7c0, $start

start:
	/* set up %ds */
	mov	%cs, %ax
	mov	%ax, %ds

	/* set up %ss and %esp */
	data32
	mov	$BOOTSEG, %eax
	mov	%ax, %ss
	/*
	 * make a little room on the stack for
	 * us to save the default bootstring we might find..
	 * effectively, we push the bootstring.
	 */
	data32
	mov	$BOOTSTACK-64, %esp

	/* set up %es, (where we will load boot2 to) */
	mov	%ax, %es


	/* bootstrap passes us drive number in %dl */
	cmpb	$0x80, %dl
	data32
	jae	hd

fd:

	data32
	mov	$msg1, %esi
	data32
	call	message
	data32
	mov	$msg2, %esi
	data32
	call	message
	data32

	mov	$0x0080, %edx
	jmp	hd


	/*
	 * XXX some bootstraps don't pass the drive number in %dl.
	 * This is a problem mainly when we are block 0 on a floppy.
	 * Force drive 0 for floppies.
	 * XXX %dl was assumed valid in the test that led here.
	 */
	mov	$0x0, %dl

	/* reset the disk system */
	movb	$0x0, %ah
	int	$0x13
	data32
	mov	$0x0001, %ecx	/* cyl 0, sector 1 */
	movb	$0, %dh		/* head */
	data32
	jmp	load

hd:	/**** load sector 0 into the BOOTSEG ****/
	data32
	mov	$0x0201, %eax
	xor	%ebx, %ebx	/* %bx = 0 */
	data32
	mov	$0x0001, %ecx
	data32
	andl	$0xff, %edx
	/*mov	$0x0080, %edx*/
	int	$0x13
	data32
	jb	read_error

	/* find the first 386BSD partition */
	data32
	mov	$PARTSTART, %ebx
	data32
	mov	$NUMPART, %ecx
again:
	addr32
	movb	%es:4(%ebx), %al
	cmpb	$BSDPART, %al
	data32
	je	found
	data32
	add	$PARTSZ, %ebx
	data32
	loop	again
	data32
	mov	$enoboot, %esi
	data32
	jmp	err_stop


/*
 * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
 *	Call with	%ah = 0x2
 *			%al = number of sectors
 *			%ch = cylinder
 *			%cl = sector
 *			%dh = head
 *			%dl = drive (0x80 for hard disk, 0x0 for floppy disk)
 *			%es:%bx = segment:offset of buffer
 *	Return:
 *			%al = 0x0 on success; err code on failure
 */

found:
	addr32
	movb	%es:1(%ebx), %dh /* head */
	addr32
	movl	%es:2(%ebx), %ecx /*sect, cyl (+ 2 bytes junk in top word) */

load:
#ifdef NAMEBLOCK
/*
 * Load the second sector and see if it is a boot instruction block.
 * If it is then scan the contents for the first valid string and copy it to 
 * the location of the default boot string.. then zero it out.
 * Finally write the block back to disk with the zero'd out entry..
 * I hate writing at this stage but we need this to be persistant.
 * If the boot fails, then the next boot will get the next string.
 * /etc/rc will regenerate a complete block2 iff teh boot succeeds.
 *
 * Format of block 2 is:
 * [NAMEBLOCKMAGIC] <--0xdeafc0de
 * [nulls]
 * [bootstring]NULL  <---e.g. 0:wd(0,a)/kernel.experimental
 * [bootstring]NULL  <---e.g. 0:wd(0,a)/kernel.old
 * ....
 * [bootstring]NULL  <---e.g. 0:wd(0,f)/kernel
 * FF FF FF
 */
where:
	/*
	 * save things we might smash
	 * (that are not smashed immedatly after us anyway.)
	 */
	data32
	push	%ecx	/* preserve 'cyl,sector ' */
	data32
	push	%edx
/* 
 * Load the second sector
 * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
 *	Call with	%ah = 0x2
 *			%al = number of sectors
 *			%ch = cylinder
 *			%cl = sector
 *			%dh = head
 *			%dl = drive (0x80 for hard disk, 0x0 for floppy disk)
 *			%es:%bx = segment:offset of buffer
 *	Return:
 *			%al = 0x0 on success; err code on failure
 */
	data32
	movl	$0x0201, %eax	/function 2 (read) 1 sector */
	xor	%ebx, %ebx	/* %bx = 0 */ /* buffer address (ES:0) */
	data32
	movl	$0x0002, %ecx	/* sector 2, cylinder 0 */
	data32
	andl	$0x00ff, %edx	/* head 0, drive N */
	int	$0x13
	data32
	jb	read_error
	/*
	 * confirm that it is one for us
	 */
	data32
	xorl	%ebx, %ebx	/* magic number at start of buffer */
	data32
	addr32
	movl	%es:(%ebx), %eax
	data32
	cmpl	$NAMEBLOCKMAGIC, %eax
	data32
	jne	notours		/* not ours so return to caller */
	/*
	 * scan for a bootstring
	 * Skip the magic number, and scan till we find a non-null,
	 * or a -1
	 */
	incl	%ebx	/* quicker and smaller */
	incl	%ebx
	incl	%ebx
scan:
	incl	%ebx
	addr32
	movb	%es:(%ebx), %al	/* load the next byte */
	testb	%al, %al	/* and if it is null */
	data32			/* keep scanning (past deleted entries) */
	jz scan
	incb	%al		/* now look for -1 */
	data32
	jz	notours		/* if we reach the 0xFF then we have finished */

	/*
	 * save our settings.. we need them twice..
	 */
	data32
	push	%ebx
	/*
	 * copy it to the default string location
	 * which is just above the stack for 64 bytes.
	 */
	data32
	movl	$BOOTSTACK-64, %ecx	/* 64 bytes at the top of the stack */
nxtbyte:
	addr32
	movb	%es:(%ebx), %al	/* get the next byte in */
	addr32
	movb	%al, %es:(%ecx)	/* and transfer it to the name buffer */
	incl	%ebx		/* get on with the next byte */
	incl	%ecx		/* get on with the next byte */
	testb	%al, %al	/* if it was 0 then quit this */
	data32
	jnz nxtbyte		/* and looop if more to do */ 
	
	/*
	 * restore the saved settings and
	 * zero it out so next time we don't try it again
	 */
	data32
	pop	%ebx		/* get back our starting location */
#ifdef	NAMEBLOCK_WRITEBACK
nxtbyte2:
	addr32
	movb	%es:(%ebx), %al	/* get the byte */
	addr32
	movb	$0,  %es:(%ebx)	/* zero it out */
	data32
	incl	%ebx		/* point to the next byte */
	testb	%al, %al	/* check if we have finished.. */
	data32
	jne nxtbyte2
/* 
 * Write the second sector back
 * Load the second sector
 * BIOS call "INT 0x13 Function 0x3" to write sectors from memory to disk
 *	Call with	%ah = 0x3
 *			%al = number of sectors
 *			%ch = cylinder
 *			%cl = sector
 *			%dh = head
 *			%dl = drive (0x80 for hard disk, 0x0 for floppy disk)
 *			%es:%bx = segment:offset of buffer
 *	Return:
 *			%al = 0x0 on success; err code on failure
 */
	data32
	movl	$0x0301, %eax	/* write 1 sector */
	xor	%ebx, %ebx	/* buffer is at offset 0 */ 
	data32
	movl	$0x0002, %ecx	/* block 2 */
	data32
	andl	$0xff, %edx	/* head 0 */
	int	$0x13
	data32
	jnb	notours
	data32
	mov	$eread, %esi
	jmp	err_stop
#endif	/* NAMEBLOCK_WRITEBACK */
	/*
	 * return to the main-line
	 */
notours:
	data32
	pop	%edx
	data32
	pop	%ecx
#endif
	movb	$0x2, %ah	/* function 2 */
	movb	$LOADSZ, %al	/* number of blocks */
	xor	%ebx, %ebx	/* %bx = 0, put it at 0 in the BOOTSEG */
	int	$0x13
	data32
	jb	read_error

	/*
	 * ljmp to the second stage boot loader (boot2).
	 * After ljmp, %cs is BOOTSEG and boot1 (512 bytes) will be used
	 * as an internal buffer "intbuf".
	 */

	data32
	ljmp	$BOOTSEG, $ EXT(boot2)

/*
 * read_error
 */
read_error:
	data32
	mov	$eread, %esi
err_stop:
	data32
	call	message
	data32
	jmp	stop

/*
 * message: write the error message in %ds:%esi to console
 */
message:
	/*
	 * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
	 *	%ah = 0xe	%al = character
	 *	%bh = page	%bl = foreground color (graphics modes)
	 */

	data32
	push	%eax
	data32
	push	%ebx
	data32
	mov	$0x0001, %ebx
	cld

nextb:
	lodsb			/* load a byte into %al */
	cmpb	$0x0, %al
	data32
	je	done
	movb	$0xe, %ah
	int	$0x10		/* display a byte */
	data32
	jmp	nextb
done:
	data32
	pop	%ebx
	data32
	pop	%eax
	data32
	ret

stop:	hlt
	data32
	jmp	stop		/* halt doesnt actually halt forever */

/* error messages */


#ifdef	DEBUG
one:	String		"1-\0"
two:	String		"2-\0"
three:	String		"3-\0"
four:	String		"4-\0"
#endif	DEBUG
#ifdef 	NAMEBLOCK_WRITEBACK
ewrite:	String		"Write error\r\n\0"
#endif	/* NAMEBLOCK_WRITEBACK */
eread:	String		"Read error\r\n\0"
enoboot: String		"No bootable partition\r\n\0"
msg1: String		"boot1: BIOS bootstrap code failed to specify drive.\r\n\0"
msg2: String		"boot1: using hard coded boot device as hard disk (0x80).\r\n\0"
endofcode:
/*
 * Dummy partition table in case we are block 0.  The ending c/h/s values
 * of the non-null partition are almost arbitary.  The length of this
 * partition is bogus for backwards compatibility and as a signature.
 * A real partition table shouldn't be as weird and broken as this one,
 * and the isa slice initialization routine interprets this table as
 * saying that the whole disk is used for FreeBSD.
 */
/* flag, head, sec, cyl, typ, ehead, esect, ecyl, start, len */
	. = EXT(boot1) + PARTSTART
strttbl:
	.byte 0x0,0,0,0,0,0,0,0
	.long 0,0
	.byte 0x0,0,0,0,0,0,0,0
	.long 0,0
	.byte 0x0,0,0,0,0,0,0,0
	.long 0,0
	.byte BOOTABLE,0,1,0,BSDPART,255,255,255
	.long 0,50000
/* the last 2 bytes in the sector 0 contain the signature */
	. = EXT(boot1) + 0x1fe
	.value	SIGNATURE
ENTRY(disklabel)
	. = EXT(boot1) + 0x400	
<-----------------  end of my "start.S file  ---------------------------------->

<----------------- here is my diffs file: diff start.S start.S.orig ----------->
112,126d111
< 
< 	data32
< 	mov	$msg1, %esi
< 	data32
< 	call	message
< 	data32
< 	mov	$msg2, %esi
< 	data32
< 	call	message
< 	data32
< 
< 	mov	$0x0080, %edx
< 	jmp	hd
< 
< 
437,438d421
< msg1: String		"boot1: BIOS bootstrap code failed to specify drive.\r\n\0"
< msg2: String		"boot1: using hard coded boot device as hard disk (0x80).\r\n\0"
<-----------------  end of my diffs file: diff start.S start.S.orig  ---------->


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806031808.NAA11501>