mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-03 19:01:31 +00:00
103 lines
2.2 KiB
C
103 lines
2.2 KiB
C
/* radare2 - LGPL - Copyright 2020-2021 - pancake, aemmitt */
|
|
|
|
#include <r_asm.h>
|
|
#include <r_lib.h>
|
|
|
|
#include "operations.h"
|
|
#include "encodings_fmt.h"
|
|
#include "encodings_dec.h"
|
|
#include "arm64dis.h"
|
|
|
|
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
|
|
Instruction inst = {0};
|
|
char output[256];
|
|
op->size = 4;
|
|
if (len < 4) {
|
|
return -1;
|
|
}
|
|
ut32 n = r_read_le32 (buf);
|
|
// FailureCodes
|
|
int fc = aarch64_decompose (n, &inst, a->pc);
|
|
if (fc != DISASM_SUCCESS) {
|
|
return -1;
|
|
}
|
|
output[0] = 0;
|
|
fc = aarch64_disassemble (&inst, output, sizeof (output));
|
|
if (fc == DISASM_SUCCESS) {
|
|
if (*output) {
|
|
// XXX trim tailing newline on UNDEFINED string
|
|
/// output[strlen (output) - 2] = 0;
|
|
}
|
|
r_str_trim_tail (output);
|
|
r_str_replace_char (output, '\t', ' ');
|
|
r_str_replace_char (output, '#', ' ');
|
|
if (r_str_startswith (output, "UNDEF")) {
|
|
r_strbuf_set (&op->buf_asm, "undefined");
|
|
return 4 - (a->pc % 4);
|
|
}
|
|
r_strbuf_set (&op->buf_asm, output);
|
|
return op->size;
|
|
}
|
|
r_strbuf_set (&op->buf_asm, "invalid");
|
|
return 4 - (a->pc % 4);
|
|
}
|
|
|
|
static const char* v35_insn_name(int id) {
|
|
Instruction insn = { .operation = id };
|
|
return get_operation (&insn);
|
|
}
|
|
|
|
static char *mnemonics(RAsm *a, int id, bool json) {
|
|
int i;
|
|
if (id != -1) {
|
|
const char *name = v35_insn_name (id);
|
|
if (json) {
|
|
return name? r_str_newf ("[\"%s\"]\n", name): NULL;
|
|
}
|
|
return name? strdup (name): NULL;
|
|
}
|
|
RStrBuf *buf = r_strbuf_new ("");
|
|
if (json) {
|
|
r_strbuf_append (buf, "[");
|
|
}
|
|
for (i = 1; ; i++) {
|
|
const char *op = v35_insn_name (i);
|
|
if (!op) {
|
|
break;
|
|
}
|
|
if (json) {
|
|
r_strbuf_append (buf, "\"");
|
|
}
|
|
r_strbuf_append (buf, op);
|
|
if (json) {
|
|
if (v35_insn_name (i + 1)) {
|
|
r_strbuf_append (buf, "\",");
|
|
} else {
|
|
r_strbuf_append (buf, "\"]\n");
|
|
}
|
|
} else {
|
|
r_strbuf_append (buf, "\n");
|
|
}
|
|
}
|
|
return r_strbuf_drain (buf);
|
|
}
|
|
|
|
RAsmPlugin r_asm_plugin_arm_v35 = {
|
|
.name = "arm.v35",
|
|
.desc = "Vector35 ARM64 disassembler",
|
|
.license = "Apache",
|
|
.arch = "arm",
|
|
.bits = 64,
|
|
.endian = R_SYS_ENDIAN_LITTLE,
|
|
.mnemonics = mnemonics,
|
|
.disassemble = &disassemble,
|
|
};
|
|
|
|
#ifndef R2_PLUGIN_INCORE
|
|
R_API RLibStruct radare_plugin = {
|
|
.type = R_LIB_TYPE_ASM,
|
|
.data = &r_asm_plugin_arm_v35,
|
|
.version = R2_VERSION
|
|
};
|
|
#endif
|