On 5/10/19 12:25 PM, Nadav Amit wrote: > It may be useful to check in runtime whether certain assertions are > violated even during speculative execution. This can allow to avoid > adding unnecessary memory fences and at the same time check that no data > leak channels exist. > > For example, adding such checks can show that allocating zeroed pages > can return speculatively non-zeroed pages (the first qword is not > zero). [This might be a problem when the page-fault handler performs > software page-walk, for example.] > > Introduce SPEC_WARN_ON(), which checks in runtime whether a certain > condition is violated during speculative execution. The condition should > be computed without branches, e.g., using bitwise operators. The check > will wait for the condition to be realized (i.e., not speculated), and > if the assertion is violated, a warning will be thrown. > > Warnings can be provided in one of two modes: precise and imprecise. > Both mode are not perfect. The precise mode does not always make it easy > to understand which assertion was broken, but instead points to a point > in the execution somewhere around the point in which the assertion was > violated. In addition, it prints a warning for each violation (unlike > WARN_ONCE() like behavior). > > The imprecise mode, on the other hand, can sometimes throw the wrong > indication, specifically if the control flow has changed between the > speculative execution and the actual one. Note that it is not a > false-positive, it just means that the output would mislead the user to > think the wrong assertion was broken. > > There are some more limitations. Since the mechanism requires an > indirect branch, it should not be used in production systems that are > susceptible for Spectre v2. The mechanism requires TSX and performance > counters that are only available in skylake+. There is a hidden > assumption that TSX is not used in the kernel for anything else, other > than this mechanism. > > The basic idea behind the implementation is to use a performance counter > that updates also during speculative execution as an indication for > assertion failure. By using conditional-mov, which is not predicted, > to affect the control flow, the condition is realized before the event > that affects the PMU is triggered. > > Enable this feature by setting "spec_warn=on" or "spec_warn=precise" > kernel parameter. I did not run performance numbers but I guess the > overhead should not be too high.
Hi, If this progresses, please document spec_warn={on|precise} in Documentation/admin-guide/kernel-parameters.txt. > I did not run too many tests, but brief experiments suggest that it does > work. Let me know if I missed anything and whether you think this can be > useful. To be frank, the exact use cases are not super clear, and there > are various possible extensions (e.g., ensuring the speculation window > is long enough by adding data dependencies). I would appreciate your > inputs. > > Cc: Andy Lutomirsky <l...@kernel.org> > Cc: Ingo Molnar <mi...@kernel.org> > Cc: Peter Zijlstra <pet...@infradead.org> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: Jann Horn <ja...@google.com> > Signed-off-by: Nadav Amit <na...@vmware.com> > --- > arch/x86/Kconfig | 4 + > arch/x86/include/asm/nospec-branch.h | 30 +++++ > arch/x86/kernel/Makefile | 1 + > arch/x86/kernel/nospec.c | 185 +++++++++++++++++++++++++++ > 4 files changed, 220 insertions(+) > create mode 100644 arch/x86/kernel/nospec.c thanks. -- ~Randy