+/* Find the lowest RMRR higher than base. */
+static int find_next_rmrr(uint32_t base)
+{
+ unsigned int i;
+ int next_rmrr = -1;
+ uint64_t min_base = (1ull << 32);
+
+ for ( i = 0; i < memory_map.nr_map ; i++ )
+ {
+ if ( memory_map.map[i].type == E820_RESERVED &&
+ memory_map.map[i].addr > base &&
+ memory_map.map[i].addr < min_base )
+ {
+ next_rmrr = i;
+ min_base = memory_map.map[i].addr;
+ }
+ }
+ return next_rmrr;
+}
Considering _both_ callers, I think the function should actually return
the lowest RMRR higher than or equal to base.
You mean instead of strictly greater than the base.
Or wait - we actually
need to find the lowest RMRR the _end_ of which is higher than base.
Yes, you're right: there's always a risk that pci_mem_start will *start*
in the middle of a range. Looking for the next *end* is more robust.
Sorry this is not very clear to me so are you saying something like this?
for ( i = 0; i < memory_map.nr_map ; i++ )
{
end = memory_map.map[i].addr + memory_map.map[i].size;
if ( memory_map.map[i].type == E820_RESERVED &&
end > base &&
memory_map.map[i].addr < min_base )
{
next_rmrr = i;
min_base = memory_map.map[i].addr;
}
}
Thanks
Tiejun
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel