Re: How does the size field work in IOCTL numbers?
On Fri, Sep 02, 2016 at 07:27:27PM -0400, Keno Fischer wrote: > I don't understand what the rule is for what to put in that third > argument, or is it ioctl specific? Please let me know if I missed > something. You can do whatever you like, but everything that is different between ILP32 and LP64 requires COMPAT fixups.
Re: How does the size field work in IOCTL numbers?
On Fri, Sep 02, 2016 at 07:27:27PM -0400, Keno Fischer wrote: > I don't understand what the rule is for what to put in that third > argument, or is it ioctl specific? Please let me know if I missed > something. You can do whatever you like, but everything that is different between ILP32 and LP64 requires COMPAT fixups.
How does the size field work in IOCTL numbers?
Hi folks, this is more of a general linux question, but since I noticed it while looking perf_events code, I'm ccing perf_events folks in case the answer is perf_events specific (hope that's ok). uapi/linux/perf_event.h has the following: #define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) #define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) #define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) #define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) #define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) Now, my question is how to interpret the last argument to the _IO* macros. The man page for ioctl(2) says, it encodes the "size of the argument argp in bytes", but I'm not sure how to interpret that. For example, IOC_PERIOD takes a pointer to a 64-bit value, so the __u64 makes sense for me. But as far as I know, IOC_ID also takes a pointer to a 64-bit value (and writes the ID to it), but it has `__64 *` rather than `__u64`. The we have IOC_SET_FILTER which as far as I know takes a pointer to a variable-length string (but with the above definition the size field is sizeof(char*)), and IOC_SET_BPF which doesn't take a pointer at all, but interprets the argument as a file descriptor (similar to IOC_SET_OUTPUT, which doesn't have a size at all). I don't understand what the rule is for what to put in that third argument, or is it ioctl specific? Please let me know if I missed something. Thanks, Keno
How does the size field work in IOCTL numbers?
Hi folks, this is more of a general linux question, but since I noticed it while looking perf_events code, I'm ccing perf_events folks in case the answer is perf_events specific (hope that's ok). uapi/linux/perf_event.h has the following: #define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) #define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) #define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) #define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) #define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) Now, my question is how to interpret the last argument to the _IO* macros. The man page for ioctl(2) says, it encodes the "size of the argument argp in bytes", but I'm not sure how to interpret that. For example, IOC_PERIOD takes a pointer to a 64-bit value, so the __u64 makes sense for me. But as far as I know, IOC_ID also takes a pointer to a 64-bit value (and writes the ID to it), but it has `__64 *` rather than `__u64`. The we have IOC_SET_FILTER which as far as I know takes a pointer to a variable-length string (but with the above definition the size field is sizeof(char*)), and IOC_SET_BPF which doesn't take a pointer at all, but interprets the argument as a file descriptor (similar to IOC_SET_OUTPUT, which doesn't have a size at all). I don't understand what the rule is for what to put in that third argument, or is it ioctl specific? Please let me know if I missed something. Thanks, Keno