xref: /xnu-8792.81.2/bsd/dev/arm64/disassembler.c (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions /*
2*19c3b8c2SApple OSS Distributions  * Copyright (c) 2017-2018 Apple Inc. All rights reserved.
3*19c3b8c2SApple OSS Distributions  *
4*19c3b8c2SApple OSS Distributions  * Disassemblers for ARM64 (AArch64)
5*19c3b8c2SApple OSS Distributions  */
6*19c3b8c2SApple OSS Distributions 
7*19c3b8c2SApple OSS Distributions #include  <sys/fasttrap_isa.h>
8*19c3b8c2SApple OSS Distributions 
9*19c3b8c2SApple OSS Distributions uint8_t dtrace_decode_arm64(uint32_t instr);
10*19c3b8c2SApple OSS Distributions 
11*19c3b8c2SApple OSS Distributions struct arm64_decode_entry {
12*19c3b8c2SApple OSS Distributions 	uint32_t mask;
13*19c3b8c2SApple OSS Distributions 	uint32_t value;
14*19c3b8c2SApple OSS Distributions 	uint8_t type;
15*19c3b8c2SApple OSS Distributions };
16*19c3b8c2SApple OSS Distributions 
17*19c3b8c2SApple OSS Distributions struct arm64_decode_entry arm64_decode_table[] = {
18*19c3b8c2SApple OSS Distributions 	{ .mask = 0xFFFFFFFF, .value = FASTTRAP_ARM64_OP_VALUE_FUNC_ENTRY, .type = FASTTRAP_T_ARM64_STANDARD_FUNCTION_ENTRY },
19*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_LDR_S_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_LDR_S_PC_REL, .type = FASTTRAP_T_ARM64_LDR_S_PC_REL },
20*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_LDR_W_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_LDR_W_PC_REL, .type = FASTTRAP_T_ARM64_LDR_W_PC_REL },
21*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_LDR_D_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_LDR_D_PC_REL, .type = FASTTRAP_T_ARM64_LDR_D_PC_REL },
22*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_LDR_X_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_LDR_X_PC_REL, .type = FASTTRAP_T_ARM64_LDR_X_PC_REL },
23*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_LDR_Q_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_LDR_Q_PC_REL, .type = FASTTRAP_T_ARM64_LDR_Q_PC_REL },
24*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_LRDSW_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_LRDSW_PC_REL, .type = FASTTRAP_T_ARM64_LDRSW_PC_REL },
25*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_B_COND_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_B_COND_PC_REL, .type = FASTTRAP_T_ARM64_B_COND },
26*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_CBNZ_W_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_CBNZ_W_PC_REL, .type = FASTTRAP_T_ARM64_CBNZ_W },
27*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_CBNZ_X_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_CBNZ_X_PC_REL, .type = FASTTRAP_T_ARM64_CBNZ_X },
28*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_CBZ_W_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_CBZ_W_PC_REL, .type = FASTTRAP_T_ARM64_CBZ_W },
29*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_CBZ_X_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_CBZ_X_PC_REL, .type = FASTTRAP_T_ARM64_CBZ_X },
30*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_TBNZ_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_TBNZ_PC_REL, .type = FASTTRAP_T_ARM64_TBNZ },
31*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_TBZ_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_TBZ_PC_REL, .type = FASTTRAP_T_ARM64_TBZ },
32*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_B_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_B_PC_REL, .type = FASTTRAP_T_ARM64_B },
33*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_BL_PC_REL, .value = FASTTRAP_ARM64_OP_VALUE_BL_PC_REL, .type = FASTTRAP_T_ARM64_BL },
34*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_BLR, .value = FASTTRAP_ARM64_OP_VALUE_BLR, .type = FASTTRAP_T_ARM64_BLR },
35*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_BR, .value = FASTTRAP_ARM64_OP_VALUE_BR, .type = FASTTRAP_T_ARM64_BR },
36*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_RET, .value = FASTTRAP_ARM64_OP_VALUE_RET, .type = FASTTRAP_T_ARM64_RET },
37*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_ADRP, .value = FASTTRAP_ARM64_OP_VALUE_ADRP, .type = FASTTRAP_T_ARM64_ADRP },
38*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_ADR, .value = FASTTRAP_ARM64_OP_VALUE_ADR, .type = FASTTRAP_T_ARM64_ADR },
39*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_PRFM, .value = FASTTRAP_ARM64_OP_VALUE_PRFM, .type = FASTTRAP_T_ARM64_PRFM },
40*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_EXCL_MEM, .value = FASTTRAP_ARM64_OP_VALUE_EXCL_MEM, .type = FASTTRAP_T_ARM64_EXCLUSIVE_MEM },
41*19c3b8c2SApple OSS Distributions 	{ .mask = FASTTRAP_ARM64_OP_MASK_RETAB, .value = FASTTRAP_ARM64_OP_VALUE_RETAB, .type = FASTTRAP_T_ARM64_RETAB }
42*19c3b8c2SApple OSS Distributions };
43*19c3b8c2SApple OSS Distributions 
44*19c3b8c2SApple OSS Distributions #define NUM_DECODE_ENTRIES (sizeof(arm64_decode_table) / sizeof(struct arm64_decode_entry))
45*19c3b8c2SApple OSS Distributions 
46*19c3b8c2SApple OSS Distributions uint8_t
dtrace_decode_arm64(uint32_t instr)47*19c3b8c2SApple OSS Distributions dtrace_decode_arm64(uint32_t instr)
48*19c3b8c2SApple OSS Distributions {
49*19c3b8c2SApple OSS Distributions 	unsigned i;
50*19c3b8c2SApple OSS Distributions 
51*19c3b8c2SApple OSS Distributions 	for (i = 0; i < NUM_DECODE_ENTRIES; i++) {
52*19c3b8c2SApple OSS Distributions 		if ((instr & arm64_decode_table[i].mask) == arm64_decode_table[i].value) {
53*19c3b8c2SApple OSS Distributions 			return arm64_decode_table[i].type;
54*19c3b8c2SApple OSS Distributions 		}
55*19c3b8c2SApple OSS Distributions 	}
56*19c3b8c2SApple OSS Distributions 
57*19c3b8c2SApple OSS Distributions 	return FASTTRAP_T_COMMON;
58*19c3b8c2SApple OSS Distributions }
59