From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, qemu-arm@nongnu.org
Subject: [PATCH v2 37/71] target/arm: Add cpu properties for SME
Date: Tue, 7 Jun 2022 13:32:32 -0700 [thread overview]
Message-ID: <20220607203306.657998-38-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220607203306.657998-1-richard.henderson@linaro.org>
Mirror the properties for SVE. The main difference is
that any arbitrary set of powers of 2 may be supported,
and not the stricter constraints that apply to SVE.
Include a property to control FEAT_SME_FA64, as failing
to restrict the runtime to the proper subset of insns
could be a major point for bugs.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/cpu.h | 2 +
target/arm/internals.h | 1 +
target/arm/cpu.c | 14 +++--
target/arm/cpu64.c | 114 +++++++++++++++++++++++++++++++++++++++--
4 files changed, 124 insertions(+), 7 deletions(-)
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 8a89548cb9..d81d1bedf9 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -1046,9 +1046,11 @@ struct ArchCPU {
#ifdef CONFIG_USER_ONLY
/* Used to set the default vector length at process start. */
uint32_t sve_default_vq;
+ uint32_t sme_default_vq;
#endif
ARMVQMap sve_vq;
+ ARMVQMap sme_vq;
/* Generic timer counter frequency, in Hz */
uint64_t gt_cntfrq_hz;
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 756301b536..7e160d1349 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -1310,6 +1310,7 @@ int arm_gdb_set_svereg(CPUARMState *env, uint8_t *buf, int reg);
int aarch64_fpu_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg);
int aarch64_fpu_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg);
void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp);
+void arm_cpu_sme_finalize(ARMCPU *cpu, Error **errp);
void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp);
void arm_cpu_lpa2_finalize(ARMCPU *cpu, Error **errp);
#endif
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index b5276fa944..75295a14a3 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1122,11 +1122,13 @@ static void arm_cpu_initfn(Object *obj)
#ifdef CONFIG_USER_ONLY
# ifdef TARGET_AARCH64
/*
- * The linux kernel defaults to 512-bit vectors, when sve is supported.
- * See documentation for /proc/sys/abi/sve_default_vector_length, and
- * our corresponding sve-default-vector-length cpu property.
+ * The linux kernel defaults to 512-bit for SVE, and 256-bit for SME.
+ * These values were chosen to fit within the default signal frame.
+ * See documentation for /proc/sys/abi/{sve,sme}_default_vector_length,
+ * and our corresponding cpu property.
*/
cpu->sve_default_vq = 4;
+ cpu->sme_default_vq = 2;
# endif
#else
/* Our inbound IRQ and FIQ lines */
@@ -1429,6 +1431,12 @@ void arm_cpu_finalize_features(ARMCPU *cpu, Error **errp)
return;
}
+ arm_cpu_sme_finalize(cpu, &local_err);
+ if (local_err != NULL) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
arm_cpu_pauth_finalize(cpu, &local_err);
if (local_err != NULL) {
error_propagate(errp, local_err);
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 9ae9be6698..aaf2c243d6 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -589,10 +589,13 @@ static void cpu_arm_get_vq(Object *obj, Visitor *v, const char *name,
ARMCPU *cpu = ARM_CPU(obj);
ARMVQMap *vq_map = opaque;
uint32_t vq = atoi(&name[3]) / 128;
+ bool sve = vq_map == &cpu->sve_vq;
bool value;
- /* All vector lengths are disabled when SVE is off. */
- if (!cpu_isar_feature(aa64_sve, cpu)) {
+ /* All vector lengths are disabled when feature is off. */
+ if (sve
+ ? !cpu_isar_feature(aa64_sve, cpu)
+ : !cpu_isar_feature(aa64_sme, cpu)) {
value = false;
} else {
value = extract32(vq_map->map, vq - 1, 1);
@@ -636,8 +639,80 @@ static void cpu_arm_set_sve(Object *obj, bool value, Error **errp)
cpu->isar.id_aa64pfr0 = t;
}
+void arm_cpu_sme_finalize(ARMCPU *cpu, Error **errp)
+{
+ uint32_t vq_map = cpu->sme_vq.map;
+ uint32_t vq_init = cpu->sme_vq.init;
+ uint32_t vq_supported = cpu->sme_vq.supported;
+ uint32_t vq;
+
+ if (vq_map == 0) {
+ if (!cpu_isar_feature(aa64_sme, cpu)) {
+ cpu->isar.id_aa64smfr0 = 0;
+ return;
+ }
+
+ /* TODO: KVM will require limitations via SMCR_EL2. */
+ vq_map = vq_supported & ~vq_init;
+
+ if (vq_map == 0) {
+ vq = ctz32(vq_supported) + 1;
+ error_setg(errp, "cannot disable sme%d", vq * 128);
+ error_append_hint(errp, "All SME vector lengths are disabled.\n");
+ error_append_hint(errp, "With SME enabled, at least one "
+ "vector length must be enabled.\n");
+ return;
+ }
+ } else {
+ if (!cpu_isar_feature(aa64_sme, cpu)) {
+ vq = 32 - clz32(vq_map);
+ error_setg(errp, "cannot enable sme%d", vq * 128);
+ error_append_hint(errp, "SME must be enabled to enable "
+ "vector lengths.\n");
+ error_append_hint(errp, "Add sme=on to the CPU property list.\n");
+ return;
+ }
+ /* TODO: KVM will require limitations via SMCR_EL2. */
+ }
+
+ cpu->sme_vq.map = vq_map;
+}
+
+static bool cpu_arm_get_sme(Object *obj, Error **errp)
+{
+ ARMCPU *cpu = ARM_CPU(obj);
+ return cpu_isar_feature(aa64_sme, cpu);
+}
+
+static void cpu_arm_set_sme(Object *obj, bool value, Error **errp)
+{
+ ARMCPU *cpu = ARM_CPU(obj);
+ uint64_t t;
+
+ t = cpu->isar.id_aa64pfr1;
+ t = FIELD_DP64(t, ID_AA64PFR1, SME, value);
+ cpu->isar.id_aa64pfr1 = t;
+}
+
+static bool cpu_arm_get_sme_fa64(Object *obj, Error **errp)
+{
+ ARMCPU *cpu = ARM_CPU(obj);
+ return cpu_isar_feature(aa64_sme, cpu) &&
+ cpu_isar_feature(aa64_sme_fa64, cpu);
+}
+
+static void cpu_arm_set_sme_fa64(Object *obj, bool value, Error **errp)
+{
+ ARMCPU *cpu = ARM_CPU(obj);
+ uint64_t t;
+
+ t = cpu->isar.id_aa64smfr0;
+ t = FIELD_DP64(t, ID_AA64SMFR0, FA64, value);
+ cpu->isar.id_aa64smfr0 = t;
+}
+
#ifdef CONFIG_USER_ONLY
-/* Mirror linux /proc/sys/abi/sve_default_vector_length. */
+/* Mirror linux /proc/sys/abi/{sve,sme}_default_vector_length. */
static void cpu_arm_set_default_vec_len(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
@@ -663,7 +738,11 @@ static void cpu_arm_set_default_vec_len(Object *obj, Visitor *v,
* and is the maximum architectural width of ZCR_ELx.LEN.
*/
if (remainder || default_vq < 1 || default_vq > 512) {
- error_setg(errp, "cannot set sve-default-vector-length");
+ ARMCPU *cpu = ARM_CPU(obj);
+ const char *which =
+ (ptr_default_vq == &cpu->sve_default_vq ? "sve" : "sme");
+
+ error_setg(errp, "cannot set %s-default-vector-length", which);
if (remainder) {
error_append_hint(errp, "Vector length not a multiple of 16\n");
} else if (default_vq < 1) {
@@ -712,6 +791,31 @@ static void aarch64_add_sve_properties(Object *obj)
#endif
}
+static void aarch64_add_sme_properties(Object *obj)
+{
+ ARMCPU *cpu = ARM_CPU(obj);
+ uint32_t vq;
+
+ object_property_add_bool(obj, "sme", cpu_arm_get_sme, cpu_arm_set_sme);
+ object_property_add_bool(obj, "sme_fa64", cpu_arm_get_sme_fa64,
+ cpu_arm_set_sme_fa64);
+
+ for (vq = 1; vq <= ARM_MAX_VQ; vq <<= 1) {
+ char name[8];
+ sprintf(name, "sme%d", vq * 128);
+ object_property_add(obj, name, "bool", cpu_arm_get_vq,
+ cpu_arm_set_vq, NULL, &cpu->sme_vq);
+ }
+
+#ifdef CONFIG_USER_ONLY
+ /* Mirror linux /proc/sys/abi/sme_default_vector_length. */
+ object_property_add(obj, "sme-default-vector-length", "int32",
+ cpu_arm_get_default_vec_len,
+ cpu_arm_set_default_vec_len, NULL,
+ &cpu->sme_default_vq);
+#endif
+}
+
void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
{
int arch_val = 0, impdef_val = 0;
@@ -976,9 +1080,11 @@ static void aarch64_max_initfn(Object *obj)
#endif
cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ);
+ cpu->sme_vq.supported = SVE_VQ_POW2_MAP;
aarch64_add_pauth_properties(obj);
aarch64_add_sve_properties(obj);
+ aarch64_add_sme_properties(obj);
object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_max_vq,
cpu_max_set_sve_max_vq, NULL, NULL);
qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
--
2.34.1
next prev parent reply other threads:[~2022-06-07 21:31 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-07 20:31 [PATCH v2 00/71] target/arm: Scalable Matrix Extension Richard Henderson
2022-06-07 20:31 ` [PATCH v2 01/71] target/arm: Rename TBFLAG_A64 ZCR_LEN to VL Richard Henderson
2022-06-07 20:31 ` [PATCH v2 02/71] linux-user/aarch64: Introduce sve_vq Richard Henderson
2022-06-07 20:31 ` [PATCH v2 03/71] target/arm: Remove route_to_el2 check from sve_exception_el Richard Henderson
2022-06-07 20:31 ` [PATCH v2 04/71] target/arm: Remove fp checks " Richard Henderson
2022-06-07 20:32 ` [PATCH v2 05/71] target/arm: Add el_is_in_host Richard Henderson
2022-06-07 20:32 ` [PATCH v2 06/71] target/arm: Use el_is_in_host for sve_zcr_len_for_el Richard Henderson
2022-06-07 20:32 ` [PATCH v2 07/71] target/arm: Use el_is_in_host for sve_exception_el Richard Henderson
2022-06-07 20:32 ` [PATCH v2 08/71] target/arm: Hoist arm_is_el2_enabled check in sve_exception_el Richard Henderson
2022-06-07 20:32 ` [PATCH v2 09/71] target/arm: Do not use aarch64_sve_zcr_get_valid_len in reset Richard Henderson
2022-06-07 20:32 ` [PATCH v2 10/71] target/arm: Merge aarch64_sve_zcr_get_valid_len into caller Richard Henderson
2022-06-07 20:32 ` [PATCH v2 11/71] target/arm: Use uint32_t instead of bitmap for sve vq's Richard Henderson
2022-06-07 20:32 ` [PATCH v2 12/71] target/arm: Rename sve_zcr_len_for_el to sve_vqm1_for_el Richard Henderson
2022-06-07 20:32 ` [PATCH v2 13/71] target/arm: Split out load/store primitives to sve_ldst_internal.h Richard Henderson
2022-06-07 20:32 ` [PATCH v2 14/71] target/arm: Export sve contiguous ldst support functions Richard Henderson
2022-06-07 20:32 ` [PATCH v2 15/71] target/arm: Move expand_pred_b to vec_internal.h Richard Henderson
2022-06-07 20:32 ` [PATCH v2 16/71] target/arm: Use expand_pred_b in mve_helper.c Richard Henderson
2022-06-07 20:32 ` [PATCH v2 17/71] target/arm: Move expand_pred_h to vec_internal.h Richard Henderson
2022-06-07 20:32 ` [PATCH v2 18/71] target/arm: Export bfdotadd from vec_helper.c Richard Henderson
2022-06-07 20:32 ` [PATCH v2 19/71] target/arm: Add isar_feature_aa64_sme Richard Henderson
2022-06-07 20:32 ` [PATCH v2 20/71] target/arm: Add ID_AA64SMFR0_EL1 Richard Henderson
2022-06-07 20:32 ` [PATCH v2 21/71] target/arm: Implement TPIDR2_EL0 Richard Henderson
2022-06-09 15:24 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 22/71] target/arm: Add SMEEXC_EL to TB flags Richard Henderson
2022-06-07 20:32 ` [PATCH v2 23/71] target/arm: Add syn_smetrap Richard Henderson
2022-06-07 20:32 ` [PATCH v2 24/71] target/arm: Add ARM_CP_SME Richard Henderson
2022-06-07 20:32 ` [PATCH v2 25/71] target/arm: Add SVCR Richard Henderson
2022-06-09 15:25 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 26/71] target/arm: Add SMCR_ELx Richard Henderson
2022-06-07 20:32 ` [PATCH v2 27/71] target/arm: Add SMIDR_EL1, SMPRI_EL1, SMPRIMAP_EL2 Richard Henderson
2022-06-07 20:32 ` [PATCH v2 28/71] target/arm: Add PSTATE.{SM,ZA} to TB flags Richard Henderson
2022-06-07 20:32 ` [PATCH v2 29/71] target/arm: Add the SME ZA storage to CPUARMState Richard Henderson
2022-06-10 12:59 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 30/71] target/arm: Implement SMSTART, SMSTOP Richard Henderson
2022-06-07 20:32 ` [PATCH v2 31/71] target/arm: Move error for sve%d property to arm_cpu_sve_finalize Richard Henderson
2022-06-09 15:29 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 32/71] target/arm: Create ARMVQMap Richard Henderson
2022-06-09 15:30 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 33/71] target/arm: Generalize cpu_arm_{get,set}_vq Richard Henderson
2022-06-09 15:30 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 34/71] target/arm: Generalize cpu_arm_{get, set}_default_vec_len Richard Henderson
2022-06-09 15:31 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 35/71] target/arm: Move arm_cpu_*_finalize to internals.h Richard Henderson
2022-06-09 15:31 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 36/71] target/arm: Unexport aarch64_add_*_properties Richard Henderson
2022-06-09 15:32 ` Peter Maydell
2022-06-07 20:32 ` Richard Henderson [this message]
2022-06-09 15:32 ` [PATCH v2 37/71] target/arm: Add cpu properties for SME Peter Maydell
2022-06-07 20:32 ` [PATCH v2 38/71] target/arm: Introduce sve_vqm1_for_el_sm Richard Henderson
2022-06-09 15:33 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 39/71] target/arm: Add SVL to TB flags Richard Henderson
2022-06-09 15:33 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 40/71] target/arm: Move pred_{full, gvec}_reg_{offset, size} to translate-a64.h Richard Henderson
2022-06-09 15:34 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 41/71] target/arm: Add infrastructure for disas_sme Richard Henderson
2022-06-09 15:35 ` Peter Maydell
2022-06-09 22:58 ` Richard Henderson
2022-06-10 9:02 ` Peter Maydell
2022-06-07 20:32 ` [PATCH v2 42/71] target/arm: Trap AdvSIMD usage when Streaming SVE is active Richard Henderson
2022-06-07 20:32 ` [PATCH v2 43/71] target/arm: Implement SME RDSVL, ADDSVL, ADDSPL Richard Henderson
2022-06-07 20:32 ` [PATCH v2 44/71] target/arm: Implement SME ZERO Richard Henderson
2022-06-07 20:32 ` [PATCH v2 45/71] target/arm: Implement SME MOVA Richard Henderson
2022-06-07 20:32 ` [PATCH v2 46/71] target/arm: Implement SME LD1, ST1 Richard Henderson
2022-06-07 20:32 ` [PATCH v2 47/71] target/arm: Export unpredicated ld/st from translate-sve.c Richard Henderson
2022-06-07 20:32 ` [PATCH v2 48/71] target/arm: Implement SME LDR, STR Richard Henderson
2022-06-07 20:32 ` [PATCH v2 49/71] target/arm: Implement SME ADDHA, ADDVA Richard Henderson
2022-06-07 20:32 ` [PATCH v2 50/71] target/arm: Implement FMOPA, FMOPS (non-widening) Richard Henderson
2022-06-07 20:32 ` [PATCH v2 51/71] target/arm: Implement BFMOPA, BFMOPS Richard Henderson
2022-06-07 20:32 ` [PATCH v2 52/71] target/arm: Implement FMOPA, FMOPS (widening) Richard Henderson
2022-06-07 20:32 ` [PATCH v2 53/71] target/arm: Implement SME integer outer product Richard Henderson
2022-06-07 20:32 ` [PATCH v2 54/71] target/arm: Implement PSEL Richard Henderson
2022-06-07 20:32 ` [PATCH v2 55/71] target/arm: Implement REVD Richard Henderson
2022-06-07 20:32 ` [PATCH v2 56/71] target/arm: Implement SCLAMP, UCLAMP Richard Henderson
2022-06-07 20:32 ` [PATCH v2 57/71] target/arm: Reset streaming sve state on exception boundaries Richard Henderson
2022-06-07 20:32 ` [PATCH v2 58/71] target/arm: Enable SME for -cpu max Richard Henderson
2022-06-07 20:32 ` [PATCH v2 59/71] linux-user/aarch64: Clear tpidr2_el0 if CLONE_SETTLS Richard Henderson
2022-06-07 20:32 ` [PATCH v2 60/71] linux-user/aarch64: Reset PSTATE.SM on syscalls Richard Henderson
2022-06-07 20:32 ` [PATCH v2 61/71] linux-user/aarch64: Add SM bit to SVE signal context Richard Henderson
2022-06-07 20:32 ` [PATCH v2 62/71] linux-user/aarch64: Tidy target_restore_sigframe error return Richard Henderson
2022-06-07 20:32 ` [PATCH v2 63/71] linux-user/aarch64: Do not allow duplicate or short sve records Richard Henderson
2022-06-07 20:32 ` [PATCH v2 64/71] linux-user/aarch64: Verify extra record lock succeeded Richard Henderson
2022-06-07 20:33 ` [PATCH v2 65/71] linux-user/aarch64: Move sve record checks into restore Richard Henderson
2022-06-07 20:33 ` [PATCH v2 66/71] linux-user/aarch64: Implement SME signal handling Richard Henderson
2022-06-07 20:33 ` [PATCH v2 67/71] linux-user: Rename sve prctls Richard Henderson
2022-06-07 20:33 ` [PATCH v2 68/71] linux-user/aarch64: Implement PR_SME_GET_VL, PR_SME_SET_VL Richard Henderson
2022-06-07 20:33 ` [PATCH v2 69/71] target/arm: Only set ZEN in reset if SVE present Richard Henderson
2022-06-07 20:33 ` [PATCH v2 70/71] target/arm: Enable SME for user-only Richard Henderson
2022-06-07 20:33 ` [PATCH v2 71/71] linux-user/aarch64: Add SME related hwcap entries Richard Henderson
2022-06-09 15:22 ` [PATCH v2 00/71] target/arm: Scalable Matrix Extension Peter Maydell
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=20220607203306.657998-38-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.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).