diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2008-02-20 14:47:24 -0500 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-04-27 04:53:25 -0400 |
commit | 2e53d63acba75795aa226febd140f67c58c6a353 (patch) | |
tree | be4ad4e5b28c737053af78a950d270a657e9f628 /virt/kvm | |
parent | 847f0ad8cbfa70c1af6948025836dfbd9ed6da1e (diff) |
KVM: MMU: ignore zapped root pagetables
Mark zapped root pagetables as invalid and ignore such pages during lookup.
This is a problem with the cr3-target feature, where a zapped root table fools
the faulting code into creating a read-only mapping. The result is a lockup
if the instruction can't be emulated.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/kvm_main.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index cf6df5167af6..c41eb57ce29b 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -119,6 +119,29 @@ void kvm_flush_remote_tlbs(struct kvm *kvm) | |||
119 | smp_call_function_mask(cpus, ack_flush, NULL, 1); | 119 | smp_call_function_mask(cpus, ack_flush, NULL, 1); |
120 | } | 120 | } |
121 | 121 | ||
122 | void kvm_reload_remote_mmus(struct kvm *kvm) | ||
123 | { | ||
124 | int i, cpu; | ||
125 | cpumask_t cpus; | ||
126 | struct kvm_vcpu *vcpu; | ||
127 | |||
128 | cpus_clear(cpus); | ||
129 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | ||
130 | vcpu = kvm->vcpus[i]; | ||
131 | if (!vcpu) | ||
132 | continue; | ||
133 | if (test_and_set_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests)) | ||
134 | continue; | ||
135 | cpu = vcpu->cpu; | ||
136 | if (cpu != -1 && cpu != raw_smp_processor_id()) | ||
137 | cpu_set(cpu, cpus); | ||
138 | } | ||
139 | if (cpus_empty(cpus)) | ||
140 | return; | ||
141 | smp_call_function_mask(cpus, ack_flush, NULL, 1); | ||
142 | } | ||
143 | |||
144 | |||
122 | int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) | 145 | int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) |
123 | { | 146 | { |
124 | struct page *page; | 147 | struct page *page; |