From patchwork Thu Apr 28 20:50:56 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 93320 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 9753CB6FBC for ; Fri, 29 Apr 2011 06:59:46 +1000 (EST) Received: from localhost ([::1]:34267 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QFYJM-0003Kl-1y for incoming@patchwork.ozlabs.org; Thu, 28 Apr 2011 16:59:44 -0400 Received: from eggs.gnu.org ([140.186.70.92]:47854) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QFYBZ-0005IX-OB for qemu-devel@nongnu.org; Thu, 28 Apr 2011 16:51:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QFYBY-0005cW-SH for qemu-devel@nongnu.org; Thu, 28 Apr 2011 16:51:41 -0400 Received: from mail-pw0-f45.google.com ([209.85.160.45]:41062) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QFYBY-0005Yq-LQ for qemu-devel@nongnu.org; Thu, 28 Apr 2011 16:51:40 -0400 Received: by mail-pw0-f45.google.com with SMTP id 6so1870069pwi.4 for ; Thu, 28 Apr 2011 13:51:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:sender:from:to:subject:date:message-id:x-mailer :in-reply-to:references; bh=kUkfdmQQX9pREacIiOTy5JEDDESVn5Rl3ve/QbhnX3Y=; b=YpXnD57Puz5UYmZ9tUq5NYnIVp+CxFV1ors8bVTiX7waE5efwzxF+x1mcKXkCc/Kog cYgtQh5cV266v3cbK65rtSehsBqj8PgmLSNyrY1xJ9KETcxQe+NKrx8h57hrY/Rh5fkO 1jmdWMAQkE3y8B2jEox1iON0ZNIR0zShWDGsA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:subject:date:message-id:x-mailer:in-reply-to :references; b=vwc+jwN+LEUOIxpKbnmucJz2vOFbef6z4OCYd3RgzqBxkAY4F7eTeU3NLXoRvQYf40 AOUp9wG05I2vH+rfeyIb3OkZM/nHACZQVNrHuaxlsAioKsBcQQ67YgebQ04nr0X8Q2gL mBRYhe8c6g/grJHTTxmTZV0rmIr8pNUiFteKI= Received: by 10.142.171.15 with SMTP id t15mr1313060wfe.442.1304023900191; Thu, 28 Apr 2011 13:51:40 -0700 (PDT) Received: from localhost.localdomain (are.twiddle.net [75.101.38.216]) by mx.google.com with ESMTPS id z10sm2266797wfj.12.2011.04.28.13.51.39 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 28 Apr 2011 13:51:39 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 28 Apr 2011 13:50:56 -0700 Message-Id: <1304023875-25040-15-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1304023875-25040-1-git-send-email-rth@twiddle.net> References: <1304023875-25040-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.160.45 Subject: [Qemu-devel] [PATCH 14/33] target-alpha: Use do_restore_state for arithmetic exceptions. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This gets the PC right after an arithmetic exception. Also tidies the code in the TLB fault handlers to use common code. Signed-off-by: Richard Henderson --- target-alpha/op_helper.c | 49 ++++++++++++++++++++++++++++----------------- 1 files changed, 30 insertions(+), 19 deletions(-) diff --git a/target-alpha/op_helper.c b/target-alpha/op_helper.c index 672940e..fc5020a 100644 --- a/target-alpha/op_helper.c +++ b/target-alpha/op_helper.c @@ -25,20 +25,42 @@ /*****************************************************************************/ /* Exceptions processing helpers */ -void QEMU_NORETURN helper_excp (int excp, int error) + +/* This should only be called from translate, via gen_excp. + We expect that ENV->PC has already been updated. */ +void QEMU_NORETURN helper_excp(int excp, int error) +{ + env->exception_index = excp; + env->error_code = error; + cpu_loop_exit(); +} + +static void do_restore_state(void *retaddr) +{ + unsigned long pc = (unsigned long)retaddr; + + if (pc) { + TranslationBlock *tb = tb_find_pc(pc); + if (tb) { + cpu_restore_state(tb, env, pc); + } + } +} + +/* This may be called from any of the helpers to set up EXCEPTION_INDEX. */ +static void QEMU_NORETURN dynamic_excp(int excp, int error) { env->exception_index = excp; env->error_code = error; + do_restore_state(GETPC()); cpu_loop_exit(); } static void QEMU_NORETURN arith_excp(int exc, uint64_t mask) { - env->exception_index = EXCP_ARITH; - env->error_code = 0; env->trap_arg0 = exc; env->trap_arg1 = mask; - cpu_loop_exit(); + dynamic_excp(EXCP_ARITH, 0); } uint64_t helper_load_pcc (void) @@ -521,7 +543,7 @@ static inline float32 f_to_float32(uint64_t a) if (unlikely(!exp && mant_sig)) { /* Reserved operands / Dirty zero */ - helper_excp(EXCP_OPCDEC, 0); + dynamic_excp(EXCP_OPCDEC, 0); } if (exp < 3) { @@ -651,7 +673,7 @@ static inline float64 g_to_float64(uint64_t a) if (!exp && mant_sig) { /* Reserved operands / Dirty zero */ - helper_excp(EXCP_OPCDEC, 0); + dynamic_excp(EXCP_OPCDEC, 0); } if (exp < 3) { @@ -1260,9 +1282,7 @@ uint64_t helper_stq_c_phys(uint64_t p, uint64_t v) /* XXX: fix it to restore all registers */ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) { - TranslationBlock *tb; CPUState *saved_env; - unsigned long pc; int ret; /* XXX: hack to restore env in all cases, even if not called from @@ -1270,17 +1290,8 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) saved_env = env; env = cpu_single_env; ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); - if (!likely(ret == 0)) { - if (likely(retaddr)) { - /* now we have a real cpu fault */ - pc = (unsigned long)retaddr; - tb = tb_find_pc(pc); - if (likely(tb)) { - /* the PC is inside the translated code. It means that we have - a virtual CPU fault */ - cpu_restore_state(tb, env, pc); - } - } + if (unlikely(ret != 0)) { + do_restore_state(retaddr); /* Exception index and error code are already set */ cpu_loop_exit(); }