From patchwork Fri Oct 10 16:03:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Bellows X-Patchwork-Id: 38610 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f197.google.com (mail-wi0-f197.google.com [209.85.212.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 61AFE205D8 for ; Fri, 10 Oct 2014 16:14:35 +0000 (UTC) Received: by mail-wi0-f197.google.com with SMTP id n3sf1028919wiv.0 for ; Fri, 10 Oct 2014 09:14:34 -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=aZA8xFfGPCoytZCDVs6xLaGtg7fUcoVxG/RWSmXn7S0=; b=VzC+iIDvJCyYlj5dYnIMcz+HNpwtDe7QDEufYPTG/nNr55b83gJ8Kj96ZKtuts5wnf eMbybiia01kujNoBZCA56E9ss3D3iV3yBGZBc3Z2VjU3wXdzfoJaTzkwfinMGmFHdp9/ JerdqlJLxtf69+/VetThVIBhJwNFoyGXkoblrT1B/9j6zBb3kwHvJsnydjBHz2mV22A1 Ycnw4HyV/FVrY+CS5bPzE1z1lXvD1OcNv4qTcGJLxKqA/d1XrYnCOfTJfW1yFNIH5LE0 vV5GaDAWJmpDAXHvk/DPi0MpSq7ggTtVbTdEU0tIaHwvt7eku5YjJFHz3JraEm6pxXv9 yapQ== X-Gm-Message-State: ALoCoQn73Pvi1nPvx460I9ztg21sEAmMIgFQvR/dsrbUSKZ0OoYbQpl1OUCJT2jGv1L71dIekva9 X-Received: by 10.180.106.197 with SMTP id gw5mr1246978wib.1.1412957674470; Fri, 10 Oct 2014 09:14:34 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.2.39 with SMTP id 7ls262352lar.87.gmail; Fri, 10 Oct 2014 09:14:34 -0700 (PDT) X-Received: by 10.152.21.195 with SMTP id x3mr6000121lae.11.1412957674312; Fri, 10 Oct 2014 09:14:34 -0700 (PDT) Received: from mail-la0-f41.google.com (mail-la0-f41.google.com [209.85.215.41]) by mx.google.com with ESMTPS id h3si10019349lag.57.2014.10.10.09.14.34 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 10 Oct 2014 09:14:34 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.41 as permitted sender) client-ip=209.85.215.41; Received: by mail-la0-f41.google.com with SMTP id pn19so3620182lab.28 for ; Fri, 10 Oct 2014 09:14:34 -0700 (PDT) X-Received: by 10.152.26.226 with SMTP id o2mr6009394lag.44.1412957674196; Fri, 10 Oct 2014 09:14:34 -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.112.84.229 with SMTP id c5csp457598lbz; Fri, 10 Oct 2014 09:14:33 -0700 (PDT) X-Received: by 10.229.24.137 with SMTP id v9mr9869052qcb.14.1412957672737; Fri, 10 Oct 2014 09:14:32 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id d63si11705603qgd.80.2014.10.10.09.14.32 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 10 Oct 2014 09:14:32 -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]:49487 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xccpr-0006Nu-Pg for patch@linaro.org; Fri, 10 Oct 2014 12:14:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35013) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xccfp-0006sL-RU for qemu-devel@nongnu.org; Fri, 10 Oct 2014 12:04:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xccfk-00080V-90 for qemu-devel@nongnu.org; Fri, 10 Oct 2014 12:04:09 -0400 Received: from mail-oi0-f53.google.com ([209.85.218.53]:56848) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xccfk-00080M-3Y for qemu-devel@nongnu.org; Fri, 10 Oct 2014 12:04:04 -0400 Received: by mail-oi0-f53.google.com with SMTP id v63so7031259oia.40 for ; Fri, 10 Oct 2014 09:04:03 -0700 (PDT) X-Received: by 10.202.171.194 with SMTP id u185mr5299535oie.24.1412957043766; Fri, 10 Oct 2014 09:04:03 -0700 (PDT) Received: from gbellows-linaro.bellowshome.net (99-179-1-128.lightspeed.austtx.sbcglobal.net. [99.179.1.128]) by mx.google.com with ESMTPSA id d6sm5382455obt.12.2014.10.10.09.04.02 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 10 Oct 2014 09:04:03 -0700 (PDT) From: Greg Bellows To: qemu-devel@nongnu.org, peter.maydell@linaro.org, serge.fdrv@gmail.com, edgar.iglesias@gmail.com, aggelerf@ethz.ch Date: Fri, 10 Oct 2014 11:03:20 -0500 Message-Id: <1412957023-11105-10-git-send-email-greg.bellows@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1412957023-11105-1-git-send-email-greg.bellows@linaro.org> References: <1412957023-11105-1-git-send-email-greg.bellows@linaro.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.218.53 Subject: [Qemu-devel] [PATCH v6 09/32] target-arm: add banked register accessors 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: greg.bellows@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.215.41 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: Fabian Aggeler If EL3 is in AArch32 state certain cp registers are banked (secure and non-secure instance). When reading or writing to coprocessor registers the following macros can be used. - A32_BANKED macros are used for choosing the banked register based on provided input security argument. This macro is used to choose the bank during translation of MRC/MCR instructions that are dependent on something other than the current secure state. - A32_BANKED_CURRENT macros are used for choosing the banked register based on current secure state. This is NOT to be used for choosing the bank used during translation as it breaks monitor mode. If EL3 is operating in AArch64 state coprocessor registers are not banked anymore. The macros use the non-secure instance (_ns) in this case, which is architecturally mapped to the AArch64 EL register. Signed-off-by: Sergey Fedorov Signed-off-by: Fabian Aggeler Signed-off-by: Greg Bellows ========== v5 -> v6 - Converted macro USE_SECURE_REG() into inlince function use_secure_reg() - Globally replace Aarch# with AArch# v4 -> v5 - Cleaned-up macros to try and alleviate misuse. Made A32_BANKED macros take secure arg indicator rather than relying on USE_SECURE_REG. Incorporated the A32_BANKED macros into the A32_BANKED_CURRENT. CURRENT is now the only one that automatically chooses based on current secure state. --- target-arm/cpu.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/target-arm/cpu.h b/target-arm/cpu.h index 6e633cd..9f1613f 100644 --- a/target-arm/cpu.h +++ b/target-arm/cpu.h @@ -812,6 +812,46 @@ static inline bool arm_el_is_aa64(CPUARMState *env, int el) return arm_feature(env, ARM_FEATURE_AARCH64); } +/* Function for determing whether to use the secure or non-secure bank of a CP + * register. When EL3 is operating in AArch32 state, the NS-bit determines + * whether the secure instance of a cp-register should be used. + */ +static inline bool use_secure_reg(CPUARMState *env) +{ + bool ret = (arm_feature(env, ARM_FEATURE_EL3) && + !arm_el_is_aa64(env, 3) && + !(env->cp15.scr_el3 & SCR_NS)); + + return ret; +} + +/* Macros for accessing a specified CP register bank */ +#define A32_BANKED_REG_GET(_env, _regname, _secure) \ + ((_secure) ? (_env)->cp15._regname##_s : (_env)->cp15._regname##_ns) + +#define A32_BANKED_REG_SET(_env, _regname, _secure, _val) \ + do { \ + if (_secure) { \ + (_env)->cp15._regname##_s = (_val); \ + } else { \ + (_env)->cp15._regname##_ns = (_val); \ + } \ + } while (0) + +/* Macros for automatically accessing a specific CP register bank depending on + * the current secure state of the system. These macros are not intended for + * supporting instruction translation reads/writes as these are dependent + * solely on the SCR.NS bit and not the mode. + */ +#define A32_BANKED_CURRENT_REG_GET(_env, _regname) \ + A32_BANKED_REG_GET((_env), _regname, \ + ((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env)))) + +#define A32_BANKED_CURRENT_REG_SET(_env, _regname, _val) \ + A32_BANKED_REG_SET((_env), _regname, \ + ((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))), \ + (_val)) + void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf); unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx);