aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/kvm/kvm.h4
-rw-r--r--drivers/kvm/mmu.c4
-rw-r--r--drivers/kvm/paging_tmpl.h4
3 files changed, 7 insertions, 5 deletions
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 0d3555bf5333..ceefb4427dbd 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -55,7 +55,7 @@ struct kvm_pte_chain {
55 * bits 4:7 - page table level for this shadow (1-4) 55 * bits 4:7 - page table level for this shadow (1-4)
56 * bits 8:9 - page table quadrant for 2-level guests 56 * bits 8:9 - page table quadrant for 2-level guests
57 * bit 16 - "metaphysical" - gfn is not a real page (huge page/real mode) 57 * bit 16 - "metaphysical" - gfn is not a real page (huge page/real mode)
58 * bits 17:19 - "access" - the user, writable, and nx bits of a huge page pde 58 * bits 17:19 - common access permissions for all ptes in this shadow page
59 */ 59 */
60union kvm_mmu_page_role { 60union kvm_mmu_page_role {
61 unsigned word; 61 unsigned word;
@@ -65,7 +65,7 @@ union kvm_mmu_page_role {
65 unsigned quadrant : 2; 65 unsigned quadrant : 2;
66 unsigned pad_for_nice_hex_output : 6; 66 unsigned pad_for_nice_hex_output : 6;
67 unsigned metaphysical : 1; 67 unsigned metaphysical : 1;
68 unsigned hugepage_access : 3; 68 unsigned access : 3;
69 }; 69 };
70}; 70};
71 71
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c
index f8a2137c64a2..cace1e41b683 100644
--- a/drivers/kvm/mmu.c
+++ b/drivers/kvm/mmu.c
@@ -680,7 +680,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
680 gva_t gaddr, 680 gva_t gaddr,
681 unsigned level, 681 unsigned level,
682 int metaphysical, 682 int metaphysical,
683 unsigned hugepage_access, 683 unsigned access,
684 u64 *parent_pte) 684 u64 *parent_pte)
685{ 685{
686 union kvm_mmu_page_role role; 686 union kvm_mmu_page_role role;
@@ -694,7 +694,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
694 role.glevels = vcpu->mmu.root_level; 694 role.glevels = vcpu->mmu.root_level;
695 role.level = level; 695 role.level = level;
696 role.metaphysical = metaphysical; 696 role.metaphysical = metaphysical;
697 role.hugepage_access = hugepage_access; 697 role.access = access;
698 if (vcpu->mmu.root_level <= PT32_ROOT_LEVEL) { 698 if (vcpu->mmu.root_level <= PT32_ROOT_LEVEL) {
699 quadrant = gaddr >> (PAGE_SHIFT + (PT64_PT_BITS * level)); 699 quadrant = gaddr >> (PAGE_SHIFT + (PT64_PT_BITS * level));
700 quadrant &= (1 << ((PT32_PT_BITS - PT64_PT_BITS) * level)) - 1; 700 quadrant &= (1 << ((PT32_PT_BITS - PT64_PT_BITS) * level)) - 1;
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h
index 1fc4f9b321ee..211fef83be5d 100644
--- a/drivers/kvm/paging_tmpl.h
+++ b/drivers/kvm/paging_tmpl.h
@@ -327,6 +327,7 @@ static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *page,
327 int offset_in_pte) 327 int offset_in_pte)
328{ 328{
329 pt_element_t gpte; 329 pt_element_t gpte;
330 unsigned pte_access;
330 331
331 gpte = *(const pt_element_t *)pte; 332 gpte = *(const pt_element_t *)pte;
332 if (~gpte & (PT_PRESENT_MASK | PT_ACCESSED_MASK)) { 333 if (~gpte & (PT_PRESENT_MASK | PT_ACCESSED_MASK)) {
@@ -337,7 +338,8 @@ static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *page,
337 if (bytes < sizeof(pt_element_t)) 338 if (bytes < sizeof(pt_element_t))
338 return; 339 return;
339 pgprintk("%s: gpte %llx spte %p\n", __FUNCTION__, (u64)gpte, spte); 340 pgprintk("%s: gpte %llx spte %p\n", __FUNCTION__, (u64)gpte, spte);
340 FNAME(set_pte)(vcpu, gpte, spte, ACC_ALL, ACC_ALL, 341 pte_access = page->role.access & FNAME(gpte_access)(vcpu, gpte);
342 FNAME(set_pte)(vcpu, gpte, spte, page->role.access, pte_access,
341 0, 0, NULL, NULL, gpte_to_gfn(gpte)); 343 0, 0, NULL, NULL, gpte_to_gfn(gpte));
342} 344}
343 345