context->sync_page = nonpaging_sync_page;
context->invlpg = NULL;
context->root_level = 0;
- context->shadow_root_level = PT32E_ROOT_LEVEL;
context->direct_map = true;
context->nx = false;
}
static void paging64_init_context_common(struct kvm_vcpu *vcpu,
struct kvm_mmu *context,
- int level)
+ int root_level)
{
context->nx = is_nx(vcpu);
- context->root_level = level;
+ context->root_level = root_level;
reset_rsvds_bits_mask(vcpu, context);
update_permission_bitmask(vcpu, context, false);
context->gva_to_gpa = paging64_gva_to_gpa;
context->sync_page = paging64_sync_page;
context->invlpg = paging64_invlpg;
- context->shadow_root_level = level;
context->direct_map = false;
}
context->gva_to_gpa = paging32_gva_to_gpa;
context->sync_page = paging32_sync_page;
context->invlpg = paging32_invlpg;
- context->shadow_root_level = PT32E_ROOT_LEVEL;
context->direct_map = false;
}
else
paging32_init_context(vcpu, context);
+ context->shadow_root_level = new_role.base.level;
+
context->mmu_role.as_u64 = new_role.as_u64;
reset_shadow_zero_bits_mask(vcpu, context);
}
__kvm_mmu_new_pgd(vcpu, nested_cr3, new_role.base);
- if (new_role.as_u64 != context->mmu_role.as_u64) {
+ if (new_role.as_u64 != context->mmu_role.as_u64)
shadow_mmu_init_context(vcpu, context, cr0, cr4, efer, new_role);
- /*
- * Override the level set by the common init helper, nested TDP
- * always uses the host's TDP configuration.
- */
- context->shadow_root_level = new_role.base.level;
- }
-
/*
* Redo the shadow bits, the reset done by shadow_mmu_init_context()
* (above) may use the wrong shadow_root_level.