On Tue, 31 Dec 2002 11:09:36 +0100 (CET), Daniela Engert wrote: >>>> Memory objects in this so called linear address >>>>space are addressable from any context by means of >>>>the DOS32FLATDS selector; >>>Are you sure ? AFAIK, DOS32FLATDS requires the code to >>>run at ring 0. I seem to remember, that I had to move some >>>INIT code to INITCOMPLETE in order to use this approach. >True, but why bother at all? As I said, if some weird driver *requires* >addressability of parts of this memory at some odd instance of time it >may use the LinToGDTSelector device helper service. Besides that, >INITCOMPLETE is the perfect place to do initialization stuff.
No. That's not the actual problem. GCONFIG-API is designed to work anywhere this means even on INIT of simple DEVICE-PDDs for e.g. device-searching etc. And because the API is linked in as FAR CALL, I need to be able to access the configuration area even on Ring-3. There is no way around it. It's not a "weird driver requirement". It's a requirement of GCONFIG. >Think about this stuff and get it! Linear addresses have these >properties: >1) the memory pointed to is *accessible* in all Ring-0 contexts by >means of the the flat selector. >2) the address is *valid* in all, even Ring-3 contexts. In Ring-3 it >needs some mapping to make it *accessible*. And searching through BASE-Block area would require me to map on every search, every check, every PCI Read/Write and whatever call? This would be crazy! I would need to map the whole area anyway, so I would have to built 3 different types of routines. Currently only 2 routine-types are required (16-bit segmented and 32-bit linear). LinToGDT is *also* limited to 64k, so if there is no DOS32FLATDS for Ring-3, then this is the only way. >>Yes I think that's right. Otherwise there would have to be 2 selectors. One for >Ring-0, the other one for >>Ring-3. For god-sake, I didn't start changing the APIs yet :-) This means I really >have to do this 512 >>GDT-selectors stuff. >Three times NO! You don't need such kind of things. And if you insist >on a GDT selector, why don't you setup a single big one? Because AllocGDTSel is limited to 64k by IBM :-) Three times NO to IBM ;-) >>>>So, instead of virtual (GDT based) pointer switch to linear (32-bit) >>>>ones and *expose* them to clients. If a client is so stupid to require >>>>a virtual mapping then it can do it itself. >>>Why is this mapping necessary at all ? Wasn't the result of some >>>ealier discussion to copy out the data ? >You are true, copy out was the solution wee agreed on. This makes >things even easier. Like I said before: I'm not working with device IOCTL. Parts of the API will be also accessible that way, but not all of it (and that's actually meant for application Ring-3, *not* driver INIT). Anyway generating one device IOCTL (and switch back and forth from Ring-0 to Ring-3) for a single (!) PCI read/write operation during INIT would be nuts. This would be a huge overhead (speed, size and code), which is actually completely useless. This would also need me to define all sorts of "pass-through" buffers and much more crap. I'm currently working with stack based arguments and far call. This is the fastest approach there is. Far Call is also needed, because GCONFIG-"printf" is working on Ring-0 *and* Ring-3 (!). If I switch to Ring-0 via device IOCTL, this is *not* possible. The current driver-code for using GCONFIG-API is around 100-200 bytes (!) and it won't increase per API call. An IOCTL approach would require *much* overhead and for every routine "imported" from GCONFIG, there would need to be some stub-routine in the actual driver PDD (which would mean duplicate code every here and there). cu, Kiewitz ----------- To unsubscribe yourself from this list, send the following message to [EMAIL PROTECTED] unsubscribe acpi-os2 end