After install - Fatal trap 18 ATA problem?
Søren Schmidt
sos at deepcore.dk
Sun Jul 16 10:29:26 UTC 2006
Anish Mistry wrote:
> On Friday 30 June 2006 22:14, Anish Mistry wrote:
>
>> On Friday 30 June 2006 17:33, you wrote:
>>
>>> Anish Mistry wrote:
>>>
>>>> On Friday 30 June 2006 16:54, you wrote:
>>>>
>>>>> Anish Mistry wrote:
>>>>>
>>>>>>> No, it fell through the cracks somewhere...
>>>>>>>
>>>>>>> Do you still have the HW in question so tests can be done ?
>>>>>>>
>>>>>> Yes, in the exact same configuration
>>>>>>
>>>>> OK, so lets start over, I've not been following this, could
>>>>> you get me a dmesg from a verbose booted system please ?
>>>>> It fails because the disk geometry is invalid right ?
>>>>>
>>>> http://am-productions.biz/docs/boot-panic-script.txt.gz
>>>>
>>>> The email I sent earlier today contains all of the details
>>>> including the above link. Let me know if you need further
>>>> clarification.
>>>>
>>> OK, in ata-disk.c::ad_attach the following lines is around line
>>> 100:
>>>
>>> if (atadev->param.atavalid & ATA_FLAG_54_58) {
>>> adp->heads = atadev->param.current_heads;
>>> adp->sectors = atadev->param.current_sectors;
>>> adp->total_secs = (u_int32_t)atadev->param.current_size_1
>>> | ((u_int32_t)atadev->param.current_size_2 << 16); }
>>> else {
>>> adp->heads = atadev->param.heads;
>>> adp->sectors = atadev->param.sectors;
>>> adp->total_secs = atadev->param.cylinders * adp->heads *
>>> adp->sectors;
>>> }
>>>
>>> It would seem that the wrong way of getting at the
>>> cyl/head/sector is used for your disk.
>>> My guess is that ->param.current_* isn't set correctly in your
>>> disk (firmware / BIOS mishap), so we need to take the old
>>> defaults instead. That is instead of relying on good values as
>>> the ATA_FLAG_54_58 was supposed to say, we also need to check the
>>> values for sane settings.
>>>
>>> I just love how hard it is to understand the word "shall" in
>>> standards, sigh....
>>>
>> Changing that bit to the following fixed it and allows it to boot.
>>
>> if (atadev->param.atavalid & ATA_FLAG_54_58) {
>> adp->heads = atadev->param.current_heads;
>> adp->sectors = atadev->param.current_sectors;
>> adp->total_secs = (u_int32_t)atadev->param.current_size_1 |
>> ((u_int32_t)atadev->param.current_size_2 << 16);
>> }
>> if (!(atadev->param.atavalid & ATA_FLAG_54_58) ||
>> ((atadev->param.atavalid & ATA_FLAG_54_58) && (adp->heads == 0 ||
>> adp->sectors == 0))) {
>> adp->heads = atadev->param.heads;
>> adp->sectors = atadev->param.sectors;
>> adp->total_secs = atadev->param.cylinders * adp->heads *
>> adp->sectors;
>> }
>>
> Do you have an ETA on committing this fix? Or is there something
> wrong with the change?
>
I've been out-of-office for the last week so thats why...
It needs a bit more refinement to be on the safe side however, I'll get
it in there, no worries...
-Søren
> Thanks,
>
>
More information about the freebsd-current
mailing list