]>
Commit | Line | Data |
---|---|---|
51ae4a2d PA |
1 | /* |
2 | * Supervisor Mode Access Prevention support | |
3 | * | |
4 | * Copyright (C) 2012 Intel Corporation | |
5 | * Author: H. Peter Anvin <hpa@linux.intel.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License | |
9 | * as published by the Free Software Foundation; version 2 | |
10 | * of the License. | |
11 | */ | |
12 | ||
13 | #ifndef _ASM_X86_SMAP_H | |
14 | #define _ASM_X86_SMAP_H | |
15 | ||
16 | #include <linux/stringify.h> | |
17 | #include <asm/nops.h> | |
cd4d09ec | 18 | #include <asm/cpufeatures.h> |
51ae4a2d PA |
19 | |
20 | /* "Raw" instruction opcodes */ | |
21 | #define __ASM_CLAC .byte 0x0f,0x01,0xca | |
22 | #define __ASM_STAC .byte 0x0f,0x01,0xcb | |
23 | ||
24 | #ifdef __ASSEMBLY__ | |
25 | ||
26 | #include <asm/alternative-asm.h> | |
27 | ||
28 | #ifdef CONFIG_X86_SMAP | |
29 | ||
669f8a90 BP |
30 | #define ASM_CLAC \ |
31 | ALTERNATIVE "", __stringify(__ASM_CLAC), X86_FEATURE_SMAP | |
32 | ||
33 | #define ASM_STAC \ | |
34 | ALTERNATIVE "", __stringify(__ASM_STAC), X86_FEATURE_SMAP | |
51ae4a2d PA |
35 | |
36 | #else /* CONFIG_X86_SMAP */ | |
37 | ||
38 | #define ASM_CLAC | |
39 | #define ASM_STAC | |
40 | ||
41 | #endif /* CONFIG_X86_SMAP */ | |
42 | ||
43 | #else /* __ASSEMBLY__ */ | |
44 | ||
45 | #include <asm/alternative.h> | |
46 | ||
47 | #ifdef CONFIG_X86_SMAP | |
48 | ||
63bcff2a | 49 | static __always_inline void clac(void) |
51ae4a2d PA |
50 | { |
51 | /* Note: a barrier is implicit in alternative() */ | |
669f8a90 | 52 | alternative("", __stringify(__ASM_CLAC), X86_FEATURE_SMAP); |
51ae4a2d PA |
53 | } |
54 | ||
63bcff2a | 55 | static __always_inline void stac(void) |
51ae4a2d PA |
56 | { |
57 | /* Note: a barrier is implicit in alternative() */ | |
669f8a90 | 58 | alternative("", __stringify(__ASM_STAC), X86_FEATURE_SMAP); |
51ae4a2d PA |
59 | } |
60 | ||
61 | /* These macros can be used in asm() statements */ | |
62 | #define ASM_CLAC \ | |
669f8a90 | 63 | ALTERNATIVE("", __stringify(__ASM_CLAC), X86_FEATURE_SMAP) |
51ae4a2d | 64 | #define ASM_STAC \ |
669f8a90 | 65 | ALTERNATIVE("", __stringify(__ASM_STAC), X86_FEATURE_SMAP) |
51ae4a2d PA |
66 | |
67 | #else /* CONFIG_X86_SMAP */ | |
68 | ||
69 | static inline void clac(void) { } | |
70 | static inline void stac(void) { } | |
71 | ||
72 | #define ASM_CLAC | |
73 | #define ASM_STAC | |
74 | ||
75 | #endif /* CONFIG_X86_SMAP */ | |
76 | ||
77 | #endif /* __ASSEMBLY__ */ | |
78 | ||
79 | #endif /* _ASM_X86_SMAP_H */ |