static int kvm_check_cpucfg2(CPUState *cs)
{
int ret;
- uint64_t val;
+ uint64_t val = 0;
struct kvm_device_attr attr = {
.group = KVM_LOONGARCH_VCPU_CPUCFG,
.attr = 2,
ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
if (!ret) {
- kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
- env->cpucfg[2] &= val;
+ /*
+ * The &= mask is best-effort feature negotiation. If HAS succeeded,
+ * a GET failure is most likely a copy_{from,to}_user issue; warn and
+ * keep the cpucfg2 the guest already has rather than failing the sync.
+ */
+ int r = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
+ if (r) {
+ warn_report("CPUCFG2: KVM_GET_DEVICE_ATTR: %s", strerror(errno));
+ } else {
+ env->cpucfg[2] &= val;
+ }
if (FIELD_EX32(env->cpucfg[2], CPUCFG2, FP)) {
/* The FP minimal version is 1. */