diff options
author | Jan Kiszka <jan.kiszka@web.de> | 2009-05-14 16:42:53 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-09-10 01:32:41 -0400 |
commit | c5ff41ce66382d657a76bc06ba252d848826950f (patch) | |
tree | 4b7bc3674faa6259b1e6b07fc616b17dcf281d98 /arch/x86/kvm/x86.c | |
parent | 721eecbf4fe995ca94a9edec0c9843b1cc0eaaf3 (diff) |
KVM: Allow PIT emulation without speaker port
The in-kernel speaker emulation is only a dummy and also unneeded from
the performance point of view. Rather, it takes user space support to
generate sound output on the host, e.g. console beeps.
To allow this, introduce KVM_CREATE_PIT2 which controls in-kernel
speaker port emulation via a flag passed along the new IOCTL. It also
leaves room for future extensions of the PIT configuration interface.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 15f39fc08ece..5eb3b8dd74b8 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1127,6 +1127,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
1127 | case KVM_CAP_IRQ_INJECT_STATUS: | 1127 | case KVM_CAP_IRQ_INJECT_STATUS: |
1128 | case KVM_CAP_ASSIGN_DEV_IRQ: | 1128 | case KVM_CAP_ASSIGN_DEV_IRQ: |
1129 | case KVM_CAP_IRQFD: | 1129 | case KVM_CAP_IRQFD: |
1130 | case KVM_CAP_PIT2: | ||
1130 | r = 1; | 1131 | r = 1; |
1131 | break; | 1132 | break; |
1132 | case KVM_CAP_COALESCED_MMIO: | 1133 | case KVM_CAP_COALESCED_MMIO: |
@@ -2038,6 +2039,7 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
2038 | union { | 2039 | union { |
2039 | struct kvm_pit_state ps; | 2040 | struct kvm_pit_state ps; |
2040 | struct kvm_memory_alias alias; | 2041 | struct kvm_memory_alias alias; |
2042 | struct kvm_pit_config pit_config; | ||
2041 | } u; | 2043 | } u; |
2042 | 2044 | ||
2043 | switch (ioctl) { | 2045 | switch (ioctl) { |
@@ -2098,12 +2100,20 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
2098 | } | 2100 | } |
2099 | break; | 2101 | break; |
2100 | case KVM_CREATE_PIT: | 2102 | case KVM_CREATE_PIT: |
2103 | u.pit_config.flags = KVM_PIT_SPEAKER_DUMMY; | ||
2104 | goto create_pit; | ||
2105 | case KVM_CREATE_PIT2: | ||
2106 | r = -EFAULT; | ||
2107 | if (copy_from_user(&u.pit_config, argp, | ||
2108 | sizeof(struct kvm_pit_config))) | ||
2109 | goto out; | ||
2110 | create_pit: | ||
2101 | mutex_lock(&kvm->lock); | 2111 | mutex_lock(&kvm->lock); |
2102 | r = -EEXIST; | 2112 | r = -EEXIST; |
2103 | if (kvm->arch.vpit) | 2113 | if (kvm->arch.vpit) |
2104 | goto create_pit_unlock; | 2114 | goto create_pit_unlock; |
2105 | r = -ENOMEM; | 2115 | r = -ENOMEM; |
2106 | kvm->arch.vpit = kvm_create_pit(kvm); | 2116 | kvm->arch.vpit = kvm_create_pit(kvm, u.pit_config.flags); |
2107 | if (kvm->arch.vpit) | 2117 | if (kvm->arch.vpit) |
2108 | r = 0; | 2118 | r = 0; |
2109 | create_pit_unlock: | 2119 | create_pit_unlock: |