Am 11.09.2013 15:08, schrieb Claudio Fontana: > use C++ libvixl to implement output, for now only enabled for the host output > disasm, since we don't have the aarch64 target yet. > > Signed-off-by: Claudio Fontana <claudio.font...@linaro.org> > --- > configure | 6 +++++ > disas.c | 2 ++ > disas/Makefile.objs | 7 ++++++ > disas/aarch64-cxx.cc | 53 > +++++++++++++++++++++++++++++++++++++++++++++ > disas/aarch64.c | 45 ++++++++++++++++++++++++++++++++++++++ > disas/libvixl/Makefile.objs | 6 +++++ > include/disas/bfd.h | 1 + > 7 files changed, 120 insertions(+) > create mode 100644 disas/aarch64-cxx.cc > create mode 100644 disas/aarch64.c > create mode 100644 disas/libvixl/Makefile.objs > > diff --git a/configure b/configure > index 6b73d99..1a2648a 100755 > --- a/configure > +++ b/configure > @@ -4443,6 +4443,12 @@ ldflags="" > > for i in $ARCH $TARGET_BASE_ARCH ; do > case "$i" in > + aarch64) > + if test "x${cxx}" != "x"; then > + echo "CONFIG_AARCH64_DIS=y" >> $config_target_mak > + echo "CONFIG_AARCH64_DIS=y" >> config-all-disas.mak > + fi > + ;; > alpha) > echo "CONFIG_ALPHA_DIS=y" >> $config_target_mak > echo "CONFIG_ALPHA_DIS=y" >> config-all-disas.mak > diff --git a/disas.c b/disas.c > index 0203ef2..cc20c4a 100644 > --- a/disas.c > +++ b/disas.c > @@ -356,6 +356,8 @@ void disas(FILE *out, void *code, unsigned long size) > #elif defined(_ARCH_PPC) > s.info.disassembler_options = (char *)"any"; > print_insn = print_insn_ppc; > +#elif defined(__aarch64__) > + print_insn = print_insn_aarch64; > #elif defined(__alpha__) > print_insn = print_insn_alpha; > #elif defined(__sparc__) > diff --git a/disas/Makefile.objs b/disas/Makefile.objs > index 3b1e77a..f468c22 100644 > --- a/disas/Makefile.objs > +++ b/disas/Makefile.objs > @@ -1,3 +1,10 @@ > +ifeq ($(CONFIG_AARCH64_DIS),y) > +libvixldir = $(SRC_PATH)/disas/libvixl/src > +QEMU_CFLAGS += -I$(libvixldir) -Wno-undef > +common-obj-$(CONFIG_AARCH64_DIS) += libvixl/ > +common-obj-$(CONFIG_AARCH64_DIS) += aarch64.o aarch64-cxx.o > +endif > + > common-obj-$(CONFIG_ALPHA_DIS) += alpha.o > common-obj-$(CONFIG_ARM_DIS) += arm.o > common-obj-$(CONFIG_CRIS_DIS) += cris.o > diff --git a/disas/aarch64-cxx.cc b/disas/aarch64-cxx.cc > new file mode 100644 > index 0000000..524f5ae > --- /dev/null > +++ b/disas/aarch64-cxx.cc > @@ -0,0 +1,53 @@ > +/* > + * Aarch64 disassembly output wrapper to libvixl - C++ part > + * Copyright (c) 2013 Linaro Limited > + * Written by Claudio Fontana > + * > + * This program is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include "a64/simulator-a64.h" > +#include "a64/macro-assembler-a64.h" > + > +extern "C" { > + int vixl_is_initialized(int); > + int vixl_init(FILE *f); > + int vixl_decode_insn(uint8_t *bytes); > +} > + > +using namespace vixl; > + > +static Decoder *vixl_decoder = NULL; > +static Disassembler *vixl_disasm = NULL; > + > +int vixl_is_initialized(int unused) > +{ > + return vixl_decoder != NULL; > +} > + > +/* Disassemble Aarch64 bytecode - wrappers */ > +int vixl_init(FILE *f) { > + vixl_decoder = new Decoder(); > + vixl_disasm = new PrintDisassembler(f); > + vixl_decoder->AppendVisitor(vixl_disasm); > + return 1; > +} > + > +int vixl_decode_insn(uint8_t *bytes) > +{ > + Instr instr; > + instr = bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24; > + vixl_decoder->Decode(reinterpret_cast<Instruction*>(&instr)); > + return 1; > +} > diff --git a/disas/aarch64.c b/disas/aarch64.c > new file mode 100644 > index 0000000..7e44837 > --- /dev/null > +++ b/disas/aarch64.c > @@ -0,0 +1,45 @@ > +/* > + * Aarch64 disassembly output wrapper to libvixl - C part > + * Copyright (c) 2013 Linaro Limited > + * Written by Claudio Fontana > + * > + * This program is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include "disas/bfd.h" > +#define INSN_SIZE 4 > + > +extern int vixl_is_initialized(int); > +extern int vixl_init(FILE *); > +extern int vixl_decode_insn(uint8_t *); > + > +/* Disassemble Aarch64 bytecode. */ > +int print_insn_aarch64(uint64_t addr, disassemble_info *info) > +{ > + uint8_t bytes[INSN_SIZE]; > + int status; > + > + if (!vixl_is_initialized(0)) { > + vixl_init(info->stream); > + } > + > + status = info->read_memory_func(addr, bytes, INSN_SIZE, info); > + if (status != 0) { > + info->memory_error_func(status, addr, info); > + return -1; > + } > + > + vixl_decode_insn(bytes); > + return INSN_SIZE; > +}
Why split this into two mini files? You're already using extern "C" { ... } in the C++ file for the prototypes anyway. Apart from that the library integration looks surprisingly clean. :) Cheers, Andreas > diff --git a/disas/libvixl/Makefile.objs b/disas/libvixl/Makefile.objs > new file mode 100644 > index 0000000..43ba29c > --- /dev/null > +++ b/disas/libvixl/Makefile.objs > @@ -0,0 +1,6 @@ > +libvixl_OBJS = src/utils.o \ > + src/a64/instructions-a64.o \ > + src/a64/decoder-a64.o \ > + src/a64/disasm-a64.o > + > +common-obj-$(CONFIG_AARCH64_DIS) += $(libvixl_OBJS) > diff --git a/include/disas/bfd.h b/include/disas/bfd.h > index 803b6ef..73017da 100644 > --- a/include/disas/bfd.h > +++ b/include/disas/bfd.h > @@ -379,6 +379,7 @@ 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_aarch64 (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*); > -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg