From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: qemu-arm@nongnu.org
Subject: [PATCH 37/71] target/arm: Add cpu properties for SME
Date: Thu, 2 Jun 2022 14:48:19 -0700 [thread overview]
Message-ID: <20220602214853.496211-38-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220602214853.496211-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 60f84ba033..d74c06e2f0 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-02 22:34 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-02 21:47 [PATCH 00/71] target/arm: Scalable Matrix Extension Richard Henderson
2022-06-02 21:47 ` [PATCH 01/71] target/arm: Rename TBFLAG_A64 ZCR_LEN to VL Richard Henderson
2022-06-02 21:47 ` [PATCH 02/71] linux-user/aarch64: Introduce sve_vq_cached Richard Henderson
2022-06-06 10:31 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 03/71] target/arm: Remove route_to_el2 check from sve_exception_el Richard Henderson
2022-06-06 12:13 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 04/71] target/arm: Remove fp checks " Richard Henderson
2022-06-06 12:23 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 05/71] target/arm: Add el_is_in_host Richard Henderson
2022-06-02 21:47 ` [PATCH 06/71] target/arm: Use el_is_in_host for sve_zcr_len_for_el Richard Henderson
2022-06-02 21:47 ` [PATCH 07/71] target/arm: Use el_is_in_host for sve_exception_el Richard Henderson
2022-06-06 12:24 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 08/71] target/arm: Hoist arm_is_el2_enabled check in sve_exception_el Richard Henderson
2022-06-06 12:27 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 09/71] target/arm: Do not use aarch64_sve_zcr_get_valid_len in reset Richard Henderson
2022-06-06 12:27 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 10/71] target/arm: Merge aarch64_sve_zcr_get_valid_len into caller Richard Henderson
2022-06-06 12:30 ` Peter Maydell
2022-06-02 21:47 ` [PATCH 11/71] target/arm: Use uint32_t instead of bitmap for sve vq's Richard Henderson
2022-06-02 21:47 ` [PATCH 12/71] target/arm: Rename sve_zcr_len_for_el to sve_vqm1_for_el Richard Henderson
2022-06-02 21:47 ` [PATCH 13/71] target/arm: Split out load/store primitives to sve_ldst_internal.h Richard Henderson
2022-06-02 21:47 ` [PATCH 14/71] target/arm: Export sve contiguous ldst support functions Richard Henderson
2022-06-02 21:47 ` [PATCH 15/71] target/arm: Move expand_pred_b to vec_internal.h Richard Henderson
2022-06-02 21:47 ` [PATCH 16/71] target/arm: Use expand_pred_b in mve_helper.c Richard Henderson
2022-06-02 21:47 ` [PATCH 17/71] target/arm: Move expand_pred_h to vec_internal.h Richard Henderson
2022-06-02 21:48 ` [PATCH 18/71] target/arm: Export bfdotadd from vec_helper.c Richard Henderson
2022-06-02 21:48 ` [PATCH 19/71] target/arm: Add isar_feature_aa64_sme Richard Henderson
2022-06-06 12:31 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 20/71] target/arm: Add ID_AA64SMFR0_EL1 Richard Henderson
2022-06-06 13:05 ` Peter Maydell
2022-06-06 16:19 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 21/71] target/arm: Implement TPIDR2_EL0 Richard Henderson
2022-06-06 13:18 ` Peter Maydell
2022-06-06 14:38 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 22/71] target/arm: Add SMEEXC_EL to TB flags Richard Henderson
2022-06-06 13:25 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 23/71] target/arm: Add syn_smetrap Richard Henderson
2022-06-06 13:28 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 24/71] target/arm: Add ARM_CP_SME Richard Henderson
2022-06-06 13:32 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 25/71] target/arm: Add SVCR Richard Henderson
2022-06-06 13:40 ` Peter Maydell
2022-06-06 14:41 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 26/71] target/arm: Add SMCR_ELx Richard Henderson
2022-06-06 13:42 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 27/71] target/arm: Add SMIDR_EL1, SMPRI_EL1, SMPRIMAP_EL2 Richard Henderson
2022-06-06 15:55 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 28/71] target/arm: Add PSTATE.{SM,ZA} to TB flags Richard Henderson
2022-06-06 15:58 ` Peter Maydell
2022-06-06 16:50 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 29/71] target/arm: Add the SME ZA storage to CPUARMState Richard Henderson
2022-06-06 16:13 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 30/71] target/arm: Implement SMSTART, SMSTOP Richard Henderson
2022-06-06 16:50 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 31/71] target/arm: Move error for sve%d property to arm_cpu_sve_finalize Richard Henderson
2022-06-07 8:44 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 32/71] target/arm: Create ARMVQMap Richard Henderson
2022-06-07 8:45 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 33/71] target/arm: Generalize cpu_arm_{get,set}_vq Richard Henderson
2022-06-07 8:48 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 34/71] target/arm: Generalize cpu_arm_{get, set}_default_vec_len Richard Henderson
2022-06-07 8:49 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 35/71] target/arm: Move arm_cpu_*_finalize to internals.h Richard Henderson
2022-06-07 8:50 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 36/71] target/arm: Unexport aarch64_add_*_properties Richard Henderson
2022-06-07 8:51 ` Peter Maydell
2022-06-02 21:48 ` Richard Henderson [this message]
2022-06-07 9:47 ` [PATCH 37/71] target/arm: Add cpu properties for SME Peter Maydell
2022-06-07 14:45 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 38/71] target/arm: Introduce sve_vqm1_for_el_sm Richard Henderson
2022-06-07 9:54 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 39/71] target/arm: Add SVL to TB flags Richard Henderson
2022-06-07 9:58 ` Peter Maydell
2022-06-07 14:49 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 40/71] target/arm: Move pred_{full, gvec}_reg_{offset, size} to translate-a64.h Richard Henderson
2022-06-07 9:58 ` Peter Maydell
2022-06-02 21:48 ` [PATCH 41/71] target/arm: Add infrastructure for disas_sme Richard Henderson
2022-06-07 10:03 ` Peter Maydell
2022-06-07 14:52 ` Richard Henderson
2022-06-02 21:48 ` [PATCH 42/71] target/arm: Trap AdvSIMD usage when Streaming SVE is active Richard Henderson
2022-06-02 21:48 ` [PATCH 43/71] target/arm: Implement SME RDSVL, ADDSVL, ADDSPL Richard Henderson
2022-06-02 21:48 ` [PATCH 44/71] target/arm: Implement SME ZERO Richard Henderson
2022-06-02 21:48 ` [PATCH 45/71] target/arm: Implement SME MOVA Richard Henderson
2022-06-02 21:48 ` [PATCH 46/71] target/arm: Implement SME LD1, ST1 Richard Henderson
2022-06-02 21:48 ` [PATCH 47/71] target/arm: Export unpredicated ld/st from translate-sve.c Richard Henderson
2022-06-02 21:48 ` [PATCH 48/71] target/arm: Implement SME LDR, STR Richard Henderson
2022-06-02 21:48 ` [PATCH 49/71] target/arm: Implement SME ADDHA, ADDVA Richard Henderson
2022-06-02 21:48 ` [PATCH 50/71] target/arm: Implement FMOPA, FMOPS (non-widening) Richard Henderson
2022-06-02 21:48 ` [PATCH 51/71] target/arm: Implement BFMOPA, BFMOPS Richard Henderson
2022-06-02 21:48 ` [PATCH 52/71] target/arm: Implement FMOPA, FMOPS (widening) Richard Henderson
2022-06-02 21:48 ` [PATCH 53/71] target/arm: Implement SME integer outer product Richard Henderson
2022-06-02 21:48 ` [PATCH 54/71] target/arm: Implement PSEL Richard Henderson
2022-06-02 21:48 ` [PATCH 55/71] target/arm: Implement REVD Richard Henderson
2022-06-02 21:48 ` [PATCH 56/71] target/arm: Implement SCLAMP, UCLAMP Richard Henderson
2022-06-02 21:48 ` [PATCH 57/71] target/arm: Reset streaming sve state on exception boundaries Richard Henderson
2022-06-02 21:48 ` [PATCH 58/71] target/arm: Enable SME for -cpu max Richard Henderson
2022-06-02 21:48 ` [PATCH 59/71] linux-user/aarch64: Clear tpidr2_el0 if CLONE_SETTLS Richard Henderson
2022-06-02 21:48 ` [PATCH 60/71] linux-user/aarch64: Reset PSTATE.SM on syscalls Richard Henderson
2022-06-02 21:48 ` [PATCH 61/71] linux-user/aarch64: Add SM bit to SVE signal context Richard Henderson
2022-06-02 21:48 ` [PATCH 62/71] linux-user/aarch64: Tidy target_restore_sigframe error return Richard Henderson
2022-06-02 21:48 ` [PATCH 63/71] linux-user/aarch64: Do not allow duplicate or short sve records Richard Henderson
2022-06-02 21:48 ` [PATCH 64/71] linux-user/aarch64: Verify extra record lock succeeded Richard Henderson
2022-06-02 21:48 ` [PATCH 65/71] linux-user/aarch64: Move sve record checks into restore Richard Henderson
2022-06-02 21:48 ` [PATCH 66/71] linux-user/aarch64: Implement SME signal handling Richard Henderson
2022-06-02 21:48 ` [PATCH 67/71] linux-user: Rename sve prctls Richard Henderson
2022-06-02 21:48 ` [PATCH 68/71] linux-user/aarch64: Implement PR_SME_GET_VL, PR_SME_SET_VL Richard Henderson
2022-06-02 21:48 ` [PATCH 69/71] target/arm: Only set ZEN in reset if SVE present Richard Henderson
2022-06-02 21:48 ` [PATCH 70/71] target/arm: Enable SME for user-only Richard Henderson
2022-06-02 21:48 ` [PATCH 71/71] linux-user/aarch64: Add SME related hwcap entries 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=20220602214853.496211-38-richard.henderson@linaro.org \
--to=richard.henderson@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).