diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2024-03-05 19:50:13 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2024-03-05 20:34:34 -0500 |
| commit | e093c21ed880ac3eb72119be15093ee04f8ce299 (patch) | |
| tree | 9f720ebdc0ae415734b1199ed341668c69710a94 /arch/arm64/disassembler/pcode.h | |
| parent | 0609276712622908254065546102381466033141 (diff) | |
Move architecture modules into the API repo
Diffstat (limited to 'arch/arm64/disassembler/pcode.h')
| -rw-r--r-- | arch/arm64/disassembler/pcode.h | 449 |
1 files changed, 449 insertions, 0 deletions
diff --git a/arch/arm64/disassembler/pcode.h b/arch/arm64/disassembler/pcode.h new file mode 100644 index 00000000..e9410f34 --- /dev/null +++ b/arch/arm64/disassembler/pcode.h @@ -0,0 +1,449 @@ +#include "feature_flags.h" + +#define INSWORD (ctx->insword) +#define UNDEFINED \ + { \ + return DECODE_STATUS_UNDEFINED; \ + } +#define UNMATCHED \ + { \ + return DECODE_STATUS_UNMATCHED; \ + } +#define RESERVED(X) \ + { \ + return DECODE_STATUS_RESERVED; \ + } +#define UNALLOCATED(X) \ + { \ + dec->encoding = (X); \ + return DECODE_STATUS_UNALLOCATED; \ + } +#define ENDOFINSTRUCTION \ + { \ + return DECODE_STATUS_END_OF_INSTRUCTION; \ + } +#define SEE \ + { \ + return DECODE_STATUS_LOST; \ + } +#define UNREACHABLE \ + { \ + return DECODE_STATUS_UNREACHABLE; \ + } +/* do NOT return immediately! post-decode pcode might still need to run */ +#define OK(X) \ + { \ + instr->encoding = (X); \ + instr->operation = enc_to_oper(X); \ + rc = DECODE_STATUS_OK; \ + } +#define assert(X) \ + if (!(X)) \ + { \ + return DECODE_STATUS_ASSERT_FAILED; \ + } + +#define BITMASK(N) (((uint64_t)1 << (N)) - 1) +#define SLICE(X, MSB, LSB) (((X) >> (LSB)) & BITMASK((MSB) - (LSB) + 1)) /* get bits [MSB,LSB] */ +#define CONCAT(A, B, B_WIDTH) (((A) << (B_WIDTH)) | (B)) +#define NOT(X, X_WIDTH) ((X) ^ BITMASK(X_WIDTH)) + +#define DecodeBitMasksCheckUndefined(N, imms) \ + if ((N == 0 && \ + (imms == 0x3D || imms == 0x3B || imms == 0x37 || imms == 0x2F || imms == 0x1F)) || \ + (N == 1 && imms == 0x3F)) \ + { \ + return DECODE_STATUS_UNDEFINED; \ + } + +#define UINT(x) (unsigned int)(x) +#define SInt(X, X_WIDTH) SignExtend((X), (X_WIDTH)) +#define INT(x) (signed int)(x) +#define ZeroExtend(X, Y) (uint64_t)(X) +#define LSL(X, Y) ((X) << (Y)) + +#define LOG2_TAG_GRANULE 4 +#define TAG_GRANULE (1 << LOG2_TAG_GRANULE) + +/* pcode -> cpp booleans */ +#define TRUE true +#define FALSE false + +/* these calls just check generated per-iform boolean variables */ +#define EncodingLabeled32Bit() (encoding32) +#define EncodingLabeled64Bit() (encoding64) + +// extras we find in spec tables, etc. +#define HaveTLBIOS() (1) +#define HaveTLBIRANGE() (1) +#define HaveDCCVADP() (1) +#define HaveDCPoP() (1) + +#define SetBTypeCompatible(X) ctx->BTypeCompatible = (X) +#define SetBTypeNext(X) ctx->BTypeNext = (X) +#define Halted() ctx->halted + +enum SystemOp +{ + Sys_ERROR = -1, + Sys_AT = 0, + Sys_DC = 1, + Sys_IC = 2, + Sys_TLBI = 3, + Sys_SYS = 4, +}; + +enum ReduceOp +{ + ReduceOp_ERROR = 0, + ReduceOp_ADD, + ReduceOp_FADD, + ReduceOp_FMIN, + ReduceOp_FMAX, + ReduceOp_FMINNUM, + ReduceOp_FMAXNUM, +}; + +enum LogicalOp +{ + LogicalOp_ERROR = 0, + LogicalOp_AND, + LogicalOp_EOR, + LogicalOp_ORR +}; + +enum BranchType +{ + BranchType_ERROR = 0, + BranchType_DIRCALL, // Direct Branch with link + BranchType_INDCALL, // Indirect Branch with link + BranchType_ERET, // Exception return (indirect) + BranchType_DBGEXIT, // Exit from Debug state + BranchType_RET, // Indirect branch with function return hint + BranchType_DIR, // Direct branch + BranchType_INDIR, // Indirect branch + BranchType_EXCEPTION, // Exception entry + BranchType_RESET, // Reset + BranchType_UNKNOWN // Other +}; + +enum VBitOp +{ + VBitOp_ERROR = 0, + VBitOp_VBIF, + VBitOp_VBIT, + VBitOp_VBSL, + VBitOp_VEOR +}; + +enum SystemHintOp +{ + SystemHintOp_ERROR = 0, + SystemHintOp_NOP, + SystemHintOp_YIELD, + SystemHintOp_WFE, + SystemHintOp_WFI, + SystemHintOp_SEV, + SystemHintOp_SEVL, + SystemHintOp_DGH, + SystemHintOp_ESB, + SystemHintOp_PSB, + SystemHintOp_TSB, + SystemHintOp_BTI, + SystemHintOp_CSDB, + SystemHintOp_WFET, + SystemHintOp_WFIT, +}; + +enum ImmediateOp +{ + ImmediateOp_ERROR = 0, + ImmediateOp_MOVI, + ImmediateOp_MVNI, + ImmediateOp_ORR, + ImmediateOp_BIC +}; + +enum AccType +{ + AccType_ERROR = 0, + AccType_ATOMICRW, + AccType_ATOMIC, + AccType_LIMITEDORDERED, + AccType_ORDEREDATOMICRW, + AccType_ORDEREDATOMIC, + AccType_ORDERED +}; + +enum CompareOp +{ + CompareOp_ERROR = 0, + CompareOp_EQ, + CompareOp_GE, + CompareOp_GT, + CompareOp_LE, + CompareOp_LT +}; + +enum Constraint +{ + Constraint_ERROR = 0, + Constraint_DISABLED, + Constraint_FALSE, + Constraint_FAULT, + Constraint_FORCE, + Constraint_LIMITED_ATOMICITY, + Constraint_NONE, + Constraint_NOP, + Constraint_TRUE, + Constraint_UNDEF, + Constraint_UNKNOWN, + Constraint_WBSUPPRESS, +}; + +enum CountOp +{ + CountOp_ERROR = 0, + CountOp_CLS, + CountOp_CLZ +}; + +enum DSBAlias +{ + DSBAlias_DSB = 0, + DSBAlias_SSBB, + DSBAlias_PSSBB +}; + +enum MBReqDomain +{ + MBReqDomain_ERROR = 0, + MBReqDomain_Nonshareable, + MBReqDomain_InnerShareable, + MBReqDomain_OuterShareable, + MBReqDomain_FullSystem +}; + +enum MBReqTypes +{ + MBReqTypes_ERROR = 0, + MBReqTypes_Reads, + MBReqTypes_Writes, + MBReqTypes_All +}; + +enum FPUnaryOp +{ + FPUnaryOp_ERROR = 0, + FPUnaryOp_ABS, + FPUnaryOp_MOV, + FPUnaryOp_NEG, + FPUnaryOp_SQRT +}; + +enum FPConvOp +{ + FPConvOp_ERROR = 0, + FPConvOp_CVT_FtoI, + FPConvOp_CVT_ItoF, + FPConvOp_MOV_FtoI, + FPConvOp_MOV_ItoF, + FPConvOp_CVT_FtoI_JS +}; + +enum FPMaxMinOp +{ + FPMaxMinOp_ERROR = 0, + FPMaxMinOp_MAX, + FPMaxMinOp_MIN, + FPMaxMinOp_MAXNUM, + FPMaxMinOp_MINNUM +}; + +enum FPRounding +{ + FPRounding_ERROR = 0, + FPRounding_TIEEVEN, + FPRounding_POSINF, + FPRounding_NEGINF, + FPRounding_ZERO, + FPRounding_TIEAWAY, + FPRounding_ODD +}; + +enum MemAtomicOp +{ + MemAtomicOp_ERROR = 0, + MemAtomicOp_ADD, + MemAtomicOp_BIC, + MemAtomicOp_EOR, + MemAtomicOp_ORR, + MemAtomicOp_SMAX, + MemAtomicOp_SMIN, + MemAtomicOp_UMAX, + MemAtomicOp_UMIN, + MemAtomicOp_SWP +}; + +enum MemOp +{ + MemOp_ERROR = 0, + MemOp_LOAD, + MemOp_STORE, + MemOp_PREFETCH +}; + +enum MoveWideOp +{ + MoveWideOp_ERROR = 0, + MoveWideOp_N, + MoveWideOp_Z, + MoveWideOp_K +}; + +enum PSTATEField +{ + PSTATEField_ERROR = 0, + PSTATEField_DAIFSet, + PSTATEField_DAIFClr, + PSTATEField_PAN, // Armv8.1 + PSTATEField_UAO, // Armv8.2 + PSTATEField_DIT, // Armv8.4 + PSTATEField_SSBS, + PSTATEField_TCO, // Armv8.5 + PSTATEField_SP, + PSTATEField_SVCRZA, + PSTATEField_SVCRSM, + PSTATEField_SVCRSMZA +}; + +enum SVECmp +{ + Cmp_ERROR = -1, + Cmp_EQ, + Cmp_NE, + Cmp_GE, + Cmp_GT, + Cmp_LT, + Cmp_LE, + Cmp_UN +}; + +enum PrefetchHint +{ + Prefetch_ERROR = -1, + Prefetch_READ, + Prefetch_WRITE, + Prefetch_EXEC +}; + +enum Unpredictable +{ + Unpredictable_ERROR = -1, + Unpredictable_VMSR, + Unpredictable_WBOVERLAPLD, + Unpredictable_WBOVERLAPST, + Unpredictable_LDPOVERLAP, + Unpredictable_BASEOVERLAP, + Unpredictable_DATAOVERLAP, + Unpredictable_DEVPAGE2, + Unpredictable_DEVICETAGSTORE, + Unpredictable_INSTRDEVICE, + Unpredictable_RESCPACR, + Unpredictable_RESMAIR, + Unpredictable_RESTEXCB, + Unpredictable_RESDACR, + Unpredictable_RESPRRR, + Unpredictable_RESVTCRS, + Unpredictable_RESTnSZ, + Unpredictable_OORTnSZ, + Unpredictable_LARGEIPA, + Unpredictable_ESRCONDPASS, + Unpredictable_ILZEROIT, + Unpredictable_ILZEROT, + Unpredictable_BPVECTORCATCHPRI, + Unpredictable_VCMATCHHALF, + Unpredictable_VCMATCHDAPA, + Unpredictable_WPMASKANDBAS, + Unpredictable_WPBASCONTIGUOUS, + Unpredictable_RESWPMASK, + Unpredictable_WPMASKEDBITS, + Unpredictable_RESBPWPCTRL, + Unpredictable_BPNOTIMPL, + Unpredictable_RESBPTYPE, + Unpredictable_BPNOTCTXCMP, + Unpredictable_BPMATCHHALF, + Unpredictable_BPMISMATCHHALF, + Unpredictable_RESTARTALIGNPC, + Unpredictable_RESTARTZEROUPPERPC, + Unpredictable_ZEROUPPER, + Unpredictable_ERETZEROUPPERPC, + Unpredictable_A32FORCEALIGNPC, + Unpredictable_SMD, + Unpredictable_NONFAULT, + Unpredictable_SVEZEROUPPER, + Unpredictable_SVELDNFDATA, + Unpredictable_SVELDNFZERO, + Unpredictable_CHECKSPNONEACTIVE, + Unpredictable_AFUPDATE, // AF update for alignment or permission fault, + Unpredictable_IESBinDebug, // Use SCTLR[].IESB in Debug state, + Unpredictable_BADPMSFCR, // Bad settings for PMSFCR_EL1/PMSEVFR_EL1/PMSLATFR_EL1, + Unpredictable_ZEROBTYPE, + Unpredictable_CLEARERRITEZERO, // Clearing sticky errors when instruction in flight, + Unpredictable_ALUEXCEPTIONRETURN, + Unpredictable_DBGxVR_RESS, + Unpredictable_WFxTDEBUG, + Unpredictable_LS64UNSUPPORTED, +}; + +typedef struct DecodeBitMasks_ReturnType_ +{ + uint64_t wmask; + uint64_t tmask; +} DecodeBitMasks_ReturnType; + +int HighestSetBit(uint64_t x); +int LowestSetBit(uint64_t x); + +bool BFXPreferred(uint32_t sf, uint32_t uns, uint32_t imms, uint32_t immr); +int BitCount(uint32_t x); +DecodeBitMasks_ReturnType DecodeBitMasks( + uint8_t /*bit*/ immN, uint8_t /*bit(6)*/ imms, uint8_t /*bit(6)*/ immr); + +enum Constraint ConstrainUnpredictable(enum Unpredictable); +bool MoveWidePreferred(uint32_t sf, uint32_t immN, uint32_t imms, uint32_t immr); +bool SVEMoveMaskPreferred(uint32_t imm13); +enum ShiftType DecodeRegExtend(uint8_t op); +enum ShiftType DecodeShift(uint8_t op); +enum SystemOp SysOp(uint32_t op1, uint32_t CRn, uint32_t CRm, uint32_t op2); +uint32_t UInt(uint32_t); +uint32_t BitSlice(uint64_t, int hi, int lo); // including the endpoints +bool IsZero(uint64_t foo); +bool IsOnes(uint64_t foo, int width); +uint64_t Replicate(uint64_t val, uint8_t times, uint64_t width); +uint64_t AdvSIMDExpandImm(uint8_t op, uint8_t cmode, uint64_t imm8); + +bool BTypeCompatible_BTI(uint8_t hintcode, uint8_t pstate_btype); +bool BTypeCompatible_PACIXSP(void); + +enum FPRounding FPDecodeRounding(uint8_t RMode); +enum FPRounding FPRoundingMode(uint64_t fpcr); + +bool HaltingAllowed(void); +void SystemAccessTrap(uint32_t a, uint32_t b); +void CheckSystemAccess(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t); + +uint64_t VFPExpandImm(uint8_t imm8, unsigned width); + +#define EL0 0 +#define EL1 1 +#define EL2 2 +#define EL3 3 +bool EL2Enabled(void); +bool ELUsingAArch32(uint8_t); + +uint64_t FPOne(bool sign, int width); +uint64_t FPTwo(bool sign, int width); +uint64_t FPPointFive(bool sign, int width); + +uint64_t SignExtend(uint64_t x, int width); |
