Message ID | 20200616105147.21736-2-filip.bozuta@syrmia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add strace support for printing arguments for ioctls | expand |
Le 16/06/2020 à 12:51, Filip Bozuta a écrit : > From: Filip Bozuta <Filip.Bozuta@syrmia.com> > > Socket ioctls SIOCGSTAMP and SIOCGSTAMPNS, used for timestamping the socket > connection, are defined in file "ioctls.h" differently from other ioctls. > The reason for this difference is explained in the comments above their definition. > These ioctls didn't have defined thunk argument types before changes from this > patch. They have special handling functions ("do_ioctl_SIOCGSTAMP" and > "do_ioctl_SIOCGSTAMPNS") that take care of setting values for approppriate argument > types (struct timeval and struct timespec) and thus no thunk argument types were > needed for their implementation. But this patch adds those argument type definitions > in file "syscall_types.h" and "ioctls.h" as it is needed for printing arguments > of these ioctls with strace. > > Implementation notes: > > There are two variants of these ioctls: SIOCGSTAMP_OLD/SIOCGSTAM_NEW and > SIOCGSTAMPNS_OLD/SIOCGSTAMPNS_NEW. One is the old existing definition and the > other is the 2038 safe variant used for 32-bit architectures. Corresponding > structure definitions STRUCT_timespec/STRUCT__kernel_timespec and > STRUCT_timeval/STRUCT__kernel_sock_timeval were added for these variants. > STRUCT_timeval definition was already inside the file as it is used by > another implemented ioctl. Two cases were added for definitions > STRUCT_timeval/STRUCT__kernel_sock_timeval to manage the case when the > "u_sec" field of the timeval structure is of type int. > > Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com> > --- > linux-user/ioctls.h | 12 ++++++++---- > linux-user/syscall_types.h | 22 ++++++++++++++++++++++ > 2 files changed, 30 insertions(+), 4 deletions(-) > > diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h > index 0defa1d8c1..edb7172207 100644 > --- a/linux-user/ioctls.h > +++ b/linux-user/ioctls.h > @@ -279,13 +279,17 @@ > * FIXME: create a macro to define this kind of entry > */ > { TARGET_SIOCGSTAMP_OLD, TARGET_SIOCGSTAMP_OLD, > - "SIOCGSTAMP_OLD", IOC_R, do_ioctl_SIOCGSTAMP }, > + "SIOCGSTAMP_OLD", IOC_R, do_ioctl_SIOCGSTAMP, > + { MK_PTR(MK_STRUCT(STRUCT_timeval)) } }, > { TARGET_SIOCGSTAMPNS_OLD, TARGET_SIOCGSTAMPNS_OLD, > - "SIOCGSTAMPNS_OLD", IOC_R, do_ioctl_SIOCGSTAMPNS }, > + "SIOCGSTAMPNS_OLD", IOC_R, do_ioctl_SIOCGSTAMPNS, > + { MK_PTR(MK_STRUCT(STRUCT_timespec)) } }, > { TARGET_SIOCGSTAMP_NEW, TARGET_SIOCGSTAMP_NEW, > - "SIOCGSTAMP_NEW", IOC_R, do_ioctl_SIOCGSTAMP }, > + "SIOCGSTAMP_NEW", IOC_R, do_ioctl_SIOCGSTAMP, > + { MK_PTR(MK_STRUCT(STRUCT__kernel_sock_timeval)) } }, > { TARGET_SIOCGSTAMPNS_NEW, TARGET_SIOCGSTAMPNS_NEW, > - "SIOCGSTAMPNS_NEW", IOC_R, do_ioctl_SIOCGSTAMPNS }, > + "SIOCGSTAMPNS_NEW", IOC_R, do_ioctl_SIOCGSTAMPNS, > + { MK_PTR(MK_STRUCT(STRUCT__kernel_timespec)) } }, > > IOCTL(RNDGETENTCNT, IOC_R, MK_PTR(TYPE_INT)) > IOCTL(RNDADDTOENTCNT, IOC_W, MK_PTR(TYPE_INT)) > diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h > index 4e12c1661e..d636561bf4 100644 > --- a/linux-user/syscall_types.h > +++ b/linux-user/syscall_types.h > @@ -137,10 +137,32 @@ STRUCT(snd_timer_params, > TYPE_INT, /* filter */ > MK_ARRAY(TYPE_CHAR, 60)) /* reserved */ > > +#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) > +STRUCT(timeval, > + TYPE_LONG, /* tv_sec */ > + TYPE_INT) /* tv_usec */ > + > +STRUCT(_kernel_sock_timeval, > + TYPE_LONG, /* tv_sec */ > + TYPE_INT) /* tv_usec */ > +#else > +STRUCT(timeval, > + TYPE_LONG, /* tv_sec */ > + TYPE_LONG) /* tv_usec */ > + > +STRUCT(_kernel_sock_timeval, > + TYPE_LONGLONG, /* tv_sec */ > + TYPE_LONGLONG) /* tv_usec */ > +#endif > + > STRUCT(timespec, > TYPE_LONG, /* tv_sec */ > TYPE_LONG) /* tv_nsec */ > > +STRUCT(_kernel_timespec, > + TYPE_LONGLONG, /* tv_sec */ > + TYPE_LONGLONG) /* tv_nsec */ > + > STRUCT(snd_timer_status, > MK_STRUCT(STRUCT_timespec), /* tstamp */ > TYPE_INT, /* resolution */ > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h index 0defa1d8c1..edb7172207 100644 --- a/linux-user/ioctls.h +++ b/linux-user/ioctls.h @@ -279,13 +279,17 @@ * FIXME: create a macro to define this kind of entry */ { TARGET_SIOCGSTAMP_OLD, TARGET_SIOCGSTAMP_OLD, - "SIOCGSTAMP_OLD", IOC_R, do_ioctl_SIOCGSTAMP }, + "SIOCGSTAMP_OLD", IOC_R, do_ioctl_SIOCGSTAMP, + { MK_PTR(MK_STRUCT(STRUCT_timeval)) } }, { TARGET_SIOCGSTAMPNS_OLD, TARGET_SIOCGSTAMPNS_OLD, - "SIOCGSTAMPNS_OLD", IOC_R, do_ioctl_SIOCGSTAMPNS }, + "SIOCGSTAMPNS_OLD", IOC_R, do_ioctl_SIOCGSTAMPNS, + { MK_PTR(MK_STRUCT(STRUCT_timespec)) } }, { TARGET_SIOCGSTAMP_NEW, TARGET_SIOCGSTAMP_NEW, - "SIOCGSTAMP_NEW", IOC_R, do_ioctl_SIOCGSTAMP }, + "SIOCGSTAMP_NEW", IOC_R, do_ioctl_SIOCGSTAMP, + { MK_PTR(MK_STRUCT(STRUCT__kernel_sock_timeval)) } }, { TARGET_SIOCGSTAMPNS_NEW, TARGET_SIOCGSTAMPNS_NEW, - "SIOCGSTAMPNS_NEW", IOC_R, do_ioctl_SIOCGSTAMPNS }, + "SIOCGSTAMPNS_NEW", IOC_R, do_ioctl_SIOCGSTAMPNS, + { MK_PTR(MK_STRUCT(STRUCT__kernel_timespec)) } }, IOCTL(RNDGETENTCNT, IOC_R, MK_PTR(TYPE_INT)) IOCTL(RNDADDTOENTCNT, IOC_W, MK_PTR(TYPE_INT)) diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h index 4e12c1661e..d636561bf4 100644 --- a/linux-user/syscall_types.h +++ b/linux-user/syscall_types.h @@ -137,10 +137,32 @@ STRUCT(snd_timer_params, TYPE_INT, /* filter */ MK_ARRAY(TYPE_CHAR, 60)) /* reserved */ +#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) +STRUCT(timeval, + TYPE_LONG, /* tv_sec */ + TYPE_INT) /* tv_usec */ + +STRUCT(_kernel_sock_timeval, + TYPE_LONG, /* tv_sec */ + TYPE_INT) /* tv_usec */ +#else +STRUCT(timeval, + TYPE_LONG, /* tv_sec */ + TYPE_LONG) /* tv_usec */ + +STRUCT(_kernel_sock_timeval, + TYPE_LONGLONG, /* tv_sec */ + TYPE_LONGLONG) /* tv_usec */ +#endif + STRUCT(timespec, TYPE_LONG, /* tv_sec */ TYPE_LONG) /* tv_nsec */ +STRUCT(_kernel_timespec, + TYPE_LONGLONG, /* tv_sec */ + TYPE_LONGLONG) /* tv_nsec */ + STRUCT(snd_timer_status, MK_STRUCT(STRUCT_timespec), /* tstamp */ TYPE_INT, /* resolution */