Re: gptzfsboot error using HP Smart Array P410i Controller

From: Christoph Hoffmann <christoph_hoffmann_at_me.com>
Date: Tue, 16 Aug 2011 15:14:08 +0200
Hello John,

Thank you very much indeed for your reply.

The pmbr.s passes the ARGS set to 0x900 to main() in zfsboot.c and
*(uint8_t *)PTOV(ARGS)) is 0x80. 

In zfsboot.c main(), before the line
  bootinfo.bi_version = BOOTINFO_VERSION;
gets executed we still keep the right value of the dsk->drive and just after
the execution, the dsk->drive is equal to zero.

Adding
   printf("hello\n");
before
   dsk = malloc(sizeof(struct dsk));
keeps the dsk->drive value assigned to 0x80 and the box will boot.

Any comments will be appreciated.

Best Regards,

Christoph

--
Christoph Hoffmann

On Aug 15, 2011, at 6:12 PM, John Baldwin wrote:

> On Friday, August 05, 2011 10:08:27 am Christoph Hoffmann wrote:
>> Hello Everyone,
>> 
>> Despite the BIOS information about the nonexistent floppy, the zfsboot.c 
> code 
>> will prevent to boot from the first HDD if a floppy is given as a first 
> available device.
>> 
>> The drive 0x0 (floppy) will be probed before the code below and an error 
> occurs:
>> […]
>> gptzfsboot: error 1 lba 32                                                      
>> gptzfsboot: error 1 lba 1                                                       
>> […]
>> 
>> The continue statement will skip the rest of the iteration because  
>>         if ((i | DRV_HARD) == *(uint8_t *)PTOV(ARGS)) 
>> is true if the drive equals 0x80. As a result we do not call probe_drive()
>> for this drive.
> 
> But that shouldn't happen if ARGS has a drive number of 0.  (In that case 0x80 
> != 0x0, so it shouldn't match.)
> 
> This shows that PTOV(ARGS) actually has a %dl value of 0x80 which is correct.  
> The question is how your initial 'dsk' ended up using 0x0 instead of 0x80.
> Note that your 'type' is 0, so that means that it was ok initially (TYPE_AD is 
> 0):
> 
>    dsk->drive = *(uint8_t *)PTOV(ARGS);
>    dsk->type = dsk->drive & DRV_HARD ? TYPE_AD : TYPE_FD;
> 
> Somewhere between where 'dsk' is initalized in main() and before probe_drive() 
> is called in main() for 'dsk', 'dsk->drive' is getting clobbered.  Can you add 
> some additional printfs to nail down where that is happening?
> 
> -- 
> John Baldwin
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
Received on Tue Aug 16 2011 - 11:15:04 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:16 UTC