mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 10:14:23 +08:00
KVM: MMU: Check for root_level instead of long mode
The walk_addr function checks for !is_long_mode in its 64 bit version. But what is meant here is a check for pae paging. Change the condition to really check for pae paging so that it also works with nested nested paging. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
7b91409822
commit
957446afce
@ -132,7 +132,7 @@ walk:
|
|||||||
walker->level = vcpu->arch.mmu.root_level;
|
walker->level = vcpu->arch.mmu.root_level;
|
||||||
pte = vcpu->arch.cr3;
|
pte = vcpu->arch.cr3;
|
||||||
#if PTTYPE == 64
|
#if PTTYPE == 64
|
||||||
if (!is_long_mode(vcpu)) {
|
if (vcpu->arch.mmu.root_level == PT32E_ROOT_LEVEL) {
|
||||||
pte = kvm_pdptr_read(vcpu, (addr >> 30) & 3);
|
pte = kvm_pdptr_read(vcpu, (addr >> 30) & 3);
|
||||||
trace_kvm_mmu_paging_element(pte, walker->level);
|
trace_kvm_mmu_paging_element(pte, walker->level);
|
||||||
if (!is_present_gpte(pte)) {
|
if (!is_present_gpte(pte)) {
|
||||||
@ -205,7 +205,7 @@ walk:
|
|||||||
(PTTYPE == 64 || is_pse(vcpu))) ||
|
(PTTYPE == 64 || is_pse(vcpu))) ||
|
||||||
((walker->level == PT_PDPE_LEVEL) &&
|
((walker->level == PT_PDPE_LEVEL) &&
|
||||||
is_large_pte(pte) &&
|
is_large_pte(pte) &&
|
||||||
is_long_mode(vcpu))) {
|
vcpu->arch.mmu.root_level == PT64_ROOT_LEVEL)) {
|
||||||
int lvl = walker->level;
|
int lvl = walker->level;
|
||||||
|
|
||||||
walker->gfn = gpte_to_gfn_lvl(pte, lvl);
|
walker->gfn = gpte_to_gfn_lvl(pte, lvl);
|
||||||
|
Loading…
Reference in New Issue
Block a user