diff --git a/include/qemu/seqlock.h b/include/qemu/seqlock.h index fd408b7ec543029249e518c0666879d167eaab82..8b6b4ee4bbcf6a80fee192125afdff21a358a7c5 100644 --- a/include/qemu/seqlock.h +++ b/include/qemu/seqlock.h @@ -55,11 +55,11 @@ static inline void seqlock_write_lock_impl(QemuSeqLock *sl, QemuLockable *lock) #define seqlock_write_lock(sl, lock) \ seqlock_write_lock_impl(sl, QEMU_MAKE_LOCKABLE(lock)) -/* Lock out other writers and update the count. */ +/* Update the count and release the lock. */ static inline void seqlock_write_unlock_impl(QemuSeqLock *sl, QemuLockable *lock) { + seqlock_write_end(sl); qemu_lockable_unlock(lock); - seqlock_write_begin(sl); } #define seqlock_write_unlock(sl, lock) \ seqlock_write_unlock_impl(sl, QEMU_MAKE_LOCKABLE(lock)) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index ec8bc9957eae8fb47e3e456948443ade40dcb216..1962f00c774290d9da198a1b5b7eb7bd06decfa4 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -6330,6 +6330,10 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) &cpu->mwait.ecx, &cpu->mwait.edx); env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR; } + if (kvm_enabled() && cpu->ucode_rev == 0) { + cpu->ucode_rev = kvm_arch_get_supported_msr_feature(kvm_state, + MSR_IA32_UCODE_REV); + } } if (cpu->ucode_rev == 0) { diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 60060087fddec75abe865b1a159cc83c6a6cc32a..e49a2d2585a1b880f71d67a745cdadb77ada57e5 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -99,6 +99,7 @@ static bool has_msr_smi_count; static bool has_msr_arch_capabs; static bool has_msr_core_capabs; static bool has_msr_vmx_vmfunc; +static bool has_msr_ucode_rev; static bool has_msr_vmx_procbased_ctls2; static uint32_t has_architectural_pmu_version; @@ -1985,6 +1986,9 @@ static int kvm_get_supported_msrs(KVMState *s) case MSR_IA32_VMX_VMFUNC: has_msr_vmx_vmfunc = true; break; + case MSR_IA32_UCODE_REV: + has_msr_ucode_rev = true; + break; case MSR_IA32_VMX_PROCBASED_CTLS2: has_msr_vmx_procbased_ctls2 = true; break; @@ -2628,6 +2632,10 @@ static void kvm_init_msrs(X86CPU *cpu) env->features[FEAT_CORE_CAPABILITY]); } + if (has_msr_ucode_rev) { + kvm_msr_entry_add(cpu, MSR_IA32_UCODE_REV, cpu->ucode_rev); + } + /* * Older kernels do not include VMX MSRs in KVM_GET_MSR_INDEX_LIST, but * all kernels with MSR features should have them. diff --git a/vl.c b/vl.c index b426b3213461210565bd1db15a0c89d71e9fea7c..cec0bfdb444c1b1e6b669ba8cdbfbfc8dc0c790c 100644 --- a/vl.c +++ b/vl.c @@ -3532,7 +3532,7 @@ int main(int argc, char **argv, char **envp) gchar **optname = g_strsplit(typename, ACCEL_CLASS_SUFFIX, 0); printf("%s\n", optname[0]); - g_free(optname); + g_strfreev(optname); } g_free(typename); }