From patchwork Wed Jun 22 09:51:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Rolnik X-Patchwork-Id: 9192321 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E497560756 for ; Wed, 22 Jun 2016 10:03:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D3A861FFB9 for ; Wed, 22 Jun 2016 10:03:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C5F31283DF; Wed, 22 Jun 2016 10:03:16 +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=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 26D5D1FFB9 for ; Wed, 22 Jun 2016 10:03:15 +0000 (UTC) Received: from localhost ([::1]:56893 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bFf06-0004n4-HD for patchwork-qemu-devel@patchwork.kernel.org; Wed, 22 Jun 2016 06:03:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40743) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bFepp-0002ZH-1J for qemu-devel@nongnu.org; Wed, 22 Jun 2016 05:52:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bFepi-0006Js-F0 for qemu-devel@nongnu.org; Wed, 22 Jun 2016 05:52:36 -0400 Received: from mail-lb0-x244.google.com ([2a00:1450:4010:c04::244]:34769) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bFepi-0006JT-1n for qemu-devel@nongnu.org; Wed, 22 Jun 2016 05:52:30 -0400 Received: by mail-lb0-x244.google.com with SMTP id w10so3832041lbo.1 for ; Wed, 22 Jun 2016 02:52:29 -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:in-reply-to:references; bh=LMMzF2rSrbOXmK1cneDjk5WnAzIzMsWUU9VZUcxBZfQ=; b=cDD9coVEkFCIG5ESECH5FQ2MfCk5MAvux4zonO6g9HiiWjYBVRJ18N73ugNdDYeKU+ kVPkeUtGCr16QlhlSifaA+y9fhZs6XVNkEURYCf4zsgANVL4cTatNFEMJzX+1510YNO1 pIMmG4ddvFMBcczcH7tnXAwRoAaDcX9Xp9Oi93jT+JkNnIz1hFflgdOGH7wG7ps/FjXD zxjIeUtP0thou0MAuwgzklawadyng1GIrSzY8gybE/+pYkh3GpiBHAG99fKLt+nSAW6k rUTIaOg7+iG3iBd+BWZwGX6kshPUTfsGNHje6AtL7R3txvg48uy85TfwUNrknFqYSLLX BgWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=LMMzF2rSrbOXmK1cneDjk5WnAzIzMsWUU9VZUcxBZfQ=; b=QoTcLDAmpnnHPVTtWFMLtDCYIaVCgyJvNeakjVwazH8D8P5aZdnP9FbwG01FwQkc0Q sSbL6STmC71eCW0q294X+F81RodVnZUGhvrlKhb3A3VG1pnUy05Gf3UGWrKA1lcl7TmW x7o8g/pAJp4UeHr7kPh6IrWh7P/dlcn1xjRNi5xcND0PtM+UI2h5WgYN93fi/kC9Gc+k KEFq9kf4DcmtSbZ5Eky9Xe+b9pN2iBCSn8vtUG/OENalZaWwyuD9iogwFPL3Ojba0cao TEUyYp6uWjRYctcoUVgz+3Pkwlomhh73JhS7nvU8Djzzaier1Pn8j9eJFphdYXxbwapA aeJg== X-Gm-Message-State: ALyK8tI0XkOipwopnk0VYxavYTqF6LEVnF9umK/+p7Y54MHBkeNJAcwC0GVuyEzJZGutxw== X-Received: by 10.194.216.33 with SMTP id on1mr23415369wjc.153.1466589149111; Wed, 22 Jun 2016 02:52:29 -0700 (PDT) Received: from a0999b0126e1.ant.amazon.com ([5.102.195.79]) by smtp.gmail.com with ESMTPSA id b187sm7215976wmg.15.2016.06.22.02.52.27 (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 22 Jun 2016 02:52:28 -0700 (PDT) From: Michael Rolnik To: qemu-devel@nongnu.org Date: Wed, 22 Jun 2016 12:51:54 +0300 Message-Id: <1466589115-57738-10-git-send-email-mrolnik@gmail.com> X-Mailer: git-send-email 2.4.9 (Apple Git-60) In-Reply-To: <1466589115-57738-1-git-send-email-mrolnik@gmail.com> References: <1466589115-57738-1-git-send-email-mrolnik@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:4010:c04::244 Subject: [Qemu-devel] [PATCH v9 09/10] target-avr: updating translate.c to use instructions translation 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: peter.maydell@linaro.org, Michael Rolnik , rth@twiddle.net Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Michael Rolnik --- target-avr/Makefile.objs | 4 +- target-avr/translate.c | 142 ++++++++++++++++++++--------------------------- 2 files changed, 64 insertions(+), 82 deletions(-) diff --git a/target-avr/Makefile.objs b/target-avr/Makefile.objs index 2a10104..9757721 100644 --- a/target-avr/Makefile.objs +++ b/target-avr/Makefile.objs @@ -18,6 +18,8 @@ # # -obj-y += translate.o cpu.o helper.o +obj-y += translate.o helper.o cpu.o translate-inst.o obj-y += gdbstub.o obj-$(CONFIG_SOFTMMU) += machine.o + +obj-y += decode.o diff --git a/target-avr/translate.c b/target-avr/translate.c index 66ec98b..f98ae07 100644 --- a/target-avr/translate.c +++ b/target-avr/translate.c @@ -18,60 +18,30 @@ * */ -#include "qemu/osdep.h" - -#include "cpu.h" -#include "exec/exec-all.h" -#include "disas/disas.h" -#include "tcg-op.h" -#include "exec/cpu_ldst.h" - -#include "exec/helper-proto.h" -#include "exec/helper-gen.h" -#include "exec/log.h" - -typedef struct DisasContext DisasContext; -typedef struct InstInfo InstInfo; - -/*This is the state at translation time. */ -struct DisasContext { - struct TranslationBlock *tb; - - /*Routine used to access memory */ - int memidx; - int bstate; - int singlestep; -}; - -enum { - BS_NONE = 0, /* Nothing special (none of the below */ - BS_STOP = 1, /* We want to stop translation for any reason */ - BS_BRANCH = 2, /* A branch condition is reached */ - BS_EXCP = 3, /* An exception condition is reached */ -}; - -static TCGv_env cpu_env; - -static TCGv cpu_pc; - -static TCGv cpu_Cf; -static TCGv cpu_Zf; -static TCGv cpu_Nf; -static TCGv cpu_Vf; -static TCGv cpu_Sf; -static TCGv cpu_Hf; -static TCGv cpu_Tf; -static TCGv cpu_If; - -static TCGv cpu_rampD; -static TCGv cpu_rampX; -static TCGv cpu_rampY; -static TCGv cpu_rampZ; - -static TCGv cpu_io[64]; -static TCGv cpu_r[32]; -static TCGv cpu_eind; -static TCGv cpu_sp; +#include "translate.h" + +TCGv_env cpu_env; + +TCGv cpu_pc; + +TCGv cpu_Cf; +TCGv cpu_Zf; +TCGv cpu_Nf; +TCGv cpu_Vf; +TCGv cpu_Sf; +TCGv cpu_Hf; +TCGv cpu_Tf; +TCGv cpu_If; + +TCGv cpu_rampD; +TCGv cpu_rampX; +TCGv cpu_rampY; +TCGv cpu_rampZ; + +TCGv cpu_io[64]; +TCGv cpu_r[32]; +TCGv cpu_eind; +TCGv cpu_sp; #include "exec/gen-icount.h" #define REG(x) (cpu_r[x]) @@ -120,25 +90,27 @@ void avr_translate_init(void) done_init = 1; } -static inline void gen_goto_tb(CPUAVRState *env, DisasContext *ctx, int n, - target_ulong dest) +static void decode_opc(AVRCPU *cpu, DisasContext *ctx, InstInfo *inst) { - TranslationBlock *tb; + CPUAVRState *env = &cpu->env; - tb = ctx->tb; + inst->opcode = cpu_ldl_code(env, inst->cpc * 2);/* pc points to words */ + inst->length = 16; + inst->translate = NULL; - if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) - && (ctx->singlestep == 0)) { - tcg_gen_goto_tb(n); - tcg_gen_movi_i32(cpu_pc, dest); - tcg_gen_exit_tb((uintptr_t)tb + n); - } else { - tcg_gen_movi_i32(cpu_pc, dest); + /* the following function looks onto the opcode as a string of bytes */ + avr_decode(inst->cpc, &inst->length, inst->opcode, &inst->translate); - if (ctx->singlestep) { - gen_helper_debug(cpu_env); - } - tcg_gen_exit_tb(0); + if (inst->length == 16) { + inst->npc = inst->cpc + 1; + /* get opcode as 16bit value */ + inst->opcode = inst->opcode & 0x0000ffff; + } + if (inst->length == 32) { + inst->npc = inst->cpc + 2; + /* get opcode as 32bit value */ + inst->opcode = (inst->opcode << 16) + | (inst->opcode >> 16); } } @@ -172,18 +144,21 @@ void gen_intermediate_code(CPUAVRState *env, struct TranslationBlock *tb) gen_tb_start(tb); /* decode first instruction */ - cpc = pc_start; - npc = cpc + 1; + ctx.inst[0].cpc = pc_start; + decode_opc(cpu, &ctx, &ctx.inst[0]); do { - /* translate current instruction */ + /* set curr/next PCs */ + cpc = ctx.inst[0].cpc; + npc = ctx.inst[0].npc; + + /* decode next instruction */ + ctx.inst[1].cpc = ctx.inst[0].npc; + decode_opc(cpu, &ctx, &ctx.inst[1]); + + /* translate current instruction */ tcg_gen_insn_start(cpc); num_insns++; - /* just skip to next instruction */ - cpc++; - npc++; - ctx.bstate = BS_NONE; - if (unlikely(cpu_breakpoint_test(cs, cpc * 2, BP_ANY))) { tcg_gen_movi_i32(cpu_pc, cpc); gen_helper_debug(cpu_env); @@ -195,6 +170,8 @@ void gen_intermediate_code(CPUAVRState *env, struct TranslationBlock *tb) goto done_generating; } + ctx.bstate = ctx.inst[0].translate(env, &ctx, ctx.inst[0].opcode); + if (num_insns >= max_insns) { break; /* max translated instructions limit reached */ } @@ -204,6 +181,8 @@ void gen_intermediate_code(CPUAVRState *env, struct TranslationBlock *tb) if ((cpc & (TARGET_PAGE_SIZE - 1)) == 0) { break; /* page boundary */ } + + ctx.inst[0] = ctx.inst[1]; /* make next inst curr */ } while (ctx.bstate == BS_NONE && !tcg_op_buf_full()); if (tb->cflags & CF_LAST_IO) { @@ -239,16 +218,17 @@ done_generating: } void restore_state_to_opc(CPUAVRState *env, TranslationBlock *tb, - target_ulong *data) + target_ulong *data) { env->pc_w = data[0]; } void avr_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, - int flags) + int flags) { AVRCPU *cpu = AVR_CPU(cs); CPUAVRState *env = &cpu->env; + int i; cpu_fprintf(f, "\n"); cpu_fprintf(f, "PC: %06x\n", env->pc_w); @@ -272,7 +252,7 @@ void avr_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, env->sregC ? 'I' : '-'); cpu_fprintf(f, "\n"); - for (int i = 0; i < ARRAY_SIZE(env->r); i++) { + for (i = 0; i < ARRAY_SIZE(env->r); i++) { cpu_fprintf(f, "R[%02d]: %02x ", i, env->r[i]); if ((i % 8) == 7) { @@ -281,7 +261,7 @@ void avr_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, } cpu_fprintf(f, "\n"); - for (int i = 0; i < ARRAY_SIZE(env->io); i++) { + for (i = 0; i < ARRAY_SIZE(env->io); i++) { cpu_fprintf(f, "IO[%02d]: %02x ", i, env->io[i]); if ((i % 8) == 7) {