Skip to content

Commit cac0f1b

Browse files
Steven PriceMarc Zyngier
authored andcommitted
KVM: Implement kvm_put_guest()
kvm_put_guest() is analogous to put_user() - it writes a single value to the guest physical address. The implementation is built upon put_user() and so it has the same single copy atomic properties. Signed-off-by: Steven Price <[email protected]> Signed-off-by: Marc Zyngier <[email protected]>
1 parent b48c1a4 commit cac0f1b

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

include/linux/kvm_host.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,28 @@ int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
746746
unsigned long len);
747747
int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
748748
gpa_t gpa, unsigned long len);
749+
750+
#define __kvm_put_guest(kvm, gfn, offset, value, type) \
751+
({ \
752+
unsigned long __addr = gfn_to_hva(kvm, gfn); \
753+
type __user *__uaddr = (type __user *)(__addr + offset); \
754+
int __ret = -EFAULT; \
755+
\
756+
if (!kvm_is_error_hva(__addr)) \
757+
__ret = put_user(value, __uaddr); \
758+
if (!__ret) \
759+
mark_page_dirty(kvm, gfn); \
760+
__ret; \
761+
})
762+
763+
#define kvm_put_guest(kvm, gpa, value, type) \
764+
({ \
765+
gpa_t __gpa = gpa; \
766+
struct kvm *__kvm = kvm; \
767+
__kvm_put_guest(__kvm, __gpa >> PAGE_SHIFT, \
768+
offset_in_page(__gpa), (value), type); \
769+
})
770+
749771
int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);
750772
int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
751773
struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);

0 commit comments

Comments
 (0)