aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2011-05-10 15:35:01 +0200
committerDavid 'Digit' Turner <digit@android.com>2011-06-01 17:08:18 +0200
commitc98cf7b1fa9531879937a970435073acd1179263 (patch)
tree1cacb347f69c2b81d8bb743886aca0904c339ff2
parentbfec547677ddf2164ffd49a34c3ace2a41c938ad (diff)
downloadexternal_qemu-c98cf7b1fa9531879937a970435073acd1179263.zip
external_qemu-c98cf7b1fa9531879937a970435073acd1179263.tar.gz
external_qemu-c98cf7b1fa9531879937a970435073acd1179263.tar.bz2
arm-dis.c: minor integrate
Change-Id: Ib97f8ceed7563bdfaa772eb1b865b46b3ee81781
-rw-r--r--arm-dis.c38
-rw-r--r--dis-asm.h96
2 files changed, 76 insertions, 58 deletions
diff --git a/arm-dis.c b/arm-dis.c
index fe7ac99..3ece02c 100644
--- a/arm-dis.c
+++ b/arm-dis.c
@@ -1587,7 +1587,7 @@ arm_decode_bitfield (const char *ptr, unsigned long insn,
}
static void
-arm_decode_shift (long given, fprintf_ftype func, void *stream,
+arm_decode_shift (long given, fprintf_function func, void *stream,
int print_shift)
{
func (stream, "%s", arm_regnames[given & 0xf]);
@@ -1633,7 +1633,7 @@ print_insn_coprocessor (bfd_vma pc, struct disassemble_info *info, long given,
{
const struct opcode32 *insn;
void *stream = info->stream;
- fprintf_ftype func = info->fprintf_func;
+ fprintf_function func = info->fprintf_func;
unsigned long mask;
unsigned long value;
int cond;
@@ -2127,7 +2127,7 @@ static void
print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
{
void *stream = info->stream;
- fprintf_ftype func = info->fprintf_func;
+ fprintf_function func = info->fprintf_func;
if (((given & 0x000f0000) == 0x000f0000)
&& ((given & 0x02000000) == 0))
@@ -2222,7 +2222,7 @@ print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
{
const struct opcode32 *insn;
void *stream = info->stream;
- fprintf_ftype func = info->fprintf_func;
+ fprintf_function func = info->fprintf_func;
if (thumb)
{
@@ -2676,7 +2676,7 @@ print_insn_arm_internal (bfd_vma pc, struct disassemble_info *info, long given)
{
const struct opcode32 *insn;
void *stream = info->stream;
- fprintf_ftype func = info->fprintf_func;
+ fprintf_function func = info->fprintf_func;
if (print_insn_coprocessor (pc, info, given, false))
return;
@@ -3036,7 +3036,7 @@ print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
{
const struct opcode16 *insn;
void *stream = info->stream;
- fprintf_ftype func = info->fprintf_func;
+ fprintf_function func = info->fprintf_func;
for (insn = thumb_opcodes; insn->assembler; insn++)
if ((given & insn->mask) == insn->value)
@@ -3312,7 +3312,7 @@ print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
{
const struct opcode32 *insn;
void *stream = info->stream;
- fprintf_ftype func = info->fprintf_func;
+ fprintf_function func = info->fprintf_func;
if (print_insn_coprocessor (pc, info, given, true))
return;
@@ -4101,6 +4101,30 @@ print_insn_arm (bfd_vma pc, struct disassemble_info *info)
addresses, since the addend is not currently pc-relative. */
pc = 0;
+ /* We include the hexdump of the instruction. The format here
+ matches that used by objdump and the ARM ARM (in particular,
+ 32 bit Thumb instructions are displayed as pairs of halfwords,
+ not as a single word.) */
+ if (is_thumb)
+ {
+ if (size == 2)
+ {
+ info->fprintf_func(info->stream, "%04lx ",
+ ((unsigned long)given) & 0xffff);
+ }
+ else
+ {
+ info->fprintf_func(info->stream, "%04lx %04lx ",
+ (((unsigned long)given) >> 16) & 0xffff,
+ ((unsigned long)given) & 0xffff);
+ }
+ }
+ else
+ {
+ info->fprintf_func(info->stream, "%08lx ",
+ ((unsigned long)given) & 0xffffffff);
+ }
+
printer (pc, info, given);
if (is_thumb)
diff --git a/dis-asm.h b/dis-asm.h
index 9b9657e..296537a 100644
--- a/dis-asm.h
+++ b/dis-asm.h
@@ -9,11 +9,7 @@
#ifndef DIS_ASM_H
#define DIS_ASM_H
-#include <stdlib.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <string.h>
-#include <inttypes.h>
+#include "qemu-common.h"
typedef void *PTR;
typedef uint64_t bfd_vma;
@@ -237,8 +233,6 @@ typedef struct symbol_cache_entry
} udata;
} asymbol;
-typedef int (*fprintf_ftype) (FILE*, const char*, ...);
-
enum dis_insn_type {
dis_noninsn, /* Not a valid instruction */
dis_nonbranch, /* Not a branch instruction */
@@ -261,7 +255,7 @@ enum dis_insn_type {
by hand, or using one of the initialization macros below. */
typedef struct disassemble_info {
- fprintf_ftype fprintf_func;
+ fprintf_function fprintf_func;
FILE *stream;
PTR application_data;
@@ -368,47 +362,48 @@ typedef struct disassemble_info {
target address. Return number of bytes processed. */
typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *);
-extern int print_insn_big_mips (bfd_vma, disassemble_info*);
-extern int print_insn_little_mips (bfd_vma, disassemble_info*);
-extern int print_insn_i386 (bfd_vma, disassemble_info*);
-extern int print_insn_m68k (bfd_vma, disassemble_info*);
-extern int print_insn_z8001 (bfd_vma, disassemble_info*);
-extern int print_insn_z8002 (bfd_vma, disassemble_info*);
-extern int print_insn_h8300 (bfd_vma, disassemble_info*);
-extern int print_insn_h8300h (bfd_vma, disassemble_info*);
-extern int print_insn_h8300s (bfd_vma, disassemble_info*);
-extern int print_insn_h8500 (bfd_vma, disassemble_info*);
-extern int print_insn_alpha (bfd_vma, disassemble_info*);
-extern disassembler_ftype arc_get_disassembler (int, int);
-extern int print_insn_arm (bfd_vma, disassemble_info*);
-extern int print_insn_sparc (bfd_vma, disassemble_info*);
-extern int print_insn_big_a29k (bfd_vma, disassemble_info*);
-extern int print_insn_little_a29k (bfd_vma, disassemble_info*);
-extern int print_insn_i960 (bfd_vma, disassemble_info*);
-extern int print_insn_sh (bfd_vma, disassemble_info*);
-extern int print_insn_shl (bfd_vma, disassemble_info*);
-extern int print_insn_hppa (bfd_vma, disassemble_info*);
-extern int print_insn_m32r (bfd_vma, disassemble_info*);
-extern int print_insn_m88k (bfd_vma, disassemble_info*);
-extern int print_insn_mn10200 (bfd_vma, disassemble_info*);
-extern int print_insn_mn10300 (bfd_vma, disassemble_info*);
-extern int print_insn_ns32k (bfd_vma, disassemble_info*);
-extern int print_insn_big_powerpc (bfd_vma, disassemble_info*);
-extern int print_insn_little_powerpc (bfd_vma, disassemble_info*);
-extern int print_insn_rs6000 (bfd_vma, disassemble_info*);
-extern int print_insn_w65 (bfd_vma, disassemble_info*);
-extern int print_insn_d10v (bfd_vma, disassemble_info*);
-extern int print_insn_v850 (bfd_vma, disassemble_info*);
-extern int print_insn_tic30 (bfd_vma, disassemble_info*);
-extern int print_insn_ppc (bfd_vma, disassemble_info*);
-extern int print_insn_s390 (bfd_vma, disassemble_info*);
-extern int print_insn_crisv32 (bfd_vma, disassemble_info*);
-extern int print_insn_microblaze (bfd_vma, disassemble_info*);
-extern int print_insn_ia64 (bfd_vma, disassemble_info*);
+int print_insn_big_mips (bfd_vma, disassemble_info*);
+int print_insn_little_mips (bfd_vma, disassemble_info*);
+int print_insn_i386 (bfd_vma, disassemble_info*);
+int print_insn_m68k (bfd_vma, disassemble_info*);
+int print_insn_z8001 (bfd_vma, disassemble_info*);
+int print_insn_z8002 (bfd_vma, disassemble_info*);
+int print_insn_h8300 (bfd_vma, disassemble_info*);
+int print_insn_h8300h (bfd_vma, disassemble_info*);
+int print_insn_h8300s (bfd_vma, disassemble_info*);
+int print_insn_h8500 (bfd_vma, disassemble_info*);
+int print_insn_alpha (bfd_vma, disassemble_info*);
+disassembler_ftype arc_get_disassembler (int, int);
+int print_insn_arm (bfd_vma, disassemble_info*);
+int print_insn_sparc (bfd_vma, disassemble_info*);
+int print_insn_big_a29k (bfd_vma, disassemble_info*);
+int print_insn_little_a29k (bfd_vma, disassemble_info*);
+int print_insn_i960 (bfd_vma, disassemble_info*);
+int print_insn_sh (bfd_vma, disassemble_info*);
+int print_insn_shl (bfd_vma, disassemble_info*);
+int print_insn_hppa (bfd_vma, disassemble_info*);
+int print_insn_m32r (bfd_vma, disassemble_info*);
+int print_insn_m88k (bfd_vma, disassemble_info*);
+int print_insn_mn10200 (bfd_vma, disassemble_info*);
+int print_insn_mn10300 (bfd_vma, disassemble_info*);
+int print_insn_ns32k (bfd_vma, disassemble_info*);
+int print_insn_big_powerpc (bfd_vma, disassemble_info*);
+int print_insn_little_powerpc (bfd_vma, disassemble_info*);
+int print_insn_rs6000 (bfd_vma, disassemble_info*);
+int print_insn_w65 (bfd_vma, disassemble_info*);
+int print_insn_d10v (bfd_vma, disassemble_info*);
+int print_insn_v850 (bfd_vma, disassemble_info*);
+int print_insn_tic30 (bfd_vma, disassemble_info*);
+int print_insn_ppc (bfd_vma, disassemble_info*);
+int print_insn_s390 (bfd_vma, disassemble_info*);
+int print_insn_crisv32 (bfd_vma, disassemble_info*);
+int print_insn_crisv10 (bfd_vma, disassemble_info*);
+int print_insn_microblaze (bfd_vma, disassemble_info*);
+int print_insn_ia64 (bfd_vma, disassemble_info*);
#if 0
/* Fetch the disassembler for a given BFD, if that support is available. */
-extern disassembler_ftype disassembler (bfd *);
+disassembler_ftype disassembler(bfd *);
#endif
@@ -417,21 +412,20 @@ extern disassembler_ftype disassembler (bfd *);
/* Here is a function which callers may wish to use for read_memory_func.
It gets bytes from a buffer. */
-extern int buffer_read_memory
- (bfd_vma, bfd_byte *, int, struct disassemble_info *);
+int buffer_read_memory(bfd_vma, bfd_byte *, int, struct disassemble_info *);
/* This function goes with buffer_read_memory.
It prints a message using info->fprintf_func and info->stream. */
-extern void perror_memory (int, bfd_vma, struct disassemble_info *);
+void perror_memory(int, bfd_vma, struct disassemble_info *);
/* Just print the address in hex. This is included for completeness even
though both GDB and objdump provide their own (to print symbolic
addresses). */
-extern void generic_print_address (bfd_vma, struct disassemble_info *);
+void generic_print_address(bfd_vma, struct disassemble_info *);
/* Always true. */
-extern int generic_symbol_at_address (bfd_vma, struct disassemble_info *);
+int generic_symbol_at_address(bfd_vma, struct disassemble_info *);
/* Macro to initialize a disassemble_info struct. This should be called
by all applications creating such a struct. */