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 | ((gpte & VMX_EPT_EXECUTABLE_MASK) ? ACC_EXEC_MASK : 0) | | 189 | ((gpte & VMX_EPT_EXECUTABLE_MASK) ? ACC_EXEC_MASK : 0) | |
| 190 | ACC_USER_MASK; | 190 | ACC_USER_MASK; |
| 191 | #else | 191 | #else |
| 192 | access = (gpte & (PT_WRITABLE_MASK | PT_USER_MASK)) | ACC_EXEC_MASK; | 192 | BUILD_BUG_ON(ACC_EXEC_MASK != PT_PRESENT_MASK); |
| 193 | access &= ~(gpte >> PT64_NX_SHIFT); | 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 | #endif | 197 | #endif |
| 195 | 198 | ||
| 196 | return access; | 199 | return access; |