Re: Fresh installed Freebsd 9 don't boot from hd

From: John Baldwin <jhb_at_freebsd.org>
Date: Mon, 24 Oct 2011 14:23:44 -0400
On Monday, October 24, 2011 12:25:09 pm Andriy Gapon wrote:
> on 24/10/2011 18:33 John Baldwin said the following:
> > On Monday, October 24, 2011 9:47:42 am Andriy Gapon wrote:
> >> on 24/10/2011 16:41 John Baldwin said the following:
> >>> On Sunday, October 23, 2011 1:57:59 pm Andriy Gapon wrote:
> [snip]
> >>>> I found a document that suggests a possibility of BIOS writing more bytes to the
> >>>> array than its current size of 0x42:
> >>>> http://www.t13.org/documents/UploadedDocuments/docs2008/e08134r1-BIOS_Enhanced_Disk_Drive_Services_4.0.pdf
> >>>>
> >>>> Of course, the size of the array is passed to BIOS at the start of the array and
> >>>> so a _non-buggy_ BIOS should not write beyond the array, but we live in a
> >>>> non-perfect world.
> >>>
> >>> Hmm, I think we've had to do a similar workaround in the past for a different
> >>> BIOS call (SMAP maybe?).  However, I do have one request, can we declare an
> >>> actual structure instead of a silly char array?  Then we can remove the weird
> >>> casts with offsets into it, etc.  Having an actual struct would be far more
> >>> readable and less bug-prone.
> >>>
> >>
> >> I am all for this.
> >> Unfortunately. ENOTIME to do this properly at the moment.
> > 
> > Ugh, it looks like in EDD 4.0 they silently expanded the path field to 16 bytes
> > instead of 8 as in EDD 3.0 which is why the HP BIOS is probably writing an extra
> > four bytes.
> 
> Yes, that's exactly what I meant above, but probably wasn't clear about that.
> 
> > Ah, so the deal is that the device path bit is variable length and the caller is
> > supposed to set the length on input which we aren't doing.  However, we don't
> > care about the device path stuff anyway, so we can set a smaller input value.
> > 
> > Perhaps try http://www.freebsd.org/~jhb/patches/edd_params.patch
> > 
> 
> > +struct edd_params {
> > +	uint16_t	len;
> > +	uint16_t	flags;
> > +	uint32_t	cylinders;
> > +	uint32_t	heads;
> > +	uint32_t	sectors_per_track;
> > +	uint64_t	sectors;
> > +	uint32_t	sector_size;
> 
> sector_size should be uint16_t, I think.  Ditto for edd_params_v3 and edd_params_v4.
> sizeof(struct edd_params) should be 30, judging from the specs.

Oops, yeah.

> > +	uint16_t	edd_params_seg;
> > +	uint16_t	edd_params_off;
> > +};
> 
> Perhaps the structures should be declared __packed (if only just in case)?
> 
> Also, perhaps edd_params_v3 and edd_params_v4 should inherit edd_params in some
> "smarter" way to avoid verbatim duplicates.

Yeah, probably so.  We will probably never even use them anyway (just as we don't
use edd_packet_v3 even though we could probably make use of it to avoid some
bounce buffering in the loader).

> Other than these issues the patch looks great!
> Perhaps later we could do detailed definitions for things like interface paths for
> various cases, etc.

I doubt we will ever use them.

-- 
John Baldwin
Received on Mon Oct 24 2011 - 17:46:26 UTC

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