Index: src/trusted/validator/x86/64/ncvalidate.c |
diff --git a/src/trusted/validator/x86/64/ncvalidate.c b/src/trusted/validator/x86/64/ncvalidate.c |
index e07cc68095103f8a3707d2c297872efa1a4d6a7b..ad3f8e40635a02fcaa773dfcac1b9bcb5662519d 100644 |
--- a/src/trusted/validator/x86/64/ncvalidate.c |
+++ b/src/trusted/validator/x86/64/ncvalidate.c |
@@ -6,9 +6,9 @@ |
/* Implement the ApplyValidator API for the x86-64 architecture. */ |
#include <assert.h> |
-#include "native_client/src/trusted/validator/ncvalidate.h" |
- |
#include "native_client/src/shared/platform/nacl_log.h" |
+#include "native_client/src/trusted/validator/ncvalidate.h" |
+#include "native_client/src/trusted/validator/validation_cache.h" |
#include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter.h" |
/* Be sure the correct compile flags are defined for this. */ |
@@ -33,32 +33,53 @@ NaClValidationStatus NaClValidatorSetup_x86_64( |
: NaClValidationSucceeded; /* or at least to this point! */ |
} |
-Bool NaClSegmentValidate_x86_64( |
- uintptr_t guest_addr, |
- uint8_t *data, |
- size_t size, |
- struct NaClValidatorState* vstate) { |
- Bool is_ok; |
- NaClValidateSegment(data, guest_addr, size, vstate); |
- is_ok = NaClValidatesOk(vstate); |
- NaClValidatorStateDestroy(vstate); |
- return is_ok; |
-} |
- |
static NaClValidationStatus NaClApplyValidatorSilently_x86_64( |
uintptr_t guest_addr, |
uint8_t *data, |
size_t size, |
int bundle_size, |
- NaClCPUFeaturesX86 *cpu_features) { |
+ NaClCPUFeaturesX86 *cpu_features, |
+ struct NaClValidationCache *cache) { |
struct NaClValidatorState *vstate; |
- NaClValidationStatus status = |
+ NaClValidationStatus status; |
+ void *query = NULL; |
+ |
+ if (cache != NULL) |
+ query = cache->CreateQuery(cache->handle); |
+ |
+ if (query != NULL) { |
+ const char validator_id[] = "x86-64"; |
+ cache->AddData(query, (uint8_t *) validator_id, sizeof(validator_id)); |
+ cache->AddData(query, (uint8_t *) cpu_features, sizeof(*cpu_features)); |
+ cache->AddData(query, data, size); |
+ if (cache->QueryKnownToValidate(query)) { |
+ cache->DestroyQuery(query); |
+ return NaClValidationSucceeded; |
+ } |
+ } |
+ |
+ status = |
NaClValidatorSetup_x86_64(guest_addr, size, bundle_size, cpu_features, |
&vstate); |
- if (status != NaClValidationSucceeded) return status; |
+ |
+ if (status != NaClValidationSucceeded) { |
+ if (query != NULL) |
+ cache->DestroyQuery(query); |
+ return status; |
+ } |
NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); |
- return NaClSegmentValidate_x86_64(guest_addr, data, size, vstate) |
- ? NaClValidationSucceeded : NaClValidationFailed; |
+ NaClValidateSegment(data, guest_addr, size, vstate); |
+ status = |
+ NaClValidatesOk(vstate) ? NaClValidationSucceeded : NaClValidationFailed; |
+ |
+ if (query != NULL) { |
+ /* Don't cache the result if the code is modified. */ |
+ if (status == NaClValidationSucceeded && !NaClValidatorDidStubOut(vstate)) |
+ cache->SetKnownToValidate(query); |
+ cache->DestroyQuery(query); |
+ } |
+ NaClValidatorStateDestroy(vstate); |
+ return status; |
} |
NaClValidationStatus NaClApplyValidatorStubout_x86_64( |
@@ -73,7 +94,8 @@ NaClValidationStatus NaClApplyValidatorStubout_x86_64( |
&vstate); |
if (status != NaClValidationSucceeded) return status; |
NaClValidatorStateSetDoStubOut(vstate, TRUE); |
- NaClSegmentValidate_x86_64(guest_addr, data, size, vstate); |
+ NaClValidateSegment(data, guest_addr, size, vstate); |
+ NaClValidatorStateDestroy(vstate); |
return NaClValidationSucceeded; |
} |
@@ -84,7 +106,8 @@ NaClValidationStatus NACL_SUBARCH_NAME(ApplyValidator, x86, 64) ( |
uint8_t *data, |
size_t size, |
int bundle_size, |
- NaClCPUFeaturesX86 *cpu_features) { |
+ NaClCPUFeaturesX86 *cpu_features, |
+ struct NaClValidationCache *cache) { |
NaClValidationStatus status = NaClValidationFailedNotImplemented; |
assert(NACL_SB_DEFAULT == sb_kind); |
if (bundle_size == 16 || bundle_size == 32) { |
@@ -93,7 +116,7 @@ NaClValidationStatus NACL_SUBARCH_NAME(ApplyValidator, x86, 64) ( |
switch (kind) { |
case NaClApplyCodeValidation: |
status = NaClApplyValidatorSilently_x86_64( |
- guest_addr, data, size, bundle_size, cpu_features); |
+ guest_addr, data, size, bundle_size, cpu_features, cache); |
break; |
case NaClApplyValidationDoStubout: |
status = NaClApplyValidatorStubout_x86_64( |