Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Aug 2011 15:14:08 +0200
From:      Christoph Hoffmann <christoph_hoffmann@me.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: gptzfsboot error  using HP Smart Array P410i Controller
Message-ID:  <7BD5F062-A7B0-4D05-989F-F23C9353E7D8@me.com>
In-Reply-To: <201108151212.07874.jhb@freebsd.org>
References:  <E040B3A9-9B62-4545-ADC9-5CE3A9217024@me.com> <9B42BCDF-43E3-4517-9972-47A8B539880F@me.com> <3D9B1E72-385F-493A-A6B3-4684A2DB50E4@me.com> <201108151212.07874.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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.=20

In zfsboot.c main(), before the line
  bootinfo.bi_version =3D 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 =3D 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,
>>=20
>> Despite the BIOS information about the nonexistent floppy, the =
zfsboot.c=20
> code=20
>> will prevent to boot from the first HDD if a floppy is given as a =
first=20
> available device.
>>=20
>> The drive 0x0 (floppy) will be probed before the code below and an =
error=20
> occurs:
>> [=85]
>> gptzfsboot: error 1 lba 32                                            =
         =20
>> gptzfsboot: error 1 lba 1                                             =
         =20
>> [=85]
>>=20
>> The continue statement will skip the rest of the iteration because =20=

>>         if ((i | DRV_HARD) =3D=3D *(uint8_t *)PTOV(ARGS))=20
>> is true if the drive equals 0x80. As a result we do not call =
probe_drive()
>> for this drive.
>=20
> But that shouldn't happen if ARGS has a drive number of 0.  (In that =
case 0x80=20
> !=3D 0x0, so it shouldn't match.)
>=20
> This shows that PTOV(ARGS) actually has a %dl value of 0x80 which is =
correct. =20
> 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=20
> 0):
>=20
>    dsk->drive =3D *(uint8_t *)PTOV(ARGS);
>    dsk->type =3D dsk->drive & DRV_HARD ? TYPE_AD : TYPE_FD;
>=20
> Somewhere between where 'dsk' is initalized in main() and before =
probe_drive()=20
> is called in main() for 'dsk', 'dsk->drive' is getting clobbered.  Can =
you add=20
> some additional printfs to nail down where that is happening?
>=20
> --=20
> John Baldwin
> _______________________________________________
> freebsd-current@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to =
"freebsd-current-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7BD5F062-A7B0-4D05-989F-F23C9353E7D8>