[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [v4][PATCH 4/9] tools:libxc: check if mmio BAR is out of RMRR mappings



On 2014/8/27 4:36, Ian Campbell wrote:
On Fri, 2014-08-22 at 18:09 +0800, Tiejun Chen wrote:

+    /* We should check if mmio range is out of RMRR mapping.
+     *
+     * Assume we have one entry if not enough we'll expand.
+     */

The usual approach with such hypervisor interfaces (which I suppose
xc_reserved_device_memory_map turns into) is to first call it with NULL
to get the required size and then allocate a suitable buffer and call a
second time.

Ofentimes, RMRR should be rare with one or two entries, even zero. So I think its reasonable to start posting one entry since this can cover such a scenario the platform really owns one entry.



+    for ( i = 0; i < rc; i++ )
+    {
+        rmrr_start = map[i].pfn << PAGE_SHIFT;
+        rmrr_end = rmrr_start + map[i].count * PAGE_SIZE;
+        if ( check_mmio_hole(rmrr_start, map[i].count * PAGE_SIZE,

Adding rmrr_size = map... & PAGE_SIZE could be used twice here.


Yes, so I think the follows should be expected:

--- a/tools/libxc/xc_hvm_build_x86.c
+++ b/tools/libxc/xc_hvm_build_x86.c
@@ -251,7 +251,7 @@ static int check_rmrr_overlap(xc_interface *xch, uint64_t mmio_start,
                               uint64_t mmio_size)
 {
     struct xen_mem_reserved_device_memory *map = NULL;
-    uint64_t rmrr_start = 0, rmrr_end = 0;
+    uint64_t rmrr_start = 0, rmrr_end = 0, rmrr_size = 0;
     unsigned int i = 0;
     int rc = 0;
     /* Assume we have one entry if not enough we'll expand.*/
@@ -295,9 +295,9 @@ static int check_rmrr_overlap(xc_interface *xch, uint64_t mmio_start,
     for ( i = 0; i < rc; i++ )
     {
         rmrr_start = map[i].start_pfn << PAGE_SHIFT;
-        rmrr_end = rmrr_start + map[i].nr_pages * PAGE_SIZE;
-        if ( check_mmio_hole(rmrr_start, map[i].nr_pages * PAGE_SIZE,
-                             mmio_start, mmio_size) )
+        rmrr_size = map[i].nr_pages * PAGE_SIZE;
+        rmrr_end = rmrr_start + rmrr_size;
+ if ( check_mmio_hole(rmrr_start, rmrr_size, mmio_start, mmio_size) )
         {
             PERROR("MMIO: [%lx]<->[%lx] overlap RMRR [%lx]<->[%lx]\n",
mmio_start, (mmio_start + mmio_size), rmrr_start, rmrr_end);

Thanks
Tiejun

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.