Hi Tom,
>>>> - int 21.1c should report invalid drives via AL (keep other regs?)
>>>> News here: DR-DOS modifies BX/CX/DX but not DS for inv drives.
[patch to preserve DS:BX and set AL=-1 if FatGetDrvData... == NULL]
> should get the job done
Indeed, test for NULL as return value of FatGetDrvData and if
NULL then do not return the pointer but do set AL to -1 :-).
It seems no other registers need fixing in 21.1c / 21.36...
>> Unfortunately I do not know to what value DR DOS sets BX/CX/DX,
> MS-DOS is the king, and it lets all registers unchanged.
Okay! Do you want to upload your int 21.1c fix or should I do it?
>>>> - CHS calculations are off by 1 and overflowing (thanks Rayer)
>>>> If your BIOS has no LBA, this was probably a real pain for you.
>>> any details about this ? like the original email ('thanks Rayer' is
>>> not enough of a description)
>> The discussion is spread over mail and chat,
> but this is certainly in the kernel mailing list, isn't it ?
No sorry I just assisted RayeR on ICQ a bit and then at some
time he had a kernel with a fix, mixed with other fixes. This
probably has a thread on the BTTR forum, where I never post.
The two changed lines are:
593 pddt->ddt_ncyl = driveParam->chs.Cylinder + 1;
Here, +1 got added. And:
762 driveParam->total_sectors =
763 (ULONG)(driveParam->chs.Cylinder+1)
764 * driveParam->chs.Head * driveParam->chs.Sector;
Here, min(...Cylinder,1023) got replaced by (ULONG)(...Cylinder+1).
Can you confirm the usefulness of those two CHS related changes?
In addition, a few format strings changed: DebugPrintf about drive
parameters from %02x %04lu %u %u to %02Xh %u %u %u for drive, C, H, S
and %02x to %02Xh for drive in "Error reading partition table" printf.
Last but not least, LBA-Transfer error now also mentions LBA_address+1
(dunno why +1) using %lu format. Do these changes make sense?
About BSS_INIT in init-mod.h, suggestion is to always use
>> #define BSS_INIT(x) = x
> it shouldn't matter if
> int SomeVariable;
> or
> int SomeVariable = 0;
> is declared. in the former case it is put into the BSS segment, and
> initialized by the runtime libray. As we don't have the normal runtime
> library, we do it in main.c
> /* clear the Init BSS area (what normally the RTL does */
> memset(_ib_start, 0, _ib_end - _ib_start);
Maybe this broke when Bart tuned the memory model recently?
Remember for example "JEMM386 int 19 fastboot compatible
storage of original pointers of hooked BIOS intr" here...
As quite a few BIOSes also clear the RAM, it would be plausible
that a bug in this area could stay undetected for quite a while?
> in both cases the variable ends up as 0
Not for RayeR, apparently: Some variables were nonzero in initdisk.
> if this makes any difference, either
> the memset() memset above doesn't work
> or
> the error relates to the actual placement of the variable in the
> DATA segment. usually an overwriting problem or similar.
> good luck hunting if it's the latter
As RayeR was able to fix the symptom by using BSS_INIT(x) = x style
for the macro, I hope that "if it is the latter" his fix would have
broken something else, so I believe that the memset has a problem.
Eric
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Freedos-kernel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freedos-kernel