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 <[email protected]>, 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to