Hi! all,

I think, rbus is confusing 'size' and 'end'.  rbus uses 'end' to extent
functions.  man extent(9) describes

  extent_create() creates an extent map managing the space from start to
  end inclusive.

However some functions assumes 'end' is not inclusive.

for example, see attahed patch.

Thanks,
--
kiyohara
Index: arch/sparc64/sparc64/rbus_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/rbus_machdep.c,v
retrieving revision 1.16
diff -u -r1.16 rbus_machdep.c
--- arch/sparc64/sparc64/rbus_machdep.c 1 Jul 2011 18:49:24 -0000       1.16
+++ arch/sparc64/sparc64/rbus_machdep.c 9 Apr 2012 15:04:48 -0000
@@ -90,7 +90,7 @@
                panic("rbus_pccbb_parent_mem: extent is not initialized");
 
        start = ex->ex_start;
-       size = ex->ex_end - start;
+       size = ex->ex_end - start + 1;
 
        return rbus_new_root_share(pa->pa_memt, ex, start, size, 0);
 }
@@ -108,7 +108,7 @@
                panic("rbus_pccbb_parent_io: extent is not initialized");
 
        start = ex->ex_start;
-       size = ex->ex_end - start;
+       size = ex->ex_end - start + 1;
 
        return rbus_new_root_share(pa->pa_iot, ex, start, size, 0);
 }
Index: dev/cardbus/rbus.c
===================================================================
RCS file: /cvsroot/src/sys/dev/cardbus/rbus.c,v
retrieving revision 1.29
diff -u -r1.29 rbus.c
--- dev/cardbus/rbus.c  27 Jan 2012 18:53:07 -0000      1.29
+++ dev/cardbus/rbus.c  9 Apr 2012 15:04:48 -0000
@@ -253,7 +253,7 @@
 {
        rbus_tag_t rb;
        struct extent *ex = NULL;
-       bus_addr_t end = start + size;
+       bus_addr_t end = start + size - 1;
 
        if (flags == RBUS_SPACE_SHARE) {
                ex = parent->rb_ext;
@@ -269,7 +269,7 @@
                return 0;
        }
 
-       rb = rbus_new_body(parent->rb_bt, parent, ex, start, start + size,
+       rb = rbus_new_body(parent->rb_bt, parent, ex, start, end,
            offset, flags);
 
        if ((rb == NULL) && (flags == RBUS_SPACE_DEDICATE)) {
@@ -293,13 +293,14 @@
 {
        rbus_tag_t rb;
        struct extent *ex;
+       bus_addr_t end = start + size - 1;
 
-       if (NULL == (ex = extent_create("rbus root", start, start + size,
+       if (NULL == (ex = extent_create("rbus root", start, end,
            NULL, 0, EX_NOCOALESCE|EX_NOWAIT))) {
                return NULL;
        }
 
-       rb = rbus_new_body(bt, NULL, ex, start, start + size, offset,
+       rb = rbus_new_body(bt, NULL, ex, start, end, offset,
            RBUS_SPACE_DEDICATE);
 
        if (rb == NULL) {
@@ -320,17 +321,19 @@
 rbus_tag_t
 rbus_new_root_share(bus_space_tag_t bt, struct extent *ex, bus_addr_t start, 
bus_size_t size, bus_addr_t offset)
 {
+       bus_addr_t end = start + size - 1;
+
        /* sanity check */
-       if (start < ex->ex_start || start + size > ex->ex_end) {
+       if (start < ex->ex_start || end > ex->ex_end) {
                /*
-                * out of range: [start, size] should be contained in
+                * out of range: [start, end] should be contained in
                 * parent space
                 */
                return 0;
                /* Should I invoke panic? */
        }
 
-       return rbus_new_body(bt, NULL, ex, start, start + size, offset,
+       return rbus_new_body(bt, NULL, ex, start, end, offset,
            RBUS_SPACE_SHARE);
 }
 

Reply via email to