From 6644e1f4e1180ea7abc1001aa3527e965a80d3d5 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Wed, 19 Jul 2017 00:33:56 +0000 Subject: [PATCH] userfaultfd: decode struct uffdio_api.features as flags * xlat/uffd_api_features.in: New file. * userfaultfd.c: Include "xlat/uffd_api_features.h". (uffdio_ioctl): Print struct uffdio_api.features using PRINT_FIELD_FLAGS64 and uffd_api_features. * NEWS: Mention this. * tests/ioctl_uffdio.c: Include "xlat.h" and "xlat/uffd_api_features.h". (main): Update expected output. --- NEWS | 1 + tests/ioctl_uffdio.c | 11 ++++++++--- userfaultfd.c | 12 +++++++----- xlat/uffd_api_features.in | 9 +++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 xlat/uffd_api_features.in diff --git a/NEWS b/NEWS index 6d621e74..305e419f 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ Noteworthy changes in release ?.?? (????-??-??) IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_JOIN_ANYCAST, IPV6_LEAVE_ANYCAST, MCAST_JOIN_GROUP, and MCAST_LEAVE_GROUP options of setsockopt syscall. + * Enhanced decoding of UFFDIO_API ioctl command. * Implemented decoding of linux socket filter programs specified for SO_ATTACH_FILTER and SO_ATTACH_REUSEPORT_CBPF socket options. * Implemented decoding of inet_diag_req_v2, inet_diag_req_compat, diff --git a/tests/ioctl_uffdio.c b/tests/ioctl_uffdio.c index 24c642a7..973de39f 100644 --- a/tests/ioctl_uffdio.c +++ b/tests/ioctl_uffdio.c @@ -44,6 +44,9 @@ # include # include +#include "xlat.h" +#include "xlat/uffd_api_features.h" + int main(void) { @@ -71,9 +74,11 @@ main(void) api_struct->features = 0; rc = ioctl(fd, UFFDIO_API, api_struct); printf("ioctl(%d, UFFDIO_API, {api=0xaa, features=0", fd); - if (api_struct->features) - printf(" => features=%#" PRIx64, - (uint64_t) api_struct->features); + if (api_struct->features) { + printf(" => features="); + printflags(uffd_api_features, api_struct->features, + "UFFD_FEATURE_???"); + } printf(", ioctls=1<<_UFFDIO_REGISTER|" "1<<_UFFDIO_UNREGISTER|1<<_UFFDIO_API"); api_struct->ioctls &= ~(1ull<<_UFFDIO_REGISTER| diff --git a/userfaultfd.c b/userfaultfd.c index 07a305b5..7d09a109 100644 --- a/userfaultfd.c +++ b/userfaultfd.c @@ -43,6 +43,7 @@ SYS_FUNC(userfaultfd) # include # include +# include "xlat/uffd_api_features.h" # include "xlat/uffd_api_flags.h" # include "xlat/uffd_copy_flags.h" # include "xlat/uffd_register_ioctl_flags.h" @@ -75,11 +76,10 @@ uffdio_ioctl(struct tcb *const tcp, const unsigned int code, tprints(", "); if (umove_or_printaddr(tcp, arg, &ua)) return RVAL_DECODED | 1; - /* Features is intended to contain some flags, but - * there aren't any defined yet. - */ PRINT_FIELD_X("{", ua, api); - PRINT_FIELD_X(", ", ua, features); + PRINT_FIELD_FLAGS64(", ", ua, features, + uffd_api_features, + "UFFD_FEATURE_???"); entering_features = malloc(sizeof(*entering_features)); if (entering_features) { *entering_features = ua.features; @@ -90,7 +90,9 @@ uffdio_ioctl(struct tcb *const tcp, const unsigned int code, entering_features = get_tcb_priv_data(tcp); if (!entering_features || *entering_features != ua.features) { - PRINT_FIELD_X(" => ", ua, features); + PRINT_FIELD_FLAGS64(" => ", ua, features, + uffd_api_features, + "UFFD_FEATURE_???"); } PRINT_FIELD_FLAGS64(", ", ua, ioctls, uffd_api_flags, diff --git a/xlat/uffd_api_features.in b/xlat/uffd_api_features.in new file mode 100644 index 00000000..8b1ea974 --- /dev/null +++ b/xlat/uffd_api_features.in @@ -0,0 +1,9 @@ +#val_type uint64_t +UFFD_FEATURE_PAGEFAULT_FLAG_WP +UFFD_FEATURE_EVENT_FORK +UFFD_FEATURE_EVENT_REMAP +UFFD_FEATURE_EVENT_REMOVE +UFFD_FEATURE_MISSING_HUGETLBFS +UFFD_FEATURE_MISSING_SHMEM +UFFD_FEATURE_EVENT_UNMAP +UFFD_FEATURE_EVENT_EXIT -- 2.40.0