8 #include <linux/kvm_host.h>
10 #include <linux/errno.h>
11 #include <linux/uaccess.h>
53 const struct _kvm_stats_desc *desc,
54 void *stats,
size_t size_stats,
55 char __user *user_buffer,
size_t size, loff_t *offset)
59 ssize_t remain =
size;
64 char __user *dest = user_buffer;
66 size_header =
sizeof(*header);
67 size_desc = header->num_desc *
sizeof(*desc);
69 len = KVM_STATS_NAME_SIZE + size_header + size_desc + size_stats - pos;
70 len = min(len, remain);
83 copylen = size_header - pos;
84 copylen = min(copylen, remain);
86 src = (
void *)header + pos;
87 if (copy_to_user(dest, src, copylen))
103 copylen = header->id_offset + KVM_STATS_NAME_SIZE - pos;
104 copylen = min(copylen, remain);
106 src =
id + pos - header->id_offset;
107 if (copy_to_user(dest, src, copylen))
121 copylen = header->desc_offset + size_desc - pos;
122 copylen = min(copylen, remain);
124 src = (
void *)desc + pos - header->desc_offset;
125 if (copy_to_user(dest, src, copylen))
133 copylen = header->data_offset + size_stats - pos;
134 copylen = min(copylen, remain);
136 src = stats + pos - header->data_offset;
137 if (copy_to_user(dest, src, copylen))
ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header, const struct _kvm_stats_desc *desc, void *stats, size_t size_stats, char __user *user_buffer, size_t size, loff_t *offset)