aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvi Kivity <avi@qumranet.com>2007-11-21 07:44:45 -0500
committerAvi Kivity <avi@qumranet.com>2008-01-30 10:53:11 -0500
commit1755fbcc6666906cada43c1c839ca1fc6616d4a6 (patch)
tree2f878da8de7c7e9043337d7ee028116b0c397829
parent38c335f1f57bd9edc3cd894e8f5f3fc133320ad3 (diff)
KVM: MMU: Introduce gfn_to_gpa()
Converting a frame number to an address is tricky since the data type changes size. Introduce a function to do it. This fixes an actual bug when accessing guest ptes. Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r--drivers/kvm/kvm.h4
-rw-r--r--drivers/kvm/paging_tmpl.h4
2 files changed, 6 insertions, 2 deletions
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 048849d97b35..eda82cded88e 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -499,6 +499,10 @@ static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot)
499 return slot - kvm->memslots; 499 return slot - kvm->memslots;
500} 500}
501 501
502static inline gpa_t gfn_to_gpa(gfn_t gfn)
503{
504 return (gpa_t)gfn << PAGE_SHIFT;
505}
502 506
503enum kvm_stat_kind { 507enum kvm_stat_kind {
504 KVM_STAT_VM, 508 KVM_STAT_VM,
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h
index a3da98bfd6a6..b24bc7c86078 100644
--- a/drivers/kvm/paging_tmpl.h
+++ b/drivers/kvm/paging_tmpl.h
@@ -110,7 +110,7 @@ static int FNAME(walk_addr)(struct guest_walker *walker,
110 index = PT_INDEX(addr, walker->level); 110 index = PT_INDEX(addr, walker->level);
111 111
112 table_gfn = gpte_to_gfn(pte); 112 table_gfn = gpte_to_gfn(pte);
113 pte_gpa = table_gfn << PAGE_SHIFT; 113 pte_gpa = gfn_to_gpa(table_gfn);
114 pte_gpa += index * sizeof(pt_element_t); 114 pte_gpa += index * sizeof(pt_element_t);
115 walker->table_gfn[walker->level - 1] = table_gfn; 115 walker->table_gfn[walker->level - 1] = table_gfn;
116 pgprintk("%s: table_gfn[%d] %lx\n", __FUNCTION__, 116 pgprintk("%s: table_gfn[%d] %lx\n", __FUNCTION__,
@@ -442,7 +442,7 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr)
442 r = FNAME(walk_addr)(&walker, vcpu, vaddr, 0, 0, 0); 442 r = FNAME(walk_addr)(&walker, vcpu, vaddr, 0, 0, 0);
443 443
444 if (r) { 444 if (r) {
445 gpa = (gpa_t)walker.gfn << PAGE_SHIFT; 445 gpa = gfn_to_gpa(walker.gfn);
446 gpa |= vaddr & ~PAGE_MASK; 446 gpa |= vaddr & ~PAGE_MASK;
447 } 447 }
448 448