static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { static struct disassemble_info disasm_obj; if (len<4) return -1; buf_global = op->buf_asm; Offset = a->pc; // disasm inverted r_mem_swapendian (bytes, buf, 4); // TODO handle thumb /* prepare disassembler */ memset (&disasm_obj,'\0', sizeof (struct disassemble_info)); disasm_obj.buffer = bytes; disasm_obj.read_memory_func = &sparc_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.mach = ((a->bits == 64) ? bfd_mach_sparc_v9b : 0); op->buf_asm[0]='\0'; op->size = print_insn_sparc ((bfd_vma)Offset, &disasm_obj); if (op->size == -1) strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE); return op->size; }
// The default endian is LE for streams. // This function either swaps or copies len bytes depending on bool big_endian // TODO: Remove completely R_API void r_mem_swaporcopy(ut8 *dest, const ut8 *src, int len, bool big_endian) { if (big_endian) { r_mem_swapendian (dest, src, len); } else { memcpy (dest, src, len); } }
static bool check_bytes(const ut8 *buf, ut64 length) { bool ret = false; int off, version = 0; if (buf && length > 32 && !memcmp (buf, "\xca\xfe\xba\xbe", 4)) { // XXX not sure about endianness here memcpy (&off, buf + 4 * sizeof (int), sizeof (int)); version = buf[6] | (buf[7] << 8); if (version > 1024) { // XXX is this correct in all cases? opposite of prev? r_mem_swapendian ((ut8 *) &off, (ut8 *) &off, sizeof (int)); ret = true; } } return ret; }
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { ut8 buf2[4]; struct winedbg_arm_insn *arminsn = arm_new(); arm_set_pc (arminsn, a->pc); arm_set_thumb (arminsn, a->bits == 16); if (a->big_endian && a->bits == 32) { r_mem_swapendian (buf2, buf, 4); arm_set_input_buffer (arminsn, buf2); } else { arm_set_input_buffer (arminsn, buf); } op->size = arm_disasm_one_insn (arminsn); strncpy (op->buf_asm, winedbg_arm_insn_asm (arminsn), R_ASM_BUFSIZE-1); strncpy (op->buf_hex, winedbg_arm_insn_hex (arminsn), R_ASM_BUFSIZE-1); arm_free (arminsn); return op->size; }
static void h8300_anal_jmp(RAnalOp *op, ut64 addr, const ut8 *buf) { ut16 ad; switch (buf[0]) { case H8300_JMP_1: op->type = R_ANAL_OP_TYPE_UJMP; break; case H8300_JMP_2: op->type = R_ANAL_OP_TYPE_JMP; r_mem_swapendian ((ut8*)&ad, buf + 2, sizeof (ut16)); op->jump = ad; break; case H8300_JMP_3: op->type = R_ANAL_OP_TYPE_UJMP; op->jump = buf[1]; break; } }
static void h8300_anal_jsr(RAnalOp *op, ut64 addr, const ut8 *buf) { ut16 ad; switch (buf[0]) { case H8300_JSR_1: op->type = R_ANAL_OP_TYPE_UCALL; break; case H8300_JSR_2: op->type = R_ANAL_OP_TYPE_CALL; r_mem_swapendian ((ut8*)&ad, buf + 2, sizeof (ut16)); op->jump = ad; op->fail = addr + 4; break; case H8300_JSR_3: op->type = R_ANAL_OP_TYPE_UCALL; op->jump = buf[1]; break; } }
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { static int (*print_insn_hexagon)(bfd_vma, struct disassemble_info *); static struct disassemble_info disasm_obj; if (len < 4) { return -1; } buf_global = op->buf_asm; Offset = a->pc; // disasm inverted r_mem_swapendian (bytes, buf, 4); // TODO handle thumb /* prepare disassembler */ memset (&disasm_obj,'\0', sizeof (struct disassemble_info)); disasm_obj.buffer = bytes; disasm_obj.read_memory_func = &hexagon_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.mach = 0; op->buf_asm[0] = '\0'; print_insn_hexagon = hexagon_get_disassembler_from_mach(0,0); op->size = print_insn_hexagon ((bfd_vma)Offset, &disasm_obj); if (!strncmp (op->buf_asm, "unknown", 7)) { strncpy (op->buf_asm, "invalid", R_ASM_BUFSIZE); } if (op->size == -1) { strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE); } return op->size; }
static int assemble(RAsm *a, RAsmOp *op, const char *str) { int ret = mips_assemble (str, a->pc, op->buf); if (!a->big_endian) r_mem_swapendian (op->buf, op->buf, op->size); return ret; }