int kvm_add_user_return_msr(u32 msr);
 int kvm_find_user_return_msr(u32 msr);
 int kvm_set_user_return_msr(unsigned index, u64 val, u64 mask);
+void kvm_user_return_msr_update_cache(unsigned int index, u64 val);
 
 static inline bool kvm_is_supported_user_return_msr(u32 msr)
 {
 
        }
 }
 
+static void kvm_user_return_register_notifier(struct kvm_user_return_msrs *msrs)
+{
+       if (!msrs->registered) {
+               msrs->urn.on_user_return = kvm_on_user_return;
+               user_return_notifier_register(&msrs->urn);
+               msrs->registered = true;
+       }
+}
+
 int kvm_set_user_return_msr(unsigned slot, u64 value, u64 mask)
 {
        struct kvm_user_return_msrs *msrs = this_cpu_ptr(user_return_msrs);
                return 1;
 
        msrs->values[slot].curr = value;
-       if (!msrs->registered) {
-               msrs->urn.on_user_return = kvm_on_user_return;
-               user_return_notifier_register(&msrs->urn);
-               msrs->registered = true;
-       }
+       kvm_user_return_register_notifier(msrs);
        return 0;
 }
 EXPORT_SYMBOL_GPL(kvm_set_user_return_msr);
 
+void kvm_user_return_msr_update_cache(unsigned int slot, u64 value)
+{
+       struct kvm_user_return_msrs *msrs = this_cpu_ptr(user_return_msrs);
+
+       msrs->values[slot].curr = value;
+       kvm_user_return_register_notifier(msrs);
+}
+EXPORT_SYMBOL_GPL(kvm_user_return_msr_update_cache);
+
 static void drop_user_return_notifiers(void)
 {
        struct kvm_user_return_msrs *msrs = this_cpu_ptr(user_return_msrs);