2 * Copyright (c) 2017-2018 Apple Inc. All rights reserved.
4 * Disassemblers for ARM64 (AArch64)
7 #include <sys/fasttrap_isa.h>
9 int dtrace_decode_arm64(uint32_t instr
);
11 struct arm64_decode_entry
{
17 struct arm64_decode_entry arm64_decode_table
[] = {
18 { .mask
= 0xFFFFFFFF, .value
= FASTTRAP_ARM64_OP_VALUE_FUNC_ENTRY
, .type
= FASTTRAP_T_ARM64_STANDARD_FUNCTION_ENTRY
},
19 { .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 { .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 { .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 { .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 { .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 { .mask
= FASTTRAP_ARM64_OP_MASK_LRDSW_PC_REL
, .value
= FASTTRAP_ARM64_OP_VALUE_LRDSW_PC_REL
, .type
= FASTTRAP_T_ARM64_LDRSW_PC_REL
},
25 { .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 { .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 { .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 { .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 { .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 { .mask
= FASTTRAP_ARM64_OP_MASK_TBNZ_PC_REL
, .value
= FASTTRAP_ARM64_OP_VALUE_TBNZ_PC_REL
, .type
= FASTTRAP_T_ARM64_TBNZ
},
31 { .mask
= FASTTRAP_ARM64_OP_MASK_TBZ_PC_REL
, .value
= FASTTRAP_ARM64_OP_VALUE_TBZ_PC_REL
, .type
= FASTTRAP_T_ARM64_TBZ
},
32 { .mask
= FASTTRAP_ARM64_OP_MASK_B_PC_REL
, .value
= FASTTRAP_ARM64_OP_VALUE_B_PC_REL
, .type
= FASTTRAP_T_ARM64_B
},
33 { .mask
= FASTTRAP_ARM64_OP_MASK_BL_PC_REL
, .value
= FASTTRAP_ARM64_OP_VALUE_BL_PC_REL
, .type
= FASTTRAP_T_ARM64_BL
},
34 { .mask
= FASTTRAP_ARM64_OP_MASK_BLR
, .value
= FASTTRAP_ARM64_OP_VALUE_BLR
, .type
= FASTTRAP_T_ARM64_BLR
},
35 { .mask
= FASTTRAP_ARM64_OP_MASK_BR
, .value
= FASTTRAP_ARM64_OP_VALUE_BR
, .type
= FASTTRAP_T_ARM64_BR
},
36 { .mask
= FASTTRAP_ARM64_OP_MASK_RET
, .value
= FASTTRAP_ARM64_OP_VALUE_RET
, .type
= FASTTRAP_T_ARM64_RET
},
37 { .mask
= FASTTRAP_ARM64_OP_MASK_ADRP
, .value
= FASTTRAP_ARM64_OP_VALUE_ADRP
, .type
= FASTTRAP_T_ARM64_ADRP
},
38 { .mask
= FASTTRAP_ARM64_OP_MASK_ADR
, .value
= FASTTRAP_ARM64_OP_VALUE_ADR
, .type
= FASTTRAP_T_ARM64_ADR
},
39 { .mask
= FASTTRAP_ARM64_OP_MASK_PRFM
, .value
= FASTTRAP_ARM64_OP_VALUE_PRFM
, .type
= FASTTRAP_T_ARM64_PRFM
},
40 { .mask
= FASTTRAP_ARM64_OP_MASK_EXCL_MEM
, .value
= FASTTRAP_ARM64_OP_VALUE_EXCL_MEM
, .type
= FASTTRAP_T_ARM64_EXCLUSIVE_MEM
},
41 { .mask
= FASTTRAP_ARM64_OP_MASK_RETAB
, .value
= FASTTRAP_ARM64_OP_VALUE_RETAB
, .type
= FASTTRAP_T_ARM64_RETAB
}
44 #define NUM_DECODE_ENTRIES (sizeof(arm64_decode_table) / sizeof(struct arm64_decode_entry))
47 dtrace_decode_arm64(uint32_t instr
)
51 for (i
= 0; i
< NUM_DECODE_ENTRIES
; i
++) {
52 if ((instr
& arm64_decode_table
[i
].mask
) == arm64_decode_table
[i
].value
) {
53 return arm64_decode_table
[i
].type
;
57 return FASTTRAP_T_COMMON
;