Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(518)

Unified Diff: src/trusted/validator_arm/validator_small_tests.cc

Issue 11194045: Change BKPT and UDF encodings on ARM. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Update copyright. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/trusted/validator_arm/validator_huge_tests.cc ('k') | tests/debug_stub/debugger_test.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/trusted/validator_arm/validator_small_tests.cc
diff --git a/src/trusted/validator_arm/validator_small_tests.cc b/src/trusted/validator_arm/validator_small_tests.cc
index e58888ff2397f3a818f7afb2895d8d980d6b5f37..c9fa8df361251d7ebe69d7b0c7ca0f18926611c2 100644
--- a/src/trusted/validator_arm/validator_small_tests.cc
+++ b/src/trusted/validator_arm/validator_small_tests.cc
@@ -520,23 +520,6 @@ TEST_F(ValidatorTests, ScaryUndefinedInstructions) {
}
}
-TEST_F(ValidatorTests, LessScaryUndefinedInstructions) {
- // These instructions are specified by ARM as *permanently* undefined, so we
- // treat them as a reliable Illegal Instruction trap.
-
- static const AnnotatedInstruction perm_undefined[] = {
- { 0xE7FFDEFE, "permanently undefined instruction produced by LLVM" },
- };
-
- for (unsigned i = 0; i < NACL_ARRAY_SIZE(perm_undefined); i++) {
- arm_inst program[] = { perm_undefined[i].inst };
- validation_should_pass(program,
- 1,
- kDefaultBaseAddr,
- perm_undefined[i].about);
- }
-}
-
TEST_F(ValidatorTests, PcRelativeFirstInst) {
// Note: This tests the fix for issue 2771.
static const arm_inst pcrel_boundary_tests[] = {
@@ -1026,7 +1009,7 @@ TEST_F(ValidatorTests, CheckPushPcUnpredictable) {
TEST_F(ValidatorTests, ConditionalBreakpoints) {
ProblemSpy spy;
arm_inst bkpt = 0xE1200070; // BKPT #0
- arm_inst pool_head = nacl_arm_dec::kLiteralPoolHeadInstruction;
+ arm_inst pool_head = nacl_arm_dec::kLiteralPoolHead;
for (Instruction::Condition cond = Instruction::EQ;
cond < Instruction::AL;
cond = Instruction::Next(cond)) {
@@ -1040,12 +1023,55 @@ TEST_F(ValidatorTests, ConditionalBreakpoints) {
}
TEST_F(ValidatorTests, LiteralPoolHeadIsBreakpoint) {
- EXPECT_EQ(nacl_arm_dec::kLiteralPoolHeadInstruction & 0xFFF000F0,
+ EXPECT_EQ(nacl_arm_dec::kLiteralPoolHead & 0xFFF000F0,
0xE1200070) // BKPT #0
<< ("the literal pool head should be a breakpoint: "
"it needs to act as a roadblock");
}
+TEST_F(ValidatorTests, Breakpoint) {
+ EXPECT_EQ(nacl_arm_dec::kBreakpoint & 0xFFF000F0,
+ 0xE1200070) // BKPT #0
+ << ("the breakpoint instruction should be a breakpoint: "
+ "it needs to trap");
+}
+
+TEST_F(ValidatorTests, HaltFill) {
+ EXPECT_EQ(nacl_arm_dec::kHaltFill & 0xFFF000F0,
+ 0xE7F000F0) // UDF #0
+ << ("the halt fill instruction should be UDF: "
+ "it needs to trap");
+}
+
+TEST_F(ValidatorTests, AbortNow) {
+ EXPECT_EQ(nacl_arm_dec::kAbortNow & 0xFFF000F0,
+ 0xE7F000F0) // UDF #0
+ << ("the abort now instruction should be UDF: "
+ "it needs to trap");
+}
+
+TEST_F(ValidatorTests, FailValidation) {
+ EXPECT_EQ(nacl_arm_dec::kFailValidation & 0xFFF000F0,
+ 0xE7F000F0) // UDF #0
+ << ("the fail validation instruction should be UDF: "
+ "it needs to trap");
+}
+
+TEST_F(ValidatorTests, UDFAndBKPTValidateAsExpected) {
+ ProblemSpy spy;
+ for (uint32_t i = 0; i < 0xFFFF; ++i) {
+ arm_inst bkpt_inst = 0xE1200070 | ((i & 0xFFF0) << 4) | (i & 0xF);
+ arm_inst udf_inst = 0xE7F000F0 | ((i & 0xFFF0) << 4) | (i & 0xF);
+ EXPECT_EQ(validate(&bkpt_inst, 1, kDefaultBaseAddr, &spy),
+ ((bkpt_inst == nacl_arm_dec::kLiteralPoolHead) ||
+ (bkpt_inst == nacl_arm_dec::kBreakpoint)));
+ EXPECT_EQ(validate(&udf_inst, 1, kDefaultBaseAddr, &spy),
+ ((udf_inst == nacl_arm_dec::kHaltFill) ||
+ (udf_inst == nacl_arm_dec::kAbortNow)));
+ // Tautological note: kFailValidation should fail validation.
+ }
+}
+
TEST_F(ValidatorTests, LiteralPoolHeadInstruction) {
// Make sure that literal pools are handled properly: they should be preceded
// by a special breakpoint instruction at the start of the bundle, and can
@@ -1059,7 +1085,7 @@ TEST_F(ValidatorTests, LiteralPoolHeadInstruction) {
literal_pool[0] = (literal_pool[0] & 0xFFF000F0) |
(imm16 & 0xF) |
((imm16 & 0xFFF0) << 8);
- if (literal_pool[0] == nacl_arm_dec::kLiteralPoolHeadInstruction) {
+ if (literal_pool[0] == nacl_arm_dec::kLiteralPoolHead) {
validation_should_pass(literal_pool.data(),
literal_pool.size(),
kDefaultBaseAddr,
@@ -1083,7 +1109,7 @@ TEST_F(ValidatorTests, LiteralPoolHeadPosition) {
std::fill(literal_pool.begin(), literal_pool.end(), 0xEF000000); // SVC #0
if (pos != literal_pool.size()) {
// We do one iteration without a literal pool head at all.
- literal_pool[pos] = nacl_arm_dec::kLiteralPoolHeadInstruction;
+ literal_pool[pos] = nacl_arm_dec::kLiteralPoolHead;
}
if (pos == 0) {
validation_should_pass(literal_pool.data(),
@@ -1108,7 +1134,7 @@ TEST_F(ValidatorTests, LiteralPoolBig) {
for (size_t pos = 0; pos <= literal_pools.size(); ++pos) {
std::fill(literal_pools.begin(), literal_pools.end(),
0xEF000000); // SVC #0
- literal_pools[pos] = nacl_arm_dec::kLiteralPoolHeadInstruction;
+ literal_pools[pos] = nacl_arm_dec::kLiteralPoolHead;
validation_should_fail(literal_pools.data(),
literal_pools.size(),
kDefaultBaseAddr,
@@ -1133,7 +1159,7 @@ TEST_F(ValidatorTests, LiteralPoolBranch) {
continue;
}
std::fill(code.begin(), code.end(), 0xE320F000); // NOP
- code[bundle_pos] = nacl_arm_dec::kLiteralPoolHeadInstruction;
+ code[bundle_pos] = nacl_arm_dec::kLiteralPoolHead;
for (size_t b_target = 0; b_target < code.size(); ++b_target) {
// PC reads as current instruction address plus 8 (e.g. two instructions
// ahead of b_pos).
« no previous file with comments | « src/trusted/validator_arm/validator_huge_tests.cc ('k') | tests/debug_stub/debugger_test.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698