|
@@ -11,7 +11,7 @@
|
|
|
|
|
|
static void print_usage_and_exit()
|
|
static void print_usage_and_exit()
|
|
{
|
|
{
|
|
- printf("usage: crash -[AsdiamfMFTtSxyXUI]\n");
|
|
|
|
|
|
+ printf("usage: crash -[AsdiamfMFTtSxyXUIc]\n");
|
|
exit(0);
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -101,6 +101,7 @@ int main(int argc, char** argv)
|
|
ExecuteNonExecutableMemory,
|
|
ExecuteNonExecutableMemory,
|
|
TriggerUserModeInstructionPrevention,
|
|
TriggerUserModeInstructionPrevention,
|
|
UseIOInstruction,
|
|
UseIOInstruction,
|
|
|
|
+ ReadTimestampCounter,
|
|
};
|
|
};
|
|
Mode mode = SegmentationViolation;
|
|
Mode mode = SegmentationViolation;
|
|
|
|
|
|
@@ -143,6 +144,8 @@ int main(int argc, char** argv)
|
|
mode = TriggerUserModeInstructionPrevention;
|
|
mode = TriggerUserModeInstructionPrevention;
|
|
else if (String(argv[1]) == "-I")
|
|
else if (String(argv[1]) == "-I")
|
|
mode = UseIOInstruction;
|
|
mode = UseIOInstruction;
|
|
|
|
+ else if (String(argv[1]) == "-c")
|
|
|
|
+ mode = ReadTimestampCounter;
|
|
else
|
|
else
|
|
print_usage_and_exit();
|
|
print_usage_and_exit();
|
|
|
|
|
|
@@ -342,5 +345,12 @@ int main(int argc, char** argv)
|
|
}).run(run_type);
|
|
}).run(run_type);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (mode == ReadTimestampCounter || mode == TestAllCrashTypes) {
|
|
|
|
+ Crash("Read the CPU timestamp counter", [] {
|
|
|
|
+ asm volatile("rdtsc");
|
|
|
|
+ return Crash::Failure::DidNotCrash;
|
|
|
|
+ }).run(run_type);
|
|
|
|
+ }
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|