From patchwork Mon May 9 21:34:27 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 94867 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 4719EB6F1B for ; Tue, 10 May 2011 07:39:37 +1000 (EST) Received: from localhost ([::1]:57554 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QJYAw-0002N0-Ko for incoming@patchwork.ozlabs.org; Mon, 09 May 2011 17:39:34 -0400 Received: from eggs.gnu.org ([140.186.70.92]:38390) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QJY6g-0003YH-2Q for qemu-devel@nongnu.org; Mon, 09 May 2011 17:35:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QJY6e-0006It-Kj for qemu-devel@nongnu.org; Mon, 09 May 2011 17:35:09 -0400 Received: from mail-iw0-f173.google.com ([209.85.214.173]:38418) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QJY6e-0006Af-EP for qemu-devel@nongnu.org; Mon, 09 May 2011 17:35:08 -0400 Received: by mail-iw0-f173.google.com with SMTP id 42so5560360iwl.4 for ; Mon, 09 May 2011 14:35:08 -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=ccpXuSucooTj8anHntq8WseAIY5aUu6DPi7iCaT0eHa3vPGp4hegmTBO0IRtyRPp5R s5Vv0cqTg21USS5uUgxXowttjtqZ7bdlOnu1qMr8B8VbgyqSNWEpIn/Xftt8saX4Ur12 q0U8RpGMbhsz0bx2njZynkM+OENik+cNPs2BQ= 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=FfSZdBfHsdaIU20ThCIJPUiFCxRideAP9aKlVtkps0UASceVTm2gfF7LPmkCA2twww A5VNl24Vn2iFTk2r10jPokfVxLRth7ntZm1OqqWnrRdP1bs4Qkjf6Ssd1Mb1XwtM4Evg r+9ye8SKCJjHXt/49cko4897rK4wVWw2wWILM= Received: by 10.42.137.130 with SMTP id y2mr468235ict.370.1304976908171; Mon, 09 May 2011 14:35:08 -0700 (PDT) Received: from localhost.localdomain (are.twiddle.net [75.101.38.216]) by mx.google.com with ESMTPS id ui7sm2549819icb.14.2011.05.09.14.35.07 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 09 May 2011 14:35:07 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 9 May 2011 14:34:27 -0700 Message-Id: <1304976889-29675-14-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1304976889-29675-1-git-send-email-rth@twiddle.net> References: <1304976889-29675-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.214.173 Subject: [Qemu-devel] [PATCH 13/35] 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(); }