Index: src/trusted/validator/x86/32/ncvalidate.c |
diff --git a/src/trusted/validator/x86/32/ncvalidate.c b/src/trusted/validator/x86/32/ncvalidate.c |
index 5b00fc6540bd7a98e7bc7a028dbdd15577820033..5c1e4b1b40398f68116ff32acd118cee0283bbb1 100644 |
--- a/src/trusted/validator/x86/32/ncvalidate.c |
+++ b/src/trusted/validator/x86/32/ncvalidate.c |
@@ -7,8 +7,11 @@ |
/* Implement the ApplyValidator API for the x86-32 architecture. */ |
#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_seg_sfi/ncvalidate.h" |
#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_detailed.h" |
+/* HACK to get access to didstubout */ |
+#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncvalidate_internaltypes.h" |
#include <assert.h> |
/* Be sure the correct compile flags are defined for this. */ |
@@ -25,14 +28,42 @@ static NaClValidationStatus NCApplyValidatorSilently_x86_32( |
uint8_t *data, |
size_t size, |
int bundle_size, |
- NaClCPUFeaturesX86 *cpu_features) { |
+ NaClCPUFeaturesX86 *cpu_features, |
+ struct NaClValidationCache *cache) { |
struct NCValidatorState *vstate; |
int validator_result = 0; |
+ void *query = NULL; |
+ |
+ if (cache != NULL) |
+ query = cache->CreateQuery(cache->handle); |
+ |
+ if (query != NULL) { |
+ const char validator_id[] = "x86-32"; |
+ 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; |
+ } |
+ } |
vstate = NCValidateInit(guest_addr, size, bundle_size, cpu_features); |
- if (vstate == NULL) return NaClValidationFailedOutOfMemory; |
+ if (vstate == NULL) { |
+ if (query != NULL) |
+ cache->DestroyQuery(query); |
+ return NaClValidationFailedOutOfMemory; |
+ } |
NCValidateSegment(data, guest_addr, size, vstate); |
validator_result = NCValidateFinish(vstate); |
+ |
+ if (query != NULL) { |
+ /* Don't cache the result if the code is modified. */ |
+ if (validator_result == 0 && !NCValidatorDidStubOut(vstate)) |
+ cache->SetKnownToValidate(query); |
+ cache->DestroyQuery(query); |
+ } |
+ |
NCValidateFreeState(&vstate); |
return (validator_result == 0) |
? NaClValidationSucceeded : NaClValidationFailed; |
@@ -62,7 +93,8 @@ NaClValidationStatus NACL_SUBARCH_NAME(ApplyValidator, NACL_TARGET_ARCH, 32) ( |
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) { |
@@ -71,7 +103,7 @@ NaClValidationStatus NACL_SUBARCH_NAME(ApplyValidator, NACL_TARGET_ARCH, 32) ( |
switch (kind) { |
case NaClApplyCodeValidation: |
status = NCApplyValidatorSilently_x86_32( |
- guest_addr, data, size, bundle_size, cpu_features); |
+ guest_addr, data, size, bundle_size, cpu_features, cache); |
break; |
case NaClApplyValidationDoStubout: |
status = NCApplyValidatorStubout_x86_32( |