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()
443 if (sve->size != sizeof(sve)) { in check_ptrace_values_sve()
448 if (sve->size != SVE_PT_SIZE(vq, sve->flags)) { in check_ptrace_values_sve()
450 sve->size, SVE_PT_SIZE(vq, sve->flags)); in check_ptrace_values_sve()
456 if (sve->flags & SVE_PT_REGS_SVE) { in check_ptrace_values_sve()
457 if (!compare_buffer("initial SVE Z", in check_ptrace_values_sve()
473 if (!compare_buffer("initial V via SVE", &fpsimd->vregs[0], in check_ptrace_values_sve()
494 vq = __sve_vq_from_vl(config->sme_vl_in); in check_ptrace_values_ssve()
514 if (sve->vl != config->sme_vl_in) { in check_ptrace_values_ssve()
516 sve->vl, config->sme_vl_in); in check_ptrace_values_ssve()
520 if ((config->svcr_in & SVCR_SM) && !(sve->flags & SVE_PT_REGS_SVE)) { in check_ptrace_values_ssve()
526 if (sve->size != sizeof(sve)) { in check_ptrace_values_ssve()
531 if (sve->size != SVE_PT_SIZE(vq, sve->flags)) { in check_ptrace_values_ssve()
533 sve->size, SVE_PT_SIZE(vq, sve->flags)); in check_ptrace_values_ssve()
539 if (sve->flags & SVE_PT_REGS_SVE) { in check_ptrace_values_ssve()
540 if (!compare_buffer("initial SSVE Z", in check_ptrace_values_ssve()
557 &fpsimd->vregs[0], v_in, sizeof(v_in))) in check_ptrace_values_ssve()
568 struct user_za_header *za; in check_ptrace_values_za() local
576 vq = __sve_vq_from_vl(config->sme_vl_in); in check_ptrace_values_za()
581 ksft_print_msg("OOM allocating %lu byte ZA buffer\n", in check_ptrace_values_za()
588 ksft_print_msg("Failed to read initial ZA: %s (%d)\n", in check_ptrace_values_za()
594 za = iov.iov_base; in check_ptrace_values_za()
596 if (za->vl != config->sme_vl_in) { in check_ptrace_values_za()
598 za->vl, config->sme_vl_in); in check_ptrace_values_za()
602 /* If PSTATE.ZA is not set we should just read the header */ in check_ptrace_values_za()
603 if (config->svcr_in & SVCR_ZA) { in check_ptrace_values_za()
604 if (za->size != ZA_PT_SIZE(vq)) { in check_ptrace_values_za()
605 ksft_print_msg("Unexpected ZA ptrace read size: %d != %lu\n", in check_ptrace_values_za()
606 za->size, ZA_PT_SIZE(vq)); in check_ptrace_values_za()
610 if (!compare_buffer("initial ZA", in check_ptrace_values_za()
615 if (za->size != sizeof(*za)) { in check_ptrace_values_za()
616 ksft_print_msg("Unexpected ZA ptrace read size: %d != %lu\n", in check_ptrace_values_za()
617 za->size, sizeof(*za)); in check_ptrace_values_za()
747 if (test->modify_values) in run_parent()
748 test->modify_values(child, config); in run_parent()
780 /* See what happened as a result */ in run_parent()
865 /* random() returns a 32 bit number regardless of the size of long */ in fill_random()
876 * Only values with a continuous set of 0..n bits set are in fill_random_ffr()
877 * valid for FFR, set all bits then clear a random number of in fill_random_ffr()
886 lbuf[i] = (1 << (bits % 8)) - 1; in fill_random_ffr()
889 static void fpsimd_to_sve(__uint128_t *v, char *z, int vl) in fpsimd_to_sve() argument
899 p = (__uint128_t *)&z[__SVE_ZREG_OFFSET(vq, i)]; in fpsimd_to_sve()
907 int sme_vq = __sve_vq_from_vl(config->sme_vl_in); in set_initial_values()
909 svcr_in = config->svcr_in; in set_initial_values()
910 svcr_expected = config->svcr_expected; in set_initial_values()
918 if (sve_supported() || (config->svcr_in & SVCR_SM)) { in set_initial_values()
919 /* The low 128 bits of Z are shared with the V registers */ in set_initial_values()
929 if ((config->svcr_in & SVCR_SM) && !fa64_supported()) in set_initial_values()
937 if (config->svcr_in & SVCR_ZA) in set_initial_values()
941 if (config->svcr_expected & SVCR_ZA) in set_initial_values()
949 if (config->svcr_in & SVCR_ZA) in set_initial_values()
953 if (config->svcr_expected & SVCR_ZA) in set_initial_values()
980 sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in check_memory_values()
988 if (sve_vl_out != config->sve_vl_expected) { in check_memory_values()
990 sve_vl_out, config->sve_vl_expected); in check_memory_values()
994 if (sme_vl_out != config->sme_vl_expected) { in check_memory_values()
996 sme_vl_out, config->sme_vl_expected); in check_memory_values()
1000 if (!compare_buffer("saved Z", z_out, z_expected, in check_memory_values()
1012 if (!compare_buffer("saved ZA", za_out, za_expected, in check_memory_values()
1030 if (config->sve_vl_in != config->sve_vl_expected) in sve_sme_same()
1033 if (config->sme_vl_in != config->sme_vl_expected) in sve_sme_same()
1036 if (config->svcr_in != config->svcr_expected) in sve_sme_same()
1047 if ((config->svcr_in & SVCR_ZA) != (config->svcr_expected & SVCR_ZA)) in sve_write_supported()
1050 if (config->svcr_expected & SVCR_SM) { in sve_write_supported()
1051 if (config->sve_vl_in != config->sve_vl_expected) { in sve_write_supported()
1055 /* Changing the SME VL disables ZA */ in sve_write_supported()
1056 if ((config->svcr_expected & SVCR_ZA) && in sve_write_supported()
1057 (config->sme_vl_in != config->sme_vl_expected)) { in sve_write_supported()
1061 if (config->sme_vl_in != config->sme_vl_expected) { in sve_write_supported()
1077 if ((config->svcr_in & SVCR_ZA) != (config->svcr_expected & SVCR_ZA)) in sve_write_fpsimd_supported()
1080 if (config->svcr_expected & SVCR_SM) in sve_write_fpsimd_supported()
1083 if (config->sme_vl_in != config->sme_vl_expected) in sve_write_fpsimd_supported()
1095 /* The SVE registers are flushed by a FPSIMD write */ in fpsimd_write_expected()
1117 if (ret == -1) in fpsimd_write()
1155 int sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in sve_write_expected()
1168 /* Share the low bits of Z with V */ in sve_write_expected()
1172 if (config->sme_vl_in != config->sme_vl_expected) { in sve_write_expected()
1200 sve->size = iov.iov_len; in sve_write_sve()
1201 sve->flags = SVE_PT_REGS_SVE; in sve_write_sve()
1202 sve->vl = vl; in sve_write_sve()
1247 sve->size = iov.iov_len; in sve_write_fpsimd()
1248 sve->flags = SVE_PT_REGS_FPSIMD; in sve_write_fpsimd()
1249 sve->vl = vl; in sve_write_fpsimd()
1252 memcpy(&fpsimd->vregs, v_expected, sizeof(v_expected)); in sve_write_fpsimd()
1264 if ((config->svcr_in & SVCR_SM) != (config->svcr_expected & SVCR_SM)) in za_write_supported()
1274 sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in za_write_expected()
1276 if (config->svcr_expected & SVCR_ZA) { in za_write_expected()
1284 if (config->sme_vl_in != config->sme_vl_expected) { in za_write_expected()
1297 struct user_za_header *za; in za_write() local
1301 vq = __sve_vq_from_vl(config->sme_vl_expected); in za_write()
1303 if (config->svcr_expected & SVCR_ZA) in za_write()
1306 iov.iov_len = sizeof(*za); in za_write()
1309 ksft_print_msg("Failed allocating %lu byte ZA write buffer\n", in za_write()
1315 za = iov.iov_base; in za_write()
1316 za->size = iov.iov_len; in za_write()
1317 za->vl = config->sme_vl_expected; in za_write()
1318 if (config->svcr_expected & SVCR_ZA) in za_write()
1324 ksft_print_msg("Failed to write ZA: %s (%d)\n", in za_write()
1334 if (config->sme_vl_in != config->sme_vl_expected) in zt_write_supported()
1336 if (!(config->svcr_expected & SVCR_ZA)) in zt_write_supported()
1338 if ((config->svcr_in & SVCR_SM) != (config->svcr_expected & SVCR_SM)) in zt_write_supported()
1348 sme_vq = __sve_vq_from_vl(config->sme_vl_expected); in zt_write_expected()
1350 if (config->svcr_expected & SVCR_ZA) { in zt_write_expected()
1371 /* Actually run a test */
1379 snprintf(name, sizeof(name), "%s, SVE %d->%d, SME %d/%x->%d/%x", in run_test()
1380 test->name, in run_test()
1381 config->sve_vl_in, config->sve_vl_expected, in run_test()
1382 config->sme_vl_in, config->svcr_in, in run_test()
1383 config->sme_vl_expected, config->svcr_expected); in run_test()
1385 snprintf(name, sizeof(name), "%s, SVE %d->%d", test->name, in run_test()
1386 config->sve_vl_in, config->sve_vl_expected); in run_test()
1388 snprintf(name, sizeof(name), "%s, SME %d/%x->%d/%x", in run_test()
1389 test->name, in run_test()
1390 config->sme_vl_in, config->svcr_in, in run_test()
1391 config->sme_vl_expected, config->svcr_expected); in run_test()
1393 snprintf(name, sizeof(name), "%s", test->name); in run_test()
1395 if (test->supported && !test->supported(config)) { in run_test()
1402 if (test->set_expected_values) in run_test()
1403 test->set_expected_values(config); in run_test()
1465 .name = "ZA write",
1493 if (vl == -1) in probe_vls()
1499 if (*vl_count && (vl == vls[*vl_count - 1])) in probe_vls()
1510 vls[1] = vls[*vl_count - 1]; in probe_vls()
1525 /* Can't enable both SM and ZA with a single ptrace write */
1677 * have to pick a VL for each run. in main()