]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
locking/barriers: introduce new observable speculation barrier
authorElena Reshetova <elena.reshetova@intel.com>
Thu, 4 Jan 2018 07:56:24 +0000 (23:56 -0800)
committerKirtikar Kashyap <kirtikar.kashyap@oracle.com>
Fri, 12 Jan 2018 18:19:59 +0000 (10:19 -0800)
The new observable speculation barrier, osb(), ensures
that any user observable speculation doesn't cross the boundary.

Any user observable speculative activity on this CPU
thread before this point either completes, reaches a
state it can no longer cause an observable activity, or
is aborted before instructions after the barrier execute.

In x86 case, osb() resolves in lfence if X86_FEATURE_LFENCE_RDTSC
is present. Other architectures can define their variants.

Suggested-by: Arjan van de Ven <arjan@linux.intel.com>
Suggested-by: Alan Cox <alan.cox@intel.com>
Signed-off-by: Elena Reshetova <elena.reshetova@intel.com>
Orabug: 27340445
CVE: CVE-2017-5753

Signed-off-by: Chuck Anderson <chuck.anderson@oracle.com>
Conflicts:
include/asm-generic/barrier.h code base differences

Reviewed-by: John Haxby <john.haxby@oracle.com>
Signed-off-by: Kirtikar Kashyap <kirtikar.kashyap@oracle.com>
arch/x86/include/asm/barrier.h
include/asm-generic/barrier.h

index 9a186bf55e26fb2690007f4d535534be3ff1cf08..43b7d3b3715001c53fc2dc7fd023139773b54901 100644 (file)
@@ -82,6 +82,8 @@ do {                                                                  \
 
 #endif
 
+#define osb() alternative("", "lfence", X86_FEATURE_LFENCE_RDTSC)
+
 /* Atomic operations are already serializing on x86 */
 #define __smp_mb__before_atomic()      barrier()
 #define __smp_mb__after_atomic()       barrier()
index 23c2a1bb5362b92b12021e62f806588a4013109c..c4f059c28c7d2301779311f94a1c3e37a44e559d 100644 (file)
@@ -198,5 +198,16 @@ do {                                                                       \
 #define virt_store_release(p, v) __smp_store_release(p, v)
 #define virt_load_acquire(p) __smp_load_acquire(p)
 
+/* Observable speculation barrier: ensures that any user
+ * observable speculation doesn't cross the boundary.
+ * Any user observable speculative activity on this CPU
+ * thread before this point either completes, reaches a
+ * state it can no longer cause observable activity, or
+ * is aborted before instructions after the barrier execute.
+ */
+#ifndef osb
+#define osb()  do { } while (0)
+#endif
+
 #endif /* !__ASSEMBLY__ */
 #endif /* __ASM_GENERIC_BARRIER_H */