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/il.h | |
| parent | 0609276712622908254065546102381466033141 (diff) | |
Move architecture modules into the API repo
Diffstat (limited to 'arch/arm64/il.h')
| -rw-r--r-- | arch/arm64/il.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/arch/arm64/il.h b/arch/arm64/il.h new file mode 100644 index 00000000..4ce5904c --- /dev/null +++ b/arch/arm64/il.h @@ -0,0 +1,108 @@ +#pragma once + +#include "binaryninjaapi.h" +#include "disassembler/arm64dis.h" +#include "disassembler/encodings_dec.h" +#include "disassembler/encodings_fmt.h" +#include "disassembler/operations.h" + +/* Do we lift pointer authentication instructions as intrinsics? + If no, the below define should be preceeded with "//" + If yes, the below define should start with "#define" and intrinsics are used. + This is read by il.cpp and arm64test.py */ +//#define LIFT_PAC_AS_INTRINSIC 1 + +#define IL_FLAG_N 31 +#define IL_FLAG_Z 30 +#define IL_FLAG_C 29 +#define IL_FLAG_V 28 + +#define IL_FLAG_WRITE_NONE 0 +#define IL_FLAG_WRITE_ALL 1 +#define IL_FLAG_WRITE_ALL_FLOAT 2 + +#define IL_FLAG_CLASS_INT 1 +#define IL_FLAG_CLASS_FLOAT 2 + +#define IL_FLAG_GROUP_EQ 1 +#define IL_FLAG_GROUP_NE 2 +#define IL_FLAG_GROUP_CS 3 +#define IL_FLAG_GROUP_CC 4 +#define IL_FLAG_GROUP_MI 5 +#define IL_FLAG_GROUP_PL 6 +#define IL_FLAG_GROUP_VS 7 +#define IL_FLAG_GROUP_VC 8 +#define IL_FLAG_GROUP_HI 9 +#define IL_FLAG_GROUP_LS 10 +#define IL_FLAG_GROUP_GE 11 +#define IL_FLAG_GROUP_LT 12 +#define IL_FLAG_GROUP_GT 13 +#define IL_FLAG_GROUP_LE 14 + +enum Arm64Intrinsic : uint32_t +{ + ARM64_INTRIN_AUTDA, + ARM64_INTRIN_AUTDB, + ARM64_INTRIN_AUTIA, + ARM64_INTRIN_AUTIB, + ARM64_INTRIN_DC, + ARM64_INTRIN_DMB, + ARM64_INTRIN_DSB, + ARM64_INTRIN_ESB, + ARM64_INTRIN_HINT_BTI, + ARM64_INTRIN_HINT_CSDB, + ARM64_INTRIN_HINT_DGH, + ARM64_INTRIN_HINT_TSB, + ARM64_INTRIN_ISB, + ARM64_INTRIN_MRS, + ARM64_INTRIN_MSR, + ARM64_INTRIN_PACDA, + ARM64_INTRIN_PACDB, + ARM64_INTRIN_PACGA, + ARM64_INTRIN_PACIA, + ARM64_INTRIN_PACIB, + ARM64_INTRIN_PRFM, + ARM64_INTRIN_PSBCSYNC, + ARM64_INTRIN_SEV, + ARM64_INTRIN_SEVL, + ARM64_INTRIN_WFE, + ARM64_INTRIN_WFI, + ARM64_INTRIN_XPACD, + ARM64_INTRIN_XPACI, + ARM64_INTRIN_YIELD, + ARM64_INTRIN_ERET, + ARM64_INTRIN_CLZ, + ARM64_INTRIN_CLREX, + ARM64_INTRIN_REV, + ARM64_INTRIN_RBIT, + ARM64_INTRIN_AESD, + ARM64_INTRIN_AESE, + ARM64_INTRIN_LDXR, + ARM64_INTRIN_LDXRB, + ARM64_INTRIN_LDXRH, + ARM64_INTRIN_LDAXR, + ARM64_INTRIN_LDAXRB, + ARM64_INTRIN_LDAXRH, + ARM64_INTRIN_STXR, + ARM64_INTRIN_STXRB, + ARM64_INTRIN_STXRH, + ARM64_INTRIN_STLXR, + ARM64_INTRIN_STLXRB, + ARM64_INTRIN_STLXRH, + ARM64_INTRIN_NORMAL_END, /* needed so intrinsics can be extended by other lists, like neon + intrinsics */ + ARM64_INTRIN_INVALID = 0xFFFFFFFF, +}; + +enum Arm64FakeRegister : uint32_t +{ + FAKEREG_SYSREG_UNKNOWN = SYSREG_END + 1, + FAKEREG_SYSCALL_INFO = SYSREG_END + 2 +}; + +bool GetLowLevelILForInstruction(BinaryNinja::Architecture* arch, uint64_t addr, + BinaryNinja::LowLevelILFunction& il, Instruction& instr, size_t addrSize, bool alignmentRequired); + +BinaryNinja::ExprId ExtractRegister(BinaryNinja::LowLevelILFunction& il, + InstructionOperand& operand, size_t regNum, size_t extractSize, bool signExtend, + size_t resultSize); |
