From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 26/55] target/arm: Move get_S1prot, get_S2prot to ptw.c
Date: Thu, 9 Jun 2022 10:05:08 +0100 [thread overview]
Message-ID: <20220609090537.1971756-27-peter.maydell@linaro.org> (raw)
In-Reply-To: <20220609090537.1971756-1-peter.maydell@linaro.org>
From: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20220604040607.269301-20-richard.henderson@linaro.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/ptw.h | 3 --
target/arm/helper.c | 128 --------------------------------------------
target/arm/ptw.c | 128 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+), 131 deletions(-)
diff --git a/target/arm/ptw.h b/target/arm/ptw.h
index fba650d01ca..93147e0b065 100644
--- a/target/arm/ptw.h
+++ b/target/arm/ptw.h
@@ -29,9 +29,6 @@ ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
ARMMMUIdx mmu_idx);
bool check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, int level,
int inputsize, int stride, int outputsize);
-int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0);
-int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
- int ap, int ns, int xn, int pxn);
#endif /* !CONFIG_USER_ONLY */
#endif /* TARGET_ARM_PTW_H */
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 563e34ecded..148eb28ba8c 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -10615,134 +10615,6 @@ int simple_ap_to_rw_prot_is_user(int ap, bool is_user)
}
}
-/* Translate S2 section/page access permissions to protection flags
- *
- * @env: CPUARMState
- * @s2ap: The 2-bit stage2 access permissions (S2AP)
- * @xn: XN (execute-never) bits
- * @s1_is_el0: true if this is S2 of an S1+2 walk for EL0
- */
-int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
-{
- int prot = 0;
-
- if (s2ap & 1) {
- prot |= PAGE_READ;
- }
- if (s2ap & 2) {
- prot |= PAGE_WRITE;
- }
-
- if (cpu_isar_feature(any_tts2uxn, env_archcpu(env))) {
- switch (xn) {
- case 0:
- prot |= PAGE_EXEC;
- break;
- case 1:
- if (s1_is_el0) {
- prot |= PAGE_EXEC;
- }
- break;
- case 2:
- break;
- case 3:
- if (!s1_is_el0) {
- prot |= PAGE_EXEC;
- }
- break;
- default:
- g_assert_not_reached();
- }
- } else {
- if (!extract32(xn, 1, 1)) {
- if (arm_el_is_aa64(env, 2) || prot & PAGE_READ) {
- prot |= PAGE_EXEC;
- }
- }
- }
- return prot;
-}
-
-/* Translate section/page access permissions to protection flags
- *
- * @env: CPUARMState
- * @mmu_idx: MMU index indicating required translation regime
- * @is_aa64: TRUE if AArch64
- * @ap: The 2-bit simple AP (AP[2:1])
- * @ns: NS (non-secure) bit
- * @xn: XN (execute-never) bit
- * @pxn: PXN (privileged execute-never) bit
- */
-int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
- int ap, int ns, int xn, int pxn)
-{
- bool is_user = regime_is_user(env, mmu_idx);
- int prot_rw, user_rw;
- bool have_wxn;
- int wxn = 0;
-
- assert(mmu_idx != ARMMMUIdx_Stage2);
- assert(mmu_idx != ARMMMUIdx_Stage2_S);
-
- user_rw = simple_ap_to_rw_prot_is_user(ap, true);
- if (is_user) {
- prot_rw = user_rw;
- } else {
- if (user_rw && regime_is_pan(env, mmu_idx)) {
- /* PAN forbids data accesses but doesn't affect insn fetch */
- prot_rw = 0;
- } else {
- prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
- }
- }
-
- if (ns && arm_is_secure(env) && (env->cp15.scr_el3 & SCR_SIF)) {
- return prot_rw;
- }
-
- /* TODO have_wxn should be replaced with
- * ARM_FEATURE_V8 || (ARM_FEATURE_V7 && ARM_FEATURE_EL2)
- * when ARM_FEATURE_EL2 starts getting set. For now we assume all LPAE
- * compatible processors have EL2, which is required for [U]WXN.
- */
- have_wxn = arm_feature(env, ARM_FEATURE_LPAE);
-
- if (have_wxn) {
- wxn = regime_sctlr(env, mmu_idx) & SCTLR_WXN;
- }
-
- if (is_aa64) {
- if (regime_has_2_ranges(mmu_idx) && !is_user) {
- xn = pxn || (user_rw & PAGE_WRITE);
- }
- } else if (arm_feature(env, ARM_FEATURE_V7)) {
- switch (regime_el(env, mmu_idx)) {
- case 1:
- case 3:
- if (is_user) {
- xn = xn || !(user_rw & PAGE_READ);
- } else {
- int uwxn = 0;
- if (have_wxn) {
- uwxn = regime_sctlr(env, mmu_idx) & SCTLR_UWXN;
- }
- xn = xn || !(prot_rw & PAGE_READ) || pxn ||
- (uwxn && (user_rw & PAGE_WRITE));
- }
- break;
- case 2:
- break;
- }
- } else {
- xn = wxn = 0;
- }
-
- if (xn || (wxn && (prot_rw & PAGE_WRITE))) {
- return prot_rw;
- }
- return prot_rw | PAGE_EXEC;
-}
-
/*
* check_s2_mmu_setup
* @cpu: ARMCPU
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
index d754273fa16..af9ad420288 100644
--- a/target/arm/ptw.c
+++ b/target/arm/ptw.c
@@ -487,6 +487,134 @@ do_fault:
return true;
}
+/*
+ * Translate S2 section/page access permissions to protection flags
+ * @env: CPUARMState
+ * @s2ap: The 2-bit stage2 access permissions (S2AP)
+ * @xn: XN (execute-never) bits
+ * @s1_is_el0: true if this is S2 of an S1+2 walk for EL0
+ */
+static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
+{
+ int prot = 0;
+
+ if (s2ap & 1) {
+ prot |= PAGE_READ;
+ }
+ if (s2ap & 2) {
+ prot |= PAGE_WRITE;
+ }
+
+ if (cpu_isar_feature(any_tts2uxn, env_archcpu(env))) {
+ switch (xn) {
+ case 0:
+ prot |= PAGE_EXEC;
+ break;
+ case 1:
+ if (s1_is_el0) {
+ prot |= PAGE_EXEC;
+ }
+ break;
+ case 2:
+ break;
+ case 3:
+ if (!s1_is_el0) {
+ prot |= PAGE_EXEC;
+ }
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ } else {
+ if (!extract32(xn, 1, 1)) {
+ if (arm_el_is_aa64(env, 2) || prot & PAGE_READ) {
+ prot |= PAGE_EXEC;
+ }
+ }
+ }
+ return prot;
+}
+
+/*
+ * Translate section/page access permissions to protection flags
+ * @env: CPUARMState
+ * @mmu_idx: MMU index indicating required translation regime
+ * @is_aa64: TRUE if AArch64
+ * @ap: The 2-bit simple AP (AP[2:1])
+ * @ns: NS (non-secure) bit
+ * @xn: XN (execute-never) bit
+ * @pxn: PXN (privileged execute-never) bit
+ */
+static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
+ int ap, int ns, int xn, int pxn)
+{
+ bool is_user = regime_is_user(env, mmu_idx);
+ int prot_rw, user_rw;
+ bool have_wxn;
+ int wxn = 0;
+
+ assert(mmu_idx != ARMMMUIdx_Stage2);
+ assert(mmu_idx != ARMMMUIdx_Stage2_S);
+
+ user_rw = simple_ap_to_rw_prot_is_user(ap, true);
+ if (is_user) {
+ prot_rw = user_rw;
+ } else {
+ if (user_rw && regime_is_pan(env, mmu_idx)) {
+ /* PAN forbids data accesses but doesn't affect insn fetch */
+ prot_rw = 0;
+ } else {
+ prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
+ }
+ }
+
+ if (ns && arm_is_secure(env) && (env->cp15.scr_el3 & SCR_SIF)) {
+ return prot_rw;
+ }
+
+ /* TODO have_wxn should be replaced with
+ * ARM_FEATURE_V8 || (ARM_FEATURE_V7 && ARM_FEATURE_EL2)
+ * when ARM_FEATURE_EL2 starts getting set. For now we assume all LPAE
+ * compatible processors have EL2, which is required for [U]WXN.
+ */
+ have_wxn = arm_feature(env, ARM_FEATURE_LPAE);
+
+ if (have_wxn) {
+ wxn = regime_sctlr(env, mmu_idx) & SCTLR_WXN;
+ }
+
+ if (is_aa64) {
+ if (regime_has_2_ranges(mmu_idx) && !is_user) {
+ xn = pxn || (user_rw & PAGE_WRITE);
+ }
+ } else if (arm_feature(env, ARM_FEATURE_V7)) {
+ switch (regime_el(env, mmu_idx)) {
+ case 1:
+ case 3:
+ if (is_user) {
+ xn = xn || !(user_rw & PAGE_READ);
+ } else {
+ int uwxn = 0;
+ if (have_wxn) {
+ uwxn = regime_sctlr(env, mmu_idx) & SCTLR_UWXN;
+ }
+ xn = xn || !(prot_rw & PAGE_READ) || pxn ||
+ (uwxn && (user_rw & PAGE_WRITE));
+ }
+ break;
+ case 2:
+ break;
+ }
+ } else {
+ xn = wxn = 0;
+ }
+
+ if (xn || (wxn && (prot_rw & PAGE_WRITE))) {
+ return prot_rw;
+ }
+ return prot_rw | PAGE_EXEC;
+}
+
/**
* get_phys_addr_lpae: perform one stage of page table walk, LPAE format
*
--
2.25.1
next prev parent reply other threads:[~2022-06-09 9:58 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-09 9:04 [PULL 00/55] target-arm queue Peter Maydell
2022-06-09 9:04 ` [PULL 01/55] target/arm: Declare support for FEAT_RASv1p1 Peter Maydell
2022-06-09 9:04 ` [PULL 02/55] target/arm: Implement FEAT_DoubleFault Peter Maydell
2022-06-09 9:04 ` [PULL 03/55] Fix 'writeable' typos Peter Maydell
2022-06-09 9:04 ` [PULL 04/55] xlnx_dp: fix the wrong register size Peter Maydell
2022-06-09 9:04 ` [PULL 05/55] xlnx_dp: Introduce a vblank signal Peter Maydell
2022-06-09 9:04 ` [PULL 06/55] xlnx_dp: Fix the interrupt disable logic Peter Maydell
2022-06-09 9:04 ` [PULL 07/55] xlnx-zynqmp: fix the irq mapping for the display port and its dma Peter Maydell
2022-06-09 9:04 ` [PULL 08/55] target/arm: Move stage_1_mmu_idx decl to internals.h Peter Maydell
2022-06-09 9:04 ` [PULL 09/55] target/arm: Move get_phys_addr to ptw.c Peter Maydell
2022-06-09 9:04 ` [PULL 10/55] target/arm: Move get_phys_addr_v5 " Peter Maydell
2022-06-09 9:04 ` [PULL 11/55] target/arm: Move get_phys_addr_v6 " Peter Maydell
2022-06-09 9:04 ` [PULL 12/55] target/arm: Move get_phys_addr_pmsav5 " Peter Maydell
2022-06-09 9:04 ` [PULL 13/55] target/arm: Move get_phys_addr_pmsav7_default " Peter Maydell
2022-06-09 9:04 ` [PULL 14/55] target/arm: Move get_phys_addr_pmsav7 " Peter Maydell
2022-06-09 9:04 ` [PULL 15/55] target/arm: Move get_phys_addr_pmsav8 " Peter Maydell
2022-06-09 9:04 ` [PULL 16/55] target/arm: Move pmsav8_mpu_lookup " Peter Maydell
2022-06-09 9:04 ` [PULL 17/55] target/arm: Move pmsav7_use_background_region " Peter Maydell
2022-06-09 9:05 ` [PULL 18/55] target/arm: Move v8m_security_lookup " Peter Maydell
2022-06-09 9:05 ` [PULL 19/55] target/arm: Move m_is_{ppb,system}_region " Peter Maydell
2022-06-09 9:05 ` [PULL 20/55] target/arm: Move get_level1_table_address " Peter Maydell
2022-06-09 9:05 ` [PULL 21/55] target/arm: Move combine_cacheattrs and subroutines " Peter Maydell
2022-06-09 9:05 ` [PULL 22/55] target/arm: Move get_phys_addr_lpae " Peter Maydell
2022-06-09 9:05 ` [PULL 23/55] target/arm: Move arm_{ldl,ldq}_ptw " Peter Maydell
2022-06-09 9:05 ` [PULL 24/55] target/arm: Move {arm_s1_, }regime_using_lpae_format to tlb_helper.c Peter Maydell
2022-06-09 9:05 ` [PULL 25/55] target/arm: Move arm_pamax, pamax_map into ptw.c Peter Maydell
2022-06-09 9:05 ` Peter Maydell [this message]
2022-06-09 9:05 ` [PULL 27/55] target/arm: Move check_s2_mmu_setup to ptw.c Peter Maydell
2022-06-09 9:05 ` [PULL 28/55] target/arm: Move aa32_va_parameters " Peter Maydell
2022-06-09 9:05 ` [PULL 29/55] target/arm: Move ap_to_tw_prot etc " Peter Maydell
2022-06-09 9:05 ` [PULL 30/55] target/arm: Move regime_is_user " Peter Maydell
2022-06-09 9:05 ` [PULL 31/55] target/arm: Move regime_ttbr " Peter Maydell
2022-06-09 9:05 ` [PULL 32/55] target/arm: Move regime_translation_disabled " Peter Maydell
2022-06-09 9:05 ` [PULL 33/55] target/arm: Move arm_cpu_get_phys_page_attrs_debug " Peter Maydell
2022-06-09 9:05 ` [PULL 34/55] target/arm: Move stage_1_mmu_idx, arm_stage1_mmu_idx " Peter Maydell
2022-06-09 9:05 ` [PULL 35/55] target/arm: Pass CPUARMState to arm_ld[lq]_ptw Peter Maydell
2022-06-09 9:05 ` [PULL 36/55] target/arm: Rename TBFLAG_A64 ZCR_LEN to VL Peter Maydell
2022-06-09 9:05 ` [PULL 37/55] linux-user/aarch64: Introduce sve_vq Peter Maydell
2022-06-09 9:05 ` [PULL 38/55] target/arm: Remove route_to_el2 check from sve_exception_el Peter Maydell
2022-06-09 9:05 ` [PULL 39/55] target/arm: Remove fp checks " Peter Maydell
2022-06-09 9:05 ` [PULL 40/55] target/arm: Add el_is_in_host Peter Maydell
2022-06-09 9:05 ` [PULL 41/55] target/arm: Use el_is_in_host for sve_zcr_len_for_el Peter Maydell
2022-06-09 9:05 ` [PULL 42/55] target/arm: Use el_is_in_host for sve_exception_el Peter Maydell
2022-06-09 9:05 ` [PULL 43/55] target/arm: Hoist arm_is_el2_enabled check in sve_exception_el Peter Maydell
2022-06-09 9:05 ` [PULL 44/55] target/arm: Do not use aarch64_sve_zcr_get_valid_len in reset Peter Maydell
2022-06-09 9:05 ` [PULL 45/55] target/arm: Merge aarch64_sve_zcr_get_valid_len into caller Peter Maydell
2022-06-09 9:05 ` [PULL 46/55] target/arm: Use uint32_t instead of bitmap for sve vq's Peter Maydell
2022-06-09 9:05 ` [PULL 47/55] target/arm: Rename sve_zcr_len_for_el to sve_vqm1_for_el Peter Maydell
2022-06-09 9:05 ` [PULL 48/55] target/arm: Split out load/store primitives to sve_ldst_internal.h Peter Maydell
2022-06-09 9:05 ` [PULL 49/55] target/arm: Export sve contiguous ldst support functions Peter Maydell
2022-06-09 9:05 ` [PULL 50/55] target/arm: Move expand_pred_b to vec_internal.h Peter Maydell
2022-06-09 9:05 ` [PULL 51/55] target/arm: Use expand_pred_b in mve_helper.c Peter Maydell
2022-06-09 9:05 ` [PULL 52/55] target/arm: Move expand_pred_h to vec_internal.h Peter Maydell
2022-06-09 9:05 ` [PULL 53/55] target/arm: Export bfdotadd from vec_helper.c Peter Maydell
2022-06-09 9:05 ` [PULL 54/55] target/arm: Add isar_feature_aa64_sme Peter Maydell
2022-06-09 9:05 ` [PULL 55/55] target/arm: Add ID_AA64SMFR0_EL1 Peter Maydell
2022-06-09 15:24 ` [PULL 00/55] target-arm queue Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220609090537.1971756-27-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).