Module Name: src Committed By: ryo Date: Mon Aug 3 19:16:56 UTC 2020
Modified Files: src/sys/arch/aarch64/aarch64: disasm.c Log Message: make more ARMv8.x system registers are disassemblable To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/aarch64/aarch64/disasm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/aarch64/aarch64/disasm.c diff -u src/sys/arch/aarch64/aarch64/disasm.c:1.8 src/sys/arch/aarch64/aarch64/disasm.c:1.9 --- src/sys/arch/aarch64/aarch64/disasm.c:1.8 Tue May 26 05:25:21 2020 +++ src/sys/arch/aarch64/aarch64/disasm.c Mon Aug 3 19:16:56 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: disasm.c,v 1.8 2020/05/26 05:25:21 ryo Exp $ */ +/* $NetBSD: disasm.c,v 1.9 2020/08/03 19:16:56 ryo Exp $ */ /* * Copyright (c) 2018 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: disasm.c,v 1.8 2020/05/26 05:25:21 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: disasm.c,v 1.9 2020/08/03 19:16:56 ryo Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -342,11 +342,23 @@ const struct sysreg_table sysreg_table[] { SYSREG_ENC(3, 0, 2, 0, 0), "ttbr0_el1" }, { SYSREG_ENC(3, 0, 2, 0, 1), "ttbr1_el1" }, { SYSREG_ENC(3, 0, 2, 0, 2), "tcr_el1" }, + { SYSREG_ENC(3, 0, 2, 1, 0), "apiakeylo_el1" }, + { SYSREG_ENC(3, 0, 2, 1, 1), "apiakeyhi_el1" }, + { SYSREG_ENC(3, 0, 2, 1, 2), "apibkeylo_el1" }, + { SYSREG_ENC(3, 0, 2, 1, 3), "apibkeyhi_el1" }, + { SYSREG_ENC(3, 0, 2, 2, 0), "apdakeylo_el1" }, + { SYSREG_ENC(3, 0, 2, 2, 1), "apdakeyhi_el1" }, + { SYSREG_ENC(3, 0, 2, 2, 2), "apdbkeylo_el1" }, + { SYSREG_ENC(3, 0, 2, 2, 3), "apdbkeyhi_el1" }, + { SYSREG_ENC(3, 0, 2, 3, 0), "apgakeylo_el1" }, + { SYSREG_ENC(3, 0, 2, 3, 1), "apgakeyhi_el1" }, { SYSREG_ENC(3, 0, 4, 0, 0), "spsr_el1" }, { SYSREG_ENC(3, 0, 4, 0, 1), "elr_el1" }, { SYSREG_ENC(3, 0, 4, 1, 0), "sp_el0" }, { SYSREG_ENC(3, 0, 4, 2, 0), "spsel" }, { SYSREG_ENC(3, 0, 4, 2, 2), "currentel" }, + { SYSREG_ENC(3, 0, 4, 2, 3), "pan" }, + { SYSREG_ENC(3, 0, 4, 2, 4), "uao" }, { SYSREG_ENC(3, 0, 5, 1, 0), "afsr0_el1" }, { SYSREG_ENC(3, 0, 5, 1, 1), "afsr1_el1" }, { SYSREG_ENC(3, 0, 5, 2, 0), "esr_el1" }, @@ -369,8 +381,13 @@ const struct sysreg_table sysreg_table[] { SYSREG_ENC(3, 2, 0, 0, 0), "csselr_el1" }, { SYSREG_ENC(3, 3, 0, 0, 1), "ctr_el0" }, { SYSREG_ENC(3, 3, 0, 0, 7), "dczid_el0" }, + { SYSREG_ENC(3, 3, 2, 4, 0), "rndr" }, + { SYSREG_ENC(3, 3, 2, 4, 1), "rndrrs" }, { SYSREG_ENC(3, 3, 4, 2, 0), "nzcv" }, { SYSREG_ENC(3, 3, 4, 2, 1), "daif" }, + { SYSREG_ENC(3, 3, 4, 2, 5), "dit" }, + { SYSREG_ENC(3, 3, 4, 2, 6), "ssbs" }, + { SYSREG_ENC(3, 3, 4, 2, 7), "tco" }, { SYSREG_ENC(3, 3, 4, 4, 0), "fpcr" }, { SYSREG_ENC(3, 3, 4, 4, 1), "fpsr" }, { SYSREG_ENC(3, 3, 4, 5, 0), "dspsr_el0" }, @@ -1239,10 +1256,33 @@ static struct op_sys_table op_sys_table[ { SYSREG_ENC(1, 3, 7, 11, 1), OPE_XT, "dc\tcvau" }, { SYSREG_ENC(1, 3, 7, 14, 1), OPE_XT, "dc\tcivac" }, { SYSREG_ENC(1, 3, 7, 4, 1), OPE_XT, "dc\tzva" }, + { SYSREG_ENC(1, 0, 7, 6, 3), OPE_XT, "dc\tigvac" }, + { SYSREG_ENC(1, 0, 7, 6, 4), OPE_XT, "dc\tigsw" }, + { SYSREG_ENC(1, 0, 7, 6, 5), OPE_XT, "dc\tigdvac" }, + { SYSREG_ENC(1, 0, 7, 6, 6), OPE_XT, "dc\tigdsw" }, + { SYSREG_ENC(1, 0, 7, 10, 4), OPE_XT, "dc\tcgsw" }, + { SYSREG_ENC(1, 0, 7, 10, 6), OPE_XT, "dc\tcgdsw" }, + { SYSREG_ENC(1, 0, 7, 14, 4), OPE_XT, "dc\tcigsw" }, + { SYSREG_ENC(1, 0, 7, 14, 6), OPE_XT, "dc\tcigdsw" }, + { SYSREG_ENC(1, 3, 7, 4, 3), OPE_XT, "dc\tgva" }, + { SYSREG_ENC(1, 3, 7, 4, 4), OPE_XT, "dc\tgzva" }, + { SYSREG_ENC(1, 3, 7, 10, 3), OPE_XT, "dc\tcgvac" }, + { SYSREG_ENC(1, 3, 7, 10, 5), OPE_XT, "dc\tcgdvac" }, + { SYSREG_ENC(1, 3, 7, 12, 3), OPE_XT, "dc\tcgvap" }, + { SYSREG_ENC(1, 3, 7, 12, 5), OPE_XT, "dc\tcgdvap" }, + { SYSREG_ENC(1, 3, 7, 13, 3), OPE_XT, "dc\tcgvadp" }, + { SYSREG_ENC(1, 3, 7, 13, 5), OPE_XT, "dc\tcgdvadp" }, + { SYSREG_ENC(1, 3, 7, 14, 3), OPE_XT, "dc\tcigvac" }, + { SYSREG_ENC(1, 3, 7, 14, 5), OPE_XT, "dc\tcigdvac" }, + { SYSREG_ENC(1, 3, 7, 12, 1), OPE_XT, "dc\tcvap" }, + { SYSREG_ENC(1, 3, 7, 13, 1), OPE_XT, "dc\tcvadp" }, + { SYSREG_ENC(1, 0, 7, 8, 0), OPE_XT, "at\ts1e1r" }, { SYSREG_ENC(1, 0, 7, 8, 1), OPE_XT, "at\ts1e1w" }, { SYSREG_ENC(1, 0, 7, 8, 2), OPE_XT, "at\ts1e0r" }, { SYSREG_ENC(1, 0, 7, 8, 3), OPE_XT, "at\ts1e0w" }, + { SYSREG_ENC(1, 0, 7, 9, 0), OPE_XT, "at\ts1e1rp" }, + { SYSREG_ENC(1, 0, 7, 9, 1), OPE_XT, "at\ts1e1wp" }, { SYSREG_ENC(1, 4, 7, 8, 0), OPE_XT, "at\ts1e2r" }, { SYSREG_ENC(1, 4, 7, 8, 1), OPE_XT, "at\ts1e2w" }, { SYSREG_ENC(1, 4, 7, 8, 4), OPE_XT, "at\ts12e1r" }, @@ -1251,6 +1291,11 @@ static struct op_sys_table op_sys_table[ { SYSREG_ENC(1, 4, 7, 8, 7), OPE_XT, "at\ts12e0w" }, { SYSREG_ENC(1, 6, 7, 8, 0), OPE_XT, "at\ts1e3r" }, { SYSREG_ENC(1, 6, 7, 8, 1), OPE_XT, "at\ts1e3w" }, + + { SYSREG_ENC(1, 3, 7, 3, 4), OPE_XT, "cfp\trctx" }, + { SYSREG_ENC(1, 3, 7, 3, 5), OPE_XT, "dvp\trctx" }, + { SYSREG_ENC(1, 3, 7, 3, 7), OPE_XT, "cpp\trctx" }, + { SYSREG_ENC(1, 0, 8, 3, 0), OPE_NONE, "tlbi\tvmalle1is" }, { SYSREG_ENC(1, 0, 8, 3, 1), OPE_XT, "tlbi\tvae1is" }, { SYSREG_ENC(1, 0, 8, 3, 2), OPE_XT, "tlbi\taside1is" }, @@ -1336,6 +1381,8 @@ OP6FUNC(op_bfi, sf, n, immr, imms, Rn, R /* ALIAS: bfm,bfxil */ /* it is not disassembled as bfm */ + + /* XXX: if Rn=31, should be used "bfc"? (armv8.2) */ if (imms < immr) { PRINTF("bfi\t%s, %s, #%"PRIu64", #%"PRIu64"\n", ZREGNAME(sf, Rd), @@ -1634,68 +1681,47 @@ OP6FUNC(op_ror_imm, sf, n, Rm, imms, Rn, } } -OP2FUNC(op_hint, CRm, op2) -{ #define CRm_OP2(crm,op) ((crm) << 3 | (op)) +static const char *hint_table[] = { + [CRm_OP2(0, 0)] = "nop", + [CRm_OP2(0, 1)] = "yield", + [CRm_OP2(0, 2)] = "wfe", + [CRm_OP2(0, 3)] = "wfi", + [CRm_OP2(0, 4)] = "sev", + [CRm_OP2(0, 5)] = "sevl", + [CRm_OP2(0, 7)] = "xpaclri", + [CRm_OP2(1, 0)] = "pacia1716", + [CRm_OP2(1, 2)] = "pacib1716", + [CRm_OP2(1, 4)] = "autia1716", + [CRm_OP2(1, 6)] = "autib1716", + [CRm_OP2(2, 0)] = "esb", + [CRm_OP2(2, 1)] = "psb\tcsync", + [CRm_OP2(2, 2)] = "tsb\tcsync", + [CRm_OP2(2, 4)] = "csdb", + [CRm_OP2(3, 0)] = "paciaz", + [CRm_OP2(3, 1)] = "paciasp", + [CRm_OP2(3, 2)] = "pacibz", + [CRm_OP2(3, 3)] = "pacibsp", + [CRm_OP2(3, 4)] = "autiaz", + [CRm_OP2(3, 5)] = "autiasp", + [CRm_OP2(3, 6)] = "autibz", + [CRm_OP2(3, 7)] = "autibsp", + [CRm_OP2(4, 0)] = "bti", + [CRm_OP2(4, 2)] = "bti\tc", + [CRm_OP2(4, 4)] = "bti\tj", + [CRm_OP2(4, 6)] = "bti\tjc", +}; +OP2FUNC(op_hint, CRm, op2) +{ const uint64_t op = CRm_OP2(CRm, op2); - /* ALIAS: nop,sev,sevl,wfe,wfi,yield */ - switch (op) { - case CRm_OP2(0, 0): - PRINTF("nop\n"); - break; - case CRm_OP2(0, 1): - PRINTF("yield\n"); - break; - case CRm_OP2(0, 2): - PRINTF("wfe\n"); - break; - case CRm_OP2(0, 3): - PRINTF("wfi\n"); - break; - case CRm_OP2(0, 4): - PRINTF("sev\n"); - break; - case CRm_OP2(0, 5): - PRINTF("sevl\n"); - break; - case CRm_OP2(0, 7): - PRINTF("xpaclri\n"); - break; - case CRm_OP2(1, 0): - PRINTF("pacia1716\n"); - break; - case CRm_OP2(1, 2): - PRINTF("pacib1716\n"); - break; - case CRm_OP2(3, 0): - PRINTF("paciaz\n"); - break; - case CRm_OP2(3, 1): - PRINTF("paciasp\n"); - break; - case CRm_OP2(3, 2): - PRINTF("pacibz\n"); - break; - case CRm_OP2(3, 3): - PRINTF("pacibsp\n"); - break; - case CRm_OP2(4, 0): - PRINTF("bti\n"); - break; - case CRm_OP2(4, 2): - PRINTF("bti\tc\n"); - break; - case CRm_OP2(4, 4): - PRINTF("bti\tj\n"); - break; - case CRm_OP2(4, 6): - PRINTF("bti\tjc\n"); - break; - default: + /* ALIAS: nop,sev,sevl,wfe,wfi,yield,etc,.. */ + if (op < __arraycount(hint_table) && + hint_table[op] != NULL) { + PRINTF("%s\n", hint_table[op]); + } else { PRINTF("hint\t#0x%"PRIx64"\n", op); - break; } } @@ -2492,9 +2518,33 @@ OP3FUNC(op_msr_imm, op1, CRm, op2) #define MSRIMM_OP(op1, op2) (((op1) << 3) | (op2)) switch (MSRIMM_OP(op1, op2)) { + case MSRIMM_OP(0, 0): + PRINTF("cfinv\n"); + return; + case MSRIMM_OP(0, 1): + PRINTF("xaflag\n"); + return; + case MSRIMM_OP(0, 2): + PRINTF("axflag\n"); + return; + case MSRIMM_OP(0, 3): + pstatefield = "uao"; + break; + case MSRIMM_OP(0, 4): + pstatefield = "pan"; + break; case MSRIMM_OP(0, 5): pstatefield = "spsel"; break; + case MSRIMM_OP(3, 1): + pstatefield = "ssbs"; + break; + case MSRIMM_OP(3, 2): + pstatefield = "dit"; + break; + case MSRIMM_OP(3, 4): + pstatefield = "tco"; + break; case MSRIMM_OP(3, 6): pstatefield = "daifset"; break;