void threadfunc()

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;
    }
}