From patchwork Wed May 4 00:59:15 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 93953 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id DEAD0B6F59 for ; Wed, 4 May 2011 11:06:36 +1000 (EST) Received: from localhost ([::1]:35186 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHQXx-0006ae-VN for incoming@patchwork.ozlabs.org; Tue, 03 May 2011 21:06:33 -0400 Received: from eggs.gnu.org ([140.186.70.92]:53129) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHQSD-0004ss-3s for qemu-devel@nongnu.org; Tue, 03 May 2011 21:00:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QHQSB-0000mz-Td for qemu-devel@nongnu.org; Tue, 03 May 2011 21:00:36 -0400 Received: from mail-ey0-f173.google.com ([209.85.215.173]:61142) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHQSB-0000XS-Or for qemu-devel@nongnu.org; Tue, 03 May 2011 21:00:35 -0400 Received: by mail-ey0-f173.google.com with SMTP id 6so222883eyb.4 for ; Tue, 03 May 2011 18:00:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=13rlribEB+z/pErjWx8tw296pgswYwaDuuj9B0rzIS8=; b=G0SE5PvvNTrG2LLvtCbdYT2Rje0pxcgN5gxmwi0Xk7tJYkij5lR2cIy3tJq3VphsAW kMhX+ITYgDOSwhJEZ1Kv8Sv7aEvRVj8MQ2XV2Nd+f9v+MzDdWH662tXp5x5dK5iHpKR3 oW7ZATPmd9uMdYJPyBl8GIthR5mPk0wP5Lld0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=vNX8Zx2UdTQ2R36z6jqRWNLywteGbrK2+9hsmw6dfalxZZRvJY++/o+43MTMNjrDPw UnE6A42rGcJfoHgmJ1LVbc7k3Og0wFmxmB7rBOlk+6jMmtn9m/m01Uu4H/YnCNmsESjC ZQsmjsw7VnZMeofGk/1JnUO0DHxgHR+031YRU= Received: by 10.213.0.209 with SMTP id 17mr1718077ebc.30.1304470835290; Tue, 03 May 2011 18:00:35 -0700 (PDT) Received: from octofox.metropolis ([188.134.19.124]) by mx.google.com with ESMTPS id g1sm441330een.10.2011.05.03.18.00.33 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 03 May 2011 18:00:34 -0700 (PDT) Received: by octofox.metropolis (sSMTP sendmail emulation); Wed, 4 May 2011 05:00:32 +0400 From: Max Filippov To: qemu-devel@nongnu.org Date: Wed, 4 May 2011 04:59:15 +0400 Message-Id: <1304470768-16924-15-git-send-email-jcmvbkbc@gmail.com> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: <1304470768-16924-1-git-send-email-jcmvbkbc@gmail.com> References: <1304470768-16924-1-git-send-email-jcmvbkbc@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.215.173 Cc: Max Filippov Subject: [Qemu-devel] [RFC 15/28] target-xtensa: big endian support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Big endian opcode decoding is slightly different. Signed-off-by: Max Filippov --- configure | 7 ++++--- hw/xtensa_sample.c | 6 +++++- target-xtensa/translate.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/configure b/configure index 41a7007..c45c2a3 100755 --- a/configure +++ b/configure @@ -1029,6 +1029,7 @@ sh4eb-softmmu \ sparc-softmmu \ sparc64-softmmu \ xtensa-softmmu \ +xtensaeb-softmmu \ " fi # the following are Linux specific @@ -3016,7 +3017,7 @@ target_arch2=`echo $target | cut -d '-' -f 1` target_bigendian="no" case "$target_arch2" in - armeb|lm32|m68k|microblaze|mips|mipsn32|mips64|ppc|ppcemb|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus) + armeb|lm32|m68k|microblaze|mips|mipsn32|mips64|ppc|ppcemb|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb) target_bigendian=yes ;; esac @@ -3211,7 +3212,7 @@ case "$target_arch2" in unicore32) target_phys_bits=32 ;; - xtensa) + xtensa|xtensaeb) TARGET_ARCH=xtensa gdb_xml_files="xtensa-core.xml" target_phys_bits=32 @@ -3391,7 +3392,7 @@ for i in $ARCH $TARGET_BASE_ARCH ; do echo "CONFIG_SPARC_DIS=y" >> $config_target_mak echo "CONFIG_SPARC_DIS=y" >> $libdis_config_mak ;; - xtensa) + xtensa*) echo "CONFIG_XTENSA_DIS=y" >> $config_target_mak echo "CONFIG_XTENSA_DIS=y" >> $libdis_config_mak ;; diff --git a/hw/xtensa_sample.c b/hw/xtensa_sample.c index 8103675..b1da7e1 100644 --- a/hw/xtensa_sample.c +++ b/hw/xtensa_sample.c @@ -32,9 +32,13 @@ static void xtensa_init(ram_addr_t ram_size, if (kernel_filename) { uint64_t elf_entry; uint64_t elf_lowaddr; - +#ifdef TARGET_WORDS_BIGENDIAN + int success = load_elf(kernel_filename, NULL, NULL, &elf_entry, + &elf_lowaddr, NULL, 1, ELF_MACHINE, 0); +#else int success = load_elf(kernel_filename, NULL, NULL, &elf_entry, &elf_lowaddr, NULL, 0, ELF_MACHINE, 0); +#endif if (success > 0) { env->pc = elf_entry; } diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index a47efb0..da3120f 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -170,12 +170,21 @@ static void disas_xtensa_insn(DisasContext *dc) } while (0) +#ifdef TARGET_WORDS_BIGENDIAN #define _OP0 (((_b0) & 0xf0) >> 4) #define _OP1 (((_b2) & 0xf0) >> 4) #define _OP2 ((_b2) & 0xf) #define RRR_R ((_b1) & 0xf) #define RRR_S (((_b1) & 0xf0) >> 4) #define RRR_T ((_b0) & 0xf) +#else +#define _OP0 (((_b0) & 0xf)) +#define _OP1 (((_b2) & 0xf)) +#define _OP2 (((_b2) & 0xf0) >> 4) +#define RRR_R (((_b1) & 0xf0) >> 4) +#define RRR_S (((_b1) & 0xf)) +#define RRR_T (((_b0) & 0xf0) >> 4) +#endif #define RRRN_R RRR_R #define RRRN_S RRR_S @@ -187,20 +196,38 @@ static void disas_xtensa_insn(DisasContext *dc) #define RRI8_IMM8 (_b2) #define RRI8_IMM8_SE ((((_b2) & 0x80) ? 0xffffff00 : 0) | RRI8_IMM8) +#ifdef TARGET_WORDS_BIGENDIAN #define RI16_IMM16 (((_b1) << 8) | (_b2)) +#else +#define RI16_IMM16 (((_b2) << 8) | (_b1)) +#endif +#ifdef TARGET_WORDS_BIGENDIAN #define CALL_N (((_b0) & 0xc) >> 2) #define CALL_OFFSET ((((_b0) & 0x3) << 16) | ((_b1) << 8) | (_b2)) -#define CALL_OFFSET_SE (((_b0 & 0x2) ? 0xfffc0000 : 0) | CALL_OFFSET) +#else +#define CALL_N (((_b0) & 0x30) >> 4) +#define CALL_OFFSET ((((_b0) & 0xc0) >> 6) | ((_b1) << 2) | ((_b2) << 10)) +#endif +#define CALL_OFFSET_SE \ + (((CALL_OFFSET & 0x20000) ? 0xfffc0000 : 0) | CALL_OFFSET) #define CALLX_N CALL_N +#ifdef TARGET_WORDS_BIGENDIAN #define CALLX_M ((_b0) & 0x3) +#else +#define CALLX_M (((_b0) & 0xc0) >> 6) +#endif #define CALLX_S RRR_S #define BRI12_M CALLX_M #define BRI12_S RRR_S +#ifdef TARGET_WORDS_BIGENDIAN #define BRI12_IMM12 ((((_b1) & 0xf) << 8) | (_b2)) -#define BRI12_IMM12_SE ((((_b1) & 0x8) ? 0xfffff000 : 0) | BRI12_IMM12) +#else +#define BRI12_IMM12 ((((_b1) & 0xf0) >> 4) | ((_b2) << 4)) +#endif +#define BRI12_IMM12_SE (((BRI12_IMM12 & 0x800) ? 0xfffff000 : 0) | BRI12_IMM12) #define BRI8_M BRI12_M #define BRI8_R RRI8_R