Hi,
Björn Döbel wrote:
bad news: it works for me on my e1000 test machine and on Qemu.
I'm sure it does as my binary ORe module works with another e1000 series network card. It don't work with only one particular NIC type 8086:1076 (VendorID:DeviceID).
good news: I manage to get it running. It looks like problem was due to bug in DDE library.
let's look at function ioremap() in file /l4/pkg/dde/linux26/lib/src/arch/l4/res.c (revision 433):
void __iomem * ioremap(unsigned long phys_addr, unsigned long size) { struct list_head *pos, *head; head = &dde_mem_regions;
list_for_each(pos, head) { struct dde_mem_region *mreg = list_entry(pos, struct dde_mem_region, list); if (mreg->pa >= phys_addr && mreg->pa + mreg->size > phys_addr) return (void *)(mreg->va + (phys_addr - mreg->pa)); }
return NULL; }
I think that the following condition is wrong: if (mreg->pa >= phys_addr && mreg->pa + mreg->size > phys_addr)
I guess the right one is (so phys region is fully covered by DDE memory region): if (mreg->pa <= phys_addr && mreg->pa + mreg->size > phys_addr)
When I fixed it, PF disappeared. Here is a patch: =================================================================== --- res.c (revision 433) +++ res.c (working copy) @@ -131,7 +131,7 @@ list_for_each(pos, head) { struct dde_mem_region *mreg = list_entry(pos, struct dde_mem_region, list); - if (mreg->pa >= phys_addr && mreg->pa + mreg->size > phys_addr) + if (mreg->pa <= phys_addr && mreg->pa + mreg->size > phys_addr) return (void *)(mreg->va + (phys_addr - mreg->pa)); }
Did I miss something? Best Regards, Alexander Valitov