Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jun 2011 21:02:28 +0200
From:      Henri Hennebert <hlh@restart.be>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-stable@freebsd.org
Subject:   Re: ZFS boot inside on the second partition inside a slice
Message-ID:  <4E00EAC4.3050304@restart.be>
In-Reply-To: <201106211351.45919.jhb@freebsd.org>
References:  <BANLkTi=drd8vY84_4jqDZTFK%2Bsq=n0Kx9g@mail.gmail.com> <201106211155.19231.jhb@freebsd.org> <4E00C3BE.3050004@restart.be> <201106211351.45919.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 06/21/2011 19:51, John Baldwin wrote:
> 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:
>

I encounter 2 problems - see in you patch

Henri


> 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
                         %dh
                         |
------------------------+

> +		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.

Error: no such instruction: `jncxz main.6'

Here I'm lost

> +		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
>
>




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