On 64-bit PowerPC, and possibly other architectures, PCI devices are mapped
above the 32-bit barrier. When X is built as a 32-bit binary, which is typical
on PowerPC, it cannot access these devices. X tries to map the BAR as an offset
to /dev/mem. Since the offset is larger than the offset parameter to mmap, the
wrong address is mapped. The result is that either random locations in system
memory are used or a bus error is generated (I've seen both).
At least on Linux, the correct solution is to use
/sys/bus/pci/devices/*/resource* instead of /dev/mem. By doing this, the offset
to mmap would always be zero.
Sorry about the phenomenal bug spam, guys. Adding xorg-team@ to the QA contact so bugs don't get lost in future.
PCI-rework has landed, and this bug is no longer relevant.