Index: src/trusted/validator_arm/ncval.cc |
diff --git a/src/trusted/validator_arm/ncval.cc b/src/trusted/validator_arm/ncval.cc |
index cdf2f8dc6e8582bae6639ec312b5d12abaa31b70..e0ca056c59229d15bdaa13ebdbb9273768e2d0ee 100644 |
--- a/src/trusted/validator_arm/ncval.cc |
+++ b/src/trusted/validator_arm/ncval.cc |
@@ -51,18 +51,23 @@ class CommandLineProblemSink : public nacl_arm_val::ProblemSink { |
const uint32_t kOneGig = 1U * 1024 * 1024 * 1024; |
-int validate(const ncfile *ncf, bool use_zero_masks) { |
+int validate(const ncfile *ncf, bool use_zero_masks, bool thumb) { |
+ nacl_arm_dec::RegisterList roRegs = nacl_arm_dec::Register(9); |
+ if (thumb) { |
+ roRegs = nacl_arm_dec::kRegisterListNothing; |
+ } |
SfiValidator validator( |
16, // bytes per bundle |
// TODO(cbiffle): maybe check region sizes from ELF headers? |
// verify that instructions are in right region |
kOneGig, // code region size |
kOneGig, // data region size |
- nacl_arm_dec::Register(9), // read only register (used for threading) |
- nacl_arm_dec::Register(13)); // stack pointer |
+ roRegs, // read only register (used for threading) |
+ nacl_arm_dec::Register(13), // stack pointer |
+ thumb); |
if (use_zero_masks) { |
- validator.change_masks(0, 0); |
+ validator.change_masks(0, 0, 0); |
} |
CommandLineProblemSink sink; |
@@ -74,7 +79,6 @@ int validate(const ncfile *ncf, bool use_zero_masks) { |
if ((shdr[i].sh_flags & SHF_EXECINSTR) != SHF_EXECINSTR) { |
continue; |
} |
- |
CodeSegment segment(ncf->data + (shdr[i].sh_addr - ncf->vbase), |
shdr[i].sh_addr, shdr[i].sh_size); |
segments.push_back(segment); |
@@ -117,8 +121,8 @@ int main(int argc, const char *argv[]) { |
} |
// TODO(cbiffle): check OS ABI, ABI version, align mask |
+ int exit_code = validate(ncf, use_zero_masks, ncf->eheader->e_entry & 1); |
- int exit_code = validate(ncf, use_zero_masks); |
nc_freefile(ncf); |
return exit_code; |
} |