puzzle of ioctl decode in file_ioctl.c and userfaultfd.c
Dr. David Alan Gilbert
dgilbert at redhat.com
Mon Dec 12 10:39:43 UTC 2016
* jingpiao chen (chenjingpiao at gmail.com) wrote:
> Version:4.14-ab28d7f1e5ab9b51f5708741bd13f92e768123d4
>
> 2.userfaultfd.c:126
>
> 126 case UFFDIO_UNREGISTER:
> 127 case UFFDIO_WAKE: {
> 128 struct uffdio_range ura;
> 129 tprints(", ");
> 130 if (!umove_or_printaddr(tcp, arg, &ura))
> 131 tprintf_uffdio_range(&ura);
> 132 return RVAL_DECODED | 1;
> 133 }
>
> /usr/include/linux/userfaultfd.h:
> 51 #define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \
> 52 struct uffdio_range)
> 53 #define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \
> 54 struct uffdio_range)
>
> UFFDIO_UNREGISTER and UFFDIO_WAKE are read data, why it get data
> when entering.
> I means it should replace by:
From memory, the problem is that the kernel macros are wrong (and
can't be fixed since they'd break ABI).
In both those calls it's userland who passes data to the kernel
(giving the address range to be unregisters/woken).
> 127 case UFFDIO_UNREGISTER:
> 128 case UFFDIO_WAKE: {
> 129 if (entering(tcp))
> 130 return 0;
> 131
> 132 struct uffdio_range ura;
> 133 tprints(", ");
> 134 if (!umove_or_printaddr(tcp, arg, &ura))
> 135 tprintf_uffdio_range(&ura);
> 136 return RVAL_DECODED | 1;
> 137 }
Dave
--
Dr. David Alan Gilbert / dgilbert at redhat.com / Manchester, UK
More information about the Strace-devel
mailing list