Index: src/trusted/validator_arm/ncvalidate.cc |
diff --git a/src/trusted/validator_arm/ncvalidate.cc b/src/trusted/validator_arm/ncvalidate.cc |
index 6601d7a77fe68142c79273c241cf5779b5118bf6..4697d90b1b12dfa5111fbe17ae73f3e35c5e5177 100644 |
--- a/src/trusted/validator_arm/ncvalidate.cc |
+++ b/src/trusted/validator_arm/ncvalidate.cc |
@@ -46,14 +46,19 @@ class EarlyExitProblemSink : public nacl_arm_val::ProblemSink { |
EXTERN_C_BEGIN |
-int NCValidateSegment(uint8_t *mbase, uint32_t vbase, size_t size) { |
+int NCValidateSegment(uint8_t *mbase, uint32_t vbase, size_t size, |
+ bool thumb) { |
+ nacl_arm_dec::RegisterList roRegs = Register(9); |
+ if (thumb) { |
+ roRegs = nacl_arm_dec::kRegisterListNothing; |
+ } |
SfiValidator validator( |
16, // bytes per bundle |
1U * 1024 * 1024 * 1024, // bytes of code space |
1U * 1024 * 1024 * 1024, // bytes of data space |
- Register(9), // read only register(s) |
- kRegisterStack); // data addressing register(s) |
- |
+ roRegs, // read only register(s) |
+ kRegisterStack, // data addressing register(s) |
+ thumb); |
EarlyExitProblemSink sink; |
vector<CodeSegment> segments; |
@@ -74,10 +79,11 @@ NaClValidationStatus NACL_SUBARCH_NAME(ApplyValidator, arm, 32) ( |
Bool local_cpu) { |
NaClValidationStatus status = NaClValidationFailedNotImplemented; |
UNREFERENCED_PARAMETER(local_cpu); |
- UNREFERENCED_PARAMETER(sb_kind); |
+ |
if (bundle_size == 16) { |
if (kind == NaClApplyCodeValidation) { |
- status = ((0 == NCValidateSegment(data, guest_addr, size)) |
+ status = ((0 == NCValidateSegment(data, guest_addr, size, |
+ sb_kind == NACL_SB_ARM_THUMB2)) |
? NaClValidationSucceeded : NaClValidationFailed); |
} |
} |