svn commit: r341437 - in head/stand/i386: kgzldr mbr pmbr

Ed Maste emaste at FreeBSD.org
Mon Dec 3 19:16:36 UTC 2018


Author: emaste
Date: Mon Dec  3 19:16:34 2018
New Revision: 341437
URL: https://svnweb.freebsd.org/changeset/base/341437

Log:
  stand/i386: rename .s to .S to use Clang IAS
  
  As part of the migration away from obsolete binutils we want to retire
  GNU as.  Most assembly files used on amd64 have a .S extension and
  (via rules in share/mk/bsd.suffixes.mk) are assembled with Clang's
  Integrated Assembler (IAS).  Rename files in stand/i386 to .S to use
  the integrated assembler.
  
  Clang's IAS supports the defsym option (via -Wa,) but only with one
  dash, not two.  As both -defsym and --defsym are accepted by GNU as,
  use the former.
  
  PR:		233611
  Reviewed by:	tsoome
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D18369

Added:
  head/stand/i386/kgzldr/crt.S
     - copied unchanged from r341436, head/stand/i386/kgzldr/crt.s
  head/stand/i386/kgzldr/sio.S
     - copied unchanged from r341436, head/stand/i386/kgzldr/sio.s
  head/stand/i386/kgzldr/start.S
     - copied unchanged from r341436, head/stand/i386/kgzldr/start.s
  head/stand/i386/mbr/mbr.S
     - copied unchanged from r341436, head/stand/i386/mbr/mbr.s
  head/stand/i386/pmbr/pmbr.S
     - copied unchanged from r341436, head/stand/i386/pmbr/pmbr.s
Deleted:
  head/stand/i386/kgzldr/crt.s
  head/stand/i386/kgzldr/sio.s
  head/stand/i386/kgzldr/start.s
  head/stand/i386/mbr/mbr.s
  head/stand/i386/pmbr/pmbr.s
Modified:
  head/stand/i386/kgzldr/Makefile
  head/stand/i386/mbr/Makefile
  head/stand/i386/pmbr/Makefile

Modified: head/stand/i386/kgzldr/Makefile
==============================================================================
--- head/stand/i386/kgzldr/Makefile	Mon Dec  3 19:02:14 2018	(r341436)
+++ head/stand/i386/kgzldr/Makefile	Mon Dec  3 19:16:34 2018	(r341437)
@@ -7,7 +7,7 @@ STRIP=
 BINMODE=${LIBMODE}
 BINDIR=	${LIBDIR}
 
-SRCS=	start.s boot.c subr_inflate.c lib.c crt.s sio.s
+SRCS=	start.S boot.c subr_inflate.c lib.c crt.S sio.S
 CFLAGS=	-Os
 CFLAGS+=-DKZIP
 NO_SHARED=
@@ -15,6 +15,6 @@ LDFLAGS+=-Wl,-r
 .PATH:	${SYSDIR}/kern
 
 BOOT_COMCONSOLE_PORT?=	0x3f8
-AFLAGS+=--defsym SIO_PRT=${BOOT_COMCONSOLE_PORT}
+ACFLAGS+=-Wa,-defsym,SIO_PRT=${BOOT_COMCONSOLE_PORT}
 
 .include <bsd.prog.mk>

