From patchwork Wed Jan 30 23:54:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 10789423 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 42B1091E for ; Wed, 30 Jan 2019 23:58:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 54FD42DD1E for ; Wed, 30 Jan 2019 23:58:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4886B2DFB1; Wed, 30 Jan 2019 23:58:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.2 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,FROM_LOCAL_NOVOWEL,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D874E2DD1E for ; Wed, 30 Jan 2019 23:58:21 +0000 (UTC) Received: from localhost ([127.0.0.1]:45961 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gozkL-0004Sg-9r for patchwork-qemu-devel@patchwork.kernel.org; Wed, 30 Jan 2019 18:58:21 -0500 Received: from eggs.gnu.org ([209.51.188.92]:56187) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gozhO-0002Cu-L0 for qemu-devel@nongnu.org; Wed, 30 Jan 2019 18:55:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gozhN-0006vf-Qc for qemu-devel@nongnu.org; Wed, 30 Jan 2019 18:55:18 -0500 Received: from mail-lf1-x141.google.com ([2a00:1450:4864:20::141]:37519) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gozhN-0006vN-Jp for qemu-devel@nongnu.org; Wed, 30 Jan 2019 18:55:17 -0500 Received: by mail-lf1-x141.google.com with SMTP id y11so958523lfj.4 for ; Wed, 30 Jan 2019 15:55:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FCSvgoGkOWvDkMVrMfOytf4jYXP3UU8jbYEm4OQyMxg=; b=hRR32KXlYDRPkGDoq/fINqZBvr1iHT+Nx3+W0XlMyAZ/4InGX3MkxiIw83J0CkzcJW u1L9BlrGgg9emAgEpVkqdqjaBE+GRUfyzscndwDewMK/eRgafP5wEBnn02pt+Q+sbC3m CsHjrnyngsh3QSFcNOBHST4K4sYsWw9s424OVfrHyI2R2ZrJ8QuxwLQKCVf14ULtXtQu XEzVyE9rE2ohcjImfjDkJ/G6qIeQ4+RIf65r1Gif1VUyhqI1TeqVBJCqCVrRYE9dNfMp zy3/sAKuWcw2poFYdyqVZQ/ok4VUmMObjAo7zB428DLAKwWe+pYPPQe6P7UAlf5IIY4z cLmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FCSvgoGkOWvDkMVrMfOytf4jYXP3UU8jbYEm4OQyMxg=; b=IYZ0JopicDBiGR0mJWneivjHICsDVd9SHGIsl0HRiE/dEVIbQYxfqKTRvxga/XIyAV 82YbLNREQUO8DU3sjLr0Kjel5UjNj+BOb838aVKpO4/gIYJF5Gha1LmV7iMzAXNhZfYd K35kWl0BTXFcV1rNmjNYcppqYKupjWmOWio9/gS3kpRbQj5nnLxnqAFMCMbcLdusI9wo 11kJXXs6yQ48IDpZomAENlHbUqdQPMQ7vLP+dhZ5PZ6tTWP9mohRXLW+ftyt+JIxmwFA /f8zlCybBqXgb29UyT7xnoZSscCdCrKM19V+lEHhEPMoUwiM/mVjPHd9hB70L670F1F4 tvgw== X-Gm-Message-State: AJcUukdeIKaBzvNnb6WH2DKJYRGhFyl1srwBqvMIj/RYbnLA7RnxeAGA cGIn5anCAb9jvzWTt8AxRkwVOBNil9s= X-Google-Smtp-Source: ALg8bN7PhzomjauKR9ccHVTyeFoQGwn4yw6KR828Jw9haHayM2ut3zVCxa0Pa3U8kYGaklkGTi491g== X-Received: by 2002:a19:a9d2:: with SMTP id s201mr20194664lfe.154.1548892515990; Wed, 30 Jan 2019 15:55:15 -0800 (PST) Received: from octofox.cadence.com (jcmvbkbc-1-pt.tunnel.tserv24.sto1.ipv6.he.net. [2001:470:27:1fa::2]) by smtp.gmail.com with ESMTPSA id w9sm527752lfc.66.2019.01.30.15.55.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Jan 2019 15:55:15 -0800 (PST) From: Max Filippov To: qemu-devel@nongnu.org Date: Wed, 30 Jan 2019 15:54:41 -0800 Message-Id: <20190130235442.2876-3-jcmvbkbc@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190130235442.2876-1-jcmvbkbc@gmail.com> References: <20190130235442.2876-1-jcmvbkbc@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::141 Subject: [Qemu-devel] [PATCH 2/3] target/xtensa: add generic instruction post-processing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Max Filippov , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Some opcodes may need additional actions at every exit from the translated instruction or may need to amend TB exit slots available to jumps generated for the instruction. Add gen_postprocess function and call it from the gen_jump_slot and from the disas_xtensa_insn. Signed-off-by: Max Filippov --- target/xtensa/cpu.h | 4 ++++ target/xtensa/translate.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h index b665bfc0068a..e1002c626954 100644 --- a/target/xtensa/cpu.h +++ b/target/xtensa/cpu.h @@ -368,9 +368,13 @@ enum { XTENSA_OP_DIVIDE_BY_ZERO = 0x100, + /* Postprocessing flags */ XTENSA_OP_CHECK_INTERRUPTS = 0x200, XTENSA_OP_EXIT_TB_M1 = 0x400, XTENSA_OP_EXIT_TB_0 = 0x800, + XTENSA_OP_SYNC_REGISTER_WINDOW = 0x1000, + + XTENSA_OP_POSTPROCESS = 0x1e00, }; typedef struct XtensaOpcodeOps { diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c index b3718d33eec8..f5f5bcfb179a 100644 --- a/target/xtensa/translate.c +++ b/target/xtensa/translate.c @@ -71,6 +71,7 @@ struct DisasContext { unsigned cpenable; + uint32_t op_flags; uint32_t *raw_arg; xtensa_insnbuf insnbuf; xtensa_insnbuf slotbuf; @@ -363,6 +364,8 @@ static bool gen_check_cpenable(DisasContext *dc, uint32_t cp_mask) return true; } +static int gen_postprocess(DisasContext *dc, int slot); + static void gen_jump_slot(DisasContext *dc, TCGv dest, int slot) { tcg_gen_mov_i32(cpu_pc, dest); @@ -372,6 +375,9 @@ static void gen_jump_slot(DisasContext *dc, TCGv dest, int slot) if (dc->base.singlestep_enabled) { gen_exception(dc, EXCP_DEBUG); } else { + if (dc->op_flags & XTENSA_OP_POSTPROCESS) { + slot = gen_postprocess(dc, slot); + } if (slot >= 0) { tcg_gen_goto_tb(slot); tcg_gen_exit_tb(dc->base.tb, slot); @@ -855,6 +861,19 @@ static inline unsigned xtensa_op0_insn_len(DisasContext *dc, uint8_t op0) return xtensa_isa_length_from_chars(dc->config->isa, &op0); } +static int gen_postprocess(DisasContext *dc, int slot) +{ + uint32_t op_flags = dc->op_flags; + + if (op_flags & XTENSA_OP_CHECK_INTERRUPTS) { + gen_check_interrupts(dc); + } + if (op_flags & XTENSA_OP_EXIT_TB_M1) { + slot = -1; + } + return slot; +} + struct slot_prop { XtensaOpcodeOps *ops; uint32_t arg[MAX_OPCODE_ARGS]; @@ -1195,6 +1214,8 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) } } + dc->op_flags = op_flags; + for (slot = 0; slot < slots; ++slot) { struct slot_prop *pslot = ordered[slot]; XtensaOpcodeOps *ops = pslot->ops; @@ -1204,21 +1225,17 @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) } if (dc->base.is_jmp == DISAS_NEXT) { - if (op_flags & XTENSA_OP_CHECK_INTERRUPTS) { - gen_check_interrupts(dc); - } - + gen_postprocess(dc, 0); + dc->op_flags = 0; if (op_flags & XTENSA_OP_EXIT_TB_M1) { /* Change in mmu index, memory mapping or tb->flags; exit tb */ gen_jumpi_check_loop_end(dc, -1); } else if (op_flags & XTENSA_OP_EXIT_TB_0) { gen_jumpi_check_loop_end(dc, 0); + } else { + gen_check_loop_end(dc, 0); } } - - if (dc->base.is_jmp == DISAS_NEXT) { - gen_check_loop_end(dc, 0); - } dc->pc = dc->base.pc_next; }