public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* I/O port permission bit inheritance between threads
@ 2013-05-20 21:24 Stephen Hemminger
  2013-05-21  9:50 ` Joerg Roedel
  0 siblings, 1 reply; 5+ messages in thread
From: Stephen Hemminger @ 2013-05-20 21:24 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: kvm

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@outflux.net>, 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;
}

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-05-23  9:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-20 21:24 I/O port permission bit inheritance between threads Stephen Hemminger
2013-05-21  9:50 ` Joerg Roedel
2013-05-21 10:01   ` Gleb Natapov
2013-05-21 15:27     ` Stephen Hemminger
2013-05-23  9:27       ` Gleb Natapov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox