From owner-freebsd-stable@FreeBSD.ORG Tue Jun 21 17:51:47 2011 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 67807106567A for ; Tue, 21 Jun 2011 17:51:47 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 3E3F88FC22 for ; Tue, 21 Jun 2011 17:51:47 +0000 (UTC) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id E65B846B2D; Tue, 21 Jun 2011 13:51:46 -0400 (EDT) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id 81A4E8A027; Tue, 21 Jun 2011 13:51:46 -0400 (EDT) From: John Baldwin To: Henri Hennebert Date: Tue, 21 Jun 2011 13:51:45 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110325; KDE/4.5.5; amd64; ; ) References: <201106211155.19231.jhb@freebsd.org> <4E00C3BE.3050004@restart.be> In-Reply-To: <4E00C3BE.3050004@restart.be> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Message-Id: <201106211351.45919.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (bigwig.baldwin.cx); Tue, 21 Jun 2011 13:51:46 -0400 (EDT) Cc: freebsd-stable@freebsd.org Subject: Re: ZFS boot inside on the second partition inside a slice X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jun 2011 17:51:47 -0000 On Tuesday, June 21, 2011 12:15:58 pm Henri Hennebert wrote: > On 06/21/2011 17:55, John Baldwin wrote: > > On Tuesday, June 21, 2011 10:50:14 am Henri Hennebert wrote: > >> On 06/21/2011 15:01, John Baldwin wrote: > >>> Index: zfsldr.S > >>> =================================================================== > >>> --- zfsldr.S (revision 223339) > >>> +++ zfsldr.S (working copy) > >>> @@ -234,9 +234,12 @@ nread.1: xor %ecx,%ecx # Get > >>> callw read # Read from disk > >>> lea 0x10(%bp),%sp # Clear stack > >>> jnc return # If success, return > >>> - mov $msg_read,%si # Otherwise, set the error > >>> - # message and fall through to > >>> - # the error routine > >>> + mov %ah,%al # Format > >>> + mov $read_err,%di # error > >>> + call hex8 # code > >>> + mov $msg_read,%si # Set the error message and > >>> + # fall through to the error > >>> + # routine > >>> /* > >>> * Print out the error message pointed to by %ds:(%si) followed > >>> * by a prompt, wait for a keypress, and then reboot the machine. > >>> @@ -296,12 +299,28 @@ read.1: mov $msg_chs,%si > >>> jmp error > >>> msg_chs: .asciz "CHS not supported" > >>> > >>> +/* > >>> + * Convert AL to hex, saving the result to [EDI]. > >>> + */ > >>> +hex8: push %ax # Save > >>> + shrb $0x4,%al # Do upper > >>> + call hex8.1 # 4 > >>> + pop %ax # Restore > >>> +hex8.1: andb $0xf,%al # Get lower 4 > >>> + cmpb $0xa,%al # Convert > >>> + sbbb $0x69,%al # to hex > >>> + das # digit > >>> + orb $0x20,%al # To lower case > >>> + stosb # Save char > >>> + ret # (Recursive) > >>> + > >>> /* Messages */ > >>> > >>> -msg_read: .asciz "Read" > >>> -msg_part: .asciz "Boot" > >>> +msg_read: .ascii "Read error: " > >>> +read_err: .asciz "XX" > >>> +msg_part: .asciz "Boot error" > >>> > >>> -prompt: .asciz " error\r\n" > >>> +prompt: .asciz "\r\n" > >>> > >>> .org PRT_OFF,0x90 > >>> > >> I get > >> > >> Read error: 01 > > > > Hmm, that would be 'invalid parameter'. > > > > Can you add a 'foo: jmp foo' infinite loop and move it around to figure out > > which read call is failing? > > > main.5: mov %dx,MEM_ARG # Save args > movb $NSECT,%dh # Sector count > movl $1024,%eax # Offset to boot2 > callw nread.1 # Read disk > > foo: jmp foo > > After this one I get > > 'Read error: 01' Hmm, ok. NSECT changed in the MFC (it is now larger). Try this patch. It changes the code to read zfsboot in one sector at a time: Index: zfsldr.S =================================================================== --- zfsldr.S (revision 223365) +++ zfsldr.S (working copy) @@ -16,7 +16,6 @@ */ /* Memory Locations */ - .set MEM_REL,0x700 # Relocation address .set MEM_ARG,0x900 # Arguments .set MEM_ORG,0x7c00 # Origin .set MEM_BUF,0x8000 # Load area @@ -91,26 +90,19 @@ main: cld # String ops inc mov %cx,%ss # Set up mov $start,%sp # stack /* - * Relocate ourself to MEM_REL. Since %cx == 0, the inc %ch sets - * %cx == 0x100. - */ - mov %sp,%si # Source - mov $MEM_REL,%di # Destination - incb %ch # Word count - rep # Copy - movsw # code -/* * 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. */ - mov $part4,%si # Partition + mov $part4,%si # Dummy partition cmpb $0x80,%dl # Hard drive? jb main.4 # No - movb $0x1,%dh # Block count - callw nread # Read MBR + xor %eax,%eax # Read MBR from + movw $MEM_BUF,%bx # first sector + movb $0x1,%dh # on disk into + callw nread # $MEM_BUF mov $0x1,%cx # Two passes main.1: mov $MEM_BUF+PRT_OFF,%si # Partition table movb $0x1,%dh # Partition @@ -161,10 +153,18 @@ main.4: xor %dx,%dx # Partition:drive * area and target area do not overlap. */ main.5: mov %dx,MEM_ARG # Save args - movb $NSECT,%dh # Sector count + movb $NSECT,%cl # Sector count movl $1024,%eax # Offset to boot2 - callw nread.1 # Read disk -main.6: mov $MEM_BUF,%si # BTX (before reloc) + mov $MEM_BUF,%bx # Destination buffer +main.6: pushal # Save params + movb $1,$dh # One sector + callw nread # Read disk + popal # Restore + incl %eax # Update for + add $SIZ_SEC,%bx # next sector + dec %cx # Last sector? + jncxz main.6 # If not, read another. + mov $MEM_BUF,%si # BTX (before reloc) mov 0xa(%si),%bx # Get BTX length and set mov $NSECT*SIZ_SEC-1,%di # Size of load area (less one) mov %di,%si # End of load @@ -214,12 +214,12 @@ seta20.3: sti # Enable interrupts * packet on the stack and passes it to read. * * %eax - int - LBA to read in relative to partition start + * %es:%bx - ptr - destination address * %dl - byte - drive to read from * %dh - byte - num sectors to read * %si - ptr - MBR partition entry */ -nread: xor %eax,%eax # Sector offset in partition -nread.1: xor %ecx,%ecx # Get +nread: xor %ecx,%ecx # Get addl 0x8(%si),%eax # LBA adc $0,%ecx pushl %ecx # Starting absolute block @@ -234,9 +234,12 @@ seta20.3: sti # Enable interrupts callw read # Read from disk lea 0x10(%bp),%sp # Clear stack jnc return # If success, return - mov $msg_read,%si # Otherwise, set the error - # message and fall through to - # the error routine + mov %ah,%al # Format + mov $read_err,%di # error + call hex8 # code + mov $msg_read,%si # Set the error message and + # fall through to the error + # routine /* * Print out the error message pointed to by %ds:(%si) followed * by a prompt, wait for a keypress, and then reboot the machine. @@ -296,12 +299,28 @@ read.1: mov $msg_chs,%si jmp error msg_chs: .asciz "CHS not supported" +/* + * Convert AL to hex, saving the result to [EDI]. + */ +hex8: push %ax # Save + shrb $0x4,%al # Do upper + call hex8.1 # 4 + pop %ax # Restore +hex8.1: andb $0xf,%al # Get lower 4 + cmpb $0xa,%al # Convert + sbbb $0x69,%al # to hex + das # digit + orb $0x20,%al # To lower case + stosb # Save char + ret # (Recursive) + /* Messages */ -msg_read: .asciz "Read" -msg_part: .asciz "Boot" +msg_read: .ascii "Read error: " +read_err: .asciz "XX" +msg_part: .asciz "Boot error" -prompt: .asciz " error\r\n" +prompt: .asciz "\r\n" .org PRT_OFF,0x90 -- John Baldwin