ioperm() inheritance across threads is different in KVM then when run on physical hardware. The following program runs on physical hardware but get SEGV under KVM. It appears that the I/O permission bits are not shared between threads in the same way. /* Original Copyright 2011, Kees Cook <kees@xxxxxxxxxxx>, License: GPLv2 */ #include <unistd.h> #include <stdio.h> #include <pthread.h> #include <sys/io.h> static void *beep(void *arg) { unsigned char bits; fprintf(stderr, "waiting\n"); sleep(1); fprintf(stderr, "beeping\n"); /* turn on speaker */ bits = inb(0x61); bits |= 3; outb(bits, 0x61); /* set 1000 Hz frequency */ bits = 0xA9; outb(bits, 0x42); bits = 0x04; outb(bits, 0x42); /* listen to the beep */ sleep(4); fprintf(stderr, "done\n"); return NULL; } int main() { pthread_t tid; unsigned char orig; if (pthread_create(&tid, NULL, &beep, NULL)) { perror("pthread"); return 1; } /* gain access to speaker control port */ if (ioperm(0x61, 0x61, 1) < 0) { perror("0x61"); return 1; } orig = inb(0x61); /* gain access to speaker frequency port */ if (ioperm(0x42, 0x42, 1) < 0) { perror("0x42"); return 2; } fprintf(stderr, "joining\n"); pthread_join(tid, NULL); /* restore speaker bits to turn off speaker */ outb(orig, 0x61); fprintf(stderr, "done\n"); return 0; } -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html