Changeset 271247 in webkit
- Timestamp:
- Jan 7, 2021, 11:50:29 AM (6 years ago)
- Location:
- branches/safari-610-branch/Source/JavaScriptCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
assembler/AssemblerBuffer.cpp (modified) (1 diff)
-
assembler/AssemblerBuffer.h (modified) (10 diffs)
-
assembler/LinkBuffer.cpp (modified) (5 diffs)
-
assembler/LinkBuffer.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-610-branch/Source/JavaScriptCore/ChangeLog
r271246 r271247 1 2021-01-07 Alan Coon <alancoon@apple.com> 2 3 Cherry-pick r271143. rdar://problem/72893965 4 5 Validate every instruction in AssemblerBuffer 6 https://bugs.webkit.org/show_bug.cgi?id=218104 7 <rdar://problem/69433094> 8 9 Reviewed by Saam Barati. 10 11 * assembler/AssemblerBuffer.cpp: 12 (JSC::threadSpecificAssemblerHashes): 13 * assembler/AssemblerBuffer.h: 14 (JSC::AssemblerBuffer::AssemblerBuffer): 15 (JSC::AssemblerBuffer::~AssemblerBuffer): 16 (JSC::AssemblerBuffer::releaseAssemblerData): 17 (JSC::AssemblerBuffer::releaseAssemblerHashes): 18 (JSC::AssemblerBuffer::putIntegralUnchecked): 19 (JSC::AssemblerBuffer::grow): 20 (JSC::AssemblerBuffer::outOfLineGrow): 21 (JSC::ARM64EHash::update): Deleted. 22 (JSC::ARM64EHash::finalHash const): Deleted. 23 (): Deleted. 24 (JSC::AssemblerBuffer::hash const): Deleted. 25 * assembler/LinkBuffer.cpp: 26 (JSC::LinkBuffer::copyCompactAndLinkCode): 27 * assembler/LinkBuffer.h: 28 29 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@271143 268f45cc-cd09-0410-ab3c-d52691b4dbfc 30 31 2020-11-17 Tadeu Zagallo <tzagallo@apple.com> 32 33 Validate every instruction in AssemblerBuffer 34 https://bugs.webkit.org/show_bug.cgi?id=218104 35 <rdar://problem/69433094> 36 37 Reviewed by Saam Barati. 38 39 * assembler/AssemblerBuffer.cpp: 40 (JSC::threadSpecificAssemblerHashes): 41 * assembler/AssemblerBuffer.h: 42 (JSC::AssemblerBuffer::AssemblerBuffer): 43 (JSC::AssemblerBuffer::~AssemblerBuffer): 44 (JSC::AssemblerBuffer::releaseAssemblerData): 45 (JSC::AssemblerBuffer::releaseAssemblerHashes): 46 (JSC::AssemblerBuffer::putIntegralUnchecked): 47 (JSC::AssemblerBuffer::grow): 48 (JSC::AssemblerBuffer::outOfLineGrow): 49 (JSC::ARM64EHash::update): Deleted. 50 (JSC::ARM64EHash::finalHash const): Deleted. 51 (): Deleted. 52 (JSC::AssemblerBuffer::hash const): Deleted. 53 * assembler/LinkBuffer.cpp: 54 (JSC::LinkBuffer::copyCompactAndLinkCode): 55 * assembler/LinkBuffer.h: 56 1 57 2021-01-07 Alan Coon <alancoon@apple.com> 2 58 -
branches/safari-610-branch/Source/JavaScriptCore/assembler/AssemblerBuffer.cpp
r262402 r271247 46 46 } 47 47 48 #if CPU(ARM64E) 49 static ThreadSpecificAssemblerData* threadSpecificAssemblerHashesPtr; 50 ThreadSpecificAssemblerData& threadSpecificAssemblerHashes() 51 { 52 static std::once_flag flag; 53 std::call_once( 54 flag, 55 [] () { 56 threadSpecificAssemblerHashesPtr = new ThreadSpecificAssemblerData(); 57 }); 58 return *threadSpecificAssemblerHashesPtr; 59 } 60 #endif // CPU(ARM64E) 61 48 62 #endif // ENABLE(ASSEMBLER) 49 63 -
branches/safari-610-branch/Source/JavaScriptCore/assembler/AssemblerBuffer.h
r262402 r271247 47 47 48 48 JS_EXPORT_PRIVATE ThreadSpecificAssemblerData& threadSpecificAssemblerData(); 49 JS_EXPORT_PRIVATE ThreadSpecificAssemblerData& threadSpecificAssemblerHashes(); 49 50 50 51 class LinkBuffer; … … 184 185 class ARM64EHash { 185 186 public: 186 ARM64EHash() = default; 187 ALWAYS_INLINE void update(uint32_t value) 187 ARM64EHash(uint32_t initialHash) 188 : m_hash(initialHash) 189 { 190 } 191 192 ALWAYS_INLINE uint32_t update(uint32_t value) 188 193 { 189 194 uint64_t input = value ^ m_hash; … … 191 196 uint64_t b = tagInt(input, static_cast<PtrTag>(0xb7e151628aed2a6a)) >> 23; 192 197 m_hash = a ^ b; 193 } 194 uint32_t finalHash() const 195 { 196 uint64_t hash = m_hash; 197 uint64_t a = static_cast<uint32_t>(tagInt(hash, static_cast<PtrTag>(0xbf7158809cf4f3c7)) >> 39); 198 uint64_t b = tagInt(hash, static_cast<PtrTag>(0x62e7160f38b4da56)) >> 23; 199 return static_cast<uint32_t>(a ^ b); 200 } 198 return m_hash; 199 } 200 201 201 private: 202 uint32_t m_hash { 0 };202 uint32_t m_hash; 203 203 }; 204 204 #endif … … 209 209 : m_storage() 210 210 , m_index(0) 211 { 212 auto& threadSpecific = threadSpecificAssemblerData(); 213 m_storage.takeBufferIfLarger(WTFMove(*threadSpecific)); 211 #if CPU(ARM64E) 212 , m_hash(static_cast<uint32_t>(bitwise_cast<uint64_t>(this))) 213 , m_hashes() 214 #endif 215 { 216 auto& threadSpecificData = threadSpecificAssemblerData(); 217 m_storage.takeBufferIfLarger(WTFMove(*threadSpecificData)); 218 #if CPU(ARM64E) 219 auto& threadSpecificHashes = threadSpecificAssemblerHashes(); 220 m_hashes.takeBufferIfLarger(WTFMove(*threadSpecificHashes)); 221 ASSERT(m_storage.capacity() == m_hashes.capacity()); 222 #endif 214 223 } 215 224 216 225 ~AssemblerBuffer() 217 226 { 218 auto& threadSpecific = threadSpecificAssemblerData(); 219 threadSpecific->takeBufferIfLarger(WTFMove(m_storage)); 227 #if CPU(ARM64E) 228 ASSERT(m_storage.capacity() == m_hashes.capacity()); 229 auto& threadSpecificHashes = threadSpecificAssemblerHashes(); 230 threadSpecificHashes->takeBufferIfLarger(WTFMove(m_hashes)); 231 #endif 232 auto& threadSpecificData = threadSpecificAssemblerData(); 233 threadSpecificData->takeBufferIfLarger(WTFMove(m_storage)); 220 234 } 221 235 … … 270 284 unsigned debugOffset() { return m_index; } 271 285 272 AssemblerData&& releaseAssemblerData() { return WTFMove(m_storage); } 286 AssemblerData&& releaseAssemblerData() 287 { 288 return WTFMove(m_storage); 289 } 290 291 #if CPU(ARM64E) 292 AssemblerData&& releaseAssemblerHashes() 293 { 294 return WTFMove(m_hashes); 295 } 296 #endif 273 297 274 298 // LocalWriter is a trick to keep the storage buffer and the index … … 324 348 #endif // !CPU(ARM64) 325 349 326 #if CPU(ARM64E)327 ARM64EHash hash() const { return m_hash; }328 #endif329 330 350 #if !CPU(ARM64) // If we were to define this on arm64e, we'd need a way to update the hash as we write directly into the buffer. 331 351 void* data() const { return m_storage.buffer(); } 332 352 #endif 333 334 353 335 354 protected: … … 349 368 static_assert(sizeof(value) == 4, ""); 350 369 #if CPU(ARM64E) 351 m_hash.update(value); 370 uint32_t hash = m_hash.update(value); 371 WTF::unalignedStore<uint32_t>(m_hashes.buffer() + m_index, hash); 352 372 #endif 353 373 #endif … … 361 381 { 362 382 m_storage.grow(extraCapacity); 383 #if CPU(ARM64E) 384 m_hashes.grow(extraCapacity); 385 #endif 363 386 } 364 387 … … 366 389 { 367 390 m_storage.grow(); 391 #if CPU(ARM64E) 392 m_hashes.grow(); 393 #endif 368 394 } 369 395 … … 377 403 #if CPU(ARM64E) 378 404 ARM64EHash m_hash; 405 AssemblerData m_hashes; 379 406 #endif 380 407 }; -
branches/safari-610-branch/Source/JavaScriptCore/assembler/LinkBuffer.cpp
r269091 r271247 121 121 #if ENABLE(BRANCH_COMPACTION) 122 122 123 #if CPU(ARM64E)124 #define ENABLE_VERIFY_JIT_HASH 1125 #else126 #define ENABLE_VERIFY_JIT_HASH 0127 #endif128 129 123 class BranchCompactionLinkBuffer; 130 124 … … 241 235 Vector<LinkRecord, 0, UnsafeVectorOverflow>& jumpsToLink = macroAssembler.jumpsToLink(); 242 236 m_assemblerStorage = macroAssembler.m_assembler.buffer().releaseAssemblerData(); 243 uint8_t* inData = reinterpret_cast<uint8_t*>(m_assemblerStorage.buffer()); 237 uint8_t* inData = bitwise_cast<uint8_t*>(m_assemblerStorage.buffer()); 238 #if CPU(ARM64E) 239 ARM64EHash verifyUncompactedHash { static_cast<uint32_t>(bitwise_cast<uint64_t>(¯oAssembler.m_assembler.buffer())) }; 240 m_assemblerHashesStorage = macroAssembler.m_assembler.buffer().releaseAssemblerHashes(); 241 uint32_t* inHashes = bitwise_cast<uint32_t*>(m_assemblerHashesStorage.buffer()); 242 #endif 244 243 245 244 uint8_t* codeOutData = m_code.dataLocation<uint8_t*>(); 246 247 #if ENABLE(VERIFY_JIT_HASH)248 const uint32_t expectedFinalHash = macroAssembler.m_assembler.buffer().hash().finalHash();249 ARM64EHash verifyUncompactedHash;250 #endif251 245 252 246 BranchCompactionLinkBuffer outBuffer(m_size, useFastJITPermissions() ? codeOutData : 0); … … 261 255 int writePtr = 0; 262 256 unsigned jumpCount = jumpsToLink.size(); 257 258 auto read = [&](const InstructionType* ptr) -> InstructionType { 259 InstructionType value = *ptr; 260 #if CPU(ARM64E) 261 uint32_t hash = verifyUncompactedHash.update(value); 262 unsigned index = (bitwise_cast<uint8_t*>(ptr) - inData) / 4; 263 RELEASE_ASSERT(inHashes[index] == hash); 264 #endif 265 return value; 266 }; 263 267 264 268 if (useFastJITPermissions()) … … 279 283 ASSERT(!(writePtr % 2)); 280 284 while (copySource != copyEnd) { 281 InstructionType insn = *copySource++; 282 #if ENABLE(VERIFY_JIT_HASH) 283 static_assert(sizeof(InstructionType) == 4, ""); 284 verifyUncompactedHash.update(insn); 285 #endif 285 InstructionType insn = read(copySource++); 286 286 *copyDst++ = insn; 287 287 } … … 337 337 338 338 for (size_t i = 0; i < bytes; i += sizeof(InstructionType)) { 339 InstructionType insn = *src++; 340 #if ENABLE(VERIFY_JIT_HASH) 341 verifyUncompactedHash.update(insn); 342 #endif 339 InstructionType insn = read(src++); 343 340 *dst++ = insn; 344 341 } 345 342 } 346 343 347 #if ENABLE(VERIFY_JIT_HASH)348 if (verifyUncompactedHash.finalHash() != expectedFinalHash) {349 #ifndef NDEBUG350 dataLogLn("Hashes don't match: ", RawPointer(bitwise_cast<void*>(static_cast<uintptr_t>(verifyUncompactedHash.finalHash()))), " ", RawPointer(bitwise_cast<void*>(static_cast<uintptr_t>(expectedFinalHash))));351 dataLogLn("Crashing!");352 #endif353 CRASH();354 }355 #endif356 344 357 345 recordLinkOffsets(m_assemblerStorage, readPtr, initialSize, readPtr - writePtr); -
branches/safari-610-branch/Source/JavaScriptCore/assembler/LinkBuffer.h
r269088 r271247 361 361 #if ENABLE(BRANCH_COMPACTION) 362 362 AssemblerData m_assemblerStorage; 363 #if CPU(ARM64E) 364 AssemblerData m_assemblerHashesStorage; 365 #endif 363 366 bool m_shouldPerformBranchCompaction { true }; 364 367 #endif
Note:
See TracChangeset
for help on using the changeset viewer.