Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Unified Diff: src/trusted/validator/x86/64/ncvalidate.c

Issue 9535001: Add validation caching interface. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: More edits Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/trusted/validator/x86/64/ncvalidate.h ('k') | src/trusted/validator/x86/64/ncvalidate_verbose.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « src/trusted/validator/x86/64/ncvalidate.h ('k') | src/trusted/validator/x86/64/ncvalidate_verbose.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698