Date: Tue, 7 Apr 1998 17:57:43 -0500 (CDT) From: "Roger P. Johnson" <rpj@fep.hirshfields.com> To: faq@FreeBSD.ORG Subject: Consider this Q & A concerning "Read error" on boot for the FreeBSD FAQ list. Message-ID: <199804072257.RAA08086@fep.hirshfields.com>
next in thread | raw e-mail | index | archive | help
Hello,
I am submitting this FAQ in hope that it may be entered into the official
FreeBSD FAQ. After experiencing this problem first hand, searching the net,
watching and posting to the mailing list, I have had no luck in getting a
decent reply in how to fix the problem or what is going wrong.
This problem is not just an isolated incident. In the approximately nine
months of monitoring the mailing lists, I am seeing this question posted
more and more from various users.
So I dug into the source code and this is what I found as the problem
and a solution to it.
Enclosed at the very end of this letter, is the post I am posting to
the questions@FreeBSD.org mailing list. That post goes into more detail,
and this letter is really just a summary of that.
IF you do decide to put this Q&A in the official FAQ, please feel free
edit this info to what is more appropriate for the FAQ.
Thanks,
Roger P. Johnson
rjohnson@hirshfields.com
(612) 374-0230
Here is the Q&A for the FAQ:
Q: I've just installed FreeBSD on my hard disk, and now when I boot, all
I get is "Read error". Now what?
A: 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).
Your BIOS bootstrap code is not passing the BIOS boot device in
register "dl". The FreeBSD boot program "boot1" which is on the
first sector of the disk, expects this to be in register dl. But
in your case, since it is not setup in the dl register, the way
boot1 is coded, it will then try to boot off of a bootable floppy
disk in the disk drive. And since you don't have a floppy in the
floppy disk drive, the boot1 program halts and issues the
"Read error" message.
To fix this quirk in your boot up procedure, you need to manually apply
a patch to the boot1 program, compile, install and reboot.
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. 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. :)
End of FAQ letter.
================================================================================
Beginning of my detailed posting to "questions@FreeBSD.org"
================================================================================
Hi!
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?199804072257.RAA08086>
