diff options
| author | Galen Williamson <galen@vector35.com> | 2025-03-25 21:27:51 -0400 |
|---|---|---|
| committer | Galen Williamson <galen@vector35.com> | 2025-03-31 18:31:33 -0400 |
| commit | b095215397ca8fe7e9808f312403ec4494de76f6 (patch) | |
| tree | 5eebe61a44d2f95aa5fadd78d9974234fca376be /arch/arm64/disassembler/pcode.c | |
| parent | 8093106217331012734564301118244748535715 (diff) | |
[aarch64] Updating Aarch64 system registers to 2024-12 spec, fix MSR/MRS lifting to use ReadMSR/WriteMSR intrinsics that take enums, removing the sysregs from the register list of the architecture
* sysregs are no longer registers, add enum for TLBI and AT operands
* add erroneously missing cases for unsupported encodings, add enum for DC operands
Diffstat (limited to 'arch/arm64/disassembler/pcode.c')
| -rw-r--r-- | arch/arm64/disassembler/pcode.c | 364 |
1 files changed, 275 insertions, 89 deletions
diff --git a/arch/arm64/disassembler/pcode.c b/arch/arm64/disassembler/pcode.c index 2daf070b..4623d368 100644 --- a/arch/arm64/disassembler/pcode.c +++ b/arch/arm64/disassembler/pcode.c @@ -196,36 +196,55 @@ enum ShiftType DecodeShift(uint8_t op) enum SystemOp SysOp(uint32_t op1, uint32_t CRn, uint32_t CRm, uint32_t op2) { - uint32_t tmp = (op1 << 11) | (CRn << 7) | (CRm << 3) | op2; +// uint32_t tmp = (op1 << 11) | (CRn << 7) | (CRm << 3) | op2; + uint32_t tmp = (((op1 & 7) << 11) | ((CRn & 0xF) << 7) | ((CRm & 0xF) << 3) | ((op2) & 7)); switch (tmp) { - case 0b00001111000000: + case AT_OP_S1E1R: + case AT_OP_S1E1W: + case AT_OP_S1E0R: + case AT_OP_S1E0W: + case AT_OP_S1E1RP: + case AT_OP_S1E1WP: + case AT_OP_S1E1A: + case AT_OP_S1E2R: + case AT_OP_S1E2W: + case AT_OP_S12E1R: + case AT_OP_S12E1W: + case AT_OP_S12E0R: + case AT_OP_S12E0W: + case AT_OP_S1E2A: + case AT_OP_S1E3R: + case AT_OP_S1E3W: + case AT_OP_S1E3A: return Sys_AT; // S1E1R - case 0b10001111000000: - return Sys_AT; // S1E2R - case 0b11001111000000: - return Sys_AT; // S1E3R - case 0b00001111000001: - return Sys_AT; // S1E1W - case 0b00001111001001: - return Sys_AT; // S1E1WP - case 0b10001111000001: - return Sys_AT; // S1E2W - case 0b11001111000001: - return Sys_AT; // S1E3W - case 0b00001111000010: - return Sys_AT; // S1E0R - case 0b00001111000011: - return Sys_AT; // S1E0W - case 0b10001111000100: - return Sys_AT; // S12E1R - case 0b10001111000101: - return Sys_AT; // S12E1W - case 0b10001111000110: - return Sys_AT; // S12E0R - case 0b10001111000111: - return Sys_AT; // S12E0W +// case 0b00001111000000: +// return Sys_AT; // S1E1R +// case 0b10001111000000: +// return Sys_AT; // S1E2R +// case 0b11001111000000: +// return Sys_AT; // S1E3R +// case 0b00001111000001: +// return Sys_AT; // S1E1W +// case 0b00001111001001: +// return Sys_AT; // S1E1WP +// case 0b10001111000001: +// return Sys_AT; // S1E2W +// case 0b11001111000001: +// return Sys_AT; // S1E3W +// case 0b00001111000010: +// return Sys_AT; // S1E0R +// case 0b00001111000011: +// return Sys_AT; // S1E0W +// case 0b10001111000100: +// return Sys_AT; // S12E1R +// case 0b10001111000101: +// return Sys_AT; // S12E1W +// case 0b10001111000110: +// return Sys_AT; // S12E0R +// case 0b10001111000111: +// return Sys_AT; // S12E0W case 0b01101110100001: return Sys_DC; // ZVA case 0b00001110110001: @@ -250,70 +269,237 @@ enum SystemOp SysOp(uint32_t op1, uint32_t CRn, uint32_t CRm, uint32_t op2) return Sys_IC; // IALLU case 0b01101110101001: return Sys_IC; // IVAU - case 0b10010000000001: + case TLBI_VMALLE1OS: + case TLBI_VAE1OS: + case TLBI_ASIDE1OS: + case TLBI_VAAE1OS: + case TLBI_VALE1OS: + case TLBI_VAALE1OS: + case TLBI_RVAE1IS: + case TLBI_RVAAE1IS: + case TLBI_RVALE1IS: + case TLBI_RVAALE1IS: + case TLBI_VMALLE1IS: + case TLBI_VAE1IS: + case TLBI_ASIDE1IS: + case TLBI_VAAE1IS: + case TLBI_VALE1IS: + case TLBI_VAALE1IS: + case TLBI_RVAE1OS: + case TLBI_RVAAE1OS: + case TLBI_RVALE1OS: + case TLBI_RVAALE1OS: + case TLBI_RVAE1: + case TLBI_RVAAE1: + case TLBI_RVALE1: + case TLBI_RVAALE1: + case TLBI_VMALLE1: + case TLBI_VAE1: + case TLBI_ASIDE1: + case TLBI_VAAE1: + case TLBI_VALE1: + case TLBI_VAALE1: + case TLBI_VMALLE1OSNXS: + case TLBI_VAE1OSNXS: + case TLBI_ASIDE1OSNXS: + case TLBI_VAAE1OSNXS: + case TLBI_VALE1OSNXS: + case TLBI_VAALE1OSNXS: + case TLBI_RVAE1ISNXS: + case TLBI_RVAAE1ISNXS: + case TLBI_RVALE1ISNXS: + case TLBI_RVAALE1ISNXS: + case TLBI_VMALLE1ISNXS: + case TLBI_VAE1ISNXS: + case TLBI_ASIDE1ISNXS: + case TLBI_VAAE1ISNXS: + case TLBI_VALE1ISNXS: + case TLBI_VAALE1ISNXS: + case TLBI_RVAE1OSNXS: + case TLBI_RVAAE1OSNXS: + case TLBI_RVALE1OSNXS: + case TLBI_RVAALE1OSNXS: + case TLBI_RVAE1NXS: + case TLBI_RVAAE1NXS: + case TLBI_RVALE1NXS: + case TLBI_RVAALE1NXS: + case TLBI_VMALLE1NXS: + case TLBI_VAE1NXS: + case TLBI_ASIDE1NXS: + case TLBI_VAAE1NXS: + case TLBI_VALE1NXS: + case TLBI_VAALE1NXS: + case TLBI_IPAS2E1IS: + case TLBI_RIPAS2E1IS: + case TLBI_IPAS2LE1IS: + case TLBI_RIPAS2LE1IS: + case TLBI_ALLE2OS: + case TLBI_VAE2OS: + case TLBI_ALLE1OS: + case TLBI_VALE2OS: + case TLBI_VMALLS12E1OS: + case TLBI_RVAE2IS: + case TLBI_VMALLWS2E1IS: + case TLBI_RVALE2IS: + case TLBI_ALLE2IS: + case TLBI_VAE2IS: + case TLBI_ALLE1IS: + case TLBI_VALE2IS: + case TLBI_VMALLS12E1IS: + case TLBI_IPAS2E1OS: + case TLBI_IPAS2E1: + case TLBI_RIPAS2E1: + case TLBI_RIPAS2E1OS: + case TLBI_IPAS2LE1OS: + case TLBI_IPAS2LE1: + case TLBI_RIPAS2LE1: + case TLBI_RIPAS2LE1OS: + case TLBI_RVAE2OS: + case TLBI_VMALLWS2E1OS: + case TLBI_RVALE2OS: + case TLBI_RVAE2: + case TLBI_VMALLWS2E1: + case TLBI_RVALE2: + case TLBI_ALLE2: + case TLBI_VAE2: + case TLBI_ALLE1: + case TLBI_VALE2: + case TLBI_VMALLS12E1: + case TLBI_IPAS2E1ISNXS: + case TLBI_RIPAS2E1ISNXS: + case TLBI_IPAS2LE1ISNXS: + case TLBI_RIPAS2LE1ISNXS: + case TLBI_ALLE2OSNXS: + case TLBI_VAE2OSNXS: + case TLBI_ALLE1OSNXS: + case TLBI_VALE2OSNXS: + case TLBI_VMALLS12E1OSNXS: + case TLBI_RVAE2ISNXS: + case TLBI_VMALLWS2E1ISNXS: + case TLBI_RVALE2ISNXS: + case TLBI_ALLE2ISNXS: + case TLBI_VAE2ISNXS: + case TLBI_ALLE1ISNXS: + case TLBI_VALE2ISNXS: + case TLBI_VMALLS12E1ISNXS: + case TLBI_IPAS2E1OSNXS: + case TLBI_IPAS2E1NXS: + case TLBI_RIPAS2E1NXS: + case TLBI_RIPAS2E1OSNXS: + case TLBI_IPAS2LE1OSNXS: + case TLBI_IPAS2LE1NXS: + case TLBI_RIPAS2LE1NXS: + case TLBI_RIPAS2LE1OSNXS: + case TLBI_RVAE2OSNXS: + case TLBI_VMALLWS2E1OSNXS: + case TLBI_RVALE2OSNXS: + case TLBI_RVAE2NXS: + case TLBI_VMALLWS2E1NXS: + case TLBI_RVALE2NXS: + case TLBI_ALLE2NXS: + case TLBI_VAE2NXS: + case TLBI_ALLE1NXS: + case TLBI_VALE2NXS: + case TLBI_VMALLS12E1NXS: + case TLBI_ALLE3OS: + case TLBI_VAE3OS: + case TLBI_PAALLOS: + case TLBI_VALE3OS: + case TLBI_RVAE3IS: + case TLBI_RVALE3IS: + case TLBI_ALLE3IS: + case TLBI_VAE3IS: + case TLBI_VALE3IS: + case TLBI_RPAOS: + case TLBI_RPALOS: + case TLBI_RVAE3OS: + case TLBI_RVALE3OS: + case TLBI_RVAE3: + case TLBI_RVALE3: + case TLBI_ALLE3: + case TLBI_VAE3: + case TLBI_PAALL: + case TLBI_VALE3: + case TLBI_ALLE3OSNXS: + case TLBI_VAE3OSNXS: + case TLBI_VALE3OSNXS: + case TLBI_RVAE3ISNXS: + case TLBI_RVALE3ISNXS: + case TLBI_ALLE3ISNXS: + case TLBI_VAE3ISNXS: + case TLBI_VALE3ISNXS: + case TLBI_RVAE3OSNXS: + case TLBI_RVALE3OSNXS: + case TLBI_RVAE3NXS: + case TLBI_RVALE3NXS: + case TLBI_ALLE3NXS: + case TLBI_VAE3NXS: + case TLBI_VALE3NXS: return Sys_TLBI; // IPAS2E1IS - case 0b10010000000101: - return Sys_TLBI; // IPAS2LE1IS - case 0b00010000011000: - return Sys_TLBI; // VMALLE1IS - case 0b10010000011000: - return Sys_TLBI; // ALLE2IS - case 0b11010000011000: - return Sys_TLBI; // ALLE3IS - case 0b00010000011001: - return Sys_TLBI; // VAE1IS - case 0b10010000011001: - return Sys_TLBI; // VAE2IS - case 0b11010000011001: - return Sys_TLBI; // VAE3IS - case 0b00010000011010: - return Sys_TLBI; // ASIDE1IS - case 0b00010000011011: - return Sys_TLBI; // VAAE1IS - case 0b10010000011100: - return Sys_TLBI; // ALLE1IS - case 0b00010000011101: - return Sys_TLBI; // VALE1IS - case 0b10010000011101: - return Sys_TLBI; // VALE2IS - case 0b11010000011101: - return Sys_TLBI; // VALE3IS - case 0b10010000011110: - return Sys_TLBI; // VMALLS12E1IS - case 0b00010000011111: - return Sys_TLBI; // VAALE1IS - case 0b10010000100001: - return Sys_TLBI; // IPAS2E1 - case 0b10010000100101: - return Sys_TLBI; // IPAS2LE1 - case 0b00010000111000: - return Sys_TLBI; // VMALLE1 - case 0b10010000111000: - return Sys_TLBI; // ALLE2 - case 0b11010000111000: - return Sys_TLBI; // ALLE3 - case 0b00010000111001: - return Sys_TLBI; // VAE1 - case 0b10010000111001: - return Sys_TLBI; // VAE2 - case 0b11010000111001: - return Sys_TLBI; // VAE3 - case 0b00010000111010: - return Sys_TLBI; // ASIDE1 - case 0b00010000111011: - return Sys_TLBI; // VAAE1 - case 0b10010000111100: - return Sys_TLBI; // ALLE1 - case 0b00010000111101: - return Sys_TLBI; // VALE1 - case 0b10010000111101: - return Sys_TLBI; // VALE2 - case 0b11010000111101: - return Sys_TLBI; // VALE3 - case 0b10010000111110: - return Sys_TLBI; // VMALLS12E1 - case 0b00010000111111: - return Sys_TLBI; // VAALE1 +// case 0b10010000000001: +// return Sys_TLBI; // IPAS2E1IS +// case 0b10010000000101: +// return Sys_TLBI; // IPAS2LE1IS +// case 0b00010000011000: +// return Sys_TLBI; // VMALLE1IS +// case 0b10010000011000: +// return Sys_TLBI; // ALLE2IS +// case 0b11010000011000: +// return Sys_TLBI; // ALLE3IS +// case 0b00010000011001: +// return Sys_TLBI; // VAE1IS +// case 0b10010000011001: +// return Sys_TLBI; // VAE2IS +// case 0b11010000011001: +// return Sys_TLBI; // VAE3IS +// case 0b00010000011010: +// return Sys_TLBI; // ASIDE1IS +// case 0b00010000011011: +// return Sys_TLBI; // VAAE1IS +// case 0b10010000011100: +// return Sys_TLBI; // ALLE1IS +// case 0b00010000011101: +// return Sys_TLBI; // VALE1IS +// case 0b10010000011101: +// return Sys_TLBI; // VALE2IS +// case 0b11010000011101: +// return Sys_TLBI; // VALE3IS +// case 0b10010000011110: +// return Sys_TLBI; // VMALLS12E1IS +// case 0b00010000011111: +// return Sys_TLBI; // VAALE1IS +// case 0b10010000100001: +// return Sys_TLBI; // IPAS2E1 +// case 0b10010000100101: +// return Sys_TLBI; // IPAS2LE1 +// case 0b00010000111000: +// return Sys_TLBI; // VMALLE1 +// case 0b10010000111000: +// return Sys_TLBI; // ALLE2 +// case 0b11010000111000: +// return Sys_TLBI; // ALLE3 +// case 0b00010000111001: +// return Sys_TLBI; // VAE1 +// case 0b10010000111001: +// return Sys_TLBI; // VAE2 +// case 0b11010000111001: +// return Sys_TLBI; // VAE3 +// case 0b00010000111010: +// return Sys_TLBI; // ASIDE1 +// case 0b00010000111011: +// return Sys_TLBI; // VAAE1 +// case 0b10010000111100: +// return Sys_TLBI; // ALLE1 +// case 0b00010000111101: +// return Sys_TLBI; // VALE1 +// case 0b10010000111101: +// return Sys_TLBI; // VALE2 +// case 0b11010000111101: +// return Sys_TLBI; // VALE3 +// case 0b10010000111110: +// return Sys_TLBI; // VMALLS12E1 +// case 0b00010000111111: +// return Sys_TLBI; // VAALE1 default: return Sys_ERROR; } |
