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 | |
| 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')
| -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; |
