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.

79 lines
1.9 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 <map>
/*!
* Information about a "pending" system call. (The tool has started processing it, but
* not yet completed.)
*/
struct PENDING_SYSCALL
{
PENDING_SYSCALL() : _number(0) {}
PENDING_SYSCALL(ADDRINT fs, ADDRINT gs, ADDRINT num, ADDRINT a1, ADDRINT a2, ADDRINT a3, ADDRINT a4, ADDRINT a5)
:
_fs(fs), _gs(gs), _number(num), _arg1(a1), _arg2(a2), _arg3(a3), _arg4(a4), _arg5(a5)
{}
ADDRINT _fs; // Value of FS prior to system call
ADDRINT _gs; // Value of GS prior to system call
ADDRINT _number; // System call number
ADDRINT _arg1; // First 5 arguments to system call
ADDRINT _arg2;
ADDRINT _arg3;
ADDRINT _arg4;
ADDRINT _arg5;
};
/*!
* A container which can hold one pending system call for each thread.
*/
class PENDING_SYSCALLS
{
public:
PENDING_SYSCALLS()
{
PIN_InitLock(&_lock);
}
VOID Add(THREADID tid, const PENDING_SYSCALL &pend)
{
PIN_GetLock(&_lock, 1);
_map[tid] = pend;
PIN_ReleaseLock(&_lock);
}
BOOL Remove(THREADID tid, PENDING_SYSCALL *pend)
{
PIN_GetLock(&_lock, 1);
MAP::iterator it = _map.find(tid);
if (it == _map.end())
{
PIN_ReleaseLock(&_lock);
return FALSE;
}
*pend = (*it).second;
_map.erase(it);
PIN_ReleaseLock(&_lock);
return TRUE;
}
private:
PIN_LOCK _lock;
typedef std::map<UINT32, PENDING_SYSCALL> MAP;
MAP _map;
};