Copied: head/stand/i386/kgzldr/crt.S (from r341436, head/stand/i386/kgzldr/crt.s)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/stand/i386/kgzldr/crt.S	Mon Dec  3 19:16:34 2018	(r341437, copy of r341436, head/stand/i386/kgzldr/crt.s)
@@ -0,0 +1,83 @@
+#
+# Copyright (c) 1999 Global Technology Associates, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#	From: btx.s 1.10 1999/02/25 16:27:41 rnordier
+# $FreeBSD$
+#
+
+# Screen defaults and assumptions.
+
+		.set SCR_MAT,0x7		# Mode/attribute
+		.set SCR_COL,0x50		# Columns per row
+		.set SCR_ROW,0x19		# Rows per screen
+
+# BIOS Data Area locations.
+
+		.set BDA_SCR,0x449		# Video mode
+		.set BDA_POS,0x450		# Cursor position
+
+		.globl crt_putchr
+
+# void crt_putchr(int c)
+
+crt_putchr: 	movb 0x4(%esp,1),%al		# Get character
+		pusha				# Save
+		xorl %ecx,%ecx			# Zero for loops
+		movb $SCR_MAT,%ah		# Mode/attribute
+		movl $BDA_POS,%ebx		# BDA pointer
+		movw (%ebx),%dx 		# Cursor position
+		movl $0xb8000,%edi		# Regen buffer (color)
+		cmpb %ah,BDA_SCR-BDA_POS(%ebx)	# Mono mode?
+		jne crt_putchr.1		# No
+		xorw %di,%di			# Regen buffer (mono)
+crt_putchr.1:	cmpb $0xa,%al			# New line?
+		je crt_putchr.2			# Yes
+		xchgl %eax,%ecx 		# Save char
+		movb $SCR_COL,%al		# Columns per row
+		mulb %dh			#  * row position
+		addb %dl,%al			#  + column
+		adcb $0x0,%ah			#  position
+		shll %eax			#  * 2
+		xchgl %eax,%ecx 		# Swap char, offset
+		movw %ax,(%edi,%ecx,1)		# Write attr:char
+		incl %edx			# Bump cursor
+		cmpb $SCR_COL,%dl		# Beyond row?
+		jb crt_putchr.3			# No
+crt_putchr.2:	xorb %dl,%dl			# Zero column
+		incb %dh			# Bump row
+crt_putchr.3:	cmpb $SCR_ROW,%dh		# Beyond screen?
+		jb crt_putchr.4			# No
+		leal 2*SCR_COL(%edi),%esi	# New top line
+		movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
+		rep				# Scroll
+		movsl				#  screen
+		movb $' ',%al			# Space
+		movb $SCR_COL,%cl		# Columns to clear
+		rep				# Clear
+		stosw				#  line
+		movb $SCR_ROW-1,%dh		# Bottom line
+crt_putchr.4:	movw %dx,(%ebx) 		# Update position
+		popa				# Restore
+		ret				# To caller

Copied: head/stand/i386/kgzldr/sio.S (from r341436, head/stand/i386/kgzldr/sio.s)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/stand/i386/kgzldr/sio.S	Mon Dec  3 19:16:34 2018	(r341437, copy of r341436, head/stand/i386/kgzldr/sio.s)
@@ -0,0 +1,44 @@
+#
+# Copyright (c) 1999 Global Technology Associates, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#	From: sio.s 1.3 1999/01/10 14:48:03 rnordier
+# $FreeBSD$
+#
+
+		.globl sio_putchr
+
+# void sio_putchr(int c)
+
+sio_putchr:	movw $SIO_PRT+0x5,%dx		# Line status reg
+		xor %ecx,%ecx			# Timeout
+		movb $0x40,%ch			#  counter
+sio_putchr.1:	inb %dx,%al			# Transmitter
+		testb $0x20,%al 		#  buffer empty?
+		loopz sio_putchr.1		# No
+		jz sio_putchr.2			# If timeout
+		movb 0x4(%esp,1),%al		# Get character
+		subb $0x5,%dl			# Transmitter hold reg
+		outb %al,%dx			# Write character
+sio_putchr.2:	ret				# To caller

Copied: head/stand/i386/kgzldr/start.S (from r341436, head/stand/i386/kgzldr/start.s)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/stand/i386/kgzldr/start.S	Mon Dec  3 19:16:34 2018	(r341437, copy of r341436, head/stand/i386/kgzldr/start.s)
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 1999 Global Technology Associates, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+		.set entry,0x10			# kgz.entry
+
+		.globl _start
+
+# C startup code for kgzldr.
+
+_start:		cld				# String ops inc
+		movl $_edata,%edi		# Start of bss
+		movl $_end,%ecx			# Compute
+		subl %edi,%ecx			#  size
+		xorl %eax,%eax			# Zero
+		rep				# Clear
+		stosb				#  bss
+		pushl 0x4(%esp)			# Pass howto flags
+		call boot			# Call C code
+		popl %ecx			# Clear stack
+		jmp *kgz+entry			# To loaded code

Modified: head/stand/i386/mbr/Makefile
==============================================================================
--- head/stand/i386/mbr/Makefile	Mon Dec  3 19:02:14 2018	(r341436)
+++ head/stand/i386/mbr/Makefile	Mon Dec  3 19:16:34 2018	(r341437)
@@ -3,14 +3,14 @@
 PROG=	mbr
 STRIP=
 BINMODE=${NOBINMODE}
-SRCS=	${PROG}.s
+SRCS=	${PROG}.S
 
 # MBR flags: 0x80 -- try packet interface (also known as EDD or LBA)
 BOOT_MBR_FLAGS?=	0x80
 
 ORG=	0x600
 
-AFLAGS+=--defsym FLAGS=${BOOT_MBR_FLAGS}
+ACFLAGS+=-Wa,-defsym,FLAGS=${BOOT_MBR_FLAGS}
 LDFLAGS+=${LDFLAGS_BIN}
 
 .include <bsd.prog.mk>

Copied: head/stand/i386/mbr/mbr.S (from r341436, head/stand/i386/mbr/mbr.s)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/stand/i386/mbr/mbr.S	Mon Dec  3 19:16:34 2018	(r341437, copy of r341436, head/stand/i386/mbr/mbr.s)
@@ -0,0 +1,157 @@
+#
+# Copyright (c) 1999 Robert Nordier
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms are freely
+# permitted provided that the above copyright notice and this
+# paragraph and the following disclaimer are duplicated in all
+# such forms.
+#
+# This software is provided "AS IS" and without any express or
+# implied warranties, including, without limitation, the implied
+# warranties of merchantability and fitness for a particular
+# purpose.
+#
+
+# $FreeBSD$
+
+# A 512 byte MBR boot manager that simply boots the active partition.
+
+		.set LOAD,0x7c00		# Load address
+		.set EXEC,0x600 		# Execution address
+		.set PT_OFF,0x1be		# Partition table
+		.set MAGIC,0xaa55		# Magic: bootable
+		.set FL_PACKET,0x80		# Flag: try EDD
+
+		.set NHRDRV,0x475		# Number of hard drives
+
+		.globl start			# Entry point
+		.code16
+
+#
+# Setup the segment registers for flat addressing and setup the stack.
+#
+start:		cld				# String ops inc
+		xorw %ax,%ax			# Zero
+		movw %ax,%es			# Address
+		movw %ax,%ds			#  data
+		movw %ax,%ss			# Set up
+		movw $LOAD,%sp			#  stack
+#
+# Relocate ourself to a lower address so that we are out of the way when
+# we load in the bootstrap from the partition to boot.
+# 
+		movw $main-EXEC+LOAD,%si	# Source
+		movw $main,%di			# Destination
+		movw $0x200-(main-start),%cx	# Byte count
+		rep				# Relocate
+		movsb				#  code
+#
+# Jump to the relocated code.
+#
+		jmp main-LOAD+EXEC		# To relocated code
+#
+# Scan the partition table looking for an active entry.  Note that %ch is
+# zero from the repeated string instruction above.  We save the offset of
+# the active partition in %si and scan the entire table to ensure that only
+# one partition is marked active.
+#
+main:		xorw %si,%si			# No active partition
+		movw $partbl,%bx		# Partition table
+		movb $0x4,%cl			# Number of entries
+main.1: 	cmpb %ch,(%bx)			# Null entry?
+		je main.2			# Yes
+		jg err_pt			# If 0x1..0x7f
+		testw %si,%si	 		# Active already found?
+		jnz err_pt			# Yes
+		movw %bx,%si			# Point to active
+main.2: 	addb $0x10,%bl			# Till
+		loop main.1			#  done
+		testw %si,%si	 		# Active found?
+		jnz main.3			# Yes
+		int $0x18			# BIOS: Diskless boot
+#
+# Ok, we've found a possible active partition.  Check to see that the drive
+# is a valid hard drive number.
+#
+main.3: 	cmpb $0x80,%dl			# Drive valid?
+		jb main.4			# No
+		movb NHRDRV,%dh			# Calculate the highest
+		addb $0x80,%dh			#  drive number available
+		cmpb %dh,%dl			# Within range?
+		jb main.5			# Yes
+main.4: 	movb (%si),%dl			# Load drive
+#
+# Ok, now that we have a valid drive and partition entry, load the CHS from
+# the partition entry and read the sector from the disk.
+#
+main.5:		movw %sp,%di			# Save stack pointer
+		movb 0x1(%si),%dh		# Load head
+		movw 0x2(%si),%cx		# Load cylinder:sector
+		movw $LOAD,%bx			# Transfer buffer
+		testb $FL_PACKET,flags		# Try EDD?
+		jz main.7			# No.
+		pushw %cx			# Save %cx
+		pushw %bx			# Save %bx
+		movw $0x55aa,%bx		# Magic
+		movb $0x41,%ah			# BIOS:	EDD extensions
+		int $0x13			#  present?
+		jc main.6			# No.
+		cmpw $0xaa55,%bx		# Magic ok?
+		jne main.6			# No.
+		testb $0x1,%cl			# Packet mode present?
+		jz main.6			# No.
+		popw %bx			# Restore %bx
+		pushl $0x0			# Set the LBA
+		pushl 0x8(%si)			#  address
+		pushw %es			# Set the address of
+		pushw %bx			#  the transfer buffer
+		pushw $0x1			# Read 1 sector
+		pushw $0x10			# Packet length
+		movw %sp,%si			# Packer pointer
+		movw $0x4200,%ax		# BIOS:	LBA Read from disk
+		jmp main.8			# Skip the CHS setup
+main.6:		popw %bx			# Restore %bx
+		popw %cx			# Restore %cx
+main.7:		movw $0x201,%ax			# BIOS: Read from disk
+main.8:		int $0x13			# Call the BIOS
+		movw %di,%sp			# Restore stack
+		jc err_rd			# If error
+#
+# Now that we've loaded the bootstrap, check for the 0xaa55 signature.  If it
+# is present, execute the bootstrap we just loaded.
+#
+		cmpw $MAGIC,0x1fe(%bx)		# Bootable?
+		jne err_os			# No
+		jmp *%bx			# Invoke bootstrap
+#
+# Various error message entry points.
+#
+err_pt: 	movw $msg_pt,%si		# "Invalid partition
+		jmp putstr			#  table"
+
+err_rd: 	movw $msg_rd,%si		# "Error loading
+		jmp putstr			#  operating system"
+
+err_os: 	movw $msg_os,%si		# "Missing operating
+		jmp putstr			#  system"
+#
+# Output an ASCIZ string to the console via the BIOS.
+# 
+putstr.0:	movw $0x7,%bx	 		# Page:attribute
+		movb $0xe,%ah			# BIOS: Display
+		int $0x10			#  character
+putstr: 	lodsb				# Get character
+		testb %al,%al			# End of string?
+		jnz putstr.0			# No
+putstr.1:	jmp putstr.1			# Await reset
+
+msg_pt: 	.asciz "Invalid partition table"
+msg_rd: 	.asciz "Error loading operating system"
+msg_os: 	.asciz "Missing operating system"
+
+		.org PT_OFF-1,0x90
+flags:		.byte FLAGS			# Flags
+
+partbl: 	.fill 0x10,0x4,0x0		# Partition table
+		.word MAGIC			# Magic number

Modified: head/stand/i386/pmbr/Makefile
==============================================================================
--- head/stand/i386/pmbr/Makefile	Mon Dec  3 19:02:14 2018	(r341436)
+++ head/stand/i386/pmbr/Makefile	Mon Dec  3 19:16:34 2018	(r341437)
@@ -3,11 +3,13 @@
 PROG=	pmbr
 STRIP=
 BINMODE=${NOBINMODE}
-SRCS=	${PROG}.s
+SRCS=	${PROG}.S
 
+BOOT_MBR_FLAGS?=	0
+
 ORG=	0x600
 
-AFLAGS+=--defsym FLAGS=${BOOT_MBR_FLAGS}
+ACFLAGS+=-Wa,-defsym,FLAGS=${BOOT_MBR_FLAGS}
 LDFLAGS+=${LDFLAGS_BIN}
 
 .include <bsd.prog.mk>

Copied: head/stand/i386/pmbr/pmbr.S (from r341436, head/stand/i386/pmbr/pmbr.s)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/stand/i386/pmbr/pmbr.S	Mon Dec  3 19:16:34 2018	(r341437, copy of r341436, head/stand/i386/pmbr/pmbr.s)
@@ -0,0 +1,252 @@
+#-
+# Copyright (c) 2007 Yahoo!, Inc.
+# All rights reserved.
+# Written by: John Baldwin <jhb at FreeBSD.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. Neither the name of the author nor the names of any co-contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+# Partly from: src/sys/boot/i386/mbr/mbr.s 1.7
+
+# A 512 byte PMBR boot manager that looks for a FreeBSD boot GPT partition
+# and boots it.
+
+		.set LOAD,0x7c00		# Load address
+		.set EXEC,0x600 		# Execution address
+		.set MAGIC,0xaa55		# Magic: bootable
+		.set SECSIZE,0x200		# Size of a single disk sector
+		.set DISKSIG,440		# Disk signature offset
+		.set STACK,EXEC+SECSIZE*4	# Stack address
+		.set GPT_ADDR,STACK		# GPT header address
+		.set GPT_SIG,0
+		.set GPT_SIG_0,0x20494645	# "EFI "
+		.set GPT_SIG_1,0x54524150	# "PART"
+		.set GPT_MYLBA,24
+		.set GPT_PART_LBA,72
+		.set GPT_NPART,80
+		.set GPT_PART_SIZE,84
+		.set PART_ADDR,GPT_ADDR+SECSIZE	# GPT partition array address
+		.set PART_TYPE,0
+		.set PART_START_LBA,32
+		.set PART_END_LBA,40
+		.set DPBUF,PART_ADDR+SECSIZE
+		.set DPBUF_SEC,0x10		# Number of sectors
+
+		.set NHRDRV,0x475		# Number of hard drives
+
+		.globl start			# Entry point
+		.code16
+
+#
+# Setup the segment registers for flat addressing and setup the stack.
+#
+start:		cld				# String ops inc
+		xorw %ax,%ax			# Zero
+		movw %ax,%es			# Address
+		movw %ax,%ds			#  data
+		movw %ax,%ss			# Set up
+		movw $STACK,%sp			#  stack
+#
+# Relocate ourself to a lower address so that we have more room to load
+# other sectors.
+# 
+		movw $main-EXEC+LOAD,%si	# Source
+		movw $main,%di			# Destination
+		movw $SECSIZE-(main-start),%cx	# Byte count
+		rep				# Relocate
+		movsb				#  code
+#
+# Jump to the relocated code.
+#
+		jmp main-LOAD+EXEC		# To relocated code
+#
+# Validate drive number in %dl.
+#
+main:	 	cmpb $0x80,%dl			# Drive valid?
+		jb main.1			# No
+		movb NHRDRV,%dh			# Calculate the highest
+		addb $0x80,%dh			#  drive number available
+		cmpb %dh,%dl			# Within range?
+		jb main.2			# Yes
+main.1: 	movb $0x80,%dl			# Assume drive 0x80
+#
+# Load the GPT header and verify signature.  Try LBA 1 for the primary one and
+# the last LBA for the backup if it is broken.
+#
+main.2:		call getdrvparams		# Read drive parameters
+		movb $1,%dh			# %dh := 1 (reading primary)
+main.2a:	movw $GPT_ADDR,%bx
+		movw $lba,%si
+		call read			# Read header and check GPT sig
+		cmpl $GPT_SIG_0,GPT_ADDR+GPT_SIG
+		jnz main.2b
+		cmpl $GPT_SIG_1,GPT_ADDR+GPT_SIG+4
+		jnz main.2b
+		jmp load_part
+main.2b:	cmpb $1,%dh			# Reading primary?
+		jne err_pt			# If no - invalid table found
+#
+# Try alternative LBAs from the last sector for the GPT header.
+#
+main.3:		movb $0,%dh			# %dh := 0 (reading backup)
+		movw $DPBUF+DPBUF_SEC,%si	# %si = last sector + 1
+		movw $lba,%di			# %di = $lba
+main.3a:	decl (%si)			# 0x0(%si) = last sec (0-31)
+		movw $2,%cx
+		rep
+		movsw				# $lastsec--, copy it to $lba
+		jmp main.2a			# Read the next sector
+#
+# Load a partition table sector from disk and look for a FreeBSD boot
+# partition.
+#
+load_part:	movw $GPT_ADDR+GPT_PART_LBA,%si
+		movw $PART_ADDR,%bx
+		call read
+scan:		movw %bx,%si			# Compare partition UUID
+		movw $boot_uuid,%di		#  with FreeBSD boot UUID 
+		movb $0x10,%cl
+		repe cmpsb
+		jnz next_part			# Didn't match, next partition
+#
+# We found a boot partition.  Load it into RAM starting at 0x7c00.
+#
+		movw %bx,%di			# Save partition pointer in %di
+		leaw PART_START_LBA(%di),%si
+		movw $LOAD/16,%bx
+		movw %bx,%es
+		xorw %bx,%bx
+load_boot:	push %si			# Save %si
+		call read
+		pop %si				# Restore
+		movl PART_END_LBA(%di),%eax	# See if this was the last LBA
+		cmpl (%si),%eax
+		jnz next_boot
+		movl PART_END_LBA+4(%di),%eax
+		cmpl 4(%si),%eax
+		jnz next_boot
+		mov %bx,%es			# Reset %es to zero 
+		jmp LOAD			# Jump to boot code
+next_boot:	incl (%si)			# Next LBA
+		adcl $0,4(%si)
+		mov %es,%ax			# Adjust segment for next
+		addw $SECSIZE/16,%ax		#  sector
+		cmp $0x9000,%ax			# Don't load past 0x90000,
+		jae err_big			#  545k should be enough for
+		mov %ax,%es			#  any boot code. :)
+		jmp load_boot
+#
+# Move to the next partition.  If we walk off the end of the sector, load
+# the next sector.  We assume that partition entries are smaller than 64k
+# and that they won't span a sector boundary.
+#
+# XXX: Should we int 0x18 instead of err_noboot if we hit the end of the table?
+#
+next_part:	decl GPT_ADDR+GPT_NPART		# Was this the last partition?
+		jz err_noboot
+		movw GPT_ADDR+GPT_PART_SIZE,%ax
+		addw %ax,%bx			# Next partition
+		cmpw $PART_ADDR+0x200,%bx	# Still in sector?
+		jb scan
+		incl GPT_ADDR+GPT_PART_LBA	# Next sector
+		adcl $0,GPT_ADDR+GPT_PART_LBA+4
+		jmp load_part
+#
+# Load a sector (64-bit LBA at %si) from disk %dl into %es:%bx by creating
+# a EDD packet on the stack and passing it to the BIOS.  Trashes %ax and %si.
+#
+read:		pushl 0x4(%si)			# Set the LBA
+		pushl 0x0(%si)			#  address
+		pushw %es			# Set the address of
+		pushw %bx			#  the transfer buffer
+		pushw $0x1			# Read 1 sector
+		pushw $0x10			# Packet length
+		movw %sp,%si			# Packer pointer
+		movw $0x4200,%ax		# BIOS:	LBA Read from disk
+		int $0x13			# Call the BIOS
+		add $0x10,%sp			# Restore stack
+		jc err_rd			# If error
+		ret
+#
+# Check the number of LBAs on the drive index %dx.  Trashes %ax and %si.
+#
+getdrvparams:
+		movw $DPBUF,%si			# Set the address of result buf
+		movw $0x001e,(%si)		# len
+		movw $0x4800,%ax		# BIOS: Read Drive Parameters
+		int $0x13			# Call the BIOS
+		jc err_rd			# "I/O error" if error
+		ret
+#
+# Various error message entry points.
+#
+err_big: 	movw $msg_big,%si		# "Boot loader too
+		jmp putstr			#  large"
+
+err_pt: 	movw $msg_pt,%si		# "Invalid partition
+		jmp putstr			#  table"
+
+err_rd: 	movw $msg_rd,%si		# "I/O error loading
+		jmp putstr			#  boot loader"
+
+err_noboot: 	movw $msg_noboot,%si		# "Missing boot
+		jmp putstr			#  loader"
+#
+# Output an ASCIZ string to the console via the BIOS.
+# 
+putstr.0:	movw $0x7,%bx	 		# Page:attribute
+		movb $0xe,%ah			# BIOS: Display
+		int $0x10			#  character
+putstr: 	lodsb				# Get character
+		testb %al,%al			# End of string?
+		jnz putstr.0			# No
+putstr.1:	jmp putstr.1			# Await reset
+
+msg_big: 	.asciz "Boot loader too large"
+msg_pt: 	.asciz "Invalid partition table"
+msg_rd: 	.asciz "I/O error loading boot loader"
+msg_noboot: 	.asciz "Missing boot loader"
+
+lba:		.quad 1				# LBA of GPT header 
+
+boot_uuid:	.long 0x83bd6b9d
+		.word 0x7f41
+		.word 0x11dc
+		.byte 0xbe
+		.byte 0x0b
+		.byte 0x00
+		.byte 0x15
+		.byte 0x60
+		.byte 0xb8
+		.byte 0x4f
+		.byte 0x0f
+
+		.org DISKSIG,0x90
+sig:		.long 0				# OS Disk Signature
+		.word 0				# "Unknown" in PMBR
+
+partbl: 	.fill 0x10,0x4,0x0		# Partition table
+		.word MAGIC			# Magic number


More information about the svn-src-head mailing list