in src/RemainingLeakage/RemainingLeakage.cpp [71:139]
void threadfunc(size_t secret)
{
if (SetThreadAffinityMask(GetCurrentThread(), (size_t)1 << (((unsigned char)rand() % 2) + 2)) == 0)
{
std::cout << "Failed to set affinity of attacker\n";
}
// Syncronize start of transaction with start of attack
InterlockedDecrement64((volatile long long*)&customBarrier);
while (customBarrier);
// Delay transaction a bit to capture earliest parts.
for (int i = 0; i < 100; ++i) maccess((void*)&customBarrier);
unsigned status = 0;
// Start transaction
if ((status = XBEGIN) == _XBEGIN_STARTED) {
// Preload lots of data
#if (PRELOAD & READ_OP) != 0
for (int i = 0; i < (READ_LENGTH / 64) / 2; ++i)
{
maccess(data + 2 * i * 64);
maccess(data + (2 * i + 1) * 64);
maccess(data + 2 * i * 64);
maccess(data + (2 * i + 1) * 64);
}
#endif
#if (PRELOAD & WRITE_OP) != 0
for (int i = 0; i < (READ_LENGTH / 64) / 2; ++i)
{
((volatile char*)data)[2 * i * 64] = 1;
((volatile char*)data)[(2 * i + 1) * 64] = 1;
((volatile char*)data)[2 * i * 64] = 1;
((volatile char*)data)[(2 * i + 1) * 64] = 1;
}
#endif
#if (PRELOAD & EXECUTE_OP) != 0
for (int i = 0; i < (READ_LENGTH / 64); ++i)
{
((secretFunTy)(data + i * 64 + 2))();
}
#endif
_mm_mfence();
// Random other code
for (int i = 0; i < 32; ++i)
{
maccess(data + (TARGETS + (i % ((READ_LENGTH / 64) - TARGETS))) * 64);
}
for (int i = 0; i < 16; ++i)
{
((secretFunTy)(data + (TARGETS + (i % ((READ_LENGTH / 64) - TARGETS))) * 64 + 2))();
}
recurse(16);
// Secret data access
#if (SECRET & READ_OP) != 0
maccess(data + secret * 64);
#endif
#if (SECRET & WRITE_OP) != 0
((volatile char*)data)[secret * 64] = 1;
#endif
#if (SECRET & EXECUTE_OP) != 0
((secretFunTy)(data + secret * 64))();
#endif
XEND;
}
}