From patchwork Sun Jul 21 12:05:05 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 260516 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BDC4D2C0077 for ; Sun, 21 Jul 2013 22:06:43 +1000 (EST) Received: from localhost ([::1]:38407 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0sPR-0001Jb-C3 for incoming@patchwork.ozlabs.org; Sun, 21 Jul 2013 08:06:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35627) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0sOr-0001Ep-NL for qemu-devel@nongnu.org; Sun, 21 Jul 2013 08:06:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V0sOq-0007ho-9F for qemu-devel@nongnu.org; Sun, 21 Jul 2013 08:06:05 -0400 Received: from mail-la0-x22d.google.com ([2a00:1450:4010:c03::22d]:62955) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V0sOp-0007hW-UR for qemu-devel@nongnu.org; Sun, 21 Jul 2013 08:06:04 -0400 Received: by mail-la0-f45.google.com with SMTP id ev20so2793632lab.4 for ; Sun, 21 Jul 2013 05:06:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=VKHvY5vsVdFqgUYe+MPZWeRkCV5NcsydJzGzCGeQZfk=; b=X5/jkXnes2OBfZBWYGvOnGNP2WJYKurHSU2KaQhrXmyNl/FIkoQ3Z8aepa4JlpFJej ccxenL0FvTiCqQCqGho0c2DYHikAcGOnSa5ATUjFT4q0zzAmMmO4hE1nJx/rp8f9NJMD KJ22weT7puHKh9wzxtEvEXmrn4oOHorhCGRaBHdrz7KNtglcm5yMkVR+DWXNH6gGx9i4 mKPCNwAu0p1GVR7CmRxKgrD84zJfvelx5FAL09ddXVybqdLu6ncDUckRVOm41fEGkT1Z L+giGPoklHw/oWRZm38pFVi6yKkyPP7XNXi9XgRFHCXbG6S3J0IDuZWp7n4FjLK7ZDZH 19fw== X-Received: by 10.112.28.48 with SMTP id y16mr10696244lbg.37.1374408363070; Sun, 21 Jul 2013 05:06:03 -0700 (PDT) Received: from localhost.localdomain ([188.134.19.124]) by mx.google.com with ESMTPSA id x8sm9221117lae.10.2013.07.21.05.06.01 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sun, 21 Jul 2013 05:06:02 -0700 (PDT) From: Max Filippov To: qemu-devel@nongnu.org Date: Sun, 21 Jul 2013 16:05:05 +0400 Message-Id: <1374408306-2684-6-git-send-email-jcmvbkbc@gmail.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1374408306-2684-1-git-send-email-jcmvbkbc@gmail.com> References: <1374408306-2684-1-git-send-email-jcmvbkbc@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4010:c03::22d Cc: Blue Swirl , Max Filippov , Anthony Liguori Subject: [Qemu-devel] [PATCH 5/6] target-xtensa: don't generate dead code to access invalid SRs 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 This fixes the following test failure caused by access to undefined SR: qemu-system-xtensa -M sim -cpu dc232b -nographic -semihosting -kernel ./test_sr.tst QEMU 1.4.50 monitor - type 'help' for more information (qemu) QEMU 1.4.50 monitor - type 'help' for more information (qemu) qemu-system-xtensa: tcg/tcg.c:1673: temp_save: Assertion `s->temps[temp].val_type == 2 || s->temps[temp].fixed_reg' failed. Signed-off-by: Max Filippov --- target-xtensa/translate.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index ef97db0..dcd506f 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -491,7 +491,7 @@ static void gen_brcondi(DisasContext *dc, TCGCond cond, tcg_temp_free(tmp); } -static void gen_check_sr(DisasContext *dc, uint32_t sr, unsigned access) +static bool gen_check_sr(DisasContext *dc, uint32_t sr, unsigned access) { if (!xtensa_option_bits_enabled(dc->config, sregnames[sr].opt_bits)) { if (sregnames[sr].name) { @@ -500,6 +500,7 @@ static void gen_check_sr(DisasContext *dc, uint32_t sr, unsigned access) qemu_log("SR %d is not implemented\n", sr); } gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE); + return false; } else if (!(sregnames[sr].access & access)) { static const char * const access_text[] = { [SR_R] = "rsr", @@ -510,7 +511,9 @@ static void gen_check_sr(DisasContext *dc, uint32_t sr, unsigned access) qemu_log("SR %s is not available for %s\n", sregnames[sr].name, access_text[access]); gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE); + return false; } + return true; } static void gen_rsr_ccount(DisasContext *dc, TCGv_i32 d, uint32_t sr) @@ -1482,9 +1485,9 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) break; case 6: /*XSR*/ - { + if (gen_check_sr(dc, RSR_SR, SR_X)) { TCGv_i32 tmp = tcg_temp_new_i32(); - gen_check_sr(dc, RSR_SR, SR_X); + if (RSR_SR >= 64) { gen_check_privilege(dc); } @@ -1707,21 +1710,23 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) case 3: /*RST3*/ switch (OP2) { case 0: /*RSR*/ - gen_check_sr(dc, RSR_SR, SR_R); - if (RSR_SR >= 64) { - gen_check_privilege(dc); + if (gen_check_sr(dc, RSR_SR, SR_R)) { + if (RSR_SR >= 64) { + gen_check_privilege(dc); + } + gen_window_check1(dc, RRR_T); + gen_rsr(dc, cpu_R[RRR_T], RSR_SR); } - gen_window_check1(dc, RRR_T); - gen_rsr(dc, cpu_R[RRR_T], RSR_SR); break; case 1: /*WSR*/ - gen_check_sr(dc, RSR_SR, SR_W); - if (RSR_SR >= 64) { - gen_check_privilege(dc); + if (gen_check_sr(dc, RSR_SR, SR_W)) { + if (RSR_SR >= 64) { + gen_check_privilege(dc); + } + gen_window_check1(dc, RRR_T); + gen_wsr(dc, RSR_SR, cpu_R[RRR_T]); } - gen_window_check1(dc, RRR_T); - gen_wsr(dc, RSR_SR, cpu_R[RRR_T]); break; case 2: /*SEXTu*/