ZFS boot inside on the second partition inside a slice

Henri Hennebert hlh at restart.be
Tue Jun 21 16:16:05 UTC 2011


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'

Henri


More information about the freebsd-stable mailing list