Commit 91f6050c authored by swift_gan's avatar swift_gan Committed by swift_gan

add cbz cbnz

parent c8ec5259
...@@ -94,7 +94,7 @@ void A64_MOV_WIDE::decode(aarch64_mov_wide *inst) { ...@@ -94,7 +94,7 @@ void A64_MOV_WIDE::decode(aarch64_mov_wide *inst) {
imme = static_cast<U16>(inst->imm16); imme = static_cast<U16>(inst->imm16);
shift = static_cast<U8>(inst->hw * 16); shift = static_cast<U8>(inst->hw * 16);
op = static_cast<OP>(inst->opc); op = static_cast<OP>(inst->opc);
if (inst->sf == 0) { if (inst->sf == 1) {
rd = XRegister::get(static_cast<U8>(inst->rd)); rd = XRegister::get(static_cast<U8>(inst->rd));
} else { } else {
rd = WRegister::get(static_cast<U8>(inst->rd)); rd = WRegister::get(static_cast<U8>(inst->rd));
...@@ -127,5 +127,36 @@ void A64_B_BL::decode(aarch64_b_bl *inst) { ...@@ -127,5 +127,36 @@ void A64_B_BL::decode(aarch64_b_bl *inst) {
void A64_B_BL::assembler() { void A64_B_BL::assembler() {
get()->opcode = B_BL_OPCODE; get()->opcode = B_BL_OPCODE;
get()->op = op; get()->op = op;
get()->imm26 = TruncateToUint32(offset); get()->imm26 = TruncateToUint26(offset);
} }
//CBZ CBNZ
A64_CBZ_CBNZ::A64_CBZ_CBNZ() {}
A64_CBZ_CBNZ::A64_CBZ_CBNZ(aarch64_cbz_cbnz *inst) : A64_INST_PC_REL(inst) {}
ADDR A64_CBZ_CBNZ::getImmPCOffset() {
return signExtend64(19 + 2, COMBINE(get()->imm19, 0b00, 2));
}
void A64_CBZ_CBNZ::decode(aarch64_cbz_cbnz *inst) {
op = static_cast<OP>(get()->op);
if (inst->sf == 1) {
rt = XRegister::get(static_cast<U8>(inst->rt));
} else {
rt = WRegister::get(static_cast<U8>(inst->rt));
}
offset = getImmPCOffset();
}
void A64_CBZ_CBNZ::assembler() {
get()->opcode = CBZ_CBNZ_OPCODE;
get()->op = op;
get()->rt = rt->getCode();
get()->sf = rt->is64Bit() ? 1 : 0;
get()->imm19 = TruncateToUint19(offset);
}
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "../../../asm/instruction.h" #include "../../../asm/instruction.h"
#include "../../../includes/base.h" #include "../../../includes/base.h"
#include "../register/register_a64.h" #include "../register/register_a64.h"
#include "../../../../../../../hooklib/src/main/cpp/includes/inst.h"
namespace SandHook { namespace SandHook {
...@@ -206,6 +207,31 @@ namespace SandHook { ...@@ -206,6 +207,31 @@ namespace SandHook {
ADDR offset; ADDR offset;
}; };
class A64_CBZ_CBNZ : public A64_INST_PC_REL<aarch64_cbz_cbnz> {
public:
enum OP {
CBZ = 0,
CBNZ = 1
};
A64_CBZ_CBNZ();
A64_CBZ_CBNZ(aarch64_cbz_cbnz *inst);
ADDR getImmPCOffset() override;
void decode(aarch64_cbz_cbnz *inst) override;
void assembler() override;
private:
OP op;
ADDR offset;
RegisterA64* rt;
};
} }
} }
......
...@@ -65,4 +65,13 @@ struct aarch64_b_bl { ...@@ -65,4 +65,13 @@ struct aarch64_b_bl {
InstA64 imm26:26; InstA64 imm26:26;
}; };
#define CBZ_CBNZ_OPCODE 0b011010
struct aarch64_cbz_cbnz {
InstA64 sf:1;
InstA64 opcode:6;
InstA64 op:1;
InstA64 imm19:19;
InstA64 rt:5;
};
#endif //SANDHOOK_NH_INST_AARCH64_H #endif //SANDHOOK_NH_INST_AARCH64_H
...@@ -44,11 +44,11 @@ namespace SandHook { ...@@ -44,11 +44,11 @@ namespace SandHook {
return raw; return raw;
} }
Raw* get() const { inline Raw* get() const {
return raw; return raw;
} }
void set(Raw raw) const { inline void set(Raw raw) const {
*this->raw = raw; *this->raw = raw;
} }
...@@ -95,7 +95,7 @@ namespace SandHook { ...@@ -95,7 +95,7 @@ namespace SandHook {
return false; return false;
} }
virtual void decode(Inst* decode) {} virtual void decode(Inst* inst) {}
virtual void assembler() {} virtual void assembler() {}
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment