You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.5 KiB
135 lines
2.5 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <cstdio>
|
|
#include <signal.h>
|
|
|
|
|
|
#ifdef TARGET_WINDOWS
|
|
# define ASMNAME(name)
|
|
# define EXPORT extern "C" __declspec(dllexport)
|
|
#else
|
|
# define ASMNAME(name) asm(name)
|
|
# define EXPORT extern "C"
|
|
#endif
|
|
|
|
extern "C" void ClFlushFunc();
|
|
extern "C" void ClFlushOptFunc();
|
|
extern "C" void ClwbFunc();
|
|
|
|
extern "C"
|
|
{
|
|
void* funcPtr ASMNAME("funcPtr");
|
|
}
|
|
|
|
typedef void (*FUNPTR)(void*);
|
|
|
|
EXPORT void TellPinFlushParm(void* flushParm)
|
|
{
|
|
// Pin tool can place instrumentation here to learn flush parm.
|
|
}
|
|
|
|
int func()
|
|
{
|
|
return 5;
|
|
}
|
|
|
|
int lastInsLen = 0;
|
|
|
|
#ifndef TARGET_WINDOWS
|
|
|
|
/* Returning IP is stored in RIP (64bit) or EIP (32bit).
|
|
We skip the offending instruction length! */
|
|
static void HandleSignal(int signal, siginfo_t *si, void *arg)
|
|
{
|
|
ucontext_t *ctx = (ucontext_t *)arg;
|
|
|
|
#ifdef TARGET_MAC
|
|
#ifdef TARGET_IA32
|
|
ctx->uc_mcontext->__ss.__eip += lastInsLen;
|
|
#else
|
|
ctx->uc_mcontext->__ss.__rip += lastInsLen;
|
|
#endif
|
|
#else
|
|
#ifdef TARGET_IA32
|
|
ctx->uc_mcontext.gregs[REG_EIP] += lastInsLen;
|
|
#else
|
|
ctx->uc_mcontext.gregs[REG_RIP] += lastInsLen;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void SetupSignalHandler()
|
|
{
|
|
struct sigaction sigact;
|
|
|
|
memset(&sigact, 0, sizeof(sigact));
|
|
sigemptyset(&sigact.sa_mask);
|
|
sigact.sa_sigaction = HandleSignal;
|
|
sigact.sa_flags = SA_SIGINFO;
|
|
if (-1 == sigaction(SIGILL, &sigact, 0))
|
|
{
|
|
printf("Unable to set up handler\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
int main(int ac, char **av)
|
|
{
|
|
funcPtr = (void*)func;
|
|
volatile FUNPTR tellPinFlushParm = TellPinFlushParm;
|
|
|
|
#ifndef TARGET_WINDOWS
|
|
SetupSignalHandler();
|
|
#endif
|
|
|
|
tellPinFlushParm(funcPtr);
|
|
|
|
//clflush length is 3
|
|
lastInsLen = 3;
|
|
|
|
func();
|
|
try
|
|
{
|
|
ClFlushFunc();
|
|
}
|
|
catch(...)
|
|
{
|
|
}
|
|
|
|
//clflushopt, clwb length is 4
|
|
lastInsLen = 4;
|
|
|
|
func();
|
|
try
|
|
{
|
|
ClFlushOptFunc();
|
|
}
|
|
catch(...)
|
|
{
|
|
}
|
|
|
|
func();
|
|
try
|
|
{
|
|
ClwbFunc();
|
|
}
|
|
catch(...)
|
|
{
|
|
}
|
|
|
|
return 0;
|
|
}
|