From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56212) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VLSgt-0004wH-Oh for qemu-devel@nongnu.org; Mon, 16 Sep 2013 02:53:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VLSgo-0002QW-Pe for qemu-devel@nongnu.org; Mon, 16 Sep 2013 02:53:47 -0400 Received: from cantor2.suse.de ([195.135.220.15]:52226 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VLSgo-0002QJ-DO for qemu-devel@nongnu.org; Mon, 16 Sep 2013 02:53:42 -0400 Message-ID: <5236AAEE.9010703@suse.de> Date: Mon, 16 Sep 2013 08:53:34 +0200 From: =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= MIME-Version: 1.0 References: <52306808.4030701@huawei.com> <52306B65.9010405@huawei.com> In-Reply-To: <52306B65.9010405@huawei.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [RFC 4/4] disas: implement host disassembly output for aarch64 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Claudio Fontana Cc: Peter Maydell , "qemu-devel@nongnu.org" 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. >=20 > Signed-off-by: Claudio Fontana > --- > 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 >=20 > diff --git a/configure b/configure > index 6b73d99..1a2648a 100755 > --- a/configure > +++ b/configure > @@ -4443,6 +4443,12 @@ ldflags=3D"" > =20 > for i in $ARCH $TARGET_BASE_ARCH ; do > case "$i" in > + aarch64) > + if test "x${cxx}" !=3D "x"; then > + echo "CONFIG_AARCH64_DIS=3Dy" >> $config_target_mak > + echo "CONFIG_AARCH64_DIS=3Dy" >> config-all-disas.mak > + fi > + ;; > alpha) > echo "CONFIG_ALPHA_DIS=3Dy" >> $config_target_mak > echo "CONFIG_ALPHA_DIS=3Dy" >> 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 siz= e) > #elif defined(_ARCH_PPC) > s.info.disassembler_options =3D (char *)"any"; > print_insn =3D print_insn_ppc; > +#elif defined(__aarch64__) > + print_insn =3D print_insn_aarch64; > #elif defined(__alpha__) > print_insn =3D 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 =3D $(SRC_PATH)/disas/libvixl/src > +QEMU_CFLAGS +=3D -I$(libvixldir) -Wno-undef > +common-obj-$(CONFIG_AARCH64_DIS) +=3D libvixl/ > +common-obj-$(CONFIG_AARCH64_DIS) +=3D aarch64.o aarch64-cxx.o > +endif > + > common-obj-$(CONFIG_ALPHA_DIS) +=3D alpha.o > common-obj-$(CONFIG_ARM_DIS) +=3D arm.o > common-obj-$(CONFIG_CRIS_DIS) +=3D 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 modif= y > + * it under the terms of the GNU General Public License as published b= y > + * 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 . > + */ > + > +#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 =3D NULL; > +static Disassembler *vixl_disasm =3D NULL; > + > +int vixl_is_initialized(int unused) > +{ > + return vixl_decoder !=3D NULL; > +} > + > +/* Disassemble Aarch64 bytecode - wrappers */ > +int vixl_init(FILE *f) { > + vixl_decoder =3D new Decoder(); > + vixl_disasm =3D new PrintDisassembler(f); > + vixl_decoder->AppendVisitor(vixl_disasm); > + return 1; > +} > + > +int vixl_decode_insn(uint8_t *bytes) > +{ > + Instr instr; > + instr =3D bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << = 24; > + vixl_decoder->Decode(reinterpret_cast(&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 modif= y > + * it under the terms of the GNU General Public License as published b= y > + * 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 . > + */ > + > +#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 =3D info->read_memory_func(addr, bytes, INSN_SIZE, info); > + if (status !=3D 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 =3D src/utils.o \ > + src/a64/instructions-a64.o \ > + src/a64/decoder-a64.o \ > + src/a64/disasm-a64.o > + > +common-obj-$(CONFIG_AARCH64_DIS) +=3D $(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, disassemb= le_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*); >=20 --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=C3=BCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=C3=B6rffer; HRB 16746 AG N=C3=BC= rnberg