static int disassemble(struct r_asm_t *a, struct r_asm_op_t *op, const ut8 *buf, ut64 len) { static struct disassemble_info disasm_obj; if (len<4) return -1; buf_global = op->buf_asm; Offset = a->pc; memcpy (bytes, buf, 4); // TODO handle thumb /* prepare disassembler */ memset (&disasm_obj,'\0', sizeof(struct disassemble_info)); mips_mode = a->bits; disasm_obj.arch = CPU_LOONGSON_2F; disasm_obj.buffer = bytes; disasm_obj.read_memory_func = &mips_buffer_read_memory; disasm_obj.symbol_at_address_func = &symbol_at_address; disasm_obj.memory_error_func = &memory_error_func; disasm_obj.print_address_func = &print_address; disasm_obj.buffer_vma = Offset; disasm_obj.buffer_length = 4; disasm_obj.endian = !a->big_endian; disasm_obj.fprintf_func = &buf_fprintf; disasm_obj.stream = stdout; op->buf_asm[0] = '\0'; if (a->big_endian) op->inst_len = print_insn_big_mips ((bfd_vma)Offset, &disasm_obj); else op->inst_len = print_insn_little_mips ((bfd_vma)Offset, &disasm_obj); if (op->inst_len == -1) strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE); return op->inst_len; }
static int disassemble(struct r_asm_t *a, struct r_asm_op_t *op, const ut8 *buf, int len) { static struct disassemble_info disasm_obj; if (len < 4) { return -1; } buf_global = r_strbuf_get (&op->buf_asm); Offset = a->pc; memcpy (bytes, buf, 4); // TODO handle thumb /* prepare disassembler */ memset (&disasm_obj,'\0', sizeof (struct disassemble_info)); mips_mode = a->bits; disasm_obj.arch = CPU_LOONGSON_2F; disasm_obj.buffer = bytes; disasm_obj.read_memory_func = &mips_buffer_read_memory; disasm_obj.symbol_at_address_func = &symbol_at_address; disasm_obj.memory_error_func = &memory_error_func; disasm_obj.print_address_func = &print_address; disasm_obj.buffer_vma = Offset; disasm_obj.buffer_length = 4; disasm_obj.endian = !a->big_endian; disasm_obj.fprintf_func = &buf_fprintf; disasm_obj.stream = stdout; op->size = (disasm_obj.endian == BFD_ENDIAN_LITTLE) ? print_insn_little_mips ((bfd_vma)Offset, &disasm_obj) : print_insn_big_mips ((bfd_vma)Offset, &disasm_obj); if (op->size == -1) { r_strbuf_set (&op->buf_asm, "(data)"); } return op->size; }