Lines Matching +full:a +full:- +full:za +full:- +full:z
1 // SPDX-License-Identifier: GPL-2.0-only
32 #include "fp-ptrace.h"
118 u64 a = swab64(x); in arm64_cpu_to_le128() local
121 return ((__uint128_t)a << 64) | b; in arm64_cpu_to_le128()
205 if (config->svcr_in & SVCR_SM) in vl_in()
206 vl = config->sme_vl_in; in vl_in()
208 vl = config->sve_vl_in; in vl_in()
217 if (config->svcr_expected & SVCR_SM) in vl_expected()
218 vl = config->sme_vl_expected; in vl_expected()
220 vl = config->sve_vl_expected; in vl_expected()
237 ret = prctl(PR_SVE_SET_VL, config->sve_vl_in); in run_child()
238 if (ret != config->sve_vl_in) { in run_child()
240 config->sve_vl_in, ret); in run_child()
245 ret = prctl(PR_SME_SET_VL, config->sme_vl_in); in run_child()
246 if (ret != config->sme_vl_in) { in run_child()
248 config->sme_vl_in, ret); in run_child()
274 int len = iov_parent->iov_len; in read_one_child_regs()
278 if (ret == -1) in read_one_child_regs()
310 read_one_child_regs(child, "Z", &iov_parent, &iov_child); in read_child_regs()
342 read_one_child_regs(child, "ZA", &iov_parent, &iov_child); in read_child_regs()
410 vq = __sve_vq_from_vl(config->sve_vl_in); in check_ptrace_values_sve()
430 if (sve->vl != config->sve_vl_in) { in check_ptrace_values_sve()
432 sve->vl, config->sve_vl_in); in check_ptrace_values_sve()
437 if ((config->svcr_in & SVCR_SM) && (sve->flags & SVE_PT_REGS_SVE)) { in check_ptrace_values_sve()
442 if (sve->size != SVE_PT_SIZE(vq, sve->flags)) { in check_ptrace_values_sve()
444 sve->size, SVE_PT_SIZE(vq, sve->flags)); in check_ptrace_values_sve()
449 if (sve->flags & SVE_PT_REGS_SVE) { in check_ptrace_values_sve()
450 if (!compare_buffer("initial SVE Z", in check_ptrace_values_sve()
466 if (!compare_buffer("initial V via SVE", &fpsimd->vregs[0], in check_ptrace_values_sve()
487 vq = __sve_vq_from_vl(config->sme_vl_in); in check_ptrace_values_ssve()
507 if (sve->vl != config->sme_vl_in) { in check_ptrace_values_ssve()
509 sve->vl, config->sme_vl_in); in check_ptrace_values_ssve()
513 if ((config->svcr_in & SVCR_SM) && !(sve->flags & SVE_PT_REGS_SVE)) { in check_ptrace_values_ssve()
518 if (sve->size != SVE_PT_SIZE(vq, sve->flags)) { in check_ptrace_values_ssve()
520 sve->size, SVE_PT_SIZE(vq, sve->flags)); in check_ptrace_values_ssve()
525 if (sve->flags & SVE_PT_REGS_SVE) { in check_ptrace_values_ssve()
526 if (!compare_buffer("initial SSVE Z", in check_ptrace_values_ssve()
543 &fpsimd->vregs[0], v_in, sizeof(v_in))) in check_ptrace_values_ssve()
554 struct user_za_header *za; in check_ptrace_values_za() local
562 vq = __sve_vq_from_vl(config->sme_vl_in); in check_ptrace_values_za()
567 ksft_print_msg("OOM allocating %lu byte ZA buffer\n", in check_ptrace_values_za()
574 ksft_print_msg("Failed to read initial ZA: %s (%d)\n", in check_ptrace_values_za()
580 za = iov.iov_base; in check_ptrace_values_za()
582 if (za->vl != config->sme_vl_in) { in check_ptrace_values_za()
584 za->vl, config->sme_vl_in); in check_ptrace_values_za()
588 /* If PSTATE.ZA is not set we should just read the header */ in check_ptrace_values_za()
589 if (config->svcr_in & SVCR_ZA) { in check_ptrace_values_za()
590 if (za->size != ZA_PT_SIZE(vq)) { in check_ptrace_values_za()
591 ksft_print_msg("Unexpected ZA ptrace read size: %d != %lu\n", in check_ptrace_values_za()
592 za->size, ZA_PT_SIZE(vq)); in check_ptrace_values_za()
596 if (!compare_buffer("initial ZA", in check_ptrace_values_za()
601 if (za->size != sizeof(*za)) { in check_ptrace_values_za()
602 ksft_print_msg("Unexpected ZA ptrace read size: %d != %lu\n", in check_ptrace_values_za()
603 za->size, sizeof(*za)); in check_ptrace_values_za()
733 if (test->modify_values) in run_parent()
734 test->modify_values(child, config); in run_parent()
766 /* See what happened as a result */ in run_parent()
851 /* random() returns a 32 bit number regardless of the size of long */ in fill_random()
862 * Only values with a continuous set of 0..n bits set are in fill_random_ffr()
863 * valid for FFR, set all bits then clear a random number of in fill_random_ffr()
872 lbuf[i] = (1 << (bits % 8)) - 1; in fill_random_ffr()
875 static void fpsimd_to_sve(__uint128_t *v, char *z, int vl) in fpsimd_to_sve() argument
885 p = (__uint128_t *)&z[__SVE_ZREG_OFFSET(vq, i)]; in fpsimd_to_sve()
893 int sme_vq = __sve_vq_from_vl(config->sme_vl_in); in set_initial_values()
896 svcr_in = config->svcr_in; in set_initial_values()
897 svcr_expected = config->svcr_expected; in set_initial_values()
911 if (sve_supported() || (config->svcr_in & SVCR_SM)) { in set_initial_values()
912 /* The low 128 bits of Z are shared with the V registers */ in set_initial_values()
922 if ((config->svcr_in & SVCR_SM) && !fa64_supported()) in set_initial_values()
930 if (config->svcr_in & SVCR_ZA) in set_initial_values()
934 if (config->svcr_expected & SVCR_ZA) in set_initial_values()
942 if (config->svcr_in & SVCR_ZA) in set_initial_values()
946 if (config->svcr_expected & SVCR_ZA) in set_initial_values()
978 sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in check_memory_values()
986 if (sve_vl_out != config->sve_vl_expected) { in check_memory_values()
988 sve_vl_out, config->sve_vl_expected); in check_memory_values()
992 if (sme_vl_out != config->sme_vl_expected) { in check_memory_values()
994 sme_vl_out, config->sme_vl_expected); in check_memory_values()
998 if (!compare_buffer("saved Z", z_out, z_expected, in check_memory_values()
1010 if (!compare_buffer("saved ZA", za_out, za_expected, in check_memory_values()
1028 if (config->sve_vl_in != config->sve_vl_expected) in sve_sme_same()
1031 if (config->sme_vl_in != config->sme_vl_expected) in sve_sme_same()
1034 if (config->svcr_in != config->svcr_expected) in sve_sme_same()
1045 if ((config->svcr_in & SVCR_ZA) != (config->svcr_expected & SVCR_ZA)) in sve_write_supported()
1048 if (config->svcr_expected & SVCR_SM) { in sve_write_supported()
1049 if (config->sve_vl_in != config->sve_vl_expected) { in sve_write_supported()
1053 /* Changing the SME VL disables ZA */ in sve_write_supported()
1054 if ((config->svcr_expected & SVCR_ZA) && in sve_write_supported()
1055 (config->sme_vl_in != config->sme_vl_expected)) { in sve_write_supported()
1059 if (config->sme_vl_in != config->sme_vl_expected) { in sve_write_supported()
1073 /* The SVE registers are flushed by a FPSIMD write */ in fpsimd_write_expected()
1095 if (ret == -1) in fpsimd_write()
1133 int sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in sve_write_expected()
1143 /* Share the low bits of Z with V */ in sve_write_expected()
1147 if (config->sme_vl_in != config->sme_vl_expected) { in sve_write_expected()
1172 sve->size = iov.iov_len; in sve_write()
1173 sve->flags = SVE_PT_REGS_SVE; in sve_write()
1174 sve->vl = vl; in sve_write()
1198 if (config->sme_vl_in != config->sme_vl_expected) { in za_write_supported()
1200 if (config->svcr_expected & SVCR_SM) { in za_write_supported()
1205 if ((config->svcr_in & SVCR_SM) != in za_write_supported()
1206 (config->svcr_expected & SVCR_SM)) { in za_write_supported()
1218 sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in za_write_expected()
1220 if (config->svcr_expected & SVCR_ZA) { in za_write_expected()
1228 if (config->sme_vl_in != config->sme_vl_expected) { in za_write_expected()
1243 struct user_za_header *za; in za_write() local
1247 vq = __sve_vq_from_vl(config->sme_vl_expected); in za_write()
1249 if (config->svcr_expected & SVCR_ZA) in za_write()
1252 iov.iov_len = sizeof(*za); in za_write()
1255 ksft_print_msg("Failed allocating %lu byte ZA write buffer\n", in za_write()
1261 za = iov.iov_base; in za_write()
1262 za->size = iov.iov_len; in za_write()
1263 za->vl = config->sme_vl_expected; in za_write()
1264 if (config->svcr_expected & SVCR_ZA) in za_write()
1270 ksft_print_msg("Failed to write ZA: %s (%d)\n", in za_write()
1280 if (config->sme_vl_in != config->sme_vl_expected) in zt_write_supported()
1282 if (!(config->svcr_expected & SVCR_ZA)) in zt_write_supported()
1284 if ((config->svcr_in & SVCR_SM) != (config->svcr_expected & SVCR_SM)) in zt_write_supported()
1294 sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in zt_write_expected()
1296 if (config->svcr_expected & SVCR_ZA) { in zt_write_expected()
1317 /* Actually run a test */
1325 snprintf(name, sizeof(name), "%s, SVE %d->%d, SME %d/%x->%d/%x", in run_test()
1326 test->name, in run_test()
1327 config->sve_vl_in, config->sve_vl_expected, in run_test()
1328 config->sme_vl_in, config->svcr_in, in run_test()
1329 config->sme_vl_expected, config->svcr_expected); in run_test()
1331 snprintf(name, sizeof(name), "%s, SVE %d->%d", test->name, in run_test()
1332 config->sve_vl_in, config->sve_vl_expected); in run_test()
1334 snprintf(name, sizeof(name), "%s, SME %d/%x->%d/%x", in run_test()
1335 test->name, in run_test()
1336 config->sme_vl_in, config->svcr_in, in run_test()
1337 config->sme_vl_expected, config->svcr_expected); in run_test()
1339 snprintf(name, sizeof(name), "%s", test->name); in run_test()
1341 if (test->supported && !test->supported(config)) { in run_test()
1348 if (test->set_expected_values) in run_test()
1349 test->set_expected_values(config); in run_test()
1405 .name = "ZA write",
1433 if (vl == -1) in probe_vls()
1439 if (*vl_count && (vl == vls[*vl_count - 1])) in probe_vls()
1450 vls[1] = vls[*vl_count - 1]; in probe_vls()
1465 /* Can't enable both SM and ZA with a single ptrace write */
1618 * have to pick a VL for each run. in main()