blob: 66ff83d7df9dd3836076ae5d189d1ca5b11affda [file] [log] [blame]
/*
* Copyright 2019 Google LLC
*
* Licensed under both the 3-Clause BSD License and the GPLv2, found in the
* LICENSE and LICENSE.GPL-2.0 files, respectively, in the root directory.
*
* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
*/
#ifndef DEMOS_UTILS_H_
#define DEMOS_UTILS_H_
#include "compiler_specifics.h"
// Forced memory load. Loads the memory into cache. Used during both real and
// speculative execution to create a microarchitectural side effect in the
// cache. Also used for latency measurement in the FLUSH+RELOAD technique.
// Should be inlined to minimize the speculation window.
inline SAFESIDE_ALWAYS_INLINE
void ForceRead(const void *p) {
(void)*reinterpret_cast<const volatile char *>(p);
}
// Flush a memory interval from cache. Used to induce speculative execution on
// flushed values until they are fetched back to the cache.
void FlushFromDataCache(const void *start, const void *end);
#if SAFESIDE_LINUX
void PinToTheFirstCore();
#endif
// Extend the speculative execution window -- that is, increase the amount of
// time that subsequent instructions must be held in the reorder buffer before
// they can retire. This allows us to execute more operations speculatively on
// data forwarded from instructions that will raise an architectural fault when
// retired. Also known as a "windowing gadget"[1].
//
// [1] https://msrc-blog.microsoft.com/2018/03/15/mitigating-speculative-execution-side-channel-hardware-vulnerabilities/
void ExtendSpeculationWindow();
#endif // DEMOS_UTILS_H