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) {
imme = static_cast<U16>(inst->imm16);
shift = static_cast<U8>(inst->hw * 16);
op = static_cast<OP>(inst->opc);
if (inst->sf == 0) {
if (inst->sf == 1) {
rd = XRegister::get(static_cast<U8>(inst->rd));
} else {
rd = WRegister::get(static_cast<U8>(inst->rd));
......@@ -127,5 +127,36 @@ void A64_B_BL::decode(aarch64_b_bl *inst) {
void A64_B_BL::assembler() {
get()->opcode = B_BL_OPCODE;
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 @@
#include "../../../asm/instruction.h"
#include "../../../includes/base.h"
#include "../register/register_a64.h"
#include "../../../../../../../hooklib/src/main/cpp/includes/inst.h"
namespace SandHook {
......@@ -206,6 +207,31 @@ namespace SandHook {
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 {
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
......@@ -44,11 +44,11 @@ namespace SandHook {
return raw;
}
Raw* get() const {
inline Raw* get() const {
return raw;
}
void set(Raw raw) const {
inline void set(Raw raw) const {
*this->raw = raw;
}
......@@ -95,7 +95,7 @@ namespace SandHook {
return false;
}
virtual void decode(Inst* decode) {}
virtual void decode(Inst* inst) {}
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