Hallo Andreas, On 16.09.2013 08:53, Andreas Färber wrote: > 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
The reason I split this into two files is that the c++ compiler did not digest the bfd.h include. So I thought to have a .cc file which does not actually need anything from QEMU at all, and a .c file which deals with the QEMU dependencies and provides the final symbol. Ciao, Claudio >> 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*); >>