Merge branch 'kvm-updates-2.6.26' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm
* 'kvm-updates-2.6.26' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm: KVM: LAPIC: ignore pending timers if LVTT is disabled KVM: Update MAINTAINERS for new mailing lists KVM: Fix kvm_vcpu_block() task state race KVM: ia64: Set KVM_IOAPIC_NUM_PINS to 48 KVM: ia64: fix GVMM module including position-dependent objects KVM: ia64: Define new kvm_fpreg struture to replace ia64_fpreg KVM: PIT: take inject_pending into account when emulating hlt s390: KVM guest: fix compile error KVM: x86 emulator: fix writes to registers with modrm encodings
This commit is contained in:
commit
88d53766bd
12
MAINTAINERS
12
MAINTAINERS
@ -2352,15 +2352,15 @@ S: Supported
|
|||||||
KERNEL VIRTUAL MACHINE (KVM)
|
KERNEL VIRTUAL MACHINE (KVM)
|
||||||
P: Avi Kivity
|
P: Avi Kivity
|
||||||
M: avi@qumranet.com
|
M: avi@qumranet.com
|
||||||
L: kvm-devel@lists.sourceforge.net
|
L: kvm@vger.kernel.org
|
||||||
W: kvm.sourceforge.net
|
W: http://kvm.qumranet.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
||||||
P: Hollis Blanchard
|
P: Hollis Blanchard
|
||||||
M: hollisb@us.ibm.com
|
M: hollisb@us.ibm.com
|
||||||
L: kvm-ppc-devel@lists.sourceforge.net
|
L: kvm-ppc@vger.kernel.org
|
||||||
W: kvm.sourceforge.net
|
W: http://kvm.qumranet.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64)
|
KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64)
|
||||||
@ -2368,8 +2368,8 @@ P: Anthony Xu
|
|||||||
M: anthony.xu@intel.com
|
M: anthony.xu@intel.com
|
||||||
P: Xiantao Zhang
|
P: Xiantao Zhang
|
||||||
M: xiantao.zhang@intel.com
|
M: xiantao.zhang@intel.com
|
||||||
L: kvm-ia64-devel@lists.sourceforge.net
|
L: kvm-ia64@vger.kernel.org
|
||||||
W: kvm.sourceforge.net
|
W: http://kvm.qumranet.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
|
KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
|
||||||
|
@ -7,7 +7,6 @@ offsets-file := asm-offsets.h
|
|||||||
always := $(offsets-file)
|
always := $(offsets-file)
|
||||||
targets := $(offsets-file)
|
targets := $(offsets-file)
|
||||||
targets += arch/ia64/kvm/asm-offsets.s
|
targets += arch/ia64/kvm/asm-offsets.s
|
||||||
clean-files := $(addprefix $(objtree)/,$(targets) $(obj)/memcpy.S $(obj)/memset.S)
|
|
||||||
|
|
||||||
# Default sed regexp - multiline due to syntax constraints
|
# Default sed regexp - multiline due to syntax constraints
|
||||||
define sed-y
|
define sed-y
|
||||||
@ -54,5 +53,5 @@ EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
|||||||
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
||||||
vtlb.o process.o
|
vtlb.o process.o
|
||||||
#Add link memcpy and memset to avoid possible structure assignment error
|
#Add link memcpy and memset to avoid possible structure assignment error
|
||||||
kvm-intel-objs += ../lib/memset.o ../lib/memcpy.o
|
kvm-intel-objs += memcpy.o memset.o
|
||||||
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
|
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
|
||||||
|
1
arch/ia64/kvm/memcpy.S
Normal file
1
arch/ia64/kvm/memcpy.S
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../lib/memcpy.S"
|
1
arch/ia64/kvm/memset.S
Normal file
1
arch/ia64/kvm/memset.S
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../lib/memset.S"
|
@ -216,7 +216,7 @@ int pit_has_pending_timer(struct kvm_vcpu *vcpu)
|
|||||||
{
|
{
|
||||||
struct kvm_pit *pit = vcpu->kvm->arch.vpit;
|
struct kvm_pit *pit = vcpu->kvm->arch.vpit;
|
||||||
|
|
||||||
if (pit && vcpu->vcpu_id == 0)
|
if (pit && vcpu->vcpu_id == 0 && pit->pit_state.inject_pending)
|
||||||
return atomic_read(&pit->pit_state.pit_timer.pending);
|
return atomic_read(&pit->pit_state.pit_timer.pending);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -957,7 +957,7 @@ int apic_has_pending_timer(struct kvm_vcpu *vcpu)
|
|||||||
{
|
{
|
||||||
struct kvm_lapic *lapic = vcpu->arch.apic;
|
struct kvm_lapic *lapic = vcpu->arch.apic;
|
||||||
|
|
||||||
if (lapic)
|
if (lapic && apic_enabled(lapic) && apic_lvt_enabled(lapic, APIC_LVTT))
|
||||||
return atomic_read(&lapic->timer.pending);
|
return atomic_read(&lapic->timer.pending);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -677,8 +677,9 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
|||||||
c->use_modrm_ea = 1;
|
c->use_modrm_ea = 1;
|
||||||
|
|
||||||
if (c->modrm_mod == 3) {
|
if (c->modrm_mod == 3) {
|
||||||
c->modrm_val = *(unsigned long *)
|
c->modrm_ptr = decode_register(c->modrm_rm,
|
||||||
decode_register(c->modrm_rm, c->regs, c->d & ByteOp);
|
c->regs, c->d & ByteOp);
|
||||||
|
c->modrm_val = *(unsigned long *)c->modrm_ptr;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1005,6 +1006,7 @@ done_prefixes:
|
|||||||
if ((c->d & ModRM) && c->modrm_mod == 3) {
|
if ((c->d & ModRM) && c->modrm_mod == 3) {
|
||||||
c->src.type = OP_REG;
|
c->src.type = OP_REG;
|
||||||
c->src.val = c->modrm_val;
|
c->src.val = c->modrm_val;
|
||||||
|
c->src.ptr = c->modrm_ptr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c->src.type = OP_MEM;
|
c->src.type = OP_MEM;
|
||||||
@ -1049,6 +1051,7 @@ done_prefixes:
|
|||||||
if ((c->d & ModRM) && c->modrm_mod == 3) {
|
if ((c->d & ModRM) && c->modrm_mod == 3) {
|
||||||
c->dst.type = OP_REG;
|
c->dst.type = OP_REG;
|
||||||
c->dst.val = c->dst.orig_val = c->modrm_val;
|
c->dst.val = c->dst.orig_val = c->modrm_val;
|
||||||
|
c->dst.ptr = c->modrm_ptr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c->dst.type = OP_MEM;
|
c->dst.type = OP_MEM;
|
||||||
|
@ -78,27 +78,32 @@ static unsigned desc_size(const struct kvm_device_desc *desc)
|
|||||||
+ desc->config_len;
|
+ desc->config_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* This gets the device's feature bits. */
|
||||||
* This tests (and acknowleges) a feature bit.
|
static u32 kvm_get_features(struct virtio_device *vdev)
|
||||||
*/
|
|
||||||
static bool kvm_feature(struct virtio_device *vdev, unsigned fbit)
|
|
||||||
{
|
{
|
||||||
|
unsigned int i;
|
||||||
|
u32 features = 0;
|
||||||
struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
|
struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
|
||||||
u8 *features;
|
u8 *in_features = kvm_vq_features(desc);
|
||||||
|
|
||||||
if (fbit / 8 > desc->feature_len)
|
for (i = 0; i < min(desc->feature_len * 8, 32); i++)
|
||||||
return false;
|
if (in_features[i / 8] & (1 << (i % 8)))
|
||||||
|
features |= (1 << i);
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
features = kvm_vq_features(desc);
|
static void kvm_set_features(struct virtio_device *vdev, u32 features)
|
||||||
if (!(features[fbit / 8] & (1 << (fbit % 8))))
|
{
|
||||||
return false;
|
unsigned int i;
|
||||||
|
struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
|
||||||
|
/* Second half of bitmap is features we accept. */
|
||||||
|
u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
|
||||||
|
|
||||||
/*
|
memset(out_features, 0, desc->feature_len);
|
||||||
* We set the matching bit in the other half of the bitmap to tell the
|
for (i = 0; i < min(desc->feature_len * 8, 32); i++) {
|
||||||
* Host we want to use this feature.
|
if (features & (1 << i))
|
||||||
*/
|
out_features[i / 8] |= (1 << (i % 8));
|
||||||
features[desc->feature_len + fbit / 8] |= (1 << (fbit % 8));
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -221,7 +226,8 @@ static void kvm_del_vq(struct virtqueue *vq)
|
|||||||
* The config ops structure as defined by virtio config
|
* The config ops structure as defined by virtio config
|
||||||
*/
|
*/
|
||||||
static struct virtio_config_ops kvm_vq_configspace_ops = {
|
static struct virtio_config_ops kvm_vq_configspace_ops = {
|
||||||
.feature = kvm_feature,
|
.get_features = kvm_get_features,
|
||||||
|
.set_features = kvm_set_features,
|
||||||
.get = kvm_get,
|
.get = kvm_get,
|
||||||
.set = kvm_set,
|
.set = kvm_set,
|
||||||
.get_status = kvm_get_status,
|
.get_status = kvm_get_status,
|
||||||
|
@ -22,14 +22,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/fpu.h>
|
|
||||||
|
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
|
|
||||||
/* Architectural interrupt line count. */
|
/* Architectural interrupt line count. */
|
||||||
#define KVM_NR_INTERRUPTS 256
|
#define KVM_NR_INTERRUPTS 256
|
||||||
|
|
||||||
#define KVM_IOAPIC_NUM_PINS 24
|
#define KVM_IOAPIC_NUM_PINS 48
|
||||||
|
|
||||||
struct kvm_ioapic_state {
|
struct kvm_ioapic_state {
|
||||||
__u64 base_address;
|
__u64 base_address;
|
||||||
@ -61,6 +60,13 @@ struct kvm_ioapic_state {
|
|||||||
|
|
||||||
#define KVM_CONTEXT_SIZE 8*1024
|
#define KVM_CONTEXT_SIZE 8*1024
|
||||||
|
|
||||||
|
struct kvm_fpreg {
|
||||||
|
union {
|
||||||
|
unsigned long bits[2];
|
||||||
|
long double __dummy; /* force 16-byte alignment */
|
||||||
|
} u;
|
||||||
|
};
|
||||||
|
|
||||||
union context {
|
union context {
|
||||||
/* 8K size */
|
/* 8K size */
|
||||||
char dummy[KVM_CONTEXT_SIZE];
|
char dummy[KVM_CONTEXT_SIZE];
|
||||||
@ -77,7 +83,7 @@ union context {
|
|||||||
unsigned long ibr[8];
|
unsigned long ibr[8];
|
||||||
unsigned long dbr[8];
|
unsigned long dbr[8];
|
||||||
unsigned long pkr[8];
|
unsigned long pkr[8];
|
||||||
struct ia64_fpreg fr[128];
|
struct kvm_fpreg fr[128];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -135,6 +135,7 @@ struct decode_cache {
|
|||||||
u8 modrm_rm;
|
u8 modrm_rm;
|
||||||
u8 use_modrm_ea;
|
u8 use_modrm_ea;
|
||||||
unsigned long modrm_ea;
|
unsigned long modrm_ea;
|
||||||
|
void *modrm_ptr;
|
||||||
unsigned long modrm_val;
|
unsigned long modrm_val;
|
||||||
struct fetch_cache fetch;
|
struct fetch_cache fetch;
|
||||||
};
|
};
|
||||||
|
@ -758,25 +758,26 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
|
|||||||
*/
|
*/
|
||||||
void kvm_vcpu_block(struct kvm_vcpu *vcpu)
|
void kvm_vcpu_block(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
DECLARE_WAITQUEUE(wait, current);
|
DEFINE_WAIT(wait);
|
||||||
|
|
||||||
add_wait_queue(&vcpu->wq, &wait);
|
for (;;) {
|
||||||
|
prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
|
||||||
|
|
||||||
|
if (kvm_cpu_has_interrupt(vcpu))
|
||||||
|
break;
|
||||||
|
if (kvm_cpu_has_pending_timer(vcpu))
|
||||||
|
break;
|
||||||
|
if (kvm_arch_vcpu_runnable(vcpu))
|
||||||
|
break;
|
||||||
|
if (signal_pending(current))
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
|
||||||
* We will block until either an interrupt or a signal wakes us up
|
|
||||||
*/
|
|
||||||
while (!kvm_cpu_has_interrupt(vcpu)
|
|
||||||
&& !kvm_cpu_has_pending_timer(vcpu)
|
|
||||||
&& !signal_pending(current)
|
|
||||||
&& !kvm_arch_vcpu_runnable(vcpu)) {
|
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
|
||||||
vcpu_put(vcpu);
|
vcpu_put(vcpu);
|
||||||
schedule();
|
schedule();
|
||||||
vcpu_load(vcpu);
|
vcpu_load(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
__set_current_state(TASK_RUNNING);
|
finish_wait(&vcpu->wq, &wait);
|
||||||
remove_wait_queue(&vcpu->wq, &wait);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_resched(struct kvm_vcpu *vcpu)
|
void kvm_resched(struct kvm_vcpu *vcpu)
|
||||||
|
Loading…
Reference in New Issue
Block a user