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..81a852f9a22819185acc35c59d0ce7d5608e2a00 100644 |
--- a/src/trusted/validator/x86/64/ncvalidate.c |
+++ b/src/trusted/validator/x86/64/ncvalidate.c |
@@ -10,6 +10,8 @@ |
#include "native_client/src/shared/platform/nacl_log.h" |
#include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter.h" |
+/* TODO(ncbray) is there a better way to access validation stats? */ |
+#include "native_client/src/trusted/validator/x86/ncval_reg_sfi/ncvalidate_iter_internal.h" |
/* Be sure the correct compile flags are defined for this. */ |
#if NACL_ARCH(NACL_TARGET_ARCH) != NACL_x86 |
@@ -33,32 +35,54 @@ 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, |
+ NaClValidationCache *cache, |
+ void *cache_context) { |
struct NaClValidatorState *vstate; |
- NaClValidationStatus status = |
+ NaClValidationStatus status; |
+ void *query = NULL; |
+ |
+ if (cache) |
+ query = cache->create_query(cache_context); |
+ |
+ if (query) { |
+ cache->add_data(query, (uint8_t *) "x86-64", (size_t) 6); |
+ cache->add_data(query, (uint8_t *) cpu_features, |
+ sizeof(NaClCPUFeaturesX86)); |
+ cache->add_data(query, data, size); |
+ if (cache->do_query(query)) { |
+ cache->destroy_query(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) |
+ cache->destroy_query(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) { |
+ /* Don't cache the result if the code is modified. */ |
+ if (status == NaClValidationSucceeded && vstate->did_stub_out == 0) |
+ cache->set_validates(query); |
+ cache->destroy_query(query); |
+ } |
+ NaClValidatorStateDestroy(vstate); |
+ return status; |
} |
NaClValidationStatus NaClApplyValidatorStubout_x86_64( |
@@ -73,7 +97,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 +109,9 @@ NaClValidationStatus NACL_SUBARCH_NAME(ApplyValidator, x86, 64) ( |
uint8_t *data, |
size_t size, |
int bundle_size, |
- NaClCPUFeaturesX86 *cpu_features) { |
+ NaClCPUFeaturesX86 *cpu_features, |
+ NaClValidationCache *cache, |
+ void *cache_context) { |
NaClValidationStatus status = NaClValidationFailedNotImplemented; |
assert(NACL_SB_DEFAULT == sb_kind); |
if (bundle_size == 16 || bundle_size == 32) { |
@@ -93,7 +120,8 @@ 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, |
+ cache_context); |
break; |
case NaClApplyValidationDoStubout: |
status = NaClApplyValidatorStubout_x86_64( |