x86, smap: Add a header file with macros for STAC/CLAC
The STAC/CLAC instructions are only available with SMAP, but on the other hand they aren't needed if SMAP is not available, or before we start to run userspace, so construct them as alternatives which start out as noops and are enabled by the alternatives mechanism. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Link: http://lkml.kernel.org/r/1348256595-29119-7-git-send-email-hpa@linux.intel.com
This commit is contained in:
parent
76f30759f6
commit
51ae4a2d77
|
@ -1487,6 +1487,17 @@ config ARCH_RANDOM
|
||||||
If supported, this is a high bandwidth, cryptographically
|
If supported, this is a high bandwidth, cryptographically
|
||||||
secure hardware random number generator.
|
secure hardware random number generator.
|
||||||
|
|
||||||
|
config X86_SMAP
|
||||||
|
def_bool y
|
||||||
|
prompt "Supervisor Mode Access Prevention" if EXPERT
|
||||||
|
---help---
|
||||||
|
Supervisor Mode Access Prevention (SMAP) is a security
|
||||||
|
feature in newer Intel processors. There is a small
|
||||||
|
performance cost if this enabled and turned on; there is
|
||||||
|
also a small increase in the kernel size if this is enabled.
|
||||||
|
|
||||||
|
If unsure, say Y.
|
||||||
|
|
||||||
config EFI
|
config EFI
|
||||||
bool "EFI runtime service support"
|
bool "EFI runtime service support"
|
||||||
depends on ACPI
|
depends on ACPI
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
* Supervisor Mode Access Prevention support
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Intel Corporation
|
||||||
|
* Author: H. Peter Anvin <hpa@linux.intel.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; version 2
|
||||||
|
* of the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ASM_X86_SMAP_H
|
||||||
|
#define _ASM_X86_SMAP_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
#include <asm/nops.h>
|
||||||
|
#include <asm/cpufeature.h>
|
||||||
|
|
||||||
|
/* "Raw" instruction opcodes */
|
||||||
|
#define __ASM_CLAC .byte 0x0f,0x01,0xca
|
||||||
|
#define __ASM_STAC .byte 0x0f,0x01,0xcb
|
||||||
|
|
||||||
|
#ifdef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <asm/alternative-asm.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_SMAP
|
||||||
|
|
||||||
|
#define ASM_CLAC \
|
||||||
|
661: ASM_NOP3 ; \
|
||||||
|
.pushsection .altinstr_replacement, "ax" ; \
|
||||||
|
662: __ASM_CLAC ; \
|
||||||
|
.popsection ; \
|
||||||
|
.pushsection .altinstructions, "a" ; \
|
||||||
|
altinstruction_entry 661b, 662b, X86_FEATURE_SMAP, 3, 3 ; \
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
#define ASM_STAC \
|
||||||
|
661: ASM_NOP3 ; \
|
||||||
|
.pushsection .altinstr_replacement, "ax" ; \
|
||||||
|
662: __ASM_STAC ; \
|
||||||
|
.popsection ; \
|
||||||
|
.pushsection .altinstructions, "a" ; \
|
||||||
|
altinstruction_entry 661b, 662b, X86_FEATURE_SMAP, 3, 3 ; \
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
#else /* CONFIG_X86_SMAP */
|
||||||
|
|
||||||
|
#define ASM_CLAC
|
||||||
|
#define ASM_STAC
|
||||||
|
|
||||||
|
#endif /* CONFIG_X86_SMAP */
|
||||||
|
|
||||||
|
#else /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
#include <asm/alternative.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_SMAP
|
||||||
|
|
||||||
|
static inline void clac(void)
|
||||||
|
{
|
||||||
|
/* Note: a barrier is implicit in alternative() */
|
||||||
|
alternative(ASM_NOP3, __stringify(__ASM_CLAC), X86_FEATURE_SMAP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void stac(void)
|
||||||
|
{
|
||||||
|
/* Note: a barrier is implicit in alternative() */
|
||||||
|
alternative(ASM_NOP3, __stringify(__ASM_STAC), X86_FEATURE_SMAP);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These macros can be used in asm() statements */
|
||||||
|
#define ASM_CLAC \
|
||||||
|
ALTERNATIVE(ASM_NOP3, __stringify(__ASM_CLAC), X86_FEATURE_SMAP)
|
||||||
|
#define ASM_STAC \
|
||||||
|
ALTERNATIVE(ASM_NOP3, __stringify(__ASM_STAC), X86_FEATURE_SMAP)
|
||||||
|
|
||||||
|
#else /* CONFIG_X86_SMAP */
|
||||||
|
|
||||||
|
static inline void clac(void) { }
|
||||||
|
static inline void stac(void) { }
|
||||||
|
|
||||||
|
#define ASM_CLAC
|
||||||
|
#define ASM_STAC
|
||||||
|
|
||||||
|
#endif /* CONFIG_X86_SMAP */
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
#endif /* _ASM_X86_SMAP_H */
|
Loading…
Reference in New Issue