From patchwork Fri Aug 29 14:37:26 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 36288 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-vc0-f197.google.com (mail-vc0-f197.google.com [209.85.220.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 3DFF62054D for ; Fri, 29 Aug 2014 14:38:45 +0000 (UTC) Received: by mail-vc0-f197.google.com with SMTP id le20sf7222979vcb.8 for ; Fri, 29 Aug 2014 07:38:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:date :message-id:in-reply-to:references:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :errors-to:sender:x-original-sender :x-original-authentication-results:mailing-list; bh=DHM1TpqtLgtIYJL4BkuZA4RbTs2lDl+m1UPobfXvoag=; b=h1a5ckuPSjZK9ZeFaeJxJS8VzF3IidtsTLZw7mhUbryOFZct5et7tTVZpS1iXtG4Bd 4JjwMJgq5s7JLdhsjFCb6tTE9dTVH5O5k9wPjTOXhjxyPUt7Kco4L0yzDShGXkRfW1yG QcokOhAsKZ+VYGXFyHO9jV8mcME64lvIN8WK2CUYykkCimSrwXb9BNOMX8aLjAZp2NqL /+52cVAc5P2UQlEPyltb9BV+sHcWh+Hy0HX8RYEQcqtA52Ul4Kw/mk0tHfS/C7Ohr8ZY sDbshIN5imZOjMAhkYiXUVGjZ6IhM5Rimb+aSEERi1WS+E4xCoOEFiG/6GOFAT3LVb1E iB9w== X-Gm-Message-State: ALoCoQkjcsdYxw7ZwDYId6rkDCzWYcdNAck9EMfQaWogcUpJ+ORVGBwfQ6F0CQSq4r7xR4Rb5t1x X-Received: by 10.236.11.80 with SMTP id 56mr1054043yhw.22.1409323125032; Fri, 29 Aug 2014 07:38:45 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.83.49 with SMTP id i46ls256118qgd.10.gmail; Fri, 29 Aug 2014 07:38:44 -0700 (PDT) X-Received: by 10.52.168.134 with SMTP id zw6mr7605546vdb.37.1409323124967; Fri, 29 Aug 2014 07:38:44 -0700 (PDT) Received: from mail-vc0-f179.google.com (mail-vc0-f179.google.com [209.85.220.179]) by mx.google.com with ESMTPS id zx7si234280vdb.66.2014.08.29.07.38.44 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 29 Aug 2014 07:38:44 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.179 as permitted sender) client-ip=209.85.220.179; Received: by mail-vc0-f179.google.com with SMTP id hy4so2549535vcb.38 for ; Fri, 29 Aug 2014 07:38:44 -0700 (PDT) X-Received: by 10.52.94.108 with SMTP id db12mr8872440vdb.8.1409323124875; Fri, 29 Aug 2014 07:38:44 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.45.67 with SMTP id uj3csp26713vcb; Fri, 29 Aug 2014 07:38:44 -0700 (PDT) X-Received: by 10.140.33.230 with SMTP id j93mr17244745qgj.64.1409323123956; Fri, 29 Aug 2014 07:38:43 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id o8si392069qge.25.2014.08.29.07.38.43 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 29 Aug 2014 07:38:43 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Received: from localhost ([::1]:42330 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNNK7-00088h-Fu for patch@linaro.org; Fri, 29 Aug 2014 10:38:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49778) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNNJ1-00077P-N7 for qemu-devel@nongnu.org; Fri, 29 Aug 2014 10:37:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XNNIx-000811-5o for qemu-devel@nongnu.org; Fri, 29 Aug 2014 10:37:35 -0400 Received: from mnementh.archaic.org.uk ([81.2.115.146]:46762) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNNIw-000805-V3 for qemu-devel@nongnu.org; Fri, 29 Aug 2014 10:37:31 -0400 Received: from pm215 by mnementh.archaic.org.uk with local (Exim 4.80) (envelope-from ) id 1XNNIv-000529-QV for qemu-devel@nongnu.org; Fri, 29 Aug 2014 15:37:29 +0100 From: Peter Maydell To: qemu-devel@nongnu.org Date: Fri, 29 Aug 2014 15:37:26 +0100 Message-Id: <1409323049-19255-15-git-send-email-peter.maydell@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1409323049-19255-1-git-send-email-peter.maydell@linaro.org> References: <1409323049-19255-1-git-send-email-peter.maydell@linaro.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 81.2.115.146 Subject: [Qemu-devel] [PULL 14/16] target-arm: Implement pmccntr_sync function 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: peter.maydell@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.179 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 From: Alistair Francis This is used to synchronise the PMCCNTR counter and swap its state between enabled and disabled if required. It must always be called twice, both before and after any logic that could change the state of the PMCCNTR counter. Signed-off-by: Alistair Francis Signed-off-by: Peter Crosthwaite Message-id: 62811d4c0f7b1384f7aab62ea2fcfda3dcb0db50.1409025949.git.peter.crosthwaite@xilinx.com [PMM: fixed minor typos in pmccntr_sync doc comment] Signed-off-by: Peter Maydell --- target-arm/cpu.h | 11 +++++++++++ target-arm/helper.c | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/target-arm/cpu.h b/target-arm/cpu.h index 60dea03..51bedc8 100644 --- a/target-arm/cpu.h +++ b/target-arm/cpu.h @@ -353,6 +353,17 @@ int cpu_arm_signal_handler(int host_signum, void *pinfo, int arm_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw, int mmu_idx); +/** + * pmccntr_sync + * @env: CPUARMState + * + * Synchronises the counter in the PMCCNTR. This must always be called twice, + * once before any action that might affect the timer and again afterwards. + * The function is used to swap the state of the register if required. + * This only happens when not in user mode (!CONFIG_USER_ONLY) + */ +void pmccntr_sync(CPUARMState *env); + /* SCTLR bit meanings. Several bits have been reused in newer * versions of the architecture; in that case we define constants * for both old and new bit meanings. Code which tests against those diff --git a/target-arm/helper.c b/target-arm/helper.c index e6c82ab..fa79dfa 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -560,6 +560,23 @@ static inline bool arm_ccnt_enabled(CPUARMState *env) return true; } +void pmccntr_sync(CPUARMState *env) +{ + uint64_t temp_ticks; + + temp_ticks = muldiv64(qemu_clock_get_us(QEMU_CLOCK_VIRTUAL), + get_ticks_per_sec(), 1000000); + + if (env->cp15.c9_pmcr & PMCRD) { + /* Increment once every 64 processor clock cycles */ + temp_ticks /= 64; + } + + if (arm_ccnt_enabled(env)) { + env->cp15.c15_ccnt = temp_ticks - env->cp15.c15_ccnt; + } +} + static void pmcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) { @@ -644,6 +661,12 @@ static void pmccntr_write32(CPUARMState *env, const ARMCPRegInfo *ri, pmccntr_write(env, ri, deposit64(cur_val, 0, 32, value)); } +#else /* CONFIG_USER_ONLY */ + +void pmccntr_sync(CPUARMState *env) +{ +} + #endif static void pmcntenset_write(CPUARMState *env, const ARMCPRegInfo *ri,