#include #include #include #include #include #include #include #include #define PCI_MMIO_BAR_BASE 0xF0000000ULL static void handler(int sig, siginfo_t *sip, void *ctx) { printf("signo %d, code %d, errno %d\n", sip->si_signo, sip->si_code, sip->si_errno); if (sig != SIGBUS) errx(1, "expected SIGBUS: %d", sig); if (sip->si_code != BUS_ADRERR) errx(1, "expected BUS_ADRERR: %d", sip->si_code); exit(0); } int main(int argc, char **argv) { struct sigaction sa; int fd; char *p; volatile char v; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = handler; sa.sa_flags = SA_SIGINFO; if (sigaction(SIGBUS, &sa, NULL) == -1) err(2, "sigaction"); fd = open("/dev/xf86", O_RDWR); if (fd == -1) err(2, "open"); p = mmap(NULL, sizeof(v), PROT_READ, 0, fd, PCI_MMIO_BAR_BASE); if (p == MAP_FAILED) err(2, "mmap"); v = *p; errx(1, "expected signal"); }