On Mon, Dec 04, 2017 at 08:04:49PM +0900, Masatake YAMATO wrote: > * configure.ac (AC_CHECK_TYPES): Add struct kvm_userspace_memory_region. > * xlat/kvm_mem_flags.in: New file. > * kvm.c: Include print_fields.h and xlat/kvm_mem_flags.h. > (kvm_ioctl_set_user_memory_region): New function. > (kvm_ioctl) <KVM_SET_USER_MEMORY_REGION>: Use it. > > Change in v2: > * Use umove_or_printaddr instead of umove because umove_or_printaddr > performs verbose(tcp) check and prints the zero address nicely. > Suggested by ldv. > > Change in v3: > * Verify the availability struct kvm_userspace_memory_region. > Suggested by ldv. > > Signed-off-by: Masatake YAMATO <yam...@redhat.com> > --- > configure.ac | 2 ++ > kvm.c | 27 +++++++++++++++++++++++++++ > xlat/kvm_mem_flags.in | 2 ++ > 3 files changed, 31 insertions(+) > create mode 100644 xlat/kvm_mem_flags.in > > diff --git a/configure.ac b/configure.ac > index fa451d84..dad995c4 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -541,6 +541,8 @@ AC_CHECK_TYPES([struct statfs64], [ > > AC_CHECK_TYPES([struct blk_user_trace_setup],,, [#include > <linux/blktrace_api.h>]) > > +AC_CHECK_TYPES([struct kvm_userspace_memory_region],,, [#include > <linux/kvm.h>]) > + > AC_CHECK_HEADERS([linux/btrfs.h], [ > AC_CHECK_MEMBERS(m4_normalize([ > struct btrfs_ioctl_feature_flags.compat_flags, > diff --git a/kvm.c b/kvm.c > index 9e4f9978..8f68aef5 100644 > --- a/kvm.c > +++ b/kvm.c > @@ -32,6 +32,7 @@ > > #ifdef HAVE_LINUX_KVM_H > # include <linux/kvm.h> > +# include "print_fields.h" > > static int > kvm_ioctl_create_vcpu(struct tcb *const tcp, const kernel_ulong_t arg) > @@ -42,12 +43,38 @@ kvm_ioctl_create_vcpu(struct tcb *const tcp, const > kernel_ulong_t arg) > return RVAL_IOCTL_DECODED | RVAL_FD; > } > > +# include "xlat/kvm_mem_flags.h" > +static int > +kvm_ioctl_set_user_memory_region(struct tcb *const tcp, const kernel_ulong_t > arg) > +{ > +#ifdef HAVE_STRUCT_KVM_USERSPACE_MEMORY_REGION > + struct kvm_userspace_memory_region u_memory_region; > + > + tprints(", "); > + if (umove_or_printaddr(tcp, arg, &u_memory_region)) > + return RVAL_IOCTL_DECODED; > + > + PRINT_FIELD_U("{", u_memory_region, slot); > + PRINT_FIELD_FLAGS(", ", u_memory_region, flags, kvm_mem_flags, > + "KVM_MEM_???"); > + PRINT_FIELD_X(", ", u_memory_region, guest_phys_addr); > + PRINT_FIELD_U(", ", u_memory_region, memory_size); > + PRINT_FIELD_X(", ", u_memory_region, userspace_addr); > + > + return RVAL_IOCTL_DECODED; > +#else > + return RVAL_DECODED; > +#endif > +} > + > int > kvm_ioctl(struct tcb *const tcp, const unsigned int code, const > kernel_ulong_t arg) > { > switch (code) { > case KVM_CREATE_VCPU: > return kvm_ioctl_create_vcpu(tcp, arg); > + case KVM_SET_USER_MEMORY_REGION: > + return kvm_ioctl_set_user_memory_region(tcp, arg);
If HAVE_STRUCT_KVM_USERSPACE_MEMORY_REGION is not set, then KVM_SET_USER_MEMORY_REGION is not available, too, and it's use also has to be guarded, e.g. # ifdef HAVE_STRUCT_KVM_USERSPACE_MEMORY_REGION case KVM_SET_USER_MEMORY_REGION: return kvm_ioctl_set_user_memory_region(tcp, arg); # endif This allows to move the whole definition of kvm_ioctl_set_user_memory_region inside HAVE_STRUCT_KVM_USERSPACE_MEMORY_REGION guard, too. -- ldv
signature.asc
Description: PGP signature
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel