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: 1033845 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hRR32KXl"; dkim-atps=neutral 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 ozlabs.org (Postfix) with ESMTPS id 43qgKp6QWgz9s3q for ; Thu, 31 Jan 2019 10:58:06 +1100 (AEDT) Received: from localhost ([127.0.0.1]:45955 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gozk4-00044S-Vd for incoming@patchwork.ozlabs.org; Wed, 30 Jan 2019 18:58:04 -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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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; }