x86: add support for STAC/CLAC instructions
authorFeng Wu <feng.wu@intel.com>
Mon, 12 May 2014 15:00:39 +0000 (17:00 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 12 May 2014 15:00:39 +0000 (17:00 +0200)
The STAC/CLAC instructions are only available when SMAP feature is
available, but on the other hand they aren't needed if SMAP is not
enabled, or before we start to run userspace, in that case, the
functions and macros do nothing.

Signed-off-by: Feng Wu <feng.wu@intel.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/include/asm-x86/asm_defns.h

index db4a778b106f2fa7a18d3118e725168c6840d674..b75905adc78cd80e5481820dc2d772d7457c3f20 100644 (file)
@@ -8,6 +8,8 @@
 #endif
 #include <asm/processor.h>
 #include <asm/percpu.h>
+#include <xen/stringify.h>
+#include <asm/cpufeature.h>
 
 #ifndef __ASSEMBLY__
 void ret_from_intr(void);
@@ -159,6 +161,34 @@ void ret_from_intr(void);
 
 #endif
 
+/* "Raw" instruction opcodes */
+#define __ASM_CLAC      .byte 0x0f,0x01,0xca
+#define __ASM_STAC      .byte 0x0f,0x01,0xcb
+
+#ifdef __ASSEMBLY__
+#define ASM_AC(op)                                       \
+        btl $X86_FEATURE_SMAP & 31,                      \
+        CPUINFO_FEATURE_OFFSET(X86_FEATURE_SMAP)+boot_cpu_data(%rip); \
+        jnc 881f;                                        \
+        __ASM_##op;                                      \
+881:
+
+#define ASM_STAC ASM_AC(STAC)
+#define ASM_CLAC ASM_AC(CLAC)
+#else
+static inline void clac(void)
+{
+    if ( boot_cpu_has(X86_FEATURE_SMAP) )
+        asm volatile (__stringify(__ASM_CLAC) : : : "memory");
+}
+
+static inline void stac(void)
+{
+    if ( boot_cpu_has(X86_FEATURE_SMAP) )
+        asm volatile (__stringify(__ASM_STAC) : : : "memory");
+}
+#endif
+
 #ifdef __ASSEMBLY__
 .macro SAVE_ALL
         addq  $-(UREGS_error_code-UREGS_r15), %rsp