static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { static char *oldcpu = NULL; static int oldcpucode = 0; int opsize, cpucode = 0; struct disassemble_info obj; char *options = (a->bits==16)? "force-thumb": "no-force-thumb"; if (len<2) return -1; memset (bytes, 0, sizeof (bytes)); memcpy (bytes, buf, R_MIN (len, 4)); if (a->bits<64 && len<(a->bits/8)) return -1; buf_global = op->buf_asm; Offset = a->pc; /* prepare disassembler */ memset (&obj,'\0', sizeof (struct disassemble_info)); arm_mode = a->bits; cpucode = oldcpucode; /* select cpu */ if (a->cpu) { if (oldcpu != a->cpu) { cpucode = atoi (a->cpu); if (!strcmp ("v5j", a->cpu)) cpucode = 9; } } obj.arch = 0; obj.mach = cpucode; oldcpucode = cpucode; obj.buffer = bytes; obj.read_memory_func = &arm_buffer_read_memory; obj.symbol_at_address_func = &symbol_at_address; obj.memory_error_func = &memory_error_func; obj.print_address_func = &print_address; obj.endian = !a->big_endian; obj.fprintf_func = &buf_fprintf; obj.stream = stdout; obj.bytes_per_chunk = obj.bytes_per_line = (a->bits/8); op->buf_asm[0]='\0'; if (a->bits==64) { obj.disassembler_options = NULL; memcpy (bytes, buf, 4); op->size = print_insn_aarch64 ((bfd_vma)Offset, &obj); } else { obj.disassembler_options = options; op->size = (obj.endian == BFD_ENDIAN_LITTLE)? print_insn_little_arm ((bfd_vma)Offset, &obj): print_insn_big_arm ((bfd_vma)Offset, &obj); } opsize = op->size; if (op->size == -1) { strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE); op->size = 4; } return opsize; }
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; /* fetching is 4 byte aligned */ 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)); arm_mode = a->bits; //disasm_obj.arch = ARM_EXT_V1|ARM_EXT_V4T|ARM_EXT_V5; /* TODO: set arch */ disasm_obj.arch =0xffffffff; disasm_obj.mach =0xffffffff; disasm_obj.buffer = bytes; disasm_obj.read_memory_func = &arm_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.endian = !a->big_endian; disasm_obj.fprintf_func = &buf_fprintf; disasm_obj.stream = stdout; disasm_obj.bytes_per_chunk = disasm_obj.bytes_per_line = (a->bits/8); op->buf_asm[0]='\0'; if (disasm_obj.endian) op->inst_len = print_insn_little_arm ( (bfd_vma)Offset, &disasm_obj); else op->inst_len = print_insn_big_arm ( (bfd_vma)Offset, &disasm_obj); if (op->inst_len == -1) strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE); return op->inst_len; //(a->bits/8); //op->inst_len; }