From owner-freebsd-x11@FreeBSD.ORG Tue Apr 16 04:30:02 2013 Return-Path: Delivered-To: freebsd-x11@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 18407291 for ; Tue, 16 Apr 2013 04:30:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id EEBB7BFB for ; Tue, 16 Apr 2013 04:30:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.6/8.14.6) with ESMTP id r3G4U11l062239 for ; Tue, 16 Apr 2013 04:30:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.6/8.14.6/Submit) id r3G4U1ej062238; Tue, 16 Apr 2013 04:30:01 GMT (envelope-from gnats) Date: Tue, 16 Apr 2013 04:30:01 GMT Message-Id: <201304160430.r3G4U1ej062238@freefall.freebsd.org> To: freebsd-x11@FreeBSD.org Cc: From: John Wehle Subject: Re: ports/169875: x11/xorg: vesa on 9-BETA1/Xorg 7.7 with radeon 6450 causes segfault X-BeenThere: freebsd-x11@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: John Wehle List-Id: X11 on FreeBSD -- maintaining and support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Apr 2013 04:30:02 -0000 The following reply was made to PR ports/169875; it has been noted by GNATS. From: John Wehle To: bug-followup@FreeBSD.org Cc: archibald@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 +#include + +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@feith.com | | John Wehle | Fax: 1-215-540-5495 | | -------------------------------------------------------------------------