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.
98 lines
2.7 KiB
98 lines
2.7 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 <cassert>
|
|
#include <string>
|
|
#include <cstring>
|
|
#include <sstream>
|
|
#include "regvalue_utils.h"
|
|
|
|
using std::endl;
|
|
using std::flush;
|
|
using std::string;
|
|
using std::stringstream;
|
|
using std::hex;
|
|
|
|
|
|
/////////////////////
|
|
// EXTERNAL FUNCTIONS
|
|
/////////////////////
|
|
|
|
extern "C" bool ProcessorSupportsAvx();
|
|
extern "C" bool SupportsAvx512f();
|
|
|
|
|
|
/////////////////////
|
|
// GLOBAL VARIABLES
|
|
/////////////////////
|
|
|
|
// Boolean indicating whether the system supports AVX instructions and registers.
|
|
const bool hasAvxSupport = ProcessorSupportsAvx();
|
|
const bool hasAvx512fSupport = SupportsAvx512f();
|
|
|
|
|
|
/////////////////////
|
|
// INTERNAL FUNCTIONS IMPLEMENTATION
|
|
/////////////////////
|
|
|
|
template<typename SIZETYPE>
|
|
static bool CompareSizedWord(const unsigned char * value, const unsigned char * expected, unsigned int element,
|
|
unsigned int totalSize, ostream& ost)
|
|
{
|
|
if (*((SIZETYPE*)(&value[element << 3])) != *((SIZETYPE*)(&expected[element << 3])))
|
|
{
|
|
ost << "WARNING: Expected value: " << Val2Str((void*)expected, totalSize) << endl << flush;
|
|
ost << "WARNING: Received value: " << Val2Str((void*)value, totalSize) << endl << flush;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
/////////////////////
|
|
// API FUNCTIONS IMPLEMENTATION
|
|
/////////////////////
|
|
|
|
string Val2Str(const void* value, unsigned int size)
|
|
{
|
|
stringstream sstr;
|
|
sstr << hex;
|
|
const unsigned char* cval = (const unsigned char*)value;
|
|
// Traverse cval from end to beginning since the MSB is in the last block of cval.
|
|
while (size)
|
|
{
|
|
--size;
|
|
sstr << (unsigned int)cval[size];
|
|
}
|
|
return string("0x")+sstr.str();
|
|
}
|
|
|
|
bool CompareValues(const void* value, const void* expected, unsigned int size, ostream& ost)
|
|
{
|
|
if (0 != memcmp(value, expected, size))
|
|
{
|
|
ost << "WARNING: Expected value: " << Val2Str(expected, size) << endl << flush;
|
|
ost << "WARNING: Received value: " << Val2Str(value, size) << endl << flush;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void AssignNewPinRegisterValue(PIN_REGISTER* pinreg, const UINT64* newval, UINT qwords)
|
|
{
|
|
static UINT maxQwords = sizeof(PIN_REGISTER) / sizeof(UINT64);
|
|
assert(qwords <= maxQwords);
|
|
for (UINT i = 0; i < qwords; ++i)
|
|
{
|
|
pinreg->qword[i] = newval[i];
|
|
}
|
|
}
|