summaryrefslogtreecommitdiff
path: root/arch/arm64/il.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2024-03-05 19:50:13 -0500
committerRusty Wagner <rusty.wagner@gmail.com>2024-03-05 20:34:34 -0500
commite093c21ed880ac3eb72119be15093ee04f8ce299 (patch)
tree9f720ebdc0ae415734b1199ed341668c69710a94 /arch/arm64/il.h
parent0609276712622908254065546102381466033141 (diff)
Move architecture modules into the API repo
Diffstat (limited to 'arch/arm64/il.h')
-rw-r--r--arch/arm64/il.h108
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);