On Mon, Nov 24, 2008 at 9:15 AM, ron minnich rminnich@gmail.com wrote:
On Mon, Nov 24, 2008 at 7:01 AM, Myles Watson mylesgw@gmail.com wrote:
if (resource->flags & IORESOURCE_IO) { /* Don't allow potential aliases over the legacy
PCI
* expansion card addresses. The legacy PCI
decodes
* only 10 bits, uses 0x100 - 0x3ff. Therefore,
only
* 0x00 - 0xff can be used out of each 0x400 block
of * I/O space. */ if ((base & 0x300) != 0) { base = (base & ~0x3ff) + 0x400; } /* Don't allow allocations in the VGA I/O range. * PCI has special cases for that. */ else if ((base >= 0x3b0) && (base <= 0x3df)) { base = 0x3e0; } }
It seems like I'm misreading this and/or the check isn't broad enough.
If
there are really devices claiming all IO where the last 10 bits decode to 0x300, then many more ranges should be affected. For example, a size
0x200
allocation from 0x200-0x3ff doesn't trigger this check. Neither does a
size
0x200 allocation from 0x1200 - 0x13ff, but a size 0x20 allocation from 0x1320-0x133f does.
I don't understand. 0x200 & 0x300 is non-zero. 0x200 will trigger it.
You're right. I didn't put that example together well. What I was trying to say was a resource allocation that covers that range but doesn't have its base address in the range. Maybe I won't mess up a simpler example:
An allocation of size 0x400 from 0x0 - 0x3ff. The allocation has several addresses within it that have problems with the legacy decode, but doesn't get caught because the base doesn't trigger the check. Same with 0x1000 - 0x13ff.
Thanks,
Myles