diff options
Diffstat (limited to 'drivers/kvm/mmu.c')
-rw-r--r-- | drivers/kvm/mmu.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index 23dc4612026b..9ec3df90dbb8 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
@@ -1137,6 +1137,20 @@ static void mmu_pte_write_zap_pte(struct kvm_vcpu *vcpu, | |||
1137 | *spte = 0; | 1137 | *spte = 0; |
1138 | } | 1138 | } |
1139 | 1139 | ||
1140 | static void mmu_pte_write_new_pte(struct kvm_vcpu *vcpu, | ||
1141 | struct kvm_mmu_page *page, | ||
1142 | u64 *spte, | ||
1143 | const void *new, int bytes) | ||
1144 | { | ||
1145 | if (page->role.level != PT_PAGE_TABLE_LEVEL) | ||
1146 | return; | ||
1147 | |||
1148 | if (page->role.glevels == PT32_ROOT_LEVEL) | ||
1149 | paging32_update_pte(vcpu, page, spte, new, bytes); | ||
1150 | else | ||
1151 | paging64_update_pte(vcpu, page, spte, new, bytes); | ||
1152 | } | ||
1153 | |||
1140 | void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | 1154 | void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, |
1141 | const u8 *old, const u8 *new, int bytes) | 1155 | const u8 *old, const u8 *new, int bytes) |
1142 | { | 1156 | { |
@@ -1212,6 +1226,7 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
1212 | spte += page_offset / sizeof(*spte); | 1226 | spte += page_offset / sizeof(*spte); |
1213 | while (npte--) { | 1227 | while (npte--) { |
1214 | mmu_pte_write_zap_pte(vcpu, page, spte); | 1228 | mmu_pte_write_zap_pte(vcpu, page, spte); |
1229 | mmu_pte_write_new_pte(vcpu, page, spte, new, bytes); | ||
1215 | ++spte; | 1230 | ++spte; |
1216 | } | 1231 | } |
1217 | } | 1232 | } |