From patchwork Thu Sep 21 16:41:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 113859 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp2238762qgf; Thu, 21 Sep 2017 09:43:25 -0700 (PDT) X-Google-Smtp-Source: AOwi7QCyKWXnkUn1Obkako64lkB1CT+VhbnbjqMDLTrkptNjXWCwCuWGb5tXzpUbFza4lJ1Ngpc/ X-Received: by 10.55.21.39 with SMTP id f39mr3780779qkh.222.1506012205381; Thu, 21 Sep 2017 09:43:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1506012205; cv=none; d=google.com; s=arc-20160816; b=ApJd1u66l5rfWlVAp1zFI/ofXWImSLGvc9PYi9wTViMpIDNtOouueACuat34Phi9ng SSkfH4GmqvfxGLPt4YaLp+CqGANcELV+EYip8LTH2cQDVZ9mvUItKdeeo+Zh5qMFjkOw TVMHgtxMEl3nJ4KXjiI/CSBkJpcbvmY4urAMPhMnfADRjYAtpoT9sTSncdykT7NOdRyw 2xw9ynkvKtW72zGqLeKvmIxogUeWaiHBr/8NHeKRVB04q/s5E1BAHLkf0v8TIxl9cKWF BKreliz7+UkRlHsAbxy1j85/cblmlyORgmwOJy4T4uvtnq5By7cH3/rc9p5XUeNBXt// pJ1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:arc-authentication-results; bh=dcEqHH4GBjZNEqxpLXVTv0qrFu2aUAIkDWXJoPQbe/I=; b=IwFarA3okuzBh7i95oYWV3p7INw2GxweL9YcYHe+Mdec3OgDwaLoLWkv5011B7Gvrk TWxXIISh8O+72d5KYYHAsTUA1xwhbH2d2gsL4zTZ3jNdK7pqyyFlctv6tQaa0V71Vypj wsIbe3rxBxFoiLdypoelcRmbHbEKIHB6qFXaAaTa9aldoI982aYhDnBjzfVwN6GTdiBv 58+Aw0m/gX1jwCr5zqNBwFllfZOjmwmozryT0/FhxBjVwEiBXv5E082gfDeyegPLrJI+ IeZ2BH8ti0ruQu3u3P97nBbxw+/chT+EY1lkvsZ9sMcQElpPRNF/wzxfaL5hROMQSqOc Ea9A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id b184si1600083qka.362.2017.09.21.09.43.25 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 21 Sep 2017 09:43:25 -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; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:54634 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dv4ZP-0004M7-9Y for patch@linaro.org; Thu, 21 Sep 2017 12:43:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60113) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dv4XI-00032J-UK for qemu-devel@nongnu.org; Thu, 21 Sep 2017 12:41:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dv4XH-0002iF-SH for qemu-devel@nongnu.org; Thu, 21 Sep 2017 12:41:12 -0400 Received: from orth.archaic.org.uk ([2001:8b0:1d0::2]:37494) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dv4XH-0002Bq-KS for qemu-devel@nongnu.org; Thu, 21 Sep 2017 12:41:11 -0400 Received: from pm215 by orth.archaic.org.uk with local (Exim 4.89) (envelope-from ) id 1dv4X9-00052F-R9 for qemu-devel@nongnu.org; Thu, 21 Sep 2017 17:41:03 +0100 From: Peter Maydell To: qemu-devel@nongnu.org Date: Thu, 21 Sep 2017 17:41:09 +0100 Message-Id: <1506012099-13605-2-git-send-email-peter.maydell@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1506012099-13605-1-git-send-email-peter.maydell@linaro.org> References: <1506012099-13605-1-git-send-email-peter.maydell@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:8b0:1d0::2 Subject: [Qemu-devel] [PULL 01/31] target/arm: Implement MSR/MRS access to NS banked registers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 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" In v8M the MSR and MRS instructions have extra register value encodings to allow secure code to access the non-secure banked version of various special registers. (We don't implement the MSPLIM_NS or PSPLIM_NS aliases, because we don't currently implement the stack limit registers at all.) Signed-off-by: Peter Maydell Reviewed-by: Richard Henderson Message-id: 1505240046-11454-2-git-send-email-peter.maydell@linaro.org --- target/arm/helper.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) -- 2.7.4 diff --git a/target/arm/helper.c b/target/arm/helper.c index 4f41841..f4f2a87 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -8892,12 +8892,68 @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg) break; case 20: /* CONTROL */ return env->v7m.control[env->v7m.secure]; + case 0x94: /* CONTROL_NS */ + /* We have to handle this here because unprivileged Secure code + * can read the NS CONTROL register. + */ + if (!env->v7m.secure) { + return 0; + } + return env->v7m.control[M_REG_NS]; } if (el == 0) { return 0; /* unprivileged reads others as zero */ } + if (arm_feature(env, ARM_FEATURE_M_SECURITY)) { + switch (reg) { + case 0x88: /* MSP_NS */ + if (!env->v7m.secure) { + return 0; + } + return env->v7m.other_ss_msp; + case 0x89: /* PSP_NS */ + if (!env->v7m.secure) { + return 0; + } + return env->v7m.other_ss_psp; + case 0x90: /* PRIMASK_NS */ + if (!env->v7m.secure) { + return 0; + } + return env->v7m.primask[M_REG_NS]; + case 0x91: /* BASEPRI_NS */ + if (!env->v7m.secure) { + return 0; + } + return env->v7m.basepri[M_REG_NS]; + case 0x93: /* FAULTMASK_NS */ + if (!env->v7m.secure) { + return 0; + } + return env->v7m.faultmask[M_REG_NS]; + case 0x98: /* SP_NS */ + { + /* This gives the non-secure SP selected based on whether we're + * currently in handler mode or not, using the NS CONTROL.SPSEL. + */ + bool spsel = env->v7m.control[M_REG_NS] & R_V7M_CONTROL_SPSEL_MASK; + + if (!env->v7m.secure) { + return 0; + } + if (!arm_v7m_is_handler_mode(env) && spsel) { + return env->v7m.other_ss_psp; + } else { + return env->v7m.other_ss_msp; + } + } + default: + break; + } + } + switch (reg) { case 8: /* MSP */ return (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) ? @@ -8936,6 +8992,60 @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val) return; } + if (arm_feature(env, ARM_FEATURE_M_SECURITY)) { + switch (reg) { + case 0x88: /* MSP_NS */ + if (!env->v7m.secure) { + return; + } + env->v7m.other_ss_msp = val; + return; + case 0x89: /* PSP_NS */ + if (!env->v7m.secure) { + return; + } + env->v7m.other_ss_psp = val; + return; + case 0x90: /* PRIMASK_NS */ + if (!env->v7m.secure) { + return; + } + env->v7m.primask[M_REG_NS] = val & 1; + return; + case 0x91: /* BASEPRI_NS */ + if (!env->v7m.secure) { + return; + } + env->v7m.basepri[M_REG_NS] = val & 0xff; + return; + case 0x93: /* FAULTMASK_NS */ + if (!env->v7m.secure) { + return; + } + env->v7m.faultmask[M_REG_NS] = val & 1; + return; + case 0x98: /* SP_NS */ + { + /* This gives the non-secure SP selected based on whether we're + * currently in handler mode or not, using the NS CONTROL.SPSEL. + */ + bool spsel = env->v7m.control[M_REG_NS] & R_V7M_CONTROL_SPSEL_MASK; + + if (!env->v7m.secure) { + return; + } + if (!arm_v7m_is_handler_mode(env) && spsel) { + env->v7m.other_ss_psp = val; + } else { + env->v7m.other_ss_msp = val; + } + return; + } + default: + break; + } + } + switch (reg) { case 0 ... 7: /* xPSR sub-fields */ /* only APSR is actually writable */