We will re-register smram listeners after the VM file descriptors has changed. We need to unregister them first to make sure addresses and reference counters work properly.
Signed-off-by: Ani Sinha <[email protected]> --- target/i386/kvm/kvm.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 6aa17cecba..89f9e11d3a 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -113,6 +113,11 @@ typedef struct { static void kvm_init_msrs(X86CPU *cpu); static int kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr, QEMUWRMSRHandler *wrmsr); +static int unregister_smram_listener(NotifierWithReturn *notifier, + void *data, Error** errp); +NotifierWithReturn kvm_vmfd_pre_change_notifier = { + .notify = unregister_smram_listener, +}; const KVMCapabilityInfo kvm_arch_required_capabilities[] = { KVM_CAP_INFO(SET_TSS_ADDR), @@ -2749,6 +2754,13 @@ static void register_smram_listener(Notifier *n, void *unused) } } +static int unregister_smram_listener(NotifierWithReturn *notifier, + void *data, Error** errp) +{ + memory_listener_unregister(&smram_listener.listener); + return 0; +} + /* It should only be called in cpu's hotplug callback */ void kvm_smm_cpu_address_space_init(X86CPU *cpu) { @@ -3401,6 +3413,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } } + kvm_vmfd_add_pre_change_notifier(&kvm_vmfd_pre_change_notifier); + return 0; } -- 2.42.0
