1 /* 2 * Copyright (c) 2007 Apple Inc. All rights reserved. 3 */ 4 /* 5 * CDDL HEADER START 6 * 7 * The contents of this file are subject to the terms of the 8 * Common Development and Distribution License, Version 1.0 only 9 * (the "License"). You may not use this file except in compliance 10 * with the License. 11 * 12 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 13 * or http://www.opensolaris.org/os/licensing. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * 17 * When distributing Covered Code, include this CDDL HEADER in each 18 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 19 * If applicable, add the following below this CDDL HEADER, with the 20 * fields enclosed by brackets "[]" replaced with your own identifying 21 * information: Portions Copyright [yyyy] [name of copyright owner] 22 * 23 * CDDL HEADER END 24 */ 25 /* 26 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 27 * Use is subject to license terms. 28 */ 29 30 #ifndef _ARM_FASTTRAP_ISA_H 31 #define _ARM_FASTTRAP_ISA_H 32 #define _FASTTRAP_ISA_H 33 34 #if defined (__arm__) || defined (__arm64__) 35 36 #include <sys/types.h> 37 #include <stdint.h> 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 typedef union { 44 uint32_t instr32; 45 struct { 46 uint16_t instr1; 47 uint16_t instr2; 48 } instr16; 49 } fasttrap_instr_t; 50 51 typedef struct fasttrap_machtp { 52 fasttrap_instr_t ftmt_instr; /* original instruction */ 53 54 uint8_t ftmt_fntype; /* One of the FASTTRAP_FN* constants defined below */ 55 /* Once the tracepoint is initialized, fntype will be FN_DONE_INIT and thumb will be 0 for ARM, 1 for Thumb */ 56 uint8_t ftmt_thumb; 57 58 uint8_t ftmt_type; 59 uint8_t ftmt_installed:1; 60 uint8_t ftmt_retired:1; 61 } fasttrap_machtp_t; 62 63 #define ftt_instr ftt_mtp.ftmt_instr.instr32 64 #define ftt_instr1 ftt_mtp.ftmt_instr.instr16.instr1 65 #define ftt_instr2 ftt_mtp.ftmt_instr.instr16.instr2 66 #define ftt_fntype ftt_mtp.ftmt_fntype 67 #define ftt_thumb ftt_mtp.ftmt_thumb 68 #define ftt_type ftt_mtp.ftmt_type 69 #define ftt_installed ftt_mtp.ftmt_installed 70 #define ftt_retired ftt_mtp.ftmt_retired 71 72 #define FASTTRAP_T_INV 1 73 #define FASTTRAP_T_COMMON 2 74 #define FASTTRAP_T_BLX 3 75 #define FASTTRAP_T_B_COND 4 76 #define FASTTRAP_T_B_UNCOND 5 77 #define FASTTRAP_T_BX_REG 6 78 #define FASTTRAP_T_PUSH_LR 7 79 #define FASTTRAP_T_POP_PC 8 80 #define FASTTRAP_T_STM_LR 9 81 #define FASTTRAP_T_LDM_PC 10 82 #define FASTTRAP_T_CPY_PC 11 83 #define FASTTRAP_T_MOV_PC_REG 12 84 #define FASTTRAP_T_LDR_PC_IMMED 13 85 #define FASTTRAP_T_VLDR_PC_IMMED 14 86 #define FASTTRAP_T_CB_N_Z 15 87 #if defined(__arm64__) 88 #define FASTTRAP_T_ARM64_STANDARD_FUNCTION_ENTRY 16 /* stp fp, lr, [sp, #-16]! */ 89 #define FASTTRAP_T_ARM64_LDR_S_PC_REL 17 90 #define FASTTRAP_T_ARM64_LDR_W_PC_REL 18 91 #define FASTTRAP_T_ARM64_LDR_D_PC_REL 19 92 #define FASTTRAP_T_ARM64_LDR_X_PC_REL 20 93 #define FASTTRAP_T_ARM64_LDR_Q_PC_REL 21 94 #define FASTTRAP_T_ARM64_LDRSW_PC_REL 22 95 #define FASTTRAP_T_ARM64_B_COND 23 96 #define FASTTRAP_T_ARM64_CBNZ_W 24 97 #define FASTTRAP_T_ARM64_CBNZ_X 25 98 #define FASTTRAP_T_ARM64_CBZ_W 26 99 #define FASTTRAP_T_ARM64_CBZ_X 27 100 #define FASTTRAP_T_ARM64_TBNZ 28 101 #define FASTTRAP_T_ARM64_TBZ 29 102 #define FASTTRAP_T_ARM64_B 30 103 #define FASTTRAP_T_ARM64_BL 31 104 #define FASTTRAP_T_ARM64_BLR 32 105 #define FASTTRAP_T_ARM64_BR 33 106 #define FASTTRAP_T_ARM64_RET 34 107 #define FASTTRAP_T_ARM64_ADRP 35 108 #define FASTTRAP_T_ARM64_ADR 36 109 #define FASTTRAP_T_ARM64_PRFM 37 110 #define FASTTRAP_T_ARM64_EXCLUSIVE_MEM 38 111 #define FASTTRAP_T_ARM64_RETAB 39 112 #endif 113 114 #if defined (__arm__) 115 #define FASTTRAP_ARM_INSTR 0xe7ffdefc 116 #define FASTTRAP_THUMB_INSTR 0xdefc 117 #define FASTTRAP_ARM_RET_INSTR 0xe7ffdefb 118 #define FASTTRAP_THUMB_RET_INSTR 0xdefb 119 120 #elif defined (__arm64__) 121 #define FASTTRAP_ARM32_INSTR 0xe7ffdefc 122 #define FASTTRAP_THUMB32_INSTR 0xdefc 123 #define FASTTRAP_ARM64_INSTR 0xe7eeee7e 124 125 #define FASTTRAP_ARM32_RET_INSTR 0xe7ffdefb 126 #define FASTTRAP_THUMB32_RET_INSTR 0xdefb 127 #define FASTTRAP_ARM64_RET_INSTR 0xe7eeee7d 128 #endif 129 130 #define FASTTRAP_FN_DONE_INIT 255 131 #define FASTTRAP_FN_UNKNOWN 0 132 #define FASTTRAP_FN_ARM 1 133 #define FASTTRAP_FN_THUMB 2 134 #define FASTTRAP_FN_USDT 3 135 #define FASTTRAP_FN_ARM64 4 136 #define FASTTRAP_FN_ARM64_32 5 137 138 #define ARM_RM(x) ((x) & 0xF) 139 #define ARM_RS(x) (((x) >> 8) & 0xF) 140 #define ARM_RD(x) (((x) >> 12) & 0xF) 141 #define ARM_RN(x) (((x) >> 16) & 0xF) 142 #define ARM_CONDCODE(x) ((x) >> 28) 143 144 #define THUMB16_HRM(x) (((x) >> 3) & 0xF) 145 #define THUMB16_HRD(x) (((x) & 0x7) | ((((x) >> 4) & 0x8))) 146 147 #define THUMB32_RM(x, y) ((y) & 0xF) 148 #define THUMB32_RD(x, y) (((y) >> 8) & 0xF) 149 #define THUMB32_RT(x, y) (((y) >> 12) & 0xF) 150 #define THUMB32_RN(x, y) ((x) & 0xF) 151 152 #define REG_SP 13 153 #define REG_LR 14 154 #define REG_PC 15 155 156 #define FASTTRAP_RETURN_AFRAMES 6 157 #define FASTTRAP_ENTRY_AFRAMES 5 158 #define FASTTRAP_OFFSET_AFRAMES 5 159 160 #if defined(__arm64__) 161 #define FASTTRAP_ARM64_OP_VALUE_FUNC_ENTRY 0xa9bf7bfd /* stp fp, lr, [sp, #-16]! */ 162 163 #define FASTTRAP_ARM64_OP_MASK_LDR_S_PC_REL 0xff000000 /* Bits to check for ldr St, label */ 164 #define FASTTRAP_ARM64_OP_VALUE_LDR_S_PC_REL 0x1c000000 /* Value to find */ 165 166 #define FASTTRAP_ARM64_OP_MASK_LDR_W_PC_REL 0xff000000 /* Bits to check for ldr Wt, label */ 167 #define FASTTRAP_ARM64_OP_VALUE_LDR_W_PC_REL 0x18000000 /* Value to find */ 168 169 #define FASTTRAP_ARM64_OP_MASK_LDR_D_PC_REL 0xff000000 /* Bits to check for ldr Dt, label */ 170 #define FASTTRAP_ARM64_OP_VALUE_LDR_D_PC_REL 0x5c000000 /* Value to find */ 171 172 #define FASTTRAP_ARM64_OP_MASK_LDR_X_PC_REL 0xff000000 /* Bits to check for ldr Xt, label */ 173 #define FASTTRAP_ARM64_OP_VALUE_LDR_X_PC_REL 0x58000000 /* Value to find */ 174 175 #define FASTTRAP_ARM64_OP_MASK_LDR_Q_PC_REL 0xff000000 /* Bits to check for ldr Qt, label */ 176 #define FASTTRAP_ARM64_OP_VALUE_LDR_Q_PC_REL 0x9c000000 /* Value to find */ 177 178 #define FASTTRAP_ARM64_OP_MASK_LRDSW_PC_REL 0xff000000 /* Bits to check for ldrsw <reg>, label */ 179 #define FASTTRAP_ARM64_OP_VALUE_LRDSW_PC_REL 0x98000000 /* Value to find */ 180 181 #define FASTTRAP_ARM64_OP_MASK_B_COND_PC_REL 0xff000010 /* Bits to check for b.cond label */ 182 #define FASTTRAP_ARM64_OP_VALUE_B_COND_PC_REL 0x54000000 /* Value to find */ 183 184 #define FASTTRAP_ARM64_OP_MASK_CBNZ_W_PC_REL 0xff000000 /* Bits to check for cbnz Wt, _label */ 185 #define FASTTRAP_ARM64_OP_VALUE_CBNZ_W_PC_REL 0x35000000 /* Value to find */ 186 187 #define FASTTRAP_ARM64_OP_MASK_CBNZ_X_PC_REL 0xff000000 /* Bits to check for cbnz Xt, _label */ 188 #define FASTTRAP_ARM64_OP_VALUE_CBNZ_X_PC_REL 0xb5000000 /* Value to find */ 189 190 #define FASTTRAP_ARM64_OP_MASK_CBZ_W_PC_REL 0xff000000 /* Bits to check for cbz Wt, _label */ 191 #define FASTTRAP_ARM64_OP_VALUE_CBZ_W_PC_REL 0x34000000 /* Value to find */ 192 193 #define FASTTRAP_ARM64_OP_MASK_CBZ_X_PC_REL 0xff000000 /* Bits to check for cbz Xt, _label */ 194 #define FASTTRAP_ARM64_OP_VALUE_CBZ_X_PC_REL 0xb4000000 /* Value to find */ 195 196 #define FASTTRAP_ARM64_OP_MASK_TBNZ_PC_REL 0x7f000000 /* Bits to check for tbnz Xt, _label */ 197 #define FASTTRAP_ARM64_OP_VALUE_TBNZ_PC_REL 0x37000000 /* Value to find */ 198 199 #define FASTTRAP_ARM64_OP_MASK_TBZ_PC_REL 0x7f000000 /* Bits to check for tbz Xt, _label */ 200 #define FASTTRAP_ARM64_OP_VALUE_TBZ_PC_REL 0x36000000 /* Value to find */ 201 202 #define FASTTRAP_ARM64_OP_MASK_B_PC_REL 0xfc000000 /* Bits to check for b _label */ 203 #define FASTTRAP_ARM64_OP_VALUE_B_PC_REL 0x14000000 /* Value to find */ 204 205 #define FASTTRAP_ARM64_OP_MASK_BL_PC_REL 0xfc000000 /* Bits to check for bl _label */ 206 #define FASTTRAP_ARM64_OP_VALUE_BL_PC_REL 0x94000000 /* Value to find */ 207 208 #define FASTTRAP_ARM64_OP_MASK_BLR 0xfffffe1f /* Bits to check for blr Xt */ 209 #define FASTTRAP_ARM64_OP_VALUE_BLR 0xd63f0000 /* Value to find */ 210 211 #define FASTTRAP_ARM64_OP_MASK_BR 0xfffffe1f /* Bits to check for br Xt */ 212 #define FASTTRAP_ARM64_OP_VALUE_BR 0xd61f0000 /* Value to find */ 213 214 #define FASTTRAP_ARM64_OP_MASK_RET 0xfffffc1f /* Bits to check for ret Rt */ 215 #define FASTTRAP_ARM64_OP_VALUE_RET 0xd65f0000 /* Value to find */ 216 217 #define FASTTRAP_ARM64_OP_MASK_ADRP 0x9f000000 /* Bits to check for adrp Xt, label*/ 218 #define FASTTRAP_ARM64_OP_VALUE_ADRP 0x90000000 /* Value to find */ 219 220 #define FASTTRAP_ARM64_OP_MASK_ADR 0x9f000000 /* Bits to check for adr Xt, label*/ 221 #define FASTTRAP_ARM64_OP_VALUE_ADR 0x10000000 /* Value to find */ 222 223 #define FASTTRAP_ARM64_OP_MASK_PRFM 0xff000000 /* Bits to check for adr Xt, label*/ 224 #define FASTTRAP_ARM64_OP_VALUE_PRFM 0xd8000000 /* Value to find */ 225 226 #define FASTTRAP_ARM64_OP_MASK_EXCL_MEM 0x3f000000 /* Bits to check for exclusive memory operation */ 227 #define FASTTRAP_ARM64_OP_VALUE_EXCL_MEM 0x08000000 /* Value to find */ 228 229 #define FASTTRAP_ARM64_OP_MASK_RETAB 0xfffffc1f /* Bits to check for retab Rt */ 230 #define FASTTRAP_ARM64_OP_VALUE_RETAB 0xd65f0c1f /* Value to find */ 231 #endif /* defined(__arm64__) */ 232 233 #ifdef __cplusplus 234 } 235 #endif 236 237 #endif /* defined (__arm__) || defined (__arm64__) */ 238 239 #endif /* _ARM_FASTTRAP_ISA_H */ 240