{"id":811096,"url":"http://patchwork.ozlabs.org/api/patches/811096/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170907181938.3948-4-richard.henderson@linaro.org/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170907181938.3948-4-richard.henderson@linaro.org>","list_archive_url":null,"date":"2017-09-07T18:19:37","name":"[PULL,3/4] target/alpha: Convert to TranslatorOps","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"cd3e9dfddc36a62a8a27eb3d0f463f8af5c23fde","submitter":{"id":72104,"url":"http://patchwork.ozlabs.org/api/people/72104/?format=json","name":"Richard Henderson","email":"richard.henderson@linaro.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170907181938.3948-4-richard.henderson@linaro.org/mbox/","series":[{"id":2035,"url":"http://patchwork.ozlabs.org/api/series/2035/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2035","date":"2017-09-07T18:19:34","name":"[PULL,1/4] target/alpha: Convert to DisasJumpType","version":1,"mbox":"http://patchwork.ozlabs.org/series/2035/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/811096/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/811096/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"SWT4/AY2\"; dkim-atps=neutral"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xp7zq0ZqNz9s7C\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  8 Sep 2017 04:20:38 +1000 (AEST)","from localhost ([::1]:41650 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dq1Pp-0003PX-0C\n\tfor incoming@patchwork.ozlabs.org; Thu, 07 Sep 2017 14:20:37 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:41828)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <richard.henderson@linaro.org>) id 1dq1P5-0003KK-RH\n\tfor qemu-devel@nongnu.org; Thu, 07 Sep 2017 14:19:59 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <richard.henderson@linaro.org>) id 1dq1P0-0007bG-Lj\n\tfor qemu-devel@nongnu.org; Thu, 07 Sep 2017 14:19:51 -0400","from mail-pf0-x22f.google.com ([2607:f8b0:400e:c00::22f]:36653)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (envelope-from <richard.henderson@linaro.org>)\n\tid 1dq1P0-0007ah-Ag\n\tfor qemu-devel@nongnu.org; Thu, 07 Sep 2017 14:19:46 -0400","by mail-pf0-x22f.google.com with SMTP id e199so713726pfh.3\n\tfor <qemu-devel@nongnu.org>; Thu, 07 Sep 2017 11:19:46 -0700 (PDT)","from pike.twiddle.net (97-126-108-236.tukw.qwest.net.\n\t[97.126.108.236]) by smtp.gmail.com with ESMTPSA id\n\ts68sm412051pfd.72.2017.09.07.11.19.43\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tThu, 07 Sep 2017 11:19:43 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=rbLGxLy2YQASfI0h8KdMcb+i/UlDRG30LRR7g/jcY/M=;\n\tb=SWT4/AY2yHLrH5Xtn0fpM/8cFk2DJ5pkKRHetXCZTE0+Vb0CrWLL/YbP/EcjFng+OL\n\tAvmRNoJlLyi/qsMxLXHPAbdStXXFo0fdYMe4SdnJp20Z7WOc98te8T/4a68F1EGNDSL0\n\tPWycpi0XvFoiGwR6i3nqREzfDfFEi38md9gXs=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=rbLGxLy2YQASfI0h8KdMcb+i/UlDRG30LRR7g/jcY/M=;\n\tb=GIMbjtQrrA3uU/Ud7yI5Z4cOOcIM6ewzxCrq1aCLmPGiFvVy7iZoaOeLqdxZ+aWl0o\n\tc5II077SKWtBmanYgiU+5IjC2xsM9aN7DZ5zIQCDycgaax+GP0RgilDezYyz7MBwFq89\n\t0jVw6jr0HE8U0BlgMqnITDiGorxeAbJMPNC958oGqZrO7/Ypfkflj9YUfllFdFUrstJX\n\t6kUMCRQ8ATyj//ihnLuKzsWK1db/foMVybIbw6olqUMIZY0JeLv7lL60X94Fw3WEnUE5\n\tHVUElBx4Yliad5aNf8K6ZHTbiL7ZYQVC4qABjJPAV80Lvo7HzbYHJUfzUq7QNE7SzKIE\n\toUGw==","X-Gm-Message-State":"AHPjjUjC+7SzaQfZIbzp4iw6qKuGDnJ3F0oSH0QRZM1+TaUvyOBkbnWV\n\tUKSHu9PslEClf+4Hvpl0Eg==","X-Google-Smtp-Source":"ADKCNb7P0wy6kT+dXoY1z+QDHcBxR1pK0eVh8v9kd/GTCbMly8MHmSNyiFy77RFioBgzErt/V2pI0Q==","X-Received":"by 10.84.232.6 with SMTP id h6mr274681plk.66.1504808385055;\n\tThu, 07 Sep 2017 11:19:45 -0700 (PDT)","From":"Richard Henderson <richard.henderson@linaro.org>","To":"qemu-devel@nongnu.org","Date":"Thu,  7 Sep 2017 11:19:37 -0700","Message-Id":"<20170907181938.3948-4-richard.henderson@linaro.org>","X-Mailer":"git-send-email 2.13.5","In-Reply-To":"<20170907181938.3948-1-richard.henderson@linaro.org>","References":"<20170907181938.3948-1-richard.henderson@linaro.org>","X-detected-operating-system":"by eggs.gnu.org: Genre and OS details not\n\trecognized.","X-Received-From":"2607:f8b0:400e:c00::22f","Subject":"[Qemu-devel] [PULL 3/4] target/alpha: Convert to TranslatorOps","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"peter.maydell@linaro.org, Richard Henderson <rth@twiddle.net>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"From: Richard Henderson <rth@twiddle.net>\n\nSigned-off-by: Richard Henderson <rth@twiddle.net>\n---\n target/alpha/translate.c | 185 ++++++++++++++++++++++-------------------------\n 1 file changed, 86 insertions(+), 99 deletions(-)","diff":"diff --git a/target/alpha/translate.c b/target/alpha/translate.c\nindex ba38717e0f..5a92c4accb 100644\n--- a/target/alpha/translate.c\n+++ b/target/alpha/translate.c\n@@ -2929,33 +2929,23 @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)\n     return ret;\n }\n \n-void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)\n+static int alpha_tr_init_disas_context(DisasContextBase *dcbase,\n+                                       CPUState *cpu, int max_insns)\n {\n-    CPUAlphaState *env = cs->env_ptr;\n-    DisasContext ctx, *ctxp = &ctx;\n-    target_ulong pc_start;\n-    target_ulong pc_mask;\n-    uint32_t insn;\n-    DisasJumpType ret;\n-    int num_insns;\n-    int max_insns;\n-\n-    pc_start = tb->pc;\n-\n-    ctx.base.tb = tb;\n-    ctx.base.pc_next = pc_start;\n-    ctx.base.singlestep_enabled = cs->singlestep_enabled;\n+    DisasContext *ctx = container_of(dcbase, DisasContext, base);\n+    CPUAlphaState *env = cpu->env_ptr;\n+    int64_t bound, mask;\n \n-    ctx.tbflags = tb->flags;\n-    ctx.mem_idx = cpu_mmu_index(env, false);\n-    ctx.implver = env->implver;\n-    ctx.amask = env->amask;\n+    ctx->tbflags = ctx->base.tb->flags;\n+    ctx->mem_idx = cpu_mmu_index(env, false);\n+    ctx->implver = env->implver;\n+    ctx->amask = env->amask;\n \n #ifdef CONFIG_USER_ONLY\n-    ctx.ir = cpu_std_ir;\n+    ctx->ir = cpu_std_ir;\n #else\n-    ctx.palbr = env->palbr;\n-    ctx.ir = (ctx.tbflags & ENV_FLAG_PAL_MODE ? cpu_pal_ir : cpu_std_ir);\n+    ctx->palbr = env->palbr;\n+    ctx->ir = (ctx->tbflags & ENV_FLAG_PAL_MODE ? cpu_pal_ir : cpu_std_ir);\n #endif\n \n     /* ??? Every TB begins with unset rounding mode, to be initialized on\n@@ -2964,96 +2954,87 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)\n        to reset the FP_STATUS to that default at the end of any TB that\n        changes the default.  We could even (gasp) dynamiclly figure out\n        what default would be most efficient given the running program.  */\n-    ctx.tb_rm = -1;\n+    ctx->tb_rm = -1;\n     /* Similarly for flush-to-zero.  */\n-    ctx.tb_ftz = -1;\n+    ctx->tb_ftz = -1;\n \n-    TCGV_UNUSED_I64(ctx.zero);\n-    TCGV_UNUSED_I64(ctx.sink);\n-    TCGV_UNUSED_I64(ctx.lit);\n-\n-    num_insns = 0;\n-    max_insns = tb->cflags & CF_COUNT_MASK;\n-    if (max_insns == 0) {\n-        max_insns = CF_COUNT_MASK;\n-    }\n-    if (max_insns > TCG_MAX_INSNS) {\n-        max_insns = TCG_MAX_INSNS;\n-    }\n+    TCGV_UNUSED_I64(ctx->zero);\n+    TCGV_UNUSED_I64(ctx->sink);\n+    TCGV_UNUSED_I64(ctx->lit);\n \n-    if (in_superpage(&ctx, pc_start)) {\n-        pc_mask = (1ULL << 41) - 1;\n+    /* Bound the number of insns to execute to those left on the page.  */\n+    if (in_superpage(ctx, ctx->base.pc_first)) {\n+        mask = -1ULL << 41;\n     } else {\n-        pc_mask = ~TARGET_PAGE_MASK;\n+        mask = TARGET_PAGE_MASK;\n     }\n+    bound = -(ctx->base.pc_first | mask) / 4;\n \n-    gen_tb_start(tb);\n-    tcg_clear_temp_count();\n+    return MIN(max_insns, bound);\n+}\n \n-    do {\n-        tcg_gen_insn_start(ctx.base.pc_next);\n-        num_insns++;\n+static void alpha_tr_tb_start(DisasContextBase *db, CPUState *cpu)\n+{\n+}\n \n-        if (unlikely(cpu_breakpoint_test(cs, ctx.base.pc_next, BP_ANY))) {\n-            ret = gen_excp(&ctx, EXCP_DEBUG, 0);\n-            /* The address covered by the breakpoint must be included in\n-               [tb->pc, tb->pc + tb->size) in order to for it to be\n-               properly cleared -- thus we increment the PC here so that\n-               the logic setting tb->size below does the right thing.  */\n-            ctx.base.pc_next += 4;\n-            break;\n-        }\n-        if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) {\n-            gen_io_start();\n-        }\n-        insn = cpu_ldl_code(env, ctx.base.pc_next);\n+static void alpha_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)\n+{\n+    tcg_gen_insn_start(dcbase->pc_next);\n+}\n \n-        ctx.base.pc_next += 4;\n-        ret = translate_one(ctxp, insn);\n-        free_context_temps(ctxp);\n+static bool alpha_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cpu,\n+                                      const CPUBreakpoint *bp)\n+{\n+    DisasContext *ctx = container_of(dcbase, DisasContext, base);\n \n-        if (tcg_check_temp_count()) {\n-            qemu_log(\"TCG temporary leak before \"TARGET_FMT_lx\"\\n\",\n-                     ctx.base.pc_next);\n-        }\n+    ctx->base.is_jmp = gen_excp(ctx, EXCP_DEBUG, 0);\n \n-        /* If we reach a page boundary, are single stepping,\n-           or exhaust instruction count, stop generation.  */\n-        if (ret == DISAS_NEXT\n-            && ((ctx.base.pc_next & pc_mask) == 0\n-                || tcg_op_buf_full()\n-                || num_insns >= max_insns\n-                || singlestep\n-                || ctx.base.singlestep_enabled)) {\n-            ret = DISAS_TOO_MANY;\n-        }\n-    } while (ret == DISAS_NEXT);\n+    /* The address covered by the breakpoint must be included in\n+       [tb->pc, tb->pc + tb->size) in order to for it to be\n+       properly cleared -- thus we increment the PC here so that\n+       the logic setting tb->size below does the right thing.  */\n+    ctx->base.pc_next += 4;\n+    return true;\n+}\n \n-    if (tb->cflags & CF_LAST_IO) {\n-        gen_io_end();\n-    }\n+static void alpha_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)\n+{\n+    DisasContext *ctx = container_of(dcbase, DisasContext, base);\n+    CPUAlphaState *env = cpu->env_ptr;\n+    uint32_t insn = cpu_ldl_code(env, ctx->base.pc_next);\n+\n+    ctx->base.pc_next += 4;\n+    ctx->base.is_jmp = translate_one(ctx, insn);\n+\n+    free_context_temps(ctx);\n+    translator_loop_temp_check(&ctx->base);\n+}\n+\n+static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)\n+{\n+    DisasContext *ctx = container_of(dcbase, DisasContext, base);\n \n-    switch (ret) {\n+    switch (ctx->base.is_jmp) {\n     case DISAS_NORETURN:\n         break;\n     case DISAS_TOO_MANY:\n-        if (use_goto_tb(&ctx, ctx.base.pc_next)) {\n+        if (use_goto_tb(ctx, ctx->base.pc_next)) {\n             tcg_gen_goto_tb(0);\n-            tcg_gen_movi_i64(cpu_pc, ctx.base.pc_next);\n-            tcg_gen_exit_tb((uintptr_t)ctx.base.tb);\n+            tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);\n+            tcg_gen_exit_tb((uintptr_t)ctx->base.tb);\n         }\n         /* FALLTHRU */\n     case DISAS_PC_STALE:\n-        tcg_gen_movi_i64(cpu_pc, ctx.base.pc_next);\n+        tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);\n         /* FALLTHRU */\n     case DISAS_PC_UPDATED:\n-        if (!use_exit_tb(&ctx)) {\n+        if (!use_exit_tb(ctx)) {\n             tcg_gen_lookup_and_goto_ptr(cpu_pc);\n             break;\n         }\n         /* FALLTHRU */\n     case DISAS_PC_UPDATED_NOCHAIN:\n-        if (ctx.base.singlestep_enabled) {\n+        if (ctx->base.singlestep_enabled) {\n             gen_excp_1(EXCP_DEBUG, 0);\n         } else {\n             tcg_gen_exit_tb(0);\n@@ -3062,22 +3043,28 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)\n     default:\n         g_assert_not_reached();\n     }\n+}\n \n-    gen_tb_end(tb, num_insns);\n-\n-    tb->size = ctx.base.pc_next - pc_start;\n-    tb->icount = num_insns;\n+static void alpha_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)\n+{\n+    qemu_log(\"IN: %s\\n\", lookup_symbol(dcbase->pc_first));\n+    log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size, 1);\n+}\n+\n+static const TranslatorOps alpha_tr_ops = {\n+    .init_disas_context = alpha_tr_init_disas_context,\n+    .tb_start           = alpha_tr_tb_start,\n+    .insn_start         = alpha_tr_insn_start,\n+    .breakpoint_check   = alpha_tr_breakpoint_check,\n+    .translate_insn     = alpha_tr_translate_insn,\n+    .tb_stop            = alpha_tr_tb_stop,\n+    .disas_log          = alpha_tr_disas_log,\n+};\n \n-#ifdef DEBUG_DISAS\n-    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)\n-        && qemu_log_in_addr_range(pc_start)) {\n-        qemu_log_lock();\n-        qemu_log(\"IN: %s\\n\", lookup_symbol(pc_start));\n-        log_target_disas(cs, pc_start, ctx.base.pc_next - pc_start, 1);\n-        qemu_log(\"\\n\");\n-        qemu_log_unlock();\n-    }\n-#endif\n+void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb)\n+{\n+    DisasContext dc;\n+    translator_loop(&alpha_tr_ops, &dc.base, cpu, tb);\n }\n \n void restore_state_to_opc(CPUAlphaState *env, TranslationBlock *tb,\n","prefixes":["PULL","3/4"]}