ports/169875: x11/xorg: vesa on 9-BETA1/Xorg 7.7 with radeon 6450 causes segfault
John Wehle
john at feith.com
Tue Apr 16 04:30:02 UTC 2013
The following reply was made to PR ports/169875; it has been noted by GNATS.
From: John Wehle <john at feith.com>
To: bug-followup at FreeBSD.org
Cc: archibald at ethernull.org
Subject: Re: ports/169875: x11/xorg: vesa on 9-BETA1/Xorg 7.7 with radeon 6450 causes segfault
Date: Tue, 16 Apr 2013 00:25:42 -0400 (EDT)
I encountered a similar problem using a Radeon 7850 after upgrading from
xorg-server-1.11.4 to xorg-server-1.12.4.
Tracing through the code shows the problem is caused by libpciaccess
missing routines for implementing legacy I/O on FreeBSD. xorg-server-1.12.4
passes a quick smoke test once the enclosed patch is applied to libpciaccess
0.13.1.
I've only tested this fix an i386 platform.
I've also submitted this issue upstream as:
https://bugs.freedesktop.org/show_bug.cgi?id=63583
-- John
------------------------8<------------------------------8<---------------
--- src/freebsd_pci.c.ORIGINAL 2012-04-09 13:02:57.000000000 -0400
+++ src/freebsd_pci.c 2013-04-15 23:35:33.000000000 -0400
@@ -561,6 +561,92 @@
freebsd_pci_sys = NULL;
}
+#if defined(__i386__) || defined(__amd64__)
+#include <machine/cpufunc.h>
+#include <machine/sysarch.h>
+
+static struct pci_io_handle *
+pci_device_freebsd_open_legacy_io(struct pci_io_handle *ret,
+ struct pci_device *dev, pciaddr_t base, pciaddr_t size)
+{
+
+ if (i386_set_ioperm (base, size, 1) != 0)
+ return NULL;
+
+ ret->base = base;
+ ret->size = size;
+ return ret;
+}
+
+static uint32_t
+pci_device_freebsd_read32(struct pci_io_handle *handle, uint32_t reg)
+{
+ return inl(handle->base + reg);
+}
+
+static uint16_t
+pci_device_freebsd_read16(struct pci_io_handle *handle, uint32_t reg)
+{
+ return inw(handle->base + reg);
+}
+
+static uint8_t
+pci_device_freebsd_read8(struct pci_io_handle *handle, uint32_t reg)
+{
+ return inb(handle->base + reg);
+}
+
+static void
+pci_device_freebsd_write32(struct pci_io_handle *handle, uint32_t reg,
+ uint32_t data)
+{
+ outl(handle->base + reg, data);
+}
+
+static void
+pci_device_freebsd_write16(struct pci_io_handle *handle, uint32_t reg,
+ uint16_t data)
+{
+ outw(handle->base + reg, data);
+}
+
+static void
+pci_device_freebsd_write8(struct pci_io_handle *handle, uint32_t reg,
+ uint8_t data)
+{
+ outb(handle->base + reg, data);
+}
+#endif
+
+static int
+pci_device_freebsd_map_legacy(struct pci_device *dev, pciaddr_t base,
+ pciaddr_t size, unsigned map_flags, void **addr)
+{
+ struct pci_device_mapping map;
+ int err;
+
+ map.base = base;
+ map.size = size;
+ map.flags = map_flags;
+ map.memory = NULL;
+ err = pci_device_freebsd_map_range(dev, &map);
+ *addr = map.memory;
+
+ return err;
+}
+
+static int
+pci_device_freebsd_unmap_legacy(struct pci_device *dev, void *addr,
+ pciaddr_t size)
+{
+ struct pci_device_mapping map;
+
+ map.memory = addr;
+ map.size = size;
+ map.flags = 0;
+ return pci_device_freebsd_unmap_range(dev, &map);
+}
+
static const struct pci_system_methods freebsd_pci_methods = {
.destroy = pci_system_freebsd_destroy,
.destroy_device = NULL, /* nothing to do for this */
@@ -571,6 +657,17 @@
.read = pci_device_freebsd_read,
.write = pci_device_freebsd_write,
.fill_capabilities = pci_fill_capabilities_generic,
+#if defined(__i386__) || defined(__amd64__)
+ .open_legacy_io = pci_device_freebsd_open_legacy_io,
+ .read32 = pci_device_freebsd_read32,
+ .read16 = pci_device_freebsd_read16,
+ .read8 = pci_device_freebsd_read8,
+ .write32 = pci_device_freebsd_write32,
+ .write16 = pci_device_freebsd_write16,
+ .write8 = pci_device_freebsd_write8,
+#endif
+ .map_legacy = pci_device_freebsd_map_legacy,
+ .unmap_legacy = pci_device_freebsd_unmap_legacy,
};
/**
-------------------------------------------------------------------------
| Feith Systems | Voice: 1-215-646-8000 | Email: john at feith.com |
| John Wehle | Fax: 1-215-540-5495 | |
-------------------------------------------------------------------------
More information about the freebsd-x11
mailing list