#define VL_TESTS (((SVE_VQ_MAX - SVE_VQ_MIN) + 1) * 3)
 #define FLAG_TESTS 2
-#define FPSIMD_TESTS 3
+#define FPSIMD_TESTS 2
 
 #define EXPECTED_TESTS ((VL_TESTS + FLAG_TESTS + FPSIMD_TESTS) * ARRAY_SIZE(vec_types))
 
 /* Access the FPSIMD registers via the SVE regset */
 static void ptrace_sve_fpsimd(pid_t child, const struct vec_type *type)
 {
-       void *svebuf = NULL;
-       size_t svebufsz = 0;
+       void *svebuf;
        struct user_sve_header *sve;
        struct user_fpsimd_state *fpsimd, new_fpsimd;
        unsigned int i, j;
        unsigned char *p;
+       int ret;
 
-       /* New process should start with FPSIMD registers only */
-       sve = get_sve(child, type, &svebuf, &svebufsz);
-       if (!sve) {
-               ksft_test_result_fail("get_sve(%s): %s\n",
-                                     type->name, strerror(errno));
-
+       svebuf = malloc(SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD));
+       if (!svebuf) {
+               ksft_test_result_fail("Failed to allocate FPSIMD buffer\n");
                return;
-       } else {
-               ksft_test_result_pass("get_sve(%s FPSIMD)\n", type->name);
        }
 
-       ksft_test_result((sve->flags & SVE_PT_REGS_MASK) == SVE_PT_REGS_FPSIMD,
-                        "Got FPSIMD registers via %s\n", type->name);
-       if ((sve->flags & SVE_PT_REGS_MASK) != SVE_PT_REGS_FPSIMD)
-               goto out;
+       memset(svebuf, 0, SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD));
+       sve = svebuf;
+       sve->flags = SVE_PT_REGS_FPSIMD;
+       sve->size = SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD);
+       sve->vl = 16;  /* We don't care what the VL is */
 
        /* Try to set a known FPSIMD state via PT_REGS_SVE */
        fpsimd = (struct user_fpsimd_state *)((char *)sve +
                        p[j] = j;
        }
 
-       if (set_sve(child, type, sve)) {
-               ksft_test_result_fail("set_sve(%s FPSIMD): %s\n",
-                                     type->name, strerror(errno));
-
+       ret = set_sve(child, type, sve);
+       ksft_test_result(ret == 0, "%s FPSIMD set via SVE: %d\n",
+                        type->name, ret);
+       if (ret)
                goto out;
-       }
 
        /* Verify via the FPSIMD regset */
        if (get_fpsimd(child, &new_fpsimd)) {
                if (getauxval(vec_types[i].hwcap_type) & vec_types[i].hwcap) {
                        ptrace_sve_fpsimd(child, &vec_types[i]);
                } else {
-                       ksft_test_result_skip("%s FPSIMD get via SVE\n",
-                                             vec_types[i].name);
                        ksft_test_result_skip("%s FPSIMD set via SVE\n",
                                              vec_types[i].name);
-                       ksft_test_result_skip("%s set read via FPSIMD\n",
+                       ksft_test_result_skip("%s FPSIMD read\n",
                                              vec_types[i].name);
                }