KVM: x86: use vcpu-specific functions to read/write/translate GFNs
We need to hide SMRAM from guests not running in SMM. Therefore, all uses of kvm_read_guest* and kvm_write_guest* must be changed to check whether the VCPU is in system management mode and use a different set of memslots. Switch from kvm_* to the newly-introduced kvm_vcpu_*, which call into kvm_arch_vcpu_memslots_id. Reviewed-by: Radim Krčmář <rkrcmar@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Dieser Commit ist enthalten in:
@@ -256,7 +256,7 @@ static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mark_page_dirty(vcpu->kvm, table_gfn);
|
||||
kvm_vcpu_mark_page_dirty(vcpu, table_gfn);
|
||||
walker->ptes[level] = pte;
|
||||
}
|
||||
return 0;
|
||||
@@ -338,7 +338,7 @@ retry_walk:
|
||||
|
||||
real_gfn = gpa_to_gfn(real_gfn);
|
||||
|
||||
host_addr = gfn_to_hva_prot(vcpu->kvm, real_gfn,
|
||||
host_addr = kvm_vcpu_gfn_to_hva_prot(vcpu, real_gfn,
|
||||
&walker->pte_writable[walker->level - 1]);
|
||||
if (unlikely(kvm_is_error_hva(host_addr)))
|
||||
goto error;
|
||||
@@ -511,11 +511,11 @@ static bool FNAME(gpte_changed)(struct kvm_vcpu *vcpu,
|
||||
base_gpa = pte_gpa & ~mask;
|
||||
index = (pte_gpa - base_gpa) / sizeof(pt_element_t);
|
||||
|
||||
r = kvm_read_guest_atomic(vcpu->kvm, base_gpa,
|
||||
r = kvm_vcpu_read_guest_atomic(vcpu, base_gpa,
|
||||
gw->prefetch_ptes, sizeof(gw->prefetch_ptes));
|
||||
curr_pte = gw->prefetch_ptes[index];
|
||||
} else
|
||||
r = kvm_read_guest_atomic(vcpu->kvm, pte_gpa,
|
||||
r = kvm_vcpu_read_guest_atomic(vcpu, pte_gpa,
|
||||
&curr_pte, sizeof(curr_pte));
|
||||
|
||||
return r || curr_pte != gw->ptes[level - 1];
|
||||
@@ -869,8 +869,8 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva)
|
||||
if (!rmap_can_add(vcpu))
|
||||
break;
|
||||
|
||||
if (kvm_read_guest_atomic(vcpu->kvm, pte_gpa, &gpte,
|
||||
sizeof(pt_element_t)))
|
||||
if (kvm_vcpu_read_guest_atomic(vcpu, pte_gpa, &gpte,
|
||||
sizeof(pt_element_t)))
|
||||
break;
|
||||
|
||||
FNAME(update_pte)(vcpu, sp, sptep, &gpte);
|
||||
@@ -956,8 +956,8 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
|
||||
|
||||
pte_gpa = first_pte_gpa + i * sizeof(pt_element_t);
|
||||
|
||||
if (kvm_read_guest_atomic(vcpu->kvm, pte_gpa, &gpte,
|
||||
sizeof(pt_element_t)))
|
||||
if (kvm_vcpu_read_guest_atomic(vcpu, pte_gpa, &gpte,
|
||||
sizeof(pt_element_t)))
|
||||
return -EINVAL;
|
||||
|
||||
if (FNAME(prefetch_invalid_gpte)(vcpu, sp, &sp->spt[i], gpte)) {
|
||||
@@ -970,7 +970,7 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
|
||||
pte_access &= FNAME(gpte_access)(vcpu, gpte);
|
||||
FNAME(protect_clean_gpte)(&pte_access, gpte);
|
||||
|
||||
if (sync_mmio_spte(vcpu->kvm, &sp->spt[i], gfn, pte_access,
|
||||
if (sync_mmio_spte(vcpu, &sp->spt[i], gfn, pte_access,
|
||||
&nr_present))
|
||||
continue;
|
||||
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren