[PATCH 2/4] drm: Add dispatcher and driver identification for DRM
Dmitry V. Levin
ldv at altlinux.org
Tue Jun 9 22:14:20 UTC 2015
On Tue, Jun 09, 2015 at 01:26:42PM +0200, Patrik Jakobsson wrote:
[...]
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -121,6 +121,7 @@ strace_SOURCES = \
> utime.c \
> utimes.c \
> v4l2.c \
> + drm.c \
> vsprintf.c \
> wait.c \
> xattr.c
Starting with v4.7-166-g7ae73a9, we keep strace_SOURCES list sorted.
> --- /dev/null
> +++ b/drm.c
[...]
> +#include "defs.h"
> +
> +#include <sys/types.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include <linux/limits.h>
> +#include <stdint.h>
> +#include <sys/ioctl.h>
> +#include <linux/types.h>
> +#include <drm.h>
No need to include header files already included by "defs.h".
Most likely no need to include <linux/limits.h> or <linux/types.h>.
> +#define DRM_MAX_NAME_LEN 128
> +
> +inline int drm_is_priv(const unsigned int num)
> +{
> + return (_IOC_NR(num) >= DRM_COMMAND_BASE &&
> + _IOC_NR(num) < DRM_COMMAND_END);
> +}
> +
> +static int drm_get_driver_name(struct tcb *tcp, char *name, size_t bufsize)
> +{
> + char path[PATH_MAX];
> + char link[PATH_MAX];
> + int ret;
> +
> + ret = getfdpath(tcp, tcp->u_arg[0], path, PATH_MAX - 1);
> + if (!ret)
> + return ret;
> +
> + snprintf(link, PATH_MAX, "/sys/class/drm/%s/device/driver",
> + basename(path));
> +
> + ret = readlink(link, path, PATH_MAX - 1);
> + if (ret < 0)
> + return ret;
> +
> + path[ret] = '\0';
> + strncpy(name, basename(path), bufsize);
> +
> + return 0;
> +}
> +
> +int drm_is_driver(struct tcb *tcp, const char *name)
> +{
> + char drv[DRM_MAX_NAME_LEN];
> + int ret;
> +
> + ret = drm_get_driver_name(tcp, drv, DRM_MAX_NAME_LEN);
> + if (ret)
> + return 0;
> +
> + return strcmp(name, drv) == 0;
> +}
This interface will result to several getfdpath() calls per
ioctl_decode(). If the only purpose of drm_is_driver() is to help finding
the most appropriate function, let's create a table of pairs
{driver name, function} and pass this table to a function that will do a
single getfdpath() call, calculate the driver name, and choose the right
function from the table.
[...]
> @@ -284,6 +294,7 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg)
> * d sys/des.h (possible overlap)
> * d vax/dkio.h (possible overlap)
> * d vaxuba/rxreg.h (possible overlap)
> + * d drm/drm.h
> * f sys/filio.h
> * g sunwindow/win_ioctl.h -no overlap-
> * g sunwindowdev/winioctl.c !no manifest constant! -no overlap-
This is a history, no need to patch it.
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20150610/29e27b26/attachment.bin>
More information about the Strace-devel
mailing list