#include <xtf/extable.h>
#include <xen/arch-x86/xen.h>
#include <arch/desc.h>
-
-static inline uint64_t rdmsr(uint32_t idx)
-{
- uint32_t lo, hi;
-
- asm volatile("rdmsr": "=a" (lo), "=d" (hi): "c" (idx));
-
- return (((uint64_t)hi) << 32) | lo;
-}
-
-static inline bool rdmsr_safe(uint32_t idx, uint64_t *val)
-{
- uint32_t lo, hi, new_idx;
-
- asm volatile("1: rdmsr; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_rdmsr_safe)
- : "=a" (lo), "=d" (hi), "=c" (new_idx)
- : "c" (idx), "X" (ex_rdmsr_safe));
-
- bool fault = idx != new_idx;
-
- if ( !fault )
- *val = (((uint64_t)hi) << 32) | lo;
-
- return fault;
-}
-
-static inline void wrmsr(uint32_t idx, uint64_t val)
-{
- asm volatile ("wrmsr":
- : "c" (idx), "a" ((uint32_t)val),
- "d" ((uint32_t)(val >> 32)));
-}
-
-static inline bool wrmsr_safe(uint32_t idx, uint64_t val)
-{
- uint32_t new_idx;
-
- asm volatile ("1: wrmsr; 2:"
- _ASM_EXTABLE_HANDLER(1b, 2b, ex_wrmsr_safe)
- : "=c" (new_idx)
- : "c" (idx), "a" ((uint32_t)val),
- "d" ((uint32_t)(val >> 32)),
- "X" (ex_wrmsr_safe));
-
- return idx != new_idx;
-}
+#include <arch/msr.h>
static inline void cpuid(uint32_t leaf,
uint32_t *eax, uint32_t *ebx,
-#ifndef XFT_X86_MSR_INDEX_H
-#define XFT_X86_MSR_INDEX_H
+/**
+ * @file arch/x86/include/arch/msr.h
+ *
+ * Model Specific Register mnemonics and bit definitions.
+ */
+#ifndef XTF_X86_MSR_INDEX_H
+#define XTF_X86_MSR_INDEX_H
#include <xtf/numbers.h>
#define MSR_GS_BASE 0xc0000101
#define MSR_SHADOW_GS_BASE 0xc0000102
-#ifndef __ASSEMBLY__
-#include <xtf/types.h>
-
-typedef union msr_feature_control {
- uint64_t raw;
- struct {
- bool lock:1,
- vmxon_inside_smx:1,
- vmxon_outside_smx:1;
- };
-} msr_feature_control_t;
-
-typedef union msr_vmx_basic {
- uint64_t raw;
- struct {
- uint32_t vmcs_rev_id:31;
- bool mbz:1;
- uint32_t vmcs_size:13;
- uint32_t :3;
- bool paddr_32bit:1;
- bool smm_dual:1;
- uint32_t vmcs_mem_type:4;
- bool inouts_exit_info:1;
- bool true_ctls:1;
- };
-} msr_vmx_basic_t;
-
-#endif /* !__ASSEMBLY__ */
-#endif /* XFT_X86_MSR_INDEX_H */
+#endif /* XTF_X86_MSR_INDEX_H */
/*
* Local variables:
--- /dev/null
+/**
+ * @file arch/x86/include/arch/msr.h
+ *
+ * Misc C-level infrastructure for MSRs.
+ */
+#ifndef XTF_X86_MSR_H
+#define XTF_X86_MSR_H
+
+#include <xtf/extable.h>
+#include <xtf/types.h>
+
+#include <xen/arch-x86/xen.h>
+
+#include <arch/msr-index.h>
+
+/**
+ * Thin wrapper around an `rdmsr` instruction. May crash with @#GP[0].
+ */
+static inline uint64_t rdmsr(uint32_t idx)
+{
+ uint32_t lo, hi;
+
+ asm volatile ("rdmsr": "=a" (lo), "=d" (hi): "c" (idx));
+
+ return (((uint64_t)hi) << 32) | lo;
+}
+
+/**
+ * Wrapper around `rdmsr` which safely catches @#GP[0].
+ *
+ * @param idx MSR to read
+ * @param [out] val Value, if no fault occurred.
+ * @return boolean indicating whether the read faulted.
+ */
+static inline bool rdmsr_safe(uint32_t idx, uint64_t *val)
+{
+ uint32_t lo, hi, new_idx;
+
+ asm volatile ("1: rdmsr; 2:"
+ _ASM_EXTABLE_HANDLER(1b, 2b, ex_rdmsr_safe)
+ : "=a" (lo), "=d" (hi), "=c" (new_idx)
+ : "c" (idx), "X" (ex_rdmsr_safe));
+
+ bool fault = idx != new_idx;
+
+ if ( !fault )
+ *val = (((uint64_t)hi) << 32) | lo;
+
+ return fault;
+}
+
+/**
+ * Thin wrapper around an `wrmsr` instruction. May crash with @#GP[0].
+ */
+static inline void wrmsr(uint32_t idx, uint64_t val)
+{
+ asm volatile ("wrmsr":
+ : "c" (idx), "a" ((uint32_t)val),
+ "d" ((uint32_t)(val >> 32)));
+}
+
+/**
+ * Wrapper around `wrmsr` which safely catches @#GP[0].
+ *
+ * @param idx MSR to write
+ * @param val Value to write
+ * @return boolean indicating whether the write faulted.
+ */
+static inline bool wrmsr_safe(uint32_t idx, uint64_t val)
+{
+ uint32_t new_idx;
+
+ asm volatile ("1: wrmsr; 2:"
+ _ASM_EXTABLE_HANDLER(1b, 2b, ex_wrmsr_safe)
+ : "=c" (new_idx)
+ : "c" (idx), "a" ((uint32_t)val),
+ "d" ((uint32_t)(val >> 32)),
+ "X" (ex_wrmsr_safe));
+
+ return idx != new_idx;
+}
+
+/*
+ * Types wrapping MSR content.
+ */
+typedef union msr_feature_control {
+ uint64_t raw;
+ struct {
+ bool lock:1,
+ vmxon_inside_smx:1,
+ vmxon_outside_smx:1;
+ };
+} msr_feature_control_t;
+
+typedef union msr_vmx_basic {
+ uint64_t raw;
+ struct {
+ uint32_t vmcs_rev_id:31;
+ bool mbz:1;
+ uint32_t vmcs_size:13;
+ uint32_t :3;
+ bool paddr_32bit:1;
+ bool smm_dual:1;
+ uint32_t vmcs_mem_type:4;
+ bool inouts_exit_info:1;
+ bool true_ctls:1;
+ };
+} msr_vmx_basic_t;
+
+#endif /* XTF_X86_MSR_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
#include <arch/cpuid.h>
#include <arch/lib.h>
+#include <arch/msr.h>
extern char _end[];
#include <xtf.h>
#include <arch/exinfo.h>
-#include <arch/msr-index.h>
#include <arch/processor.h>
const char test_title[] = "Guest CPUID Faulting support";
#include <arch/decode.h>
#include <arch/desc.h>
-#include <arch/msr-index.h>
#include <arch/symbolic-const.h>
const char test_title[] = "Invlpg tests";
*/
#include <xtf.h>
-#include <arch/msr-index.h>
-
const char test_title[] = "LBR/TSX VMentry failure test";
static void int3_stub(void)
#include <xtf.h>
-#include <arch/msr-index.h>
#include <arch/vmx.h>
/*
*/
#include <xtf.h>
-#include <arch/msr-index.h>
-
const char test_title[] = "XSA-193 PoC";
void test_main(void)
*/
#include <xtf.h>
-#include <arch/msr-index.h>
#include <arch/processor.h>
bool test_needs_fep = true;