@samitouri / QOSamiQemu / commits / a59f5e8333

target/arm: Add have_ffr argument to kvm_arch_{get, put}_sve

Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260216034432.23912-12-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Feb 26, 2026 at 11:27 UTC a59f5e83338b1817ba773fc0dacaed98299c1c83
1 file changed +18 -14
target/arm/kvm.c
+18 -14
@@ -2118,7 +2118,7 @@ static int kvm_arch_put_fpsimd(CPUState *cs)
2118 * code the slice index to zero for now as it's unlikely we'll need more than
2119 * one slice for quite some time.
2120 */
2121 -static int kvm_arch_put_sve(CPUState *cs, uint32_t vq)
2121 +static int kvm_arch_put_sve(CPUState *cs, uint32_t vq, bool have_ffr)
2122 {
2123 CPUARMState *env = cpu_env(cs);
2124 uint64_t tmp[ARM_MAX_VQ * 2];
@@ -2141,11 +2141,13 @@ static int kvm_arch_put_sve(CPUState *cs, uint32_t vq)
2141 }
2142 }
2143
2144 - r = sve_bswap64(tmp, &env->vfp.pregs[FFR_PRED_NUM].p[0],
2145 - DIV_ROUND_UP(vq * 2, 8));
2146 - ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
2147 - if (ret) {
2148 - return ret;
2144 + if (have_ffr) {
2145 + r = sve_bswap64(tmp, &env->vfp.pregs[FFR_PRED_NUM].p[0],
2146 + DIV_ROUND_UP(vq * 2, 8));
2147 + ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
2148 + if (ret) {
2149 + return ret;
2150 + }
2151 }
2152
2153 return 0;
@@ -2234,7 +2236,7 @@ int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
2236 }
2237
2238 if (cpu_isar_feature(aa64_sve, cpu)) {
2237 - ret = kvm_arch_put_sve(cs, cpu->sve_max_vq);
2239 + ret = kvm_arch_put_sve(cs, cpu->sve_max_vq, true);
2240 } else {
2241 ret = kvm_arch_put_fpsimd(cs);
2242 }
@@ -2300,7 +2302,7 @@ static int kvm_arch_get_fpsimd(CPUState *cs)
2302 * code the slice index to zero for now as it's unlikely we'll need more than
2303 * one slice for quite some time.
2304 */
2303 -static int kvm_arch_get_sve(CPUState *cs, uint32_t vq)
2305 +static int kvm_arch_get_sve(CPUState *cs, uint32_t vq, bool have_ffr)
2306 {
2307 CPUARMState *env = cpu_env(cs);
2308 uint64_t *r;
@@ -2324,12 +2326,14 @@ static int kvm_arch_get_sve(CPUState *cs, uint32_t vq)
2326 sve_bswap64(r, r, DIV_ROUND_UP(vq * 2, 8));
2327 }
2328
2327 - r = &env->vfp.pregs[FFR_PRED_NUM].p[0];
2328 - ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
2329 - if (ret) {
2330 - return ret;
2329 + if (have_ffr) {
2330 + r = &env->vfp.pregs[FFR_PRED_NUM].p[0];
2331 + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
2332 + if (ret) {
2333 + return ret;
2334 + }
2335 + sve_bswap64(r, r, DIV_ROUND_UP(vq * 2, 8));
2336 }
2332 - sve_bswap64(r, r, DIV_ROUND_UP(vq * 2, 8));
2337
2338 return 0;
2339 }
@@ -2417,7 +2421,7 @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
2421 }
2422
2423 if (cpu_isar_feature(aa64_sve, cpu)) {
2420 - ret = kvm_arch_get_sve(cs, cpu->sve_max_vq);
2424 + ret = kvm_arch_get_sve(cs, cpu->sve_max_vq, true);
2425 } else {
2426 ret = kvm_arch_get_fpsimd(cs);
2427 }