Changeset 246147 in webkit
- Timestamp:
- Jun 6, 2019 2:31:40 AM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r246139 r246147 1 2019-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 1 34 2019-06-05 Justin Michaud <justin_michaud@apple.com> 2 35 -
trunk/Source/JavaScriptCore/disassembler/ARM64/A64DOpcode.cpp
r240730 r246147 96 96 OPCODE_GROUP_ENTRY(0x18, A64DOpcodeLoadStoreImmediate), 97 97 OPCODE_GROUP_ENTRY(0x18, A64DOpcodeLoadStoreRegisterOffset), 98 OPCODE_GROUP_ENTRY(0x18, A64DOpcodeLoadStoreAuthenticated), 98 99 OPCODE_GROUP_ENTRY(0x19, A64DOpcodeLoadStoreUnsignedImmediate), 99 100 OPCODE_GROUP_ENTRY(0x1a, A64DOpcodeConditionalSelect), … … 456 457 "rbit", "rev16", "rev32", "rev", "clz", "cls", 0, 0 457 458 }; 459 460 const 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 }; 458 465 459 466 const char* A64DOpcodeDataProcessing1Source::format() … … 461 468 if (sBit()) 462 469 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 } 463 483 464 484 if (opCode2()) … … 485 505 } 486 506 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 507 const 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 489 511 }; 490 512 … … 500 522 return A64DOpcode::format(); 501 523 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); 506 532 appendZROrRegisterName(rd(), is64Bit()); 507 533 appendSeparator(); … … 959 985 } 960 986 961 const char* const A64DOpcodeHint::s_opNames[6] = { 962 "nop", "yield", "wfe", "wfi", "sev", "sevl" 987 const 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" 963 992 }; 964 993 … … 967 996 appendInstructionName(opName()); 968 997 969 if (immediate7() > 5)998 if (immediate7() >= 32 || !s_opNames[immediate7()]) 970 999 appendUnsignedImmediate(immediate7()); 971 1000 972 1001 return m_formatBuffer; 1002 } 1003 1004 const char* A64DOpcodeHint::opName() 1005 { 1006 const char* opName = (immediate7() < 32 ? s_opNames[immediate7()] : 0); 1007 if (!opName) 1008 return "hint"; 1009 1010 return opName; 973 1011 } 974 1012 … … 1194 1232 } 1195 1233 1234 const char* const A64DOpcodeLoadStoreAuthenticated::s_opNames[2] = { 1235 "ldraa", "ldrab" 1236 }; 1237 1238 const 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 1196 1258 const char* A64DOpcodeLoadStoreRegisterPair::opName() 1197 1259 { … … 1453 1515 1454 1516 const char* const A64DOpcodeUnconditionalBranchRegister::s_opNames[8] = { "br", "blr", "ret", "", "eret", "drps", "", "" }; 1517 const 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 1523 const char* A64DOpcodeUnconditionalBranchRegister::authOpName() 1524 { 1525 unsigned opCode = authOpCode(); 1526 if (opCode >= 20) 1527 return 0; 1528 return s_AuthOpNames[opCode]; 1529 } 1455 1530 1456 1531 const char* A64DOpcodeUnconditionalBranchRegister::format() 1457 1532 { 1458 1533 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 } 1459 1551 if (opcValue == 3 || opcValue > 5) 1460 1552 return A64DOpcode::format(); -
trunk/Source/JavaScriptCore/disassembler/ARM64/A64DOpcode.h
r237136 r246147 341 341 private: 342 342 static const char* const s_opNames[8]; 343 static const char* const s_pacAutOpNames[18]; 343 344 344 345 public: … … 359 360 class A64DOpcodeDataProcessing2Source : public A64DOpcode { 360 361 private: 361 static const char* const s_opNames[ 8];362 static const char* const s_opNames[16]; 362 363 363 364 public: … … 372 373 unsigned sBit() { return (m_opcode >> 29) & 0x1; } 373 374 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; } 375 376 }; 376 377 … … 572 573 class A64DOpcodeHint : public A64DOpcodeSystem { 573 574 private: 574 static const char* const s_opNames[ 6];575 static const char* const s_opNames[32]; 575 576 576 577 public: … … 582 583 const char* format(); 583 584 584 const char* opName() { return immediate7() <= 5 ? s_opNames[immediate7()] : "hint"; }585 const char* opName(); 585 586 unsigned immediate7() { return (m_opcode >> 5) & 0x7f; } 586 587 }; … … 684 685 }; 685 686 687 class A64DOpcodeLoadStoreAuthenticated : public A64DOpcodeLoadStore { 688 private: 689 static const char* const s_opNames[2]; 690 691 protected: 692 const char* opName() 693 { 694 return s_opNames[opNumber()]; 695 } 696 697 public: 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 686 713 class A64DOpcodeLoadStoreRegisterPair : public A64DOpcodeLoadStore { 687 714 public: … … 807 834 private: 808 835 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 838 public: 839 static const uint32_t mask = 0xfe1f0000; 812 840 static const uint32_t pattern = 0xd61f0000; 813 841 … … 817 845 818 846 const char* opName() { return s_opNames[opc()]; } 847 const char* authOpName(); 819 848 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(); } 820 855 }; 821 856
Note: See TracChangeset
for help on using the changeset viewer.