target-i386: mmu: use pg_mode instead of HF_LMA_MASK

Correctly look up the paging mode of the hypervisor when it is using 64-bit
mode but the guest is not.

Fixes: 68746930ae ("target/i386: use mmu_translate for NPT walk", 2021-05-11)
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2021-11-04 14:45:20 +01:00
parent 63ed851de4
commit 93eae35832

View File

@ -90,7 +90,7 @@ static int mmu_translate(CPUState *cs, hwaddr addr, MMUTranslateFunc get_hphys_f
target_ulong pdpe_addr; target_ulong pdpe_addr;
#ifdef TARGET_X86_64 #ifdef TARGET_X86_64
if (env->hflags & HF_LMA_MASK) { if (pg_mode & PG_MODE_LMA) {
bool la57 = pg_mode & PG_MODE_LA57; bool la57 = pg_mode & PG_MODE_LA57;
uint64_t pml5e_addr, pml5e; uint64_t pml5e_addr, pml5e;
uint64_t pml4e_addr, pml4e; uint64_t pml4e_addr, pml4e;
@ -287,7 +287,7 @@ do_check_protect_pse36:
*prot |= PAGE_EXEC; *prot |= PAGE_EXEC;
} }
if (!(env->hflags & HF_LMA_MASK)) { if (!(pg_mode & PG_MODE_LMA)) {
pkr = 0; pkr = 0;
} else if (ptep & PG_USER_MASK) { } else if (ptep & PG_USER_MASK) {
pkr = pg_mode & PG_MODE_PKE ? env->pkru : 0; pkr = pg_mode & PG_MODE_PKE ? env->pkru : 0;