| 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(
|
|
|