svn commit: r223597 - head/sys/boot/i386/zfsboot

John Baldwin jhb at FreeBSD.org
Mon Jun 27 13:58:25 UTC 2011


Author: jhb
Date: Mon Jun 27 13:58:24 2011
New Revision: 223597
URL: http://svn.freebsd.org/changeset/base/223597

Log:
  - Remove the fake BPB from zfsldr.  zfsldr doesn't support booting from
    floppies, so it will not be used as the start of an emulated floppy
    image on a bootable CD which is what the fake BPB was used for.
  - Only check that EDD packet mode is available once at the start of
    zfsldr rather than for each disk sector now that we read data in one
    sector at a time.  As a result, collapse the remaining bits of read
    up into nread and rename nread to read.
  - Restore a return at the end of putstr that I removed in the previous
    revision.
  
  Tested by:	Henri Hennebert (earlier version)
  MFC after:	1 week

Modified:
  head/sys/boot/i386/zfsboot/Makefile
  head/sys/boot/i386/zfsboot/zfsldr.S

Modified: head/sys/boot/i386/zfsboot/Makefile
==============================================================================
--- head/sys/boot/i386/zfsboot/Makefile	Mon Jun 27 13:23:51 2011	(r223596)
+++ head/sys/boot/i386/zfsboot/Makefile	Mon Jun 27 13:58:24 2011	(r223597)
@@ -57,7 +57,7 @@ zfsboot1: zfsldr.out
 	objcopy -S -O binary zfsldr.out ${.TARGET}
 
 zfsldr.out: zfsldr.o
-	${LD} ${LDFLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} zfsldr.o
+	${LD} ${LDFLAGS} -e main -Ttext ${ORG1} -o ${.TARGET} zfsldr.o
 
 CLEANFILES+=	zfsboot2 zfsboot.ld zfsboot.ldr zfsboot.bin zfsboot.out \
 		zfsboot.o zfsboot.s zfsboot.s.tmp sio.o cons.o drv.o util.o

Modified: head/sys/boot/i386/zfsboot/zfsldr.S
==============================================================================
--- head/sys/boot/i386/zfsboot/zfsldr.S	Mon Jun 27 13:23:51 2011	(r223596)
+++ head/sys/boot/i386/zfsboot/zfsldr.S	Mon Jun 27 13:58:24 2011	(r223597)
@@ -34,46 +34,9 @@
 		.set SIZ_SEC,0x200		# Sector size
 
 		.set NSECT,0x80
-		.globl start
+		.globl main
 		.code16
 
-start:		jmp main			# Start recognizably
-
-/*
- * This is the start of a standard BIOS Parameter Block (BPB). Most bootable
- * FAT disks have this at the start of their MBR. While normal BIOS's will
- * work fine without this section, IBM's El Torito emulation "fixes" up the
- * BPB by writing into the memory copy of the MBR. Rather than have data
- * written into our code, we'll define a BPB to work around it.
- * The data marked with (T) indicates a field required for a ThinkPad to
- * recognize the disk and (W) indicates fields written from IBM BIOS code.
- * The use of the BPB is based on what OpenBSD and NetBSD implemented in
- * their boot code but the required fields were determined by trial and error.
- *
- * Note: If additional space is needed in boot1, one solution would be to
- * move the "prompt" message data (below) to replace the OEM ID.
- */
-		.org 0x03, 0x00
-oemid:		.space 0x08, 0x00	# OEM ID
-
-		.org 0x0b, 0x00
-bpb:		.word   512		# sector size (T)
-		.byte	0		# sectors/clustor
-		.word	0		# reserved sectors
-		.byte	0		# number of FATs
-		.word	0		# root entries
-		.word	0		# small sectors
-		.byte	0		# media type (W)
-		.word	0		# sectors/fat
-		.word	18		# sectors per track (T)
-		.word	2		# number of heads (T)
-		.long	0		# hidden sectors (W)
-		.long	0		# large sectors
-
-		.org 0x24, 0x00
-ebpb:		.byte	0		# BIOS physical drive number (W)
-
-		.org 0x25,0x90
 /*
  * Load the rest of zfsboot2 and BTX up, copy the parts to the right locations,
  * and start it all up.
@@ -90,18 +53,17 @@ main:		cld				# String ops inc
 		mov %cx,%ss			# Set up
 		mov $start,%sp			#  stack
 /*
- * If we are on a hard drive, then load the MBR and look for the first
- * FreeBSD slice.  We use the fake partition entry below that points to
- * the MBR when we call nread.  The first pass looks for the first active
- * FreeBSD slice.  The second pass looks for the first non-active FreeBSD
- * slice if the first one fails.
+ * Load the MBR and look for the first FreeBSD slice.  We use the fake
+ * partition entry below that points to the MBR when we call read.
+ * The first pass looks for the first active FreeBSD slice.  The
+ * second pass looks for the first non-active FreeBSD slice if the
+ * first one fails.
  */
+		call check_edd		 	# Make sure EDD works
 		mov $part4,%si			# Dummy partition
-		cmpb $0x80,%dl			# Hard drive?
-		jb main.4			# No
 		xor %eax,%eax			# Read MBR
 		movl $MEM_BUF,%ebx		#  from first
-		callw nread			#  sector
+		call read			#  sector
 		mov $0x1,%cx	 		# Two passes
 main.1: 	mov $MEM_BUF+PRT_OFF,%si	# Partition table
 		movb $0x1,%dh			# Partition
@@ -122,10 +84,6 @@ main.3: 	add $0x10,%si	 		# Next entry
  */
 		mov $msg_part,%si		# Message
 		jmp error			# Error
-/*
- * Floppies use partition 0 of drive 0.
- */
-main.4: 	xor %dx,%dx			# Partition:drive
 
 /*
  * Ok, we have a slice and drive in %dx now, so use that to locate and
@@ -153,7 +111,7 @@ main.5: 	mov %dx,MEM_ARG			# Save args
 		movl $1024,%eax			# Offset to boot2
 		mov $MEM_BTX,%ebx		# Destination buffer
 main.6:		pushal				# Save params
-		callw nread			# Read disk
+		call read			# Read disk
 		popal				# Restore
 		incl %eax			# Advance to
 		add $SIZ_SEC,%ebx		#  next sector
@@ -200,16 +158,16 @@ seta20.3:	sti				# Enable interrupts
 
 
 /*
- * Trampoline used to call read from within zfsldr.  Sets up an EDD
- * packet on the stack and passes it to read.  We assume that the
- * destination address is always segment-aligned.
+ * Read a sector from the disk.  Sets up an EDD packet on the stack
+ * and passes it to read.  We assume that the destination address is
+ * always segment-aligned.
  *
  * %eax		- int     - LBA to read in relative to partition start
  * %ebx		- ptr	  - destination address
  * %dl		- byte    - drive to read from
  * %si		- ptr     - MBR partition entry
  */
-nread:		xor %ecx,%ecx			# Get
+read:		xor %ecx,%ecx			# Get
 		addl 0x8(%si),%eax		#  LBA
 		adc $0,%ecx
 		pushl %ecx			# Starting absolute block
@@ -219,12 +177,13 @@ nread:		xor %ecx,%ecx			# Get
 		push $0				#  transfer buffer
 		push $0x1			# Read 1 sector
 		push $0x10			# Size of packet
-		mov %sp,%bp			# Packet pointer
-		callw read			# Read from disk
-		jc nread.1			# If error, fail
-		lea 0x10(%bp),%sp		# Clear stack
+		mov %sp,%si			# Packet pointer
+		mov $0x42,%ah			# BIOS: Extended
+		int $0x13			#  read
+		jc read.1			# If error, fail
+		lea 0x10(%si),%sp		# Clear stack
 		ret				# If success, return
-nread.1:	mov %ah,%al			# Format
+read.1:		mov %ah,%al			# Format
 		mov $read_err,%di		#  error
 		call hex8			#  code
 		mov $msg_read,%si		# Set the error message and
@@ -250,36 +209,26 @@ putstr.0:	mov $0x7,%bx	 		# Page:attribu
 putstr: 	lodsb				# Get char
 		testb %al,%al			# End of string?
 		jne putstr.0			# No
-
+		ret				# To caller
 /*
- * Reads sectors from the disk.  If EDD is enabled, then check if it is
- * installed and use it if it is.  If it is not installed or not enabled, then
- * fall back to using CHS.  Since we use a LBA, if we are using CHS, we have to
- * fetch the drive parameters from the BIOS and divide it out ourselves.
- * Call with:
- *
- * %dl	- byte     - drive number
- * stack - 10 bytes - EDD Packet
+ * Check to see if the disk supports EDD.  zfsboot requires EDD and does not
+ * support older C/H/S disk I/O.
  */
-read:		cmpb $0x80,%dl			# Hard drive?
-		jb read.1			# No, use CHS
+check_edd:	cmpb $0x80,%dl			# Hard drive?
+		jb check_edd.1 			# No, fail to boot
 		mov $0x55aa,%bx			# Magic
 		push %dx			# Save
 		movb $0x41,%ah			# BIOS: Check
 		int $0x13			#  extensions present
 		pop %dx				# Restore
-		jc read.1			# If error, use CHS
+		jc check_edd.1			# If error, fail
 		cmp $0xaa55,%bx			# Magic?
-		jne read.1			# No, so use CHS
+		jne check_edd.1			# No, so fail
 		testb $0x1,%cl			# Packet interface?
-		jz read.1			# No, so use CHS
-		mov %bp,%si			# Disk packet
-		movb $0x42,%ah			# BIOS: Extended
-		int $0x13			#  read
-		retw				# To caller
-read.1:		mov $msg_chs,%si
-		jmp error
-
+		jz check_edd.1			# No, so fail
+		ret				# EDD ok, keep booting
+check_edd.1:	mov $msg_chs,%si		# Warn that CHS is
+		jmp error			#  unsupported and fail
 /*
  * AL to hex, saving the result to [EDI].
  */


More information about the svn-src-head mailing list