aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/kvm/paging_tmpl.h20
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h
index 92b93134a2a6..6e013015f0a8 100644
--- a/drivers/kvm/paging_tmpl.h
+++ b/drivers/kvm/paging_tmpl.h
@@ -187,6 +187,7 @@ static void FNAME(set_pte_common)(struct kvm_vcpu *vcpu,
187 int dirty = gpte & PT_DIRTY_MASK; 187 int dirty = gpte & PT_DIRTY_MASK;
188 u64 spte; 188 u64 spte;
189 int was_rmapped = is_rmap_pte(*shadow_pte); 189 int was_rmapped = is_rmap_pte(*shadow_pte);
190 struct page *page;
190 191
191 pgprintk("%s: spte %llx gpte %llx access %llx write_fault %d" 192 pgprintk("%s: spte %llx gpte %llx access %llx write_fault %d"
192 " user_fault %d gfn %lx\n", 193 " user_fault %d gfn %lx\n",
@@ -205,6 +206,12 @@ static void FNAME(set_pte_common)(struct kvm_vcpu *vcpu,
205 206
206 paddr = gpa_to_hpa(vcpu->kvm, gaddr & PT64_BASE_ADDR_MASK); 207 paddr = gpa_to_hpa(vcpu->kvm, gaddr & PT64_BASE_ADDR_MASK);
207 208
209 /*
210 * the reason paddr get mask even that it isnt pte is beacuse the
211 * HPA_ERR_MASK bit might be used to signal error
212 */
213 page = pfn_to_page((paddr & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT);
214
208 spte |= PT_PRESENT_MASK; 215 spte |= PT_PRESENT_MASK;
209 if (access_bits & PT_USER_MASK) 216 if (access_bits & PT_USER_MASK)
210 spte |= PT_USER_MASK; 217 spte |= PT_USER_MASK;
@@ -212,8 +219,7 @@ static void FNAME(set_pte_common)(struct kvm_vcpu *vcpu,
212 if (is_error_hpa(paddr)) { 219 if (is_error_hpa(paddr)) {
213 set_shadow_pte(shadow_pte, 220 set_shadow_pte(shadow_pte,
214 shadow_trap_nonpresent_pte | PT_SHADOW_IO_MARK); 221 shadow_trap_nonpresent_pte | PT_SHADOW_IO_MARK);
215 kvm_release_page_clean(pfn_to_page((paddr & PT64_BASE_ADDR_MASK) 222 kvm_release_page_clean(page);
216 >> PAGE_SHIFT));
217 return; 223 return;
218 } 224 }
219 225
@@ -254,17 +260,11 @@ unshadowed:
254 if (!was_rmapped) { 260 if (!was_rmapped) {
255 rmap_add(vcpu, shadow_pte, (gaddr & PT64_BASE_ADDR_MASK) 261 rmap_add(vcpu, shadow_pte, (gaddr & PT64_BASE_ADDR_MASK)
256 >> PAGE_SHIFT); 262 >> PAGE_SHIFT);
257 if (!is_rmap_pte(*shadow_pte)) { 263 if (!is_rmap_pte(*shadow_pte))
258 struct page *page;
259
260 page = pfn_to_page((paddr & PT64_BASE_ADDR_MASK)
261 >> PAGE_SHIFT);
262 kvm_release_page_clean(page); 264 kvm_release_page_clean(page);
263 }
264 } 265 }
265 else 266 else
266 kvm_release_page_clean(pfn_to_page((paddr & PT64_BASE_ADDR_MASK) 267 kvm_release_page_clean(page);
267 >> PAGE_SHIFT));
268 if (!ptwrite || !*ptwrite) 268 if (!ptwrite || !*ptwrite)
269 vcpu->last_pte_updated = shadow_pte; 269 vcpu->last_pte_updated = shadow_pte;
270} 270}