Provide the result of RDMSR from rdmsr_safe() so that it can be used by tests that are unsure whether or not RDMSR will fault, but want the value if it doesn't fault. Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> --- lib/x86/processor.h | 9 +++++++-- x86/msr.c | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/x86/processor.h b/lib/x86/processor.h index bc6c8d94..82f8df58 100644 --- a/lib/x86/processor.h +++ b/lib/x86/processor.h @@ -360,12 +360,17 @@ static inline void wrmsr(u32 index, u64 val) asm volatile ("wrmsr" : : "a"(a), "d"(d), "c"(index) : "memory"); } -static inline int rdmsr_safe(u32 index) +static inline int rdmsr_safe(u32 index, uint64_t *val) { + uint32_t a, d; + asm volatile (ASM_TRY("1f") "rdmsr\n\t" "1:" - : : "c"(index) : "memory", "eax", "edx"); + : "=a"(a), "=d"(d) + : "c"(index) : "memory"); + + *val = (uint64_t)a | ((uint64_t)d << 32); return exception_vector(); } diff --git a/x86/msr.c b/x86/msr.c index eaca19ed..ee1d3984 100644 --- a/x86/msr.c +++ b/x86/msr.c @@ -81,7 +81,8 @@ static void test_wrmsr_fault(struct msr_info *msr, unsigned long long val) static void test_rdmsr_fault(struct msr_info *msr) { - unsigned char vector = rdmsr_safe(msr->index); + uint64_t ignored; + unsigned char vector = rdmsr_safe(msr->index, &ignored); report(vector == GP_VECTOR, "Expected #GP on RDSMR(%s), got vector %d", msr->name, vector); -- 2.36.1.255.ge46751e96f-goog