-
Notifications
You must be signed in to change notification settings - Fork 486
/
Copy pathpcm-fuzz.cpp
82 lines (66 loc) · 2.92 KB
/
pcm-fuzz.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#define UNIT_TEST 1
#include "../src/pcm.cpp"
#undef UNIT_TEST
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
size_t size_int = size / sizeof(int);
const auto ints_used = 7;
if (size_int < ints_used)
{
return 0;
}
auto m = PCM::getInstance();
const int *data_int = reinterpret_cast<const int *>(data);
int pos = 0;
int pid = data_int[pos++];
bool use_pid = data_int[pos++] % 2;
if (!use_pid)
{
pid = -1;
}
print_help("");
m->resetPMU();
m->disableJKTWorkaround();
const PCM::ErrorCode status = m->program(PCM::DEFAULT_EVENTS, nullptr, false, pid);
switch (status)
{
case PCM::Success:
break;
case PCM::UnknownError: // expected for invalid pid
return 0;
case PCM::MSRAccessDenied:
cerr << "Access to Intel(r) Performance Counter Monitor has denied (no MSR or PCI CFG space access).\n";
exit(EXIT_FAILURE);
case PCM::PMUBusy:
cerr << "Access to Intel(r) Performance Counter Monitor has denied (Performance Monitoring Unit is occupied by other application). Try to stop the application that uses PMU.\n";
cerr << "Alternatively you can try running PCM with option -r to reset PMU.\n";
exit(EXIT_FAILURE);
default:
cerr << "Access to Intel(r) Performance Counter Monitor has denied (Unknown error).\n";
exit(EXIT_FAILURE);
}
print_cpu_details();
std::vector<CoreCounterState> cstates1, cstates2;
std::vector<SocketCounterState> sktstate1, sktstate2;
SystemCounterState sstate1, sstate2;
bitset<MAX_CORES> ycores;
const auto cpu_family_model = m->getCPUFamilyModel();
print_pid_collection_message(pid);
bool show_partial_core_output = false; // TODO: add support for partial core output
bool csv_output = data_int[pos++] % 2;
int metricVersion = data_int[pos++];
bool show_socket_output = data_int[pos++] % 2;
bool show_system_output = data_int[pos++] % 2;
bool show_core_output = data_int[pos++] % 2;
assert(pos == ints_used);
m->getAllCounterStates(sstate1, sktstate1, cstates1);
m->getAllCounterStates(sstate2, sktstate2, cstates2);
if (csv_output)
print_csv(m, cstates1, cstates2, sktstate1, sktstate2, ycores, sstate1, sstate2,
show_core_output, show_partial_core_output, show_socket_output, show_system_output);
else
print_output(m, cstates1, cstates2, sktstate1, sktstate2, ycores, sstate1, sstate2,
cpu_family_model, show_core_output, show_partial_core_output, show_socket_output, show_system_output,
metricVersion);
return 0;
}