Module Name:    xsrc
Committed By:   mrg
Date:           Tue Jan 12 03:05:32 UTC 2010

Modified Files:
        xsrc/external/mit/libpciaccess/dist/src: netbsd_pci.c

Log Message:
in pci_device_netbsd_probe() probe the expansion ROM and size.
if it's there, set priv->rom_base and device->rom_size.

originally from mhitch, and it's basically the same code as present in
both freebsd_pci.c and openbsd_pci.c.

add a comment about needing to avoid the default bios mapping if this
card is not the console.

mmap() with MAP_SHARED, since the kernel forces this anyway, and it is
again the same in both freebsd_pci.c and openbsd_pci.c.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c
diff -u xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c:1.5 xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c:1.6
--- xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c:1.5	Wed Dec 23 22:21:01 2009
+++ xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c	Tue Jan 12 03:05:31 2010
@@ -354,6 +354,23 @@
 		}
 	}
 
+	/* Probe expansion ROM if present */
+	err = pci_read(domain, bus, dev, func, PCI_MAPREG_ROM, &reg);
+	if (err)
+		return err;
+	if (reg != 0) {
+		err = pci_write(domain, bus, dev, func, PCI_MAPREG_ROM,
+		    (uint32_t)(~PCI_MAPREG_ROM_ENABLE));
+		if (err)
+			return err;
+		pci_read(domain, bus, dev, func, PCI_MAPREG_ROM, &size);
+		pci_write(domain, bus, dev, func, PCI_MAPREG_ROM, reg);
+		if ((reg & PCI_MAPREG_MEM_ADDR_MASK) != 0) {
+			priv->rom_base = reg & PCI_MAPREG_MEM_ADDR_MASK;
+			device->rom_size = -(size & PCI_MAPREG_MEM_ADDR_MASK);
+		}
+	}
+
 	return 0;
 }
 
@@ -379,6 +396,10 @@
 
     if (priv->rom_base == 0) {
 #if defined(__amd64__) || defined(__i386__)
+	/*
+	 * We need a way to detect when this isn't the console and reject
+	 * this request outright.
+	 */
 	rom_base = 0xc0000;
 	rom_size = 0x10000;
 	pci_rom = 0;
@@ -419,7 +440,7 @@
     if (memfd == -1)
 	return errno;
 
-    bios = mmap(NULL, rom_size, PROT_READ, 0, memfd, (off_t)rom_base);
+    bios = mmap(NULL, rom_size, PROT_READ, MAP_SHARED, memfd, (off_t)rom_base);
     if (bios == MAP_FAILED) {
 	int serrno = errno;
 	close(memfd);

Reply via email to