@samitouri / QOSamiQemu / commits / 423b0ac34c

target/arm: Move kvm_arm_sve_get_vls within kvm.c

Prepare to adjust the invocation point and visibility. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260216034432.23912-4-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Feb 26, 2026 at 11:27 UTC 423b0ac34ca8dd19fc27b8518b6234227ac320a5
1 file changed +54 -54
target/arm/kvm.c
+54 -54
@@ -243,6 +243,60 @@ static int get_host_cpu_reg(int fd, ARMHostCPUFeatures *ahcf,
243 return ret;
244 }
245
246 +uint32_t kvm_arm_sve_get_vls(ARMCPU *cpu)
247 +{
248 + /* Only call this function if kvm_arm_sve_supported() returns true. */
249 + static uint64_t vls[KVM_ARM64_SVE_VLS_WORDS];
250 + static bool probed;
251 + uint32_t vq = 0;
252 + int i;
253 +
254 + /*
255 + * KVM ensures all host CPUs support the same set of vector lengths.
256 + * So we only need to create the scratch VCPUs once and then cache
257 + * the results.
258 + */
259 + if (!probed) {
260 + struct kvm_vcpu_init init = {
261 + .target = -1,
262 + .features[0] = (1 << KVM_ARM_VCPU_SVE),
263 + };
264 + struct kvm_one_reg reg = {
265 + .id = KVM_REG_ARM64_SVE_VLS,
266 + .addr = (uint64_t)&vls[0],
267 + };
268 + int fdarray[3], ret;
269 +
270 + probed = true;
271 +
272 + if (!kvm_arm_create_scratch_host_vcpu(fdarray, &init)) {
273 + error_report("failed to create scratch VCPU with SVE enabled");
274 + abort();
275 + }
276 + ret = ioctl(fdarray[2], KVM_GET_ONE_REG, &reg);
277 + kvm_arm_destroy_scratch_host_vcpu(fdarray);
278 + if (ret) {
279 + error_report("failed to get KVM_REG_ARM64_SVE_VLS: %s",
280 + strerror(errno));
281 + abort();
282 + }
283 +
284 + for (i = KVM_ARM64_SVE_VLS_WORDS - 1; i >= 0; --i) {
285 + if (vls[i]) {
286 + vq = 64 - clz64(vls[i]) + i * 64;
287 + break;
288 + }
289 + }
290 + if (vq > ARM_MAX_VQ) {
291 + warn_report("KVM supports vector lengths larger than "
292 + "QEMU can enable");
293 + vls[0] &= MAKE_64BIT_MASK(0, ARM_MAX_VQ);
294 + }
295 + }
296 +
297 + return vls[0];
298 +}
299 +
300 static bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
301 {
302 /* Identify the feature bits corresponding to the host CPU, and
@@ -1914,60 +1968,6 @@ bool kvm_arm_mte_supported(void)
1968
1969 QEMU_BUILD_BUG_ON(KVM_ARM64_SVE_VQ_MIN != 1);
1970
1917 -uint32_t kvm_arm_sve_get_vls(ARMCPU *cpu)
1918 -{
1919 - /* Only call this function if kvm_arm_sve_supported() returns true. */
1920 - static uint64_t vls[KVM_ARM64_SVE_VLS_WORDS];
1921 - static bool probed;
1922 - uint32_t vq = 0;
1923 - int i;
1924 -
1925 - /*
1926 - * KVM ensures all host CPUs support the same set of vector lengths.
1927 - * So we only need to create the scratch VCPUs once and then cache
1928 - * the results.
1929 - */
1930 - if (!probed) {
1931 - struct kvm_vcpu_init init = {
1932 - .target = -1,
1933 - .features[0] = (1 << KVM_ARM_VCPU_SVE),
1934 - };
1935 - struct kvm_one_reg reg = {
1936 - .id = KVM_REG_ARM64_SVE_VLS,
1937 - .addr = (uint64_t)&vls[0],
1938 - };
1939 - int fdarray[3], ret;
1940 -
1941 - probed = true;
1942 -
1943 - if (!kvm_arm_create_scratch_host_vcpu(fdarray, &init)) {
1944 - error_report("failed to create scratch VCPU with SVE enabled");
1945 - abort();
1946 - }
1947 - ret = ioctl(fdarray[2], KVM_GET_ONE_REG, &reg);
1948 - kvm_arm_destroy_scratch_host_vcpu(fdarray);
1949 - if (ret) {
1950 - error_report("failed to get KVM_REG_ARM64_SVE_VLS: %s",
1951 - strerror(errno));
1952 - abort();
1953 - }
1954 -
1955 - for (i = KVM_ARM64_SVE_VLS_WORDS - 1; i >= 0; --i) {
1956 - if (vls[i]) {
1957 - vq = 64 - clz64(vls[i]) + i * 64;
1958 - break;
1959 - }
1960 - }
1961 - if (vq > ARM_MAX_VQ) {
1962 - warn_report("KVM supports vector lengths larger than "
1963 - "QEMU can enable");
1964 - vls[0] &= MAKE_64BIT_MASK(0, ARM_MAX_VQ);
1965 - }
1966 - }
1967 -
1968 - return vls[0];
1969 -}
1970 -
1971 static int kvm_arm_sve_set_vls(ARMCPU *cpu)
1972 {
1973 uint64_t vls[KVM_ARM64_SVE_VLS_WORDS] = { cpu->sve_vq.map };