#include <asm/cpufeature.h>
#include <asm/alternative-asm.h>
+#define SPEC_CTRL_IBRS_INUSE (1<<0) /* OS enables IBRS usage */
+#define SPEC_CTRL_IBRS_SUPPORTED (1<<1) /* System supports IBRS */
+#define SPEC_CTRL_IBRS_ADMIN_DISABLED (1<<2) /* Admin disables IBRS */
+
#ifdef __ASSEMBLY__
.extern use_ibrs
.endm
.macro ENABLE_IBRS_CLOBBER
- testl $1, use_ibrs
+ testl $SPEC_CTRL_IBRS_INUSE, use_ibrs
jz 11f
__ASM_ENABLE_IBRS_CLOBBER
11:
.endm
.macro ENABLE_IBRS_SAVE_AND_CLOBBER save_reg:req
- testl $1, use_ibrs
+ testl $SPEC_CTRL_IBRS_INUSE, use_ibrs
jz 12f
movl $MSR_IA32_SPEC_CTRL, %ecx
.endm
.macro RESTORE_IBRS_CLOBBER save_reg:req
- testl $1, use_ibrs
+ testl $SPEC_CTRL_IBRS_INUSE, use_ibrs
jz 13f
cmpl $FEATURE_ENABLE_IBRS, \save_reg
.endm
.macro DISABLE_IBRS
- testl $1, use_ibrs
+ testl $SPEC_CTRL_IBRS_INUSE, use_ibrs
jz 9f
__ASM_DISABLE_IBRS
9:
extern int use_ibrs;
extern u32 sysctl_ibrs_enabled;
extern struct mutex spec_ctrl_mutex;
-#define ibrs_supported (use_ibrs & 0x2)
-#define ibrs_disabled (use_ibrs & 0x4)
+#define ibrs_supported (use_ibrs & SPEC_CTRL_IBRS_SUPPORTED)
+#define ibrs_disabled (use_ibrs & SPEC_CTRL_IBRS_ADMIN_DISABLED)
static inline void set_ibrs_inuse(void)
{
if (ibrs_supported)
- use_ibrs |= 0x1;
+ use_ibrs |= SPEC_CTRL_IBRS_INUSE;
}
static inline void clear_ibrs_inuse(void)
{
- use_ibrs &= ~0x1;
+ use_ibrs &= ~SPEC_CTRL_IBRS_INUSE;
}
static inline int check_ibrs_inuse(void)
{
- if (use_ibrs & 0x1)
+ if (use_ibrs & SPEC_CTRL_IBRS_INUSE)
return 1;
else
/* rmb to prevent wrong speculation for security */
}
static inline void set_ibrs_supported(void)
{
- use_ibrs |= 0x2;
+ use_ibrs |= SPEC_CTRL_IBRS_SUPPORTED;
if (!ibrs_disabled)
set_ibrs_inuse();
}
static inline void set_ibrs_disabled(void)
{
- use_ibrs |= 0x4;
+ use_ibrs |= SPEC_CTRL_IBRS_ADMIN_DISABLED;
if (check_ibrs_inuse())
clear_ibrs_inuse();
}
static inline void clear_ibrs_disabled(void)
{
- use_ibrs &= ~0x4;
+ use_ibrs &= ~SPEC_CTRL_IBRS_ADMIN_DISABLED;
set_ibrs_inuse();
}
#define ibrs_inuse (check_ibrs_inuse())