> On 4 Aug 2018, at 11:54, Xin Li <delp...@delphij.net> wrote:
> 
> Hi, Cy,
> 
> On 8/3/18 12:11, Cy Schubert wrote:
>> Author: cy
>> Date: Fri Aug  3 19:11:00 2018
>> New Revision: 337271
>> URL: https://svnweb.freebsd.org/changeset/base/337271
>> 
>> Log:
>>  Some drives report a geometry that is inconsisetent with the total
>>  number of sectors reported through the BIOS. Cylinders * heads *
>>  sectors may not necessarily be equal to the total number of sectors
>>  reported through int13h function 48h.
>> 
>>  An example of this is when a Mediasonic HD3-U2B PATA to USB enclosure
>>  with a 80 GB disk is attached. Loader hangs at line 506 of
>>  stand/i386/libi386/biosdisk.c while attempting to read sectors beyond
>>  the end of the disk, sector 156906855. I discovered that the Mediasonic
>>  enclosure was reporting the disk with 9767 cylinders, 255 heads, 63
>>  sectors/track. That's 156906855 sectors. However camcontrol and
>>  Windows 10 both report report the disk having 156301488 sectors, not
>>  the calculated value. At line 280 biosdisk.c sets the sectors to the
>>  higher of either bd->bd_sectors or the total calculated at line 276
>>  (156906855) instead of the lower and correct value of 156301488 reported
>>  by int 13h 48h.
>> 
>>  This was tested on all three of my Mediasonic HD3-U2B PATA to USB
>>  enclosures.
>> 
>>  Instead of using the higher of bd_sectors (returned by int13h) or the
>>  calculated value, this patch uses the lower and safer of the values.
>> 
>>  Reviewed by:        tsoome@
>>  Differential Revision:      https://reviews.freebsd.org/D16577
>> 
>> Modified:
>>  head/stand/i386/libi386/biosdisk.c
>> 
>> Modified: head/stand/i386/libi386/biosdisk.c
>> ==============================================================================
>> --- head/stand/i386/libi386/biosdisk.c       Fri Aug  3 18:52:51 2018        
>> (r337270)
>> +++ head/stand/i386/libi386/biosdisk.c       Fri Aug  3 19:11:00 2018        
>> (r337271)
>> @@ -275,7 +275,7 @@ bd_int13probe(struct bdinfo *bd)
>> 
>>              total = (uint64_t)params.cylinders *
>>                  params.heads * params.sectors_per_track;
>> -            if (bd->bd_sectors < total)
>> +            if (bd->bd_sectors > total)
>>                      bd->bd_sectors = total;
>> 
>>              ret = 1;
>> 
> 
> This broke loader on my system, but I think your reasoning was valid so
> I took a deeper look and discovered that on my system, INT 13h, function
> 48h would give zeros in EDD parameters' CHS fields.  With that, the
> calculated CHS based total would be 0, and your change would cause
> bd_sectors be zeroed.
> 
> Could you please let me know if https://reviews.freebsd.org/D16588 makes
> sense to you?  (I'm not 100% certain if I have followed the code).  It
> allowed my Asrock C2750D4I based board to boot from ZFS.
> 

I have in mind something a bit different for some time, but haven’t had chance 
to complete it because I have no “weird” systems to validate the idea:D I’ll 
try to get a bit of time and post an phabricator soon.

rgds,
toomas


_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to