Generic int 13h driver

Die Gestalt die.gestalt at gmail.com
Mon May 21 14:44:52 UTC 2007


On 5/16/07, Dag-Erling Smørgrav <des at des.no> wrote:
>
> "Die Gestalt" <die.gestalt at gmail.com> writes:
> > As the subject implies I'm currently doing the most unholy thing ever.
> I'm
> > writing a driver that accesses hard disks through BIOS int13h. The
> reasons
> > why I'm doing this are many, but mainly I will be in a situation where I
>
> > will not be able to update my kernel and where I want to support as much
> > devices as possible. I know this will be slow and I know this will only
> work
> > on the i386 platform, I accept that.
>
> It won't work nearly as universally as you intend; for some devices
> (particularly USB devices), the BIOS tries to enter protected mode when
> servicing requests.


I know there will be some limitations unfortunately.

> So far so good, I have a skeleton which is able to query the drive
> > parameters and some basic stuff. But when I want to read, this doesn't
> work,
> > except in QEmu (http://www.qemu.org). I've tried on a VMWare and a real
> > machine, what I get is a stall for maybe 10 s (sometimes not) and the
> > operations returns saying it's successful but my buffer is actually left
>
> > untouched. I get no kernel message.
>
> Have you verified that the buffer you write from or read into is mapped
> correctly in virtual 8086 mode, and that you pass the correct address to
> the BIOS?


I think so. It works when I request a buffer to be filled with information.
For instance function 48h of the int 13h correctly fills my buffer.

To pass the address I use vm86_addpage to update a vm86context and then I
pass this context to vm86_datacall.

I think this might be a DMA problem. When the BIOS writes to the buffer, it
does it via DMA, and I get typical DMA problems. However I've tried to use a
buffer allocated via buf_dmamem_alloc() to no success.

Thanks for your answer.


More information about the freebsd-drivers mailing list