Index: sys/dev/pci/pci_map.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/pci_map.c,v
retrieving revision 1.23
diff -u -b -r1.23 pci_map.c
--- sys/dev/pci/pci_map.c	28 Apr 2008 20:23:55 -0000	1.23
+++ sys/dev/pci/pci_map.c	12 Jun 2008 16:48:09 -0000
@@ -271,6 +271,15 @@
     int busflags, bus_space_tag_t *tagp, bus_space_handle_t *handlep,
     bus_addr_t *basep, bus_size_t *sizep)
 {
+	return pci_mapreg_submap(pa, reg, type, busflags, 0, 0, tagp, basep,
+	   sizep);
+}
+
+int
+pci_mapreg_submap(struct pci_attach_args *pa, int reg, pcireg_t type,
+    int busflags, bus_size_t maxsize, bus_size_t offset, bus_space_tag_t *tagp,
+	bus_space_handle_t *handlep, bus_addr_t *basep, bus_size_t *sizep)
+{
 	bus_space_tag_t tag;
 	bus_space_handle_t handle;
 	bus_addr_t base;
@@ -304,7 +313,17 @@
 		splx(s);
 	}
 
-	if (bus_space_map(tag, base, size, busflags | flags, &handle))
+	/* If we're called with maxsize/offset of 0, behave like 
+	 * pci_mapreg_map.
+	 */
+
+	maxsize = maxsize && offset ? maxsize : size;
+	base += offset;
+
+	if ((maxsize < size && offset + maxsize <= size) || offset != 0)
+		return (1);
+
+	if (bus_space_map(tag, base, maxsize, busflags | flags, &handle))
 		return (1);
 
 	if (tagp != 0)
@@ -314,7 +333,7 @@
 	if (basep != 0)
 		*basep = base;
 	if (sizep != 0)
-		*sizep = size;
+		*sizep = maxsize;
 
 	return (0);
 }
