OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/snapshot/code-serializer.h" | 5 #include "src/snapshot/code-serializer.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/counters.h" | 10 #include "src/counters.h" |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 const List<uint32_t>* stub_keys = cs->stub_keys(); | 363 const List<uint32_t>* stub_keys = cs->stub_keys(); |
364 | 364 |
365 List<Reservation> reservations; | 365 List<Reservation> reservations; |
366 cs->EncodeReservations(&reservations); | 366 cs->EncodeReservations(&reservations); |
367 | 367 |
368 // Calculate sizes. | 368 // Calculate sizes. |
369 int reservation_size = reservations.length() * kInt32Size; | 369 int reservation_size = reservations.length() * kInt32Size; |
370 int num_stub_keys = stub_keys->length(); | 370 int num_stub_keys = stub_keys->length(); |
371 int stub_keys_size = stub_keys->length() * kInt32Size; | 371 int stub_keys_size = stub_keys->length() * kInt32Size; |
372 int payload_offset = kHeaderSize + reservation_size + stub_keys_size; | 372 int payload_offset = kHeaderSize + reservation_size + stub_keys_size; |
373 int padded_payload_offset = POINTER_SIZE_ALIGN(payload_offset); | 373 int padded_payload_offset = POINTER_SIZE_ALIGN(payload_offset); |
Yang
2017/03/07 11:28:11
The reason we aligned is for checksum computation.
Jakob Kummerow
2017/03/07 12:39:15
As discussed offline, checksumming still relies on
| |
374 int size = padded_payload_offset + payload->length(); | 374 int size = padded_payload_offset + payload->length(); |
375 | 375 |
376 // Allocate backing store and create result data. | 376 // Allocate backing store and create result data. |
377 AllocateData(size); | 377 AllocateData(size); |
378 | 378 |
379 // Set header values. | 379 // Set header values. |
380 SetMagicNumber(cs->isolate()); | 380 SetMagicNumber(cs->isolate()); |
381 SetHeaderValue(kVersionHashOffset, Version::Hash()); | 381 SetHeaderValue(kVersionHashOffset, Version::Hash()); |
382 SetHeaderValue(kSourceHashOffset, cs->source_hash()); | 382 SetHeaderValue(kSourceHashOffset, cs->source_hash()); |
383 SetHeaderValue(kCpuFeaturesOffset, | 383 SetHeaderValue(kCpuFeaturesOffset, |
(...skipping 20 matching lines...) Expand all Loading... | |
404 Checksum checksum(DataWithoutHeader()); | 404 Checksum checksum(DataWithoutHeader()); |
405 SetHeaderValue(kChecksum1Offset, checksum.a()); | 405 SetHeaderValue(kChecksum1Offset, checksum.a()); |
406 SetHeaderValue(kChecksum2Offset, checksum.b()); | 406 SetHeaderValue(kChecksum2Offset, checksum.b()); |
407 } | 407 } |
408 | 408 |
409 SerializedCodeData::SanityCheckResult SerializedCodeData::SanityCheck( | 409 SerializedCodeData::SanityCheckResult SerializedCodeData::SanityCheck( |
410 Isolate* isolate, uint32_t expected_source_hash) const { | 410 Isolate* isolate, uint32_t expected_source_hash) const { |
411 if (this->size_ < kHeaderSize) return INVALID_HEADER; | 411 if (this->size_ < kHeaderSize) return INVALID_HEADER; |
412 uint32_t magic_number = GetMagicNumber(); | 412 uint32_t magic_number = GetMagicNumber(); |
413 if (magic_number != ComputeMagicNumber(isolate)) return MAGIC_NUMBER_MISMATCH; | 413 if (magic_number != ComputeMagicNumber(isolate)) return MAGIC_NUMBER_MISMATCH; |
414 if (GetExtraReferences() > GetExtraReferences(isolate)) { | |
415 return MAGIC_NUMBER_MISMATCH; | |
416 } | |
414 uint32_t version_hash = GetHeaderValue(kVersionHashOffset); | 417 uint32_t version_hash = GetHeaderValue(kVersionHashOffset); |
415 uint32_t source_hash = GetHeaderValue(kSourceHashOffset); | 418 uint32_t source_hash = GetHeaderValue(kSourceHashOffset); |
416 uint32_t cpu_features = GetHeaderValue(kCpuFeaturesOffset); | 419 uint32_t cpu_features = GetHeaderValue(kCpuFeaturesOffset); |
417 uint32_t flags_hash = GetHeaderValue(kFlagHashOffset); | 420 uint32_t flags_hash = GetHeaderValue(kFlagHashOffset); |
421 uint32_t payload_length = GetHeaderValue(kPayloadLengthOffset); | |
418 uint32_t c1 = GetHeaderValue(kChecksum1Offset); | 422 uint32_t c1 = GetHeaderValue(kChecksum1Offset); |
419 uint32_t c2 = GetHeaderValue(kChecksum2Offset); | 423 uint32_t c2 = GetHeaderValue(kChecksum2Offset); |
420 if (version_hash != Version::Hash()) return VERSION_MISMATCH; | 424 if (version_hash != Version::Hash()) return VERSION_MISMATCH; |
421 if (source_hash != expected_source_hash) return SOURCE_MISMATCH; | 425 if (source_hash != expected_source_hash) return SOURCE_MISMATCH; |
422 if (cpu_features != static_cast<uint32_t>(CpuFeatures::SupportedFeatures())) { | 426 if (cpu_features != static_cast<uint32_t>(CpuFeatures::SupportedFeatures())) { |
423 return CPU_FEATURES_MISMATCH; | 427 return CPU_FEATURES_MISMATCH; |
424 } | 428 } |
425 if (flags_hash != FlagList::Hash()) return FLAGS_MISMATCH; | 429 if (flags_hash != FlagList::Hash()) return FLAGS_MISMATCH; |
430 uint32_t max_payload_length = | |
431 this->size_ - | |
432 POINTER_SIZE_ALIGN(kHeaderSize + | |
Yang
2017/03/07 11:28:11
See above. Let's not align.
Jakob Kummerow
2017/03/07 12:39:15
See above -- if we align one, we need to align the
| |
433 GetHeaderValue(kNumReservationsOffset) * kInt32Size + | |
434 GetHeaderValue(kNumCodeStubKeysOffset) * kInt32Size); | |
435 if (payload_length > max_payload_length) return LENGTH_MISMATCH; | |
426 if (!Checksum(DataWithoutHeader()).Check(c1, c2)) return CHECKSUM_MISMATCH; | 436 if (!Checksum(DataWithoutHeader()).Check(c1, c2)) return CHECKSUM_MISMATCH; |
427 return CHECK_SUCCESS; | 437 return CHECK_SUCCESS; |
428 } | 438 } |
429 | 439 |
430 uint32_t SerializedCodeData::SourceHash(Handle<String> source) { | 440 uint32_t SerializedCodeData::SourceHash(Handle<String> source) { |
431 return source->length(); | 441 return source->length(); |
432 } | 442 } |
433 | 443 |
434 // Return ScriptData object and relinquish ownership over it to the caller. | 444 // Return ScriptData object and relinquish ownership over it to the caller. |
435 ScriptData* SerializedCodeData::GetScriptData() { | 445 ScriptData* SerializedCodeData::GetScriptData() { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
478 *rejection_result = scd.SanityCheck(isolate, expected_source_hash); | 488 *rejection_result = scd.SanityCheck(isolate, expected_source_hash); |
479 if (*rejection_result != CHECK_SUCCESS) { | 489 if (*rejection_result != CHECK_SUCCESS) { |
480 cached_data->Reject(); | 490 cached_data->Reject(); |
481 return SerializedCodeData(nullptr, 0); | 491 return SerializedCodeData(nullptr, 0); |
482 } | 492 } |
483 return scd; | 493 return scd; |
484 } | 494 } |
485 | 495 |
486 } // namespace internal | 496 } // namespace internal |
487 } // namespace v8 | 497 } // namespace v8 |
OLD | NEW |