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.
421 lines
11 KiB
421 lines
11 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.
|
|
*/
|
|
|
|
#ifndef _ALARMS_H_
|
|
#define _ALARMS_H_
|
|
|
|
#include "ialarm.H"
|
|
#include "parse_control.H"
|
|
extern "C" {
|
|
#include "xed-interface.h"
|
|
}
|
|
|
|
//in this file we define all standard alarms
|
|
//each alarm inherits form IALRM
|
|
namespace CONTROLLER
|
|
{
|
|
//*****************************************************************************
|
|
class ALARM_ICOUNT : public IALARM
|
|
{
|
|
public:
|
|
ALARM_ICOUNT(const string& icount_str, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
UINT64 icount = PARSER::StringToUint64(icount_str);
|
|
//for icount alarm the affective count is the a combination
|
|
//of the icount value and the count value
|
|
SetCount(icount*count);
|
|
Activate();
|
|
}
|
|
|
|
// Update another alarm manager with its value
|
|
VOID UpdateAlarm(ALARM_MANAGER * alarm_manager, const string& icount_str)
|
|
{
|
|
_alarm_manager = alarm_manager;
|
|
UINT64 icount = PARSER::StringToUint64(icount_str);
|
|
SetCount(icount);
|
|
}
|
|
|
|
private:
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_ADDRESS : public IALARM
|
|
{
|
|
public:
|
|
ALARM_ADDRESS(const string& address, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
_address = PARSER::StringToUint64(address);
|
|
Activate();
|
|
}
|
|
private:
|
|
VOID Activate();
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_SYMBOL : public IALARM
|
|
{
|
|
public:
|
|
ALARM_SYMBOL(const string& symbol, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager), _symbol(symbol){
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
VOID Activate();
|
|
static VOID Img(IMG img, VOID* v);
|
|
|
|
string _symbol;
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_IMAGE : public IALARM
|
|
{
|
|
public:
|
|
ALARM_IMAGE(const string& image, const string& offset , UINT32 tid,
|
|
UINT32 count, BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager),
|
|
_image(image){
|
|
_offset = PARSER::StringToUint64(offset);
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
VOID Activate();
|
|
static VOID Img(IMG img, VOID* v);
|
|
|
|
string _image;
|
|
UINT64 _offset;
|
|
};
|
|
|
|
|
|
//*****************************************************************************
|
|
class ALARM_SSC : public IALARM
|
|
{
|
|
public:
|
|
ALARM_SSC(const string& ssc, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager),_ssc(ssc){
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
string _ssc;
|
|
static const UINT32 _pattern_len = 8;
|
|
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_ITEXT : public IALARM
|
|
{
|
|
public:
|
|
ALARM_ITEXT(const string& itext, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager),_itext(itext){
|
|
Activate();
|
|
}
|
|
|
|
|
|
private:
|
|
string _itext;
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_INT3 : public IALARM
|
|
{
|
|
public:
|
|
ALARM_INT3(const string& icount_str,UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
UINT64 icount = PARSER::StringToUint64(icount_str);
|
|
//the count is the a combination
|
|
//of the icount value and the count value
|
|
SetCount(icount*count);
|
|
Activate();
|
|
}
|
|
|
|
|
|
private:
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_ISA_CATEGORY : public IALARM
|
|
{
|
|
public:
|
|
ALARM_ISA_CATEGORY(const string& isa_ctg, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
_isa_ctg = isa_ctg;
|
|
_required_ctg = str2xed_category_enum_t(_isa_ctg.c_str());
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
string _isa_ctg;
|
|
xed_category_enum_t _required_ctg;
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_ISA_EXTENSION : public IALARM
|
|
{
|
|
public:
|
|
ALARM_ISA_EXTENSION(const string& isa_ext, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
_isa_ext = isa_ext;
|
|
_required_ext = str2xed_extension_enum_t(_isa_ext.c_str());
|
|
Activate();
|
|
}
|
|
|
|
|
|
private:
|
|
string _isa_ext;
|
|
xed_extension_enum_t _required_ext;
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_INTERACTIVE : public IALARM
|
|
{
|
|
public:
|
|
ALARM_INTERACTIVE(UINT32 tid, BOOL need_ctxt,
|
|
ALARM_MANAGER* manager):
|
|
IALARM(tid, 1, need_ctxt, manager){
|
|
Activate();
|
|
}
|
|
INTERACTIVE_LISTENER* GetListener() {return _listener;}
|
|
|
|
private:
|
|
INTERACTIVE_LISTENER* _listener;
|
|
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
|
|
//add if analysis function
|
|
static VOID InsertInteractiveIf(ALARM_INTERACTIVE* alarm, INS ins);
|
|
|
|
static ADDRINT PIN_FAST_ANALYSIS_CALL
|
|
InteractiveShouldFire(ALARM_INTERACTIVE* alarm, UINT32 tid);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_ENTER_FUNC : public IALARM
|
|
{
|
|
public:
|
|
ALARM_ENTER_FUNC(const string& func, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
_func_name = func;
|
|
Activate();
|
|
}
|
|
|
|
|
|
private:
|
|
string _func_name;
|
|
|
|
VOID Activate();
|
|
static VOID OnFunctionStart(CONTEXT* ctxt, ADDRINT ip, THREADID tid, VOID *v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_EXIT_FUNC : public IALARM
|
|
{
|
|
public:
|
|
ALARM_EXIT_FUNC(const string& func, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
_func_name = func;
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
string _func_name;
|
|
|
|
VOID Activate();
|
|
static VOID OnFunctionEnd(CONTEXT* ctxt, ADDRINT ip, THREADID tid, VOID *v);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_CPUID : public IALARM
|
|
{
|
|
public:
|
|
ALARM_CPUID(const string& val_str, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager) {
|
|
UINT32 val = PARSER::StringToUint32(val_str);
|
|
ASSERT((val<0x10000), "CPUID alarm should be 16 bits value");
|
|
_val = 0x4711|(val<<16);
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
UINT32 _val;
|
|
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
|
|
static ADDRINT PIN_FAST_ANALYSIS_CALL
|
|
ShouldFire(IALARM* alarm, ADDRINT eax, UINT32 val, UINT32 tid);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_MAGIC : public IALARM
|
|
{
|
|
public:
|
|
ALARM_MAGIC(const string& val_str, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager);
|
|
|
|
private:
|
|
static const UINT32 SIM_CMD_MARKER = 4;
|
|
UINT32 _a, _b;
|
|
|
|
VOID Activate();
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
|
|
static ADDRINT PIN_FAST_ANALYSIS_CALL
|
|
ShouldFire(IALARM* alarm, ADDRINT eax, ADDRINT ebx, ADDRINT ecx,
|
|
UINT32 a, UINT32 b, UINT32 tid);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
|
|
class ALARM_PCONTROL : public IALARM
|
|
{
|
|
public:
|
|
ALARM_PCONTROL(const string& region, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager){
|
|
_region = region;
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
string _region;
|
|
|
|
VOID Activate();
|
|
static VOID Rtn(RTN rtn, VOID *v);
|
|
|
|
static VOID OnMpiPcontrol(ALARM_PCONTROL* alarm, CONTEXT* ctxt, ADDRINT ip,
|
|
ADDRINT region_app, UINT32 tid);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_TIMEOUT : public IALARM
|
|
{
|
|
public:
|
|
ALARM_TIMEOUT(const string& timeout_str, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager) {
|
|
|
|
_timeout_passed = FALSE;
|
|
_seconds_timeout = PARSER::StringToUint32(timeout_str);
|
|
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
|
|
// Private timeout data members
|
|
UINT32 _seconds_timeout;
|
|
volatile BOOL _timeout_passed;
|
|
|
|
|
|
VOID Activate();
|
|
|
|
// Internal thread routine
|
|
static VOID WaitForTimeout(VOID* v);
|
|
|
|
// Instrumentation routines
|
|
static VOID Trace(TRACE trace, VOID* v);
|
|
static VOID InsertIfCall_CheckTime(ALARM_TIMEOUT* alarm, INS ins);
|
|
|
|
// Analysis routines
|
|
static ADDRINT PIN_FAST_ANALYSIS_CALL CheckTime(ALARM_TIMEOUT* ialarm, UINT32 tid);
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_SIGNAL : public IALARM
|
|
{
|
|
public:
|
|
ALARM_SIGNAL(const string& signal_str, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager):
|
|
IALARM(tid, count, need_ctxt, manager) {
|
|
|
|
_signal_id = PARSER::StringToUint32(signal_str);
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
|
|
// Private signal data members and methods
|
|
INT32 _signal_id;
|
|
|
|
VOID Activate();
|
|
|
|
#if (!defined(TARGET_WINDOWS))
|
|
static VOID ContextChangeCallback(
|
|
THREADID tid,
|
|
CONTEXT_CHANGE_REASON reason,
|
|
const CONTEXT *ctxtFrom,
|
|
CONTEXT *ctxtTo,
|
|
INT32 sig,
|
|
VOID *v);
|
|
#endif
|
|
|
|
};
|
|
|
|
//*****************************************************************************
|
|
class ALARM_IMAGE_LOAD : public IALARM
|
|
{
|
|
public:
|
|
ALARM_IMAGE_LOAD(const string& image_name, UINT32 tid, UINT32 count,
|
|
BOOL need_ctxt, ALARM_MANAGER* manager) :
|
|
IALARM(tid, count, need_ctxt, manager) {
|
|
|
|
_image_name = ExtractFileName(image_name);
|
|
Activate();
|
|
}
|
|
|
|
private:
|
|
|
|
// Private data members and methods
|
|
string _image_name;
|
|
|
|
VOID Activate();
|
|
static VOID ImageLoad(IMG img, VOID* v);
|
|
static string ExtractFileName(const string & fullpath);
|
|
};
|
|
|
|
|
|
//*****************************************************************************
|
|
|
|
} //namespace
|
|
#endif
|