@@ -6,6 +6,8 @@
#include "msr.h"
#include <stdint.h>
+#define NONCANONICAL 0xaaaaaaaaaaaaaaaaull
+
#ifdef __x86_64__
# define R "r"
# define W "q"
@@ -80,6 +80,14 @@ int main(int ac, char **av)
for (i = 0 ; i < ARRAY_SIZE(msr_info); i++) {
if (is_64bit_host || !msr_info[i].is_64bit_only) {
test_msr_rw(&msr_info[i], msr_info[i].value);
+
+ /*
+ * The 64-bit only MSRs that take an address always perform
+ * canonical checks on both Intel and AMD.
+ */
+ if (msr_info[i].is_64bit_only &&
+ msr_info[i].value == addr_64)
+ test_wrmsr_fault(&msr_info[i], NONCANONICAL);
} else {
test_wrmsr_fault(&msr_info[i], msr_info[i].value);
test_rdmsr_fault(&msr_info[i]);
@@ -21,8 +21,6 @@
#include "smp.h"
#include "delay.h"
-#define NONCANONICAL 0xaaaaaaaaaaaaaaaaull
-
#define VPID_CAP_INVVPID_TYPES_SHIFT 40
u64 ia32_pat;
Verify that WRMSR takes a #GP when writing a non-canonical value to a MSR that always takes a 64-bit address. Specifically, AMD doesn't enforce a canonical address for the SYSENTER MSRs. Signed-off-by: Sean Christopherson <seanjc@google.com> --- lib/x86/processor.h | 2 ++ x86/msr.c | 8 ++++++++ x86/vmx_tests.c | 2 -- 3 files changed, 10 insertions(+), 2 deletions(-)