nEPT: correctly check if remote tlb flush is needed for shadowed EPT tables
need_remote_flush() assumes that shadow page is in PT64 format, but with addition of nested EPT this is no longer always true. Fix it by bits definitions that depend on host shadow page type. Reported-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Reviewed-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7a1638ce42
commit
53166229e9
1 changed files with 4 additions and 4 deletions
|
@ -132,8 +132,8 @@ module_param(dbg, bool, 0644);
|
|||
(PAGE_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \
|
||||
* PT32_LEVEL_BITS))) - 1))
|
||||
|
||||
#define PT64_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK \
|
||||
| PT64_NX_MASK)
|
||||
#define PT64_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | shadow_user_mask \
|
||||
| shadow_x_mask | shadow_nx_mask)
|
||||
|
||||
#define ACC_EXEC_MASK 1
|
||||
#define ACC_WRITE_MASK PT_WRITABLE_MASK
|
||||
|
@ -3879,8 +3879,8 @@ static bool need_remote_flush(u64 old, u64 new)
|
|||
return true;
|
||||
if ((old ^ new) & PT64_BASE_ADDR_MASK)
|
||||
return true;
|
||||
old ^= PT64_NX_MASK;
|
||||
new ^= PT64_NX_MASK;
|
||||
old ^= shadow_nx_mask;
|
||||
new ^= shadow_nx_mask;
|
||||
return (old & ~new & PT64_PERM_MASK) != 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue