Changeset 246147 in webkit


Ignore:
Timestamp:
Jun 6, 2019 2:31:40 AM (5 years ago)
Author:
msaboff@apple.com
Message:

[ARM64E]: Add disassembler support for authenticated instructions
https://bugs.webkit.org/show_bug.cgi?id=198562

Reviewed by Keith Miller.

Added support for all the instructions supported in ARM64EAssembler.h.

  • disassembler/ARM64/A64DOpcode.cpp:

(JSC::ARM64Disassembler::A64DOpcodeDataProcessing1Source::format):
(JSC::ARM64Disassembler::A64DOpcodeDataProcessing2Source::format):
(JSC::ARM64Disassembler::A64DOpcodeHint::format):
(JSC::ARM64Disassembler::A64DOpcodeHint::opName):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::format):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::authOpName):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::format):

  • disassembler/ARM64/A64DOpcode.h:

(JSC::ARM64Disassembler::A64DOpcodeDataProcessing2Source::opNameIndex):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::opName):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::opNum):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::mBit):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::sBit):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::wBit):
(JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::immediate10):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::authOpCode):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::op2):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::op3):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::op4):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::mBit):
(JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::rm):
(JSC::ARM64Disassembler::A64DOpcodeHint::opName): Deleted.

Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r246139 r246147  
     12019-06-06  Michael Saboff  <msaboff@apple.com>
     2
     3        [ARM64E]: Add disassembler support for authenticated instructions
     4        https://bugs.webkit.org/show_bug.cgi?id=198562
     5
     6        Reviewed by Keith Miller.
     7
     8        Added support for all the instructions supported in ARM64EAssembler.h.
     9
     10        * disassembler/ARM64/A64DOpcode.cpp:
     11        (JSC::ARM64Disassembler::A64DOpcodeDataProcessing1Source::format):
     12        (JSC::ARM64Disassembler::A64DOpcodeDataProcessing2Source::format):
     13        (JSC::ARM64Disassembler::A64DOpcodeHint::format):
     14        (JSC::ARM64Disassembler::A64DOpcodeHint::opName):
     15        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::format):
     16        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::authOpName):
     17        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::format):
     18        * disassembler/ARM64/A64DOpcode.h:
     19        (JSC::ARM64Disassembler::A64DOpcodeDataProcessing2Source::opNameIndex):
     20        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::opName):
     21        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::opNum):
     22        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::mBit):
     23        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::sBit):
     24        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::wBit):
     25        (JSC::ARM64Disassembler::A64DOpcodeLoadStoreAuthenticated::immediate10):
     26        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::authOpCode):
     27        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::op2):
     28        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::op3):
     29        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::op4):
     30        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::mBit):
     31        (JSC::ARM64Disassembler::A64DOpcodeUnconditionalBranchRegister::rm):
     32        (JSC::ARM64Disassembler::A64DOpcodeHint::opName): Deleted.
     33
    1342019-06-05  Justin Michaud  <justin_michaud@apple.com>
    235
  • trunk/Source/JavaScriptCore/disassembler/ARM64/A64DOpcode.cpp

    r240730 r246147  
    9696    OPCODE_GROUP_ENTRY(0x18, A64DOpcodeLoadStoreImmediate),
    9797    OPCODE_GROUP_ENTRY(0x18, A64DOpcodeLoadStoreRegisterOffset),
     98    OPCODE_GROUP_ENTRY(0x18, A64DOpcodeLoadStoreAuthenticated),
    9899    OPCODE_GROUP_ENTRY(0x19, A64DOpcodeLoadStoreUnsignedImmediate),
    99100    OPCODE_GROUP_ENTRY(0x1a, A64DOpcodeConditionalSelect),
     
    456457    "rbit", "rev16", "rev32", "rev", "clz", "cls", 0, 0
    457458};
     459   
     460const char* const A64DOpcodeDataProcessing1Source::s_pacAutOpNames[18] = {
     461    "pacia", "pacib", "pacda", "pacdb", "autia", "autib", "autda", "autdb",
     462    "paciza", "pacizb", "pacdza", "pacdzb", "autiza", "autizb", "autdza", "autdzb",
     463    "xpaci", "xpacd"
     464};
    458465
    459466const char* A64DOpcodeDataProcessing1Source::format()
     
    461468    if (sBit())
    462469        return A64DOpcode::format();
     470
     471    if (opCode2() == 1 && is64Bit() && opCode() <= 0x1001) {
     472        if (opCode() <= 0x00111 || rt() == 0x11111) {
     473            appendInstructionName(s_pacAutOpNames[opCode()]);
     474            appendZROrRegisterName(rd(), is64Bit());
     475            if (opCode() <= 0x00111) {
     476                appendSeparator();
     477                appendZROrRegisterName(rn(), is64Bit());
     478            }
     479            return m_formatBuffer;
     480        }
     481        return A64DOpcode::format();
     482    }
    463483
    464484    if (opCode2())
     
    485505}
    486506
    487 const char* const A64DOpcodeDataProcessing2Source::s_opNames[8] = {
    488     0, 0, "udiv", "sdiv", "lsl", "lsr", "asr", "ror" // We use the pseudo-op names for the shift/rotate instructions
     507const char* const A64DOpcodeDataProcessing2Source::s_opNames[16] = {
     508    // We use the pseudo-op names for the shift/rotate instructions
     509    0, 0, "udiv", "sdiv", 0, 0, 0, 0,
     510    "lsl", "lsr", "asr", "ror", 0, "pacga", 0, 0
    489511};
    490512
     
    500522        return A64DOpcode::format();
    501523
    502     if ((opCode() & 0x34) == 0x4)
    503         return A64DOpcode::format();
    504 
    505     appendInstructionName(opName());
     524    if ((opCode() & 0x3c) == 0x4)
     525        return A64DOpcode::format();
     526
     527    const char* opcodeName = opName();
     528    if (!opcodeName)
     529        return A64DOpcode::format();
     530
     531    appendInstructionName(opcodeName);
    506532    appendZROrRegisterName(rd(), is64Bit());
    507533    appendSeparator();
     
    959985}
    960986
    961 const char* const A64DOpcodeHint::s_opNames[6] = {
    962     "nop", "yield", "wfe", "wfi", "sev", "sevl"
     987const char* const A64DOpcodeHint::s_opNames[32] = {
     988    "nop", "yield", "wfe", "wfi", "sev", "sevl", 0, "xpaclri",
     989    "pacia1716", 0, "pacib1716", 0, "autia1716", 0, "autib1716", 0,
     990    0, 0, 0, 0, 0, 0, 0, 0,
     991    "paciaz", "paciasp", "pacibz", "pacibsp", "autiaz", "autiasp", "autibz", "autibsp"
    963992};
    964993
     
    967996    appendInstructionName(opName());
    968997
    969     if (immediate7() > 5)
     998    if (immediate7() >= 32 || !s_opNames[immediate7()])
    970999        appendUnsignedImmediate(immediate7());
    9711000
    9721001    return m_formatBuffer;
     1002}
     1003
     1004const char* A64DOpcodeHint::opName()
     1005{
     1006    const char* opName = (immediate7() < 32 ? s_opNames[immediate7()] : 0);
     1007    if (!opName)
     1008        return "hint";
     1009
     1010    return opName;
    9731011}
    9741012
     
    11941232}
    11951233
     1234const char* const A64DOpcodeLoadStoreAuthenticated::s_opNames[2] = {
     1235    "ldraa", "ldrab"
     1236};
     1237
     1238const char* A64DOpcodeLoadStoreAuthenticated::format()
     1239{
     1240    appendInstructionName(opName());
     1241    appendRegisterName(rt());
     1242    appendSeparator();
     1243    appendCharacter('[');
     1244    appendSPOrRegisterName(rn());
     1245
     1246    if (wBit() || immediate10()) {
     1247        appendSeparator();
     1248        appendSignedImmediate(immediate10() << size());
     1249    }
     1250    appendCharacter(']');
     1251
     1252    if (wBit())
     1253        appendCharacter('!');
     1254   
     1255    return m_formatBuffer;
     1256}
     1257
    11961258const char* A64DOpcodeLoadStoreRegisterPair::opName()
    11971259{
     
    14531515
    14541516const char* const A64DOpcodeUnconditionalBranchRegister::s_opNames[8] = { "br", "blr", "ret", "", "eret", "drps", "", "" };
     1517const char* const A64DOpcodeUnconditionalBranchRegister::s_AuthOpNames[20] = {
     1518    "braaz", "brabz", "blraaz", "blrabz", "retaa", "retab", 0, 0,
     1519    "eretaa", "eretab", 0, 0, 0, 0, 0, 0,
     1520    "braa", "brab", "blraa", "blrab"
     1521};
     1522
     1523const char* A64DOpcodeUnconditionalBranchRegister::authOpName()
     1524{
     1525    unsigned opCode = authOpCode();
     1526    if (opCode >= 20)
     1527        return 0;
     1528    return s_AuthOpNames[opCode];
     1529}
    14551530
    14561531const char* A64DOpcodeUnconditionalBranchRegister::format()
    14571532{
    14581533    unsigned opcValue = opc();
     1534    if (op2() == 0x1f && (op3() & 0x3e) == 0x2) {
     1535        const char* opName = authOpName();
     1536        if (!opName)
     1537            return A64DOpcode::format();
     1538        if (rn() != 0x1f && (opcValue == 0x2 || opcValue == 0x4))
     1539            return A64DOpcode::format();
     1540
     1541        appendInstructionName(opName);
     1542        if ((opcValue & 0x7) <= 0x1)
     1543            appendRegisterName(rn());
     1544        if (opcValue & 0x8) {
     1545            appendSeparator();
     1546            appendRegisterName(rm());
     1547        }
     1548
     1549        return m_formatBuffer;
     1550    }
    14591551    if (opcValue == 3 || opcValue > 5)
    14601552        return A64DOpcode::format();
  • trunk/Source/JavaScriptCore/disassembler/ARM64/A64DOpcode.h

    r237136 r246147  
    341341private:
    342342    static const char* const s_opNames[8];
     343    static const char* const s_pacAutOpNames[18];
    343344   
    344345public:
     
    359360class A64DOpcodeDataProcessing2Source : public A64DOpcode {
    360361private:
    361     static const char* const s_opNames[8];
     362    static const char* const s_opNames[16];
    362363
    363364public:
     
    372373    unsigned sBit() { return (m_opcode >> 29) & 0x1; }
    373374    unsigned opCode() { return (m_opcode >> 10) & 0x3f; }
    374     unsigned opNameIndex() { return ((m_opcode >> 11) & 0x4) | ((m_opcode >> 10) & 0x3); }
     375    unsigned opNameIndex() { return (m_opcode >> 10) & 0xf; }
    375376};
    376377
     
    572573class A64DOpcodeHint : public A64DOpcodeSystem {
    573574private:
    574     static const char* const s_opNames[6];
     575    static const char* const s_opNames[32];
    575576
    576577public:
     
    582583    const char* format();
    583584
    584     const char* opName() { return immediate7() <= 5 ? s_opNames[immediate7()] : "hint"; }
     585    const char* opName();
    585586    unsigned immediate7() { return (m_opcode >> 5) & 0x7f; }
    586587};
     
    684685};
    685686
     687class A64DOpcodeLoadStoreAuthenticated : public A64DOpcodeLoadStore {
     688private:
     689    static const char* const s_opNames[2];
     690   
     691protected:
     692    const char* opName()
     693    {
     694        return s_opNames[opNumber()];
     695    }
     696
     697public:
     698    static const uint32_t mask = 0xff200400;
     699    static const uint32_t pattern = 0xf8200400;
     700   
     701    DEFINE_STATIC_FORMAT(A64DOpcodeLoadStoreAuthenticated, thisObj);
     702   
     703    const char* format();
     704
     705    unsigned opNum() { return mBit(); }
     706    unsigned mBit() { return (m_opcode >> 23) & 0x1; }
     707    unsigned sBit() { return (m_opcode >> 22) & 0x1; }
     708    unsigned wBit() { return (m_opcode >> 11) & 0x1; }
     709    int immediate10() { return (sBit() << 9) | ((m_opcode >> 12) & 0x1ff); }
     710   
     711};
     712
    686713class A64DOpcodeLoadStoreRegisterPair : public A64DOpcodeLoadStore {
    687714public:
     
    807834private:
    808835    static const char* const s_opNames[8];
    809 
    810 public:
    811     static const uint32_t mask = 0xfe1ffc1f;
     836    static const char* const s_AuthOpNames[20];
     837
     838public:
     839    static const uint32_t mask = 0xfe1f0000;
    812840    static const uint32_t pattern = 0xd61f0000;
    813841
     
    817845
    818846    const char* opName() { return s_opNames[opc()]; }
     847    const char* authOpName();
    819848    unsigned opc() { return (m_opcode >> 21) & 0xf; }
     849    unsigned authOpCode() {return (opc() << 1) | mBit(); }
     850    unsigned op2() { return (m_opcode >> 16) & 0x1f; }
     851    unsigned op3() { return (m_opcode >> 10) & 0x3f; }
     852    unsigned op4() { return m_opcode & 0xf; }
     853    unsigned mBit() { return (m_opcode >> 10) & 1; }
     854    unsigned rm() { return rd(); }
    820855};
    821856
Note: See TracChangeset for help on using the changeset viewer.