aboutsummaryrefslogtreecommitdiff
path: root/tdump/src/disassembler.c
diff options
context:
space:
mode:
Diffstat (limited to 'tdump/src/disassembler.c')
-rw-r--r--tdump/src/disassembler.c191
1 files changed, 96 insertions, 95 deletions
diff --git a/tdump/src/disassembler.c b/tdump/src/disassembler.c
index e9383ca..d2b34c8 100644
--- a/tdump/src/disassembler.c
+++ b/tdump/src/disassembler.c
@@ -11,36 +11,36 @@ struct disasm_ctx {
static const char *get_gpr(tri_t x)
{
switch (x) {
- case X0: return "x0";
- case X1: return "sp";
- case X2: return "fp";
- case X3: return "gp";
- case X4: return "a0";
- case X5: return "a1";
- case X6: return "a2";
- case X7: return "a3";
- case X8: return "a4";
- case X9: return "a5";
- case X10: return "a6";
- case X11: return "t0";
- case X12: return "t1";
- case X13: return "t2";
- case X14: return "t3";
- case X15: return "t4";
- case X16: return "t5";
- case X17: return "t6";
- case X18: return "s0";
- case X19: return "s1";
- case X20: return "s2";
- case X21: return "s3";
- case X22: return "s4";
- case X23: return "s5";
- case X24: return "s6";
- case X25: return "tp";
- case X26: return "ra";
- case X27: return "a7";
- case X28: return "a8";
- case X29: return "a9";
+ case X0: return "x0";
+ case X1: return "sp";
+ case X2: return "fp";
+ case X3: return "gp";
+ case X4: return "a0";
+ case X5: return "a1";
+ case X6: return "a2";
+ case X7: return "a3";
+ case X8: return "a4";
+ case X9: return "a5";
+ case X10: return "a6";
+ case X11: return "t0";
+ case X12: return "t1";
+ case X13: return "t2";
+ case X14: return "t3";
+ case X15: return "t4";
+ case X16: return "t5";
+ case X17: return "t6";
+ case X18: return "s0";
+ case X19: return "s1";
+ case X20: return "s2";
+ case X21: return "s3";
+ case X22: return "s4";
+ case X23: return "s5";
+ case X24: return "s6";
+ case X25: return "tp";
+ case X26: return "ra";
+ case X27: return "a7";
+ case X28: return "a8";
+ case X29: return "a9";
case X30: return "a10";
case X31: return "a11";
case X32: return "a12";
@@ -56,9 +56,9 @@ static const char *get_gpr(tri_t x)
case X42: return "a22";
case X43: return "a23";
case X44: return "a24";
- case X45: return "t7";
- case X46: return "t8";
- case X47: return "t9";
+ case X45: return "t7";
+ case X46: return "t8";
+ case X47: return "t9";
case X48: return "t10";
case X49: return "t11";
case X50: return "t12";
@@ -74,9 +74,9 @@ static const char *get_gpr(tri_t x)
case X60: return "t22";
case X61: return "t23";
case X62: return "t24";
- case X63: return "s7";
- case X64: return "s8";
- case X65: return "s9";
+ case X63: return "s7";
+ case X64: return "s8";
+ case X65: return "s9";
case X66: return "s10";
case X67: return "s11";
case X68: return "s12";
@@ -119,7 +119,7 @@ static void *read_object_file(const char *file, size_t *len)
if (!buf)
return NULL;
- fread(buf, s, 1 , f);
+ fread(buf, s, 1, f);
fclose(f);
return buf;
@@ -136,7 +136,7 @@ static void disasm_lui(struct disasm_ctx *ctx, tri_t i)
size_t l = tri_fmt_default(imm, 256, imm18);
imm[l] = '\0';
printf(DEFAULT_PREFIX "lui %s, %s\n",
- ctx->pc, get_gpr(rd), imm);
+ ctx->pc, get_gpr(rd), imm);
}
static void disasm_store(struct disasm_ctx *ctx, tri_t i)
@@ -149,16 +149,16 @@ static void disasm_store(struct disasm_ctx *ctx, tri_t i)
int w = tri_get_trit(fn0, 4);
char *width = NULL;
switch (w) {
- case 0: width = "t"; break;
- case 1: width = "w"; break;
- default: width = "ill"; break;
+ case 0: width = "t"; break;
+ case 1: width = "w"; break;
+ default: width = "ill"; break;
}
char imm[256];
size_t l = tri_fmt_default(imm, 256, imm9);
imm[l] = '\0';
printf(DEFAULT_PREFIX "st %s, %s, %s(%s)\n",
- ctx->pc, width, get_gpr(rs1), imm, get_gpr(rs2));
+ ctx->pc, width, get_gpr(rs1), imm, get_gpr(rs2));
}
static void disasm_load(struct disasm_ctx *ctx, tri_t i)
@@ -169,16 +169,16 @@ static void disasm_load(struct disasm_ctx *ctx, tri_t i)
int w = tri_get_trit(fn0, 4);
char *width = NULL;
switch (w) {
- case 0: width = "t"; break;
- case 1: width = "w"; break;
- default: width = "ill"; break;
+ case 0: width = "t"; break;
+ case 1: width = "w"; break;
+ default: width = "ill"; break;
}
char imm[256];
size_t l = tri_fmt_default(imm, 256, imm9);
imm[l] = '\0';
printf(DEFAULT_PREFIX "ld %s, %s, %s(%s)\n",
- ctx->pc, width, get_gpr(rd), imm, get_gpr(rs1));
+ ctx->pc, width, get_gpr(rd), imm, get_gpr(rs1));
}
static void disasm_op_imm(struct disasm_ctx *ctx, tri_t i)
@@ -191,14 +191,14 @@ static void disasm_op_imm(struct disasm_ctx *ctx, tri_t i)
imm[l] = '\0';
switch (fn0) {
- case OP_IMM_ADDI:
- printf(DEFAULT_PREFIX "addi %s, %s, %s\n",
- ctx->pc, get_gpr(rd), get_gpr(rs1), imm);
- break;
+ case OP_IMM_ADDI:
+ printf(DEFAULT_PREFIX "addi %s, %s, %s\n",
+ ctx->pc, get_gpr(rd), get_gpr(rs1), imm);
+ break;
- default:
- printf(DEFAULT_PREFIX "unknown/unimp op_imm\n",
- ctx->pc);
+ default:
+ printf(DEFAULT_PREFIX "unknown/unimp op_imm\n",
+ ctx->pc);
}
}
@@ -208,32 +208,32 @@ static void disasm_op(struct disasm_ctx *ctx, tri_t i)
parse_r(i, &rd, &fn0, &rs1, &rs2, &fn5);
switch (fn5) {
- case 0:
+ case 0:
switch (fn0) {
- case OP_ADD:
- printf(DEFAULT_PREFIX "add %s, %s, %s\n",
- ctx->pc,
- get_gpr(rd),
- get_gpr(rs1),
- get_gpr(rs2));
- break;
+ case OP_ADD:
+ printf(DEFAULT_PREFIX "add %s, %s, %s\n",
+ ctx->pc,
+ get_gpr(rd),
+ get_gpr(rs1),
+ get_gpr(rs2));
+ break;
- case OP_SUB:
- printf(DEFAULT_PREFIX "sub %s, %s, %s\n",
- ctx->pc,
- get_gpr(rd),
- get_gpr(rs1),
- get_gpr(rs2));
- break;
+ case OP_SUB:
+ printf(DEFAULT_PREFIX "sub %s, %s, %s\n",
+ ctx->pc,
+ get_gpr(rd),
+ get_gpr(rs1),
+ get_gpr(rs2));
+ break;
- default:
- printf(DEFAULT_PREFIX "unknown/unimp op\n",
- ctx->pc);
+ default:
+ printf(DEFAULT_PREFIX "unknown/unimp op\n",
+ ctx->pc);
}
break;
- default: printf(DEFAULT_PREFIX "unknown/unimp op metaclass\n",
- ctx->pc);
+ default: printf(DEFAULT_PREFIX "unknown/unimp op metaclass\n",
+ ctx->pc);
}
}
@@ -247,11 +247,11 @@ static void disasm_jalr(struct disasm_ctx *ctx, tri_t i)
imm[l] = '\0';
switch (fn0) {
- case 0:
- printf(DEFAULT_PREFIX "jalr %s, %s(%s)\n",
- ctx->pc, get_gpr(rd), imm, get_gpr(rs1));
+ case 0:
+ printf(DEFAULT_PREFIX "jalr %s, %s(%s)\n",
+ ctx->pc, get_gpr(rd), imm, get_gpr(rs1));
break;
- default: printf(DEFAULT_PREFIX "unknown/unimp jalr\n", ctx->pc);
+ default: printf(DEFAULT_PREFIX "unknown/unimp jalr\n", ctx->pc);
}
}
@@ -267,11 +267,11 @@ static void disasm_branch(struct disasm_ctx *ctx, tri_t i)
imm[l] = '\0';
switch (fn0) {
- case BRANCH_BLT:
- printf(DEFAULT_PREFIX "blt %s, %s, %s\n",
- ctx->pc, get_gpr(rs1), get_gpr(rs2), imm);
+ case BRANCH_BLT:
+ printf(DEFAULT_PREFIX "blt %s, %s, %s\n",
+ ctx->pc, get_gpr(rs1), get_gpr(rs2), imm);
break;
- default: printf(DEFAULT_PREFIX "unknown/unimp branch\n", ctx->pc);
+ default: printf(DEFAULT_PREFIX "unknown/unimp branch\n", ctx->pc);
}
}
@@ -285,7 +285,7 @@ static void disasm_auipc(struct disasm_ctx *ctx, tri_t i)
imm[l] = '\0';
printf(DEFAULT_PREFIX "auipc %s, %s\n",
- ctx->pc, get_gpr(rd), imm);
+ ctx->pc, get_gpr(rd), imm);
}
static tri_t read1(struct disasm_ctx *ctx, size_t off)
@@ -307,23 +307,24 @@ int disassemble(const char *file)
size_t len = 0;
const uint32_t *buf = read_object_file(file, &len);
/* somewhat specific but we know that each tryte is mapped to uin32_t */
- struct disasm_ctx ctx = {.buf = buf, .pc = 0, .len = len / sizeof(uint32_t)};
+ struct disasm_ctx ctx = {.buf = buf, .pc = 0,
+ .len = len / sizeof(uint32_t)};
while (ctx.pc < ctx.len) {
tri_t i = read3(&ctx, ctx.pc);
switch (parse_opcode(i)) {
- case OPCODE_LUI: disasm_lui(&ctx, i); break;
- case OPCODE_STORE: disasm_store(&ctx, i); break;
- case OPCODE_LOAD: disasm_load(&ctx, i); break;
- //case OPCODE_SYSTEM: disasm_system(&ctx, i); break;
- case OPCODE_OP_IMM: disasm_op_imm(&ctx, i); break;
- case OPCODE_OP: disasm_op(&ctx, i); break;
- case OPCODE_JALR: disasm_jalr(&ctx, i); break;
- case OPCODE_BRANCH: disasm_branch(&ctx, i); break;
- case OPCODE_AUIPC: disasm_auipc(&ctx, i); break;
- default:
- printf(DEFAULT_PREFIX "unimp/illegal\n", ctx.pc);
- break;
+ case OPCODE_LUI: disasm_lui(&ctx, i); break;
+ case OPCODE_STORE: disasm_store(&ctx, i); break;
+ case OPCODE_LOAD: disasm_load(&ctx, i); break;
+ //case OPCODE_SYSTEM: disasm_system(&ctx, i); break;
+ case OPCODE_OP_IMM: disasm_op_imm(&ctx, i); break;
+ case OPCODE_OP: disasm_op(&ctx, i); break;
+ case OPCODE_JALR: disasm_jalr(&ctx, i); break;
+ case OPCODE_BRANCH: disasm_branch(&ctx, i); break;
+ case OPCODE_AUIPC: disasm_auipc(&ctx, i); break;
+ default:
+ printf(DEFAULT_PREFIX "unimp/illegal\n", ctx.pc);
+ break;
}
ctx.pc += 3;
}