⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 239364 in webkit


Ignore:
Timestamp:
Dec 18, 2018, 6:27:00 PM (8 years ago)
Author:
sbarati@apple.com
Message:

Update ARM64EHash
​https://bugs.webkit.org/show_bug.cgi?id=192823
<rdar://problem/45468257>

Reviewed by Mark Lam.

  • assembler/ARM64Assembler.h:

(JSC::ARM64Assembler::ARM64Assembler):

  • assembler/AbstractMacroAssembler.h:

(JSC::AbstractMacroAssembler::AbstractMacroAssembler):

  • assembler/AssemblerBuffer.h:

(JSC::ARM64EHash::update):
(JSC::ARM64EHash::finalHash const):
(JSC::AssemblerBuffer::AssemblerBuffer):
(JSC::AssemblerBuffer::putIntegralUnchecked):
(JSC::ARM64EHash::ARM64EHash): Deleted.
(JSC::ARM64EHash::hash const): Deleted.
(JSC::ARM64EHash::randomSeed const): Deleted.

  • assembler/LinkBuffer.cpp:

(JSC::LinkBuffer::copyCompactAndLinkCode):

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r239355 r239364  
     12018-12-18  Saam Barati  <sbarati@apple.com>
     2
     3        Update ARM64EHash
     4        https://bugs.webkit.org/show_bug.cgi?id=192823
     5        <rdar://problem/45468257>
     6
     7        Reviewed by Mark Lam.
     8
     9        * assembler/ARM64Assembler.h:
     10        (JSC::ARM64Assembler::ARM64Assembler):
     11        * assembler/AbstractMacroAssembler.h:
     12        (JSC::AbstractMacroAssembler::AbstractMacroAssembler):
     13        * assembler/AssemblerBuffer.h:
     14        (JSC::ARM64EHash::update):
     15        (JSC::ARM64EHash::finalHash const):
     16        (JSC::AssemblerBuffer::AssemblerBuffer):
     17        (JSC::AssemblerBuffer::putIntegralUnchecked):
     18        (JSC::ARM64EHash::ARM64EHash): Deleted.
     19        (JSC::ARM64EHash::hash const): Deleted.
     20        (JSC::ARM64EHash::randomSeed const): Deleted.
     21        * assembler/LinkBuffer.cpp:
     22        (JSC::LinkBuffer::copyCompactAndLinkCode):
     23
    1242018-12-18  Mark Lam  <mark.lam@apple.com>
    225
  • trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h

    r237266 r239364  
    327327
    328328public:
    329     ARM64Assembler(
    330 #if CPU(ARM64E)
    331         unsigned randomNumber
    332 #endif
    333         )
     329    ARM64Assembler()
    334330        : m_indexOfLastWatchpoint(INT_MIN)
    335331        , m_indexOfTailOfLastWatchpoint(INT_MIN)
    336 #if CPU(ARM64E)
    337         , m_buffer(randomNumber)
    338 #endif
    339        
    340332    {
    341333    }
  • trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h

    r236589 r239364  
    987987    AbstractMacroAssembler()
    988988        : m_randomSource(0)
    989 #if CPU(ARM64E)
    990         , m_assembler(random())
    991 #else
    992989        , m_assembler()
    993 #endif
    994990    {
    995991        invalidateAllTempRegisters();
  • trunk/Source/JavaScriptCore/assembler/AssemblerBuffer.h

    r236589 r239364  
    150150    class ARM64EHash {
    151151    public:
    152         ARM64EHash(unsigned randomNumber)
    153             : m_hash(randomNumber)
    154             , m_randomSeed(randomNumber)
    155         { }
    156         ALWAYS_INLINE void update(unsigned value, uintptr_t index)
    157         {
    158             m_hash = tagInt((static_cast<uintptr_t>(value) + m_hash) ^ (m_hash >> 32), static_cast<PtrTag>(index));
    159         }
    160         uintptr_t hash() const { return m_hash; }
    161         unsigned randomSeed() const { return m_randomSeed; }
     152        ARM64EHash() = default;
     153        ALWAYS_INLINE void update(uint32_t value)
     154        {
     155            uint64_t input = value ^ m_hash;
     156            uint64_t a = static_cast<uint32_t>(tagInt(input, static_cast<PtrTag>(0)) >> 39);
     157            uint64_t b = tagInt(input, static_cast<PtrTag>(0xb7e151628aed2a6a)) >> 23;
     158            m_hash = a | b;
     159        }
     160        uint32_t finalHash() const
     161        {
     162            uint64_t hash = m_hash;
     163            uint64_t a = static_cast<uint32_t>(tagInt(hash, static_cast<PtrTag>(0xbf7158809cf4f3c7)) >> 39);
     164            uint64_t b = tagInt(hash, static_cast<PtrTag>(0x62e7160f38b4da56)) >> 23;
     165            return static_cast<uint32_t>(a | b);
     166        }
    162167    private:
    163         uintptr_t m_hash;
    164         unsigned m_randomSeed;
     168        uint32_t m_hash { 0 };
    165169    };
    166170#endif
    … …  
    168172    class AssemblerBuffer {
    169173    public:
    170         AssemblerBuffer(
    171 #if CPU(ARM64E)
    172             unsigned randomNumber
    173 #endif
    174         )
     174        AssemblerBuffer()
    175175            : m_storage()
    176176            , m_index(0)
    177 #if CPU(ARM64E)
    178             , m_hash(randomNumber)
    179 #endif
    180177        {
    181178        }
    … …  
    310307            static_assert(sizeof(value) == 4, "");
    311308#if CPU(ARM64E)
    312             m_hash.update(value, m_index);
     309            m_hash.update(value);
    313310#endif
    314311#endif
  • trunk/Source/JavaScriptCore/assembler/LinkBuffer.cpp

    r239055 r239364  
    140140    uint8_t* codeOutData = m_code.dataLocation<uint8_t*>();
    141141#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
    142     const ARM64EHash assemblerBufferHash = macroAssembler.m_assembler.buffer().hash();
    143     ARM64EHash verifyUncompactedHash(assemblerBufferHash.randomSeed());
     142    const uint32_t expectedFinalHash = macroAssembler.m_assembler.buffer().hash().finalHash();
     143    ARM64EHash verifyUncompactedHash;
    144144    uint8_t* outData = codeOutData;
    145145#if ENABLE(SEPARATED_WX_HEAP)
    … …  
    179179            ASSERT(!(readPtr % 2));
    180180            ASSERT(!(writePtr % 2));
    181 #if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
    182             unsigned index = readPtr;
    183 #endif
    184181            while (copySource != copyEnd) {
    185182                InstructionType insn = *copySource++;
    186183#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
    187184                static_assert(sizeof(InstructionType) == 4, "");
    188                 verifyUncompactedHash.update(insn, index);
    189                 index += sizeof(InstructionType);
     185                verifyUncompactedHash.update(insn);
    190186#endif
    191187                *copyDst++ = insn;
    … …  
    232228        RELEASE_ASSERT(bytes % sizeof(InstructionType) == 0);
    233229
    234 #if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
    235         unsigned index = readPtr;
    236 #endif
    237 
    238230        for (size_t i = 0; i < bytes; i += sizeof(InstructionType)) {
    239231            InstructionType insn = *src++;
    240232#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
    241             verifyUncompactedHash.update(insn, index);
    242             index += sizeof(InstructionType);
     233            verifyUncompactedHash.update(insn);
    243234#endif
    244235            *dst++ = insn;
    … …  
    247238
    248239#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
    249     if (verifyUncompactedHash.hash() != assemblerBufferHash.hash()) {
    250         dataLogLn("Hashes don't match: ", RawPointer(bitwise_cast<void*>(verifyUncompactedHash.hash())), " ", RawPointer(bitwise_cast<void*>(assemblerBufferHash.hash())));
     240    if (verifyUncompactedHash.finalHash() != expectedFinalHash) {
     241        dataLogLn("Hashes don't match: ", RawPointer(bitwise_cast<void*>(static_cast<uintptr_t>(verifyUncompactedHash.finalHash()))), " ", RawPointer(bitwise_cast<void*>(static_cast<uintptr_t>(expectedFinalHash))));
    251242        dataLogLn("Crashing!");
    252243        CRASH();
Note: See TracChangeset for help on using the changeset viewer.