]> granicus.if.org Git - strace/commitdiff
userfaultfd: decode struct uffdio_api.features as flags
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 19 Jul 2017 00:33:56 +0000 (00:33 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 19 Jul 2017 00:33:56 +0000 (00:33 +0000)
* 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
tests/ioctl_uffdio.c
userfaultfd.c
xlat/uffd_api_features.in [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 6d621e74cf786184f71d3704ef7969964e0e10e4..305e419f72fa871c632e948d6b7fd3aae12640ce 100644 (file)
--- 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,
index 24c642a710533647f0eb934efc5a9fb7363363ee..973de39f943ffa9ad9f4e728d0ff01bec3e0a97b 100644 (file)
@@ -44,6 +44,9 @@
 # include <linux/ioctl.h>
 # include <linux/userfaultfd.h>
 
+#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|
index 07a305b5686656a227326911da009c48d979c27a..7d09a109423e53f981d46414a0a3761bf1693f88 100644 (file)
@@ -43,6 +43,7 @@ SYS_FUNC(userfaultfd)
 # include <linux/ioctl.h>
 # include <linux/userfaultfd.h>
 
+# 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 (file)
index 0000000..8b1ea97
--- /dev/null
@@ -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