Avoid AND-NOT, most x86 processor lack an instruction for it.
Unified · Split
| @@ -189,8 +189,11 @@ static inline unsigned FNAME(gpte_access)(struct kvm_vcpu *vcpu, u64 gpte) · 188 unmodified lines | ||
| 189 | 189 | ((gpte & VMX_EPT_EXECUTABLE_MASK) ? ACC_EXEC_MASK : 0) | |
| 190 | 190 | ACC_USER_MASK; |
| 191 | 191 | #else |
| 192 | − access = (gpte & (PT_WRITABLE_MASK | PT_USER_MASK)) | ACC_EXEC_MASK; | |
| 193 | − access &= ~(gpte >> PT64_NX_SHIFT); | |
| 192 | + BUILD_BUG_ON(ACC_EXEC_MASK != PT_PRESENT_MASK); | |
| 193 | + BUILD_BUG_ON(ACC_EXEC_MASK != 1); | |
| 194 | + access = gpte & (PT_WRITABLE_MASK | PT_USER_MASK | PT_PRESENT_MASK); | |
| 195 | + /* Combine NX with P (which is set here) to get ACC_EXEC_MASK. */ | |
| 196 | + access ^= (gpte >> PT64_NX_SHIFT); | |
| 194 | 197 | #endif |
| 195 | 198 | |
| 196 | 199 | return access; |