From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LoIbw-0007zr-92 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:12 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LoIbo-0007tv-66 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:07 -0400 Received: from [199.232.76.173] (port=54200 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LoIbm-0007tZ-B4 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:02 -0400 Received: from mel.act-europe.fr ([212.99.106.210]:60664) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LoIbl-000147-NU for qemu-devel@nongnu.org; Mon, 30 Mar 2009 10:37:02 -0400 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 28F1829005D for ; Mon, 30 Mar 2009 16:36:39 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4cueuOfQOGP4 for ; Mon, 30 Mar 2009 16:36:38 +0200 (CEST) Received: from ulanbator.act-europe.fr (ulanbator.act-europe.fr [10.10.1.67]) by mel.act-europe.fr (Postfix) with ESMTP id 47CE2290064 for ; Mon, 30 Mar 2009 16:36:35 +0200 (CEST) From: Tristan Gingold Date: Mon, 30 Mar 2009 16:36:33 +0200 Message-Id: <1238423794-25455-19-git-send-email-gingold@adacore.com> In-Reply-To: <1238423794-25455-18-git-send-email-gingold@adacore.com> References: <1238423794-25455-1-git-send-email-gingold@adacore.com> <1238423794-25455-2-git-send-email-gingold@adacore.com> <1238423794-25455-3-git-send-email-gingold@adacore.com> <1238423794-25455-4-git-send-email-gingold@adacore.com> <1238423794-25455-5-git-send-email-gingold@adacore.com> <1238423794-25455-6-git-send-email-gingold@adacore.com> <1238423794-25455-7-git-send-email-gingold@adacore.com> <1238423794-25455-8-git-send-email-gingold@adacore.com> <1238423794-25455-9-git-send-email-gingold@adacore.com> <1238423794-25455-10-git-send-email-gingold@adacore.com> <1238423794-25455-11-git-send-email-gingold@adacore.com> <1238423794-25455-12-git-send-email-gingold@adacore.com> <1238423794-25455-13-git-send-email-gingold@adacore.com> <1238423794-25455-14-git-send-email-gingold@adacore.com> <1238423794-25455-15-git-send-email-gingold@adacore.com> <1238423794-25455-16-git-send-email-gingold@adacore.com> <1238423794-25455-17-git-send-email-gingold@adacore.com> <1238423794-25455-18-git-send-email-gingold@adacore.com> Subject: [Qemu-devel] [PATCH 18/19] Correctly decode hw_ld/hw_st opcodes for all alpha implementations. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Allow privilegied pal_code only in kernel mode. Signed-off-by: Tristan Gingold --- target-alpha/translate.c | 30 +++++++++++++++++++++++------- 1 files changed, 23 insertions(+), 7 deletions(-) diff --git a/target-alpha/translate.c b/target-alpha/translate.c index 061cf5f..6938b5d 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -52,6 +52,7 @@ struct DisasContext { int pal_mode; #endif uint32_t amask; + uint32_t implver; }; /* global register indexes */ @@ -103,6 +104,20 @@ static void alpha_translate_init(void) done_init = 1; } +static inline int get_mxcr_iprn(DisasContext *ctx, uint32_t insn) +{ + switch (ctx->implver) { + case IMPLVER_2106x: + return insn & 0xff; + case IMPLVER_21164: + return insn & 0xffff; + case IMPLVER_21264: + return (insn >> 8) & 0xff; + default: + abort(); + } +} + static always_inline void gen_excp (DisasContext *ctx, int exception, int error_code) { @@ -689,7 +704,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) #if !defined (CONFIG_USER_ONLY) } else if (palcode < 0x40) { /* Privileged PAL code */ - if (ctx->mem_idx & 1) + if (ctx->mem_idx != MMU_KERNEL_IDX) goto invalid_opc; else gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x3F) << 6), 0); @@ -1748,7 +1763,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) if (!ctx->pal_mode) goto invalid_opc; if (ra != 31) { - TCGv tmp = tcg_const_i32(insn & 0xFF); + TCGv tmp = tcg_const_i32(get_mxcr_iprn(ctx, insn)); gen_helper_mfpr(cpu_ir[ra], tmp, cpu_ir[ra]); tcg_temp_free(tmp); } @@ -2063,9 +2078,9 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) if (!ctx->pal_mode) goto invalid_opc; else { - TCGv tmp1 = tcg_const_i32(insn & 0xFF); - if (ra != 31) - gen_helper_mtpr(tmp1, cpu_ir[ra]); + TCGv tmp1 = tcg_const_i32(get_mxcr_iprn(ctx, insn)); + if (rb != 31) + gen_helper_mtpr(tmp1, cpu_ir[rb]); else { TCGv tmp2 = tcg_const_i64(0); gen_helper_mtpr(tmp1, tmp2); @@ -2089,7 +2104,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) } else { TCGv tmp; - if (ra != 31) { + if (rb != 31) { tmp = tcg_temp_new(); tcg_gen_addi_i64(tmp, cpu_ir[rb], (((int64_t)insn << 51) >> 51)); } else @@ -2097,7 +2112,7 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) gen_helper_hw_ret(tmp); tcg_temp_free(tmp); } - ret = 2; + ret = 3; break; #endif case 0x1F: @@ -2352,6 +2367,7 @@ static always_inline void gen_intermediate_code_internal (CPUState *env, gen_opc_end = gen_opc_buf + OPC_MAX_SIZE; ctx.pc = pc_start; ctx.amask = env->amask; + ctx.implver = env->implver; #if defined (CONFIG_USER_ONLY) ctx.mem_idx = 0; #else -- 1.6.2