api_struct->api = UFFD_API;
api_struct->features = 0;
rc = ioctl(fd, UFFDIO_API, api_struct);
- printf("ioctl(%d, UFFDIO_API, {api=0xaa, features=0"
- " => features=%#" PRIx64 ", ioctls=1<<_UFFDIO_REGISTER|"
- "1<<_UFFDIO_UNREGISTER|1<<_UFFDIO_API",
- fd, (uint64_t)api_struct->features);
+ printf("ioctl(%d, UFFDIO_API, {api=0xaa, features=0", fd);
+ if (api_struct->features)
+ printf(" => features=%#" PRIx64,
+ (uint64_t) api_struct->features);
+ printf(", ioctls=1<<_UFFDIO_REGISTER|"
+ "1<<_UFFDIO_UNREGISTER|1<<_UFFDIO_API");
api_struct->ioctls &= ~(1ull<<_UFFDIO_REGISTER|
1ull<<_UFFDIO_UNREGISTER|
1ull<<_UFFDIO_API);
{
switch (code) {
case UFFDIO_API: {
+ uint64_t *entering_features;
struct uffdio_api ua;
if (entering(tcp)) {
tprints(", ");
*/
PRINT_FIELD_X("{", ua, api);
PRINT_FIELD_X(", ", ua, features);
+ entering_features = malloc(sizeof(*entering_features));
+ if (entering_features) {
+ *entering_features = ua.features;
+ set_tcb_priv_data(tcp, entering_features, free);
+ }
} else {
if (!syserror(tcp) && !umove(tcp, arg, &ua)) {
- PRINT_FIELD_X(" => ", ua, features);
+ entering_features = get_tcb_priv_data(tcp);
+ if (!entering_features
+ || *entering_features != ua.features) {
+ PRINT_FIELD_X(" => ", ua, features);
+ }
PRINT_FIELD_FLAGS64(", ", ua, ioctls,
uffd_api_flags,
"_UFFDIO_???");