#include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { unsigned long iobar; void *maddr; char buf[256]; int fd; int i,j; struct timespec start, end; int pagesize = getpagesize(); if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } if (argv[1][0] != '/') { snprintf(buf, sizeof(buf), "/proc/bus/pci/%s", argv[1]); } else strncpy(buf, argv[1], sizeof(buf)); iobar = strtoul(argv[2], NULL, 0); fd = open(buf, O_RDWR); if (fd < 0) { fprintf(stderr, "Open %s: %s\n", buf, strerror(errno)); exit(1); } if (!strncmp(buf, "/proc", 5) && ioctl(fd, PCIIOC_MMAP_IS_MEM, NULL)) { perror("ioctl"); } maddr = mmap(NULL, pagesize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, iobar); if (maddr == MAP_FAILED) { perror("mmap"); exit(1); } clock_gettime(CLOCK_MONOTONIC, &start); for (j=0;j<1000;j++) { for (i=0; i < pagesize; i++) { *(volatile char *)(maddr + i) = j; } } clock_gettime(CLOCK_MONOTONIC, &end); end.tv_sec -= start.tv_sec; if ((end.tv_nsec -= start.tv_nsec) < 0) { end.tv_nsec += 1000000000L; end.tv_sec--; } printf("Copied %d loops in %ld.%09lds\n", j, end.tv_sec, end.tv_nsec); return 0; }