From patchwork Thu Jun 26 05:02:52 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 364240 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id C36AF1400B9 for ; Thu, 26 Jun 2014 15:04:21 +1000 (EST) Received: from localhost ([::1]:42269 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X01rA-0003ZT-0B for incoming@patchwork.ozlabs.org; Thu, 26 Jun 2014 01:04:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49615) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X01pz-0001Rt-Nf for qemu-devel@nongnu.org; Thu, 26 Jun 2014 01:03:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X01pr-0006us-DJ for qemu-devel@nongnu.org; Thu, 26 Jun 2014 01:03:07 -0400 Received: from mail-ig0-x232.google.com ([2607:f8b0:4001:c05::232]:47265) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X01pr-0006um-8x for qemu-devel@nongnu.org; Thu, 26 Jun 2014 01:02:59 -0400 Received: by mail-ig0-f178.google.com with SMTP id hn18so289782igb.11 for ; Wed, 25 Jun 2014 22:02:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=4pyVQmEToqntD2Kb06EHyFRxhfEXVQoVPVnv5Od9cJE=; b=aw1VC84XXiYc76RT3BuGAP+oq8Dfet8Fk/mYxagU/P0u3iR+5g9Dogz76lvShPNHqE L3oZsoBtQi2JeZEzJcx78D6DjFtNno4hLE70AzMFxCr+D3sqvNznHyobS4f9NUk7WAwk v9tatzCY2VxOvD2hlpk8B/d890sFeRks8qLge7oz6Y/i+VlAf4tgQ0hO0NEJm6PWyRfx wRf74JTpaombCX3XxIxMSKncrQTLi6jhenkXuUUJ+gzv9ekGiBEodlO2N2Bke7JRI6DV tQJocrw0I94K9QZKKYgl6QjtwTE0JXEPw1wZMk/P4RBr0nON22fE7CAAsXDZUiiv8FcV 8Qww== X-Received: by 10.50.50.177 with SMTP id d17mr1365306igo.42.1403758978745; Wed, 25 Jun 2014 22:02:58 -0700 (PDT) Received: from localhost ([203.126.243.116]) by mx.google.com with ESMTPSA id p12sm1051135igx.18.2014.06.25.22.02.55 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Wed, 25 Jun 2014 22:02:58 -0700 (PDT) From: Alistair Francis To: qemu-devel@nongnu.org Date: Thu, 26 Jun 2014 15:02:52 +1000 Message-Id: <299bd2202b8bda7c319cfd172eb1a7ca5a175d47.1403757527.git.alistair.francis@xilinx.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4001:c05::232 Cc: peter.maydell@linaro.org, peter.crosthwaite@xilinx.com, cov@codeaurora.org, alistair.francis@xilinx.com Subject: [Qemu-devel] [PATCH v2 7/7] target-arm: Call the pmccntr_sync function when swapping ELs 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 Call the new pmccntr_sync() function when there is a possibility of swapping ELs (I.E. when there is an exception) Signed-off-by: Alistair Francis --- target-arm/helper-a64.c | 5 +++++ target-arm/helper.c | 7 +++++++ target-arm/op_helper.c | 6 ++++++ 3 files changed, 18 insertions(+), 0 deletions(-) diff --git a/target-arm/helper-a64.c b/target-arm/helper-a64.c index 2b4ce6a..b61174f 100644 --- a/target-arm/helper-a64.c +++ b/target-arm/helper-a64.c @@ -446,6 +446,8 @@ void aarch64_cpu_do_interrupt(CPUState *cs) target_ulong addr = env->cp15.vbar_el[1]; int i; + pmccntr_sync(env); + if (arm_current_pl(env) == 0) { if (env->aarch64) { addr += 0x400; @@ -484,6 +486,7 @@ void aarch64_cpu_do_interrupt(CPUState *cs) addr += 0x100; break; default: + pmccntr_sync(env); cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index); } @@ -511,4 +514,6 @@ void aarch64_cpu_do_interrupt(CPUState *cs) env->pc = addr; cs->interrupt_request |= CPU_INTERRUPT_EXITTB; + + pmccntr_sync(env); } diff --git a/target-arm/helper.c b/target-arm/helper.c index e78c5a7..f05d912 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -3457,6 +3457,8 @@ void arm_cpu_do_interrupt(CPUState *cs) assert(!IS_M(env)); + pmccntr_sync(env); + arm_log_exception(cs->exception_index); /* TODO: Vectored interrupt controller. */ @@ -3487,6 +3489,7 @@ void arm_cpu_do_interrupt(CPUState *cs) && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) { env->regs[0] = do_arm_semihosting(env); qemu_log_mask(CPU_LOG_INT, "...handled as semihosting call\n"); + pmccntr_sync(env); return; } } @@ -3505,6 +3508,7 @@ void arm_cpu_do_interrupt(CPUState *cs) env->regs[15] += 2; env->regs[0] = do_arm_semihosting(env); qemu_log_mask(CPU_LOG_INT, "...handled as semihosting call\n"); + pmccntr_sync(env); return; } } @@ -3548,6 +3552,7 @@ void arm_cpu_do_interrupt(CPUState *cs) offset = 4; break; default: + pmccntr_sync(env); cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index); return; /* Never happens. Keep compiler happy. */ } @@ -3580,6 +3585,8 @@ void arm_cpu_do_interrupt(CPUState *cs) env->regs[14] = env->regs[15] + offset; env->regs[15] = addr; cs->interrupt_request |= CPU_INTERRUPT_EXITTB; + + pmccntr_sync(env); } /* Check section/page access permissions. diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c index 9c1ef52..07ab30b 100644 --- a/target-arm/op_helper.c +++ b/target-arm/op_helper.c @@ -376,6 +376,8 @@ void HELPER(exception_return)(CPUARMState *env) uint32_t spsr = env->banked_spsr[spsr_idx]; int new_el, i; + pmccntr_sync(env); + if (env->pstate & PSTATE_SP) { env->sp_el[cur_el] = env->xregs[31]; } else { @@ -418,6 +420,8 @@ void HELPER(exception_return)(CPUARMState *env) env->pc = env->elr_el[cur_el]; } + pmccntr_sync(env); + return; illegal_return: @@ -433,6 +437,8 @@ illegal_return: spsr &= PSTATE_NZCV | PSTATE_DAIF; spsr |= pstate_read(env) & ~(PSTATE_NZCV | PSTATE_DAIF); pstate_write(env, spsr); + + pmccntr_sync(env); } /* ??? Flag setting arithmetic is awkward because we need to do comparisons.