Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions librz/arch/isa/luac/luajit/arch_2.1.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,24 @@ st32 luajitop_get_value(ut32 instr) {
return offset;
}

char *luajitop_new_str_3arg(char *opname, int a, int b, int c) {
return rz_str_newf("%s r%d %d %d", opname, a, b, c);
void luajitop_setf_asm_3arg(RzAsmOp *op, char *opname, int a, int b, int c) {
rz_asm_op_setf_asm(op, "%s r%d %d %d", opname, a, b, c);
}

char *luajitop_new_str_2arg(char *opname, int a, int b) {
return rz_str_newf("%s r%d %d", opname, a, b);
void luajitop_setf_asm_2arg(RzAsmOp *op, char *opname, int a, int b) {
rz_asm_op_setf_asm(op, "%s r%d %d", opname, a, b);
}

char *luajitop_new_str_1arg(char *opname, int a) {
return rz_str_newf("%s %d", opname, a);
void luajitop_setf_asm_1arg(RzAsmOp *op, char *opname, int a) {
rz_asm_op_setf_asm(op, "%s r%d", opname, a);
}

// For Register to constant value (e.g., KSHORT r1, 8)
char *luajitop_new_str_reg_const(const char *opname, ut32 a, st32 d) {
return rz_str_newf("%s r%d %d", opname, a, d);
void luajitop_setf_asm_reg_const(RzAsmOp *op, const char *opname, ut32 a, st32 d) {
rz_asm_op_setf_asm(op, "%s r%d %d", opname, a, d);
}

// For Register to Register (e.g., MOV r5, r4)
char *luajitop_new_str_reg_reg(const char *opname, ut32 a, ut32 d) {
return rz_str_newf("%s r%d r%d", opname, a, d);
void luajitop_setf_asm_reg_reg(RzAsmOp *op, const char *opname, ut32 a, st32 d) {
rz_asm_op_setf_asm(op, "%s r%d r%d", opname, a, d);
}
11 changes: 5 additions & 6 deletions librz/arch/isa/luac/luajit/arch_2.1.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,11 @@ int luajit_analysis_op(RzAnalysis *analysis, RzAnalysisOp *op, ut64 addr, const

/* Asm */
int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions instr, LuaJITOpCode opcode);
char *luajitop_new_str_3arg(char *opname, int a, int b, int c);
char *luajitop_new_str_2arg(char *opname, int a, int b);
char *luajitop_new_str_1arg(char *opname, int a);
char *luajitop_new_str_reg_reg(const char *opname, ut32 a, ut32 d);
char *luajitop_new_str_reg_const(const char *opname, ut32 a, st32 d);

void luajitop_setf_asm_3arg(RzAsmOp *op, char *opname, int a, int b, int c);
void luajitop_setf_asm_2arg(RzAsmOp *op, char *opname, int a, int b);
void luajitop_setf_asm_1arg(RzAsmOp *op, char *opname, int a);
void luajitop_setf_asm_reg_const(RzAsmOp *op, const char *opname, ut32 a, st32 d);
void luajitop_setf_asm_reg_reg(RzAsmOp *op, const char *opname, ut32 a, st32 d);
#define LUAJIT_GET_OPCODE(i) (cast(int, (i) & 0xFF))
#define LUAJIT_GET_A(i) (cast(int, ((i) >> 8) & 0xFF)) /*Get A*/
#define LUAJIT_GET_C(i) (cast(int, ((i) >> 16) & 0xFF)) /*Get B*/
Expand Down
25 changes: 11 additions & 14 deletions librz/arch/isa/luac/luajit/asm_2.1.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions
int c = LUAJIT_GET_C(instr);
int d = LUAJIT_GET_D(instr);

char *asm_str = NULL;

switch (opcode) {
// A D FORMAT (2 Operands)

Expand Down Expand Up @@ -44,7 +42,7 @@ int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions
case LUAJIT_OP_NOT: /* A D R(A) := ~R(D) */
case LUAJIT_OP_UNM: /* A D R(A) := -R(D) */
case LUAJIT_OP_LEN: /* A D R(A) := length of R(D) */
asm_str = luajitop_new_str_reg_reg(opname, a, d);
luajitop_setf_asm_reg_reg(op, opname, a, d);
break;
/* Constant loads */
case LUAJIT_OP_KSTR: /* A D R(A) := KSTR(D) */
Expand All @@ -64,7 +62,7 @@ int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions
case LUAJIT_OP_TDUP: /* A D R(A) := duplicate table(KTAB(D)) */
case LUAJIT_OP_GGET: /* A D R(A) := _G[KSTR(D)] */
case LUAJIT_OP_GSET: /* A D _G[KSTR(D)] := R(A) */
asm_str = luajitop_new_str_reg_const(opname, a, d);
luajitop_setf_asm_reg_const(op, opname, a, d);
break;
/* Calls and vararg handling (AD only) */
case LUAJIT_OP_CALLMT: /* A D return R(A)(R(A+1)...) */
Expand All @@ -87,18 +85,18 @@ int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions
case LUAJIT_OP_LOOP: /* A D generic loop body */
case LUAJIT_OP_ILOOP: /* A D interpreted loop body */
case LUAJIT_OP_JLOOP: /* A D JIT-compiled loop body */
asm_str = luajitop_new_str_2arg(opname, a, d);
luajitop_setf_asm_2arg(op, opname, a, d);
break;
case LUAJIT_OP_JMP: /* A D pc += (D - 0x8000) */
d = luajitop_get_value(instr);
asm_str = luajitop_new_str_2arg(opname, a, d);
luajitop_setf_asm_2arg(op, opname, a, d);
break;
case LUAJIT_OP_KSHORT: /* A D R(A) := (int16_t)D */
// Note: Needs the cast to signed 16-bit
asm_str = luajitop_new_str_reg_const(opname, a, (st16)d);
luajitop_setf_asm_reg_const(op, opname, a, (st16)d);
break;
case LUAJIT_OP_KNIL: /* A D R(A) ... R(D) := nil */
asm_str = rz_str_newf("%s r%d...r%d", opname, a, d);
rz_asm_op_setf_asm(op, "%s r%d...r%d", opname, a, d);
break;

// A B C FORMAT (3 Operands)
Expand Down Expand Up @@ -136,7 +134,7 @@ int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions
case LUAJIT_OP_ITERC: /* A B C R(A)... := R(A-3)(R(A-2), R(A-1)) */
case LUAJIT_OP_ITERN: /* A B C fast loop iterator */
case LUAJIT_OP_VARG: /* A B C R(A)...R(A+B-2) := vararg */
asm_str = luajitop_new_str_3arg(opname, a, b, c);
luajitop_setf_asm_3arg(op, opname, a, b, c);
break;

// A FORMAT (1 Operands)
Expand All @@ -149,17 +147,16 @@ int luajit_disasm(RzAsmOp *op, int len, LuaJITOpName opname, LuaJITInstructions
case LUAJIT_OP_JFUNCV: /* A JIT-compiled function header, varargs */
case LUAJIT_OP_FUNCC: /* A C function header */
case LUAJIT_OP_FUNCCW: /* A C function header with wrapper */
asm_str = luajitop_new_str_1arg(opname, a);
luajitop_setf_asm_1arg(op, opname, a);
break;
// FALLBACKS
case LUAJIT_OP__MAX: /* The maximum opcode */
asm_str = rz_str_newf("Max");
rz_asm_op_setf_asm(op, "%s", "Max");
break;
default:
asm_str = rz_str_newf("invalid");
rz_asm_op_setf_asm(op, "%s", "invalid");
break;
}
op->size = 4;
rz_asm_op_set_asm(op, asm_str);
RZ_FREE(asm_str);
return 4;
}
Loading