Problem with starting ORe
Alexander Valitov
valitov79 at mail.ru
Mon Mar 2 17:16:45 CET 2009
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
--
View this message in context: http://www.nabble.com/Problem-with-starting-ORe-tp22181637p22291127.html
Sent from the L4 mailing list archive at Nabble.com.
More information about the l4-hackers
mailing list