superH analyzer+disasm bigendian support
This commit is contained in:
parent
0215b38bd3
commit
e36d2d4dcf
4 changed files with 14 additions and 8 deletions
|
|
@ -433,12 +433,10 @@ static int (*first_nibble_decode[])(RAnal*,RAnalOp*,ut16) = {
|
|||
* routines defined in first_nibble_decode table
|
||||
*/
|
||||
static int sh_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len) {
|
||||
//TODO Check if we must do big or little endian. Also fix in RAsm
|
||||
ut8 b;
|
||||
ut8 op_MSB,op_LSB;
|
||||
int ret;
|
||||
if (data == NULL)
|
||||
return 0;
|
||||
b = data[1]; //First byte, little endian
|
||||
memset (op, '\0', sizeof (RAnalOp));
|
||||
op->addr = addr;
|
||||
op->type = R_ANAL_OP_TYPE_UNK;
|
||||
|
|
@ -447,7 +445,9 @@ static int sh_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len)
|
|||
|
||||
op->size = 2;
|
||||
|
||||
ret = first_nibble_decode[(b>>4) & 0x0F](anal, op, *((ut16 *)data));
|
||||
op_MSB = (anal->big_endian)? data[0]:data[1];
|
||||
op_LSB = (anal->big_endian)? data[1]:data[0];
|
||||
ret = first_nibble_decode[(op_MSB>>4) & 0x0F](anal, op, (ut16)(op_MSB<<16 | op_LSB));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -280,7 +280,8 @@ extern int print_insn_pdp11 (bfd_vma, disassemble_info *);
|
|||
extern int print_insn_pj (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_rs6000 (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_s390 (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_sh (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_shb (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_shl (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_sh64 (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_sh64x_media (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_sparc (bfd_vma, disassemble_info *);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
|
||||
#define LITTLE_BIT 2
|
||||
|
||||
/* disassemble 1 opcode (16bits), take care of endianness if info->flags&LITTLE_BIT*/
|
||||
static int
|
||||
print_insn_shx (memaddr, info)
|
||||
bfd_vma memaddr;
|
||||
|
|
@ -379,7 +380,7 @@ print_insn_shl (memaddr, info)
|
|||
}
|
||||
|
||||
int
|
||||
print_insn_sh (memaddr, info)
|
||||
print_insn_shb (memaddr, info)
|
||||
bfd_vma memaddr;
|
||||
struct disassemble_info *info;
|
||||
{
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ static int sh_buffer_read_memory (bfd_vma memaddr, bfd_byte *myaddr, unsigned in
|
|||
}
|
||||
|
||||
int print_insn_shl (bfd_vma memaddr, struct disassemble_info *info);
|
||||
int print_insn_shb (bfd_vma memaddr, struct disassemble_info *info);
|
||||
|
||||
static int symbol_at_address(bfd_vma addr, struct disassemble_info * info) {
|
||||
return 0;
|
||||
|
|
@ -58,7 +59,7 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
|
|||
if (len<2) return -1;
|
||||
buf_global = op->buf_asm;
|
||||
Offset = a->pc;
|
||||
memcpy (bytes, buf, 2); // TODO handle thumb
|
||||
memcpy (bytes, buf, 2);
|
||||
|
||||
/* prepare disassembler */
|
||||
memset (&disasm_obj,'\0', sizeof (struct disassemble_info));
|
||||
|
|
@ -72,7 +73,10 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
|
|||
disasm_obj.stream = stdout;
|
||||
|
||||
op->buf_asm[0] = '\0';
|
||||
op->size = print_insn_shl ((bfd_vma)Offset, &disasm_obj);
|
||||
if (a->big_endian)
|
||||
op->size = print_insn_shb ((bfd_vma)Offset, &disasm_obj);
|
||||
else
|
||||
op->size = print_insn_shl ((bfd_vma)Offset, &disasm_obj);
|
||||
|
||||
if (op->size == -1)
|
||||
strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE);
|
||||
|
|
|
|||
Loading…
Reference in a new issue