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