This adds a dispatcher for extending drm ioctl debugging info and adds the i915 ioctls to the xlat framework. Signed-off-by: Patrik Jakobsson <patrik.jakobsson@xxxxxxxxxxxxxxx> --- Makefile.am | 2 + defs.h | 2 + drm.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ drm_i915.c | 43 ++++++++++++++++++++ ioctl.c | 5 +++ xlat/drm_i915_ioctls.in | 51 ++++++++++++++++++++++++ 6 files changed, 207 insertions(+) create mode 100644 drm.c create mode 100644 drm_i915.c create mode 100644 xlat/drm_i915_ioctls.in diff --git a/Makefile.am b/Makefile.am index 549aebc..941e12a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -121,6 +121,8 @@ strace_SOURCES = \ utime.c \ utimes.c \ v4l2.c \ + drm.c \ + drm_i915.c \ vsprintf.c \ wait.c \ xattr.c diff --git a/defs.h b/defs.h index 77c819c..699e244 100644 --- a/defs.h +++ b/defs.h @@ -571,6 +571,8 @@ extern int sock_ioctl(struct tcb *, const unsigned int, long); extern int term_ioctl(struct tcb *, const unsigned int, long); extern int ubi_ioctl(struct tcb *, const unsigned int, long); extern int v4l2_ioctl(struct tcb *, const unsigned int, long); +extern int drm_ioctl(struct tcb *, const unsigned int, long); +extern int drm_i915_ioctl(struct tcb *, const unsigned int, long); extern int tv_nz(const struct timeval *); extern int tv_cmp(const struct timeval *, const struct timeval *); diff --git a/drm.c b/drm.c new file mode 100644 index 0000000..f47c514 --- /dev/null +++ b/drm.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2015 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: + * Patrik Jakobsson <patrik.jakobsson@xxxxxxxxxxxxxxx> + */ + +#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/drm.h> +#include <drm/i915_drm.h> + +#define DRM_MAX_NAME_LEN 128 + +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; +} + +static 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; +} + +int drm_ioctl(struct tcb *tcp, const unsigned int code, long arg) +{ + const struct_ioctlent *iop; + + /* Check for device specific ioctls */ + if (_IOC_NR(tcp->u_arg[1]) >= DRM_COMMAND_BASE && + _IOC_NR(tcp->u_arg[1]) < DRM_COMMAND_END) { + if (verbose(tcp) && drm_is_driver(tcp, "i915")) + return drm_i915_ioctl(tcp, code, arg); + } + + if (entering(tcp)) { + /* Fall back to default behaviour */ + iop = ioctl_lookup(tcp->u_arg[1]); + if (iop) { + tprints(iop->symbol); + while ((iop = ioctl_next_match(iop))) + tprintf(" or %s", iop->symbol); + } else { + ioctl_print_code(tcp->u_arg[1]); + } + } + + return 0; +} diff --git a/drm_i915.c b/drm_i915.c new file mode 100644 index 0000000..860e22b --- /dev/null +++ b/drm_i915.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: + * Patrik Jakobsson <patrik.jakobsson@xxxxxxxxxxxxxxx> + */ + +#include "defs.h" + +#include <drm/drm.h> +#include <drm/i915_drm.h> +#include "xlat/drm_i915_ioctls.h" + +int drm_i915_ioctl(struct tcb *tcp, const unsigned int code, long arg) +{ + if (entering(tcp)) + printxval(drm_i915_ioctls, code, "I915_IOCTL_???"); + + return 0; +} diff --git a/ioctl.c b/ioctl.c index c67d048..225e850 100644 --- a/ioctl.c +++ b/ioctl.c @@ -216,6 +216,8 @@ ioctl_decode_command_number(unsigned int arg) return 1; } return 0; + case 'd': /* DRM */ + return 1; default: return 0; } @@ -252,6 +254,8 @@ ioctl_decode(struct tcb *tcp, unsigned int code, long arg) return ubi_ioctl(tcp, code, arg); case 'V': return v4l2_ioctl(tcp, code, arg); + case 'd': + return drm_ioctl(tcp, code, arg); case '=': return ptp_ioctl(tcp, code, arg); #ifdef HAVE_LINUX_INPUT_H @@ -284,6 +288,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- diff --git a/xlat/drm_i915_ioctls.in b/xlat/drm_i915_ioctls.in new file mode 100644 index 0000000..21c3397 --- /dev/null +++ b/xlat/drm_i915_ioctls.in @@ -0,0 +1,51 @@ +/* Unfortunately i915 collides with other DRM drivers so we must specify these */ +DRM_IOCTL_I915_INIT +DRM_IOCTL_I915_FLUSH +DRM_IOCTL_I915_FLIP +DRM_IOCTL_I915_BATCHBUFFER +DRM_IOCTL_I915_IRQ_EMIT +DRM_IOCTL_I915_IRQ_WAIT +DRM_IOCTL_I915_GETPARAM +DRM_IOCTL_I915_SETPARAM +DRM_IOCTL_I915_ALLOC +DRM_IOCTL_I915_FREE +DRM_IOCTL_I915_INIT_HEAP +DRM_IOCTL_I915_CMDBUFFER +DRM_IOCTL_I915_DESTROY_HEAP +DRM_IOCTL_I915_SET_VBLANK_PIPE +DRM_IOCTL_I915_GET_VBLANK_PIPE +DRM_IOCTL_I915_VBLANK_SWAP +DRM_IOCTL_I915_HWS_ADDR +DRM_IOCTL_I915_GEM_INIT +DRM_IOCTL_I915_GEM_EXECBUFFER +DRM_IOCTL_I915_GEM_EXECBUFFER2 +DRM_IOCTL_I915_GEM_PIN +DRM_IOCTL_I915_GEM_UNPIN +DRM_IOCTL_I915_GEM_BUSY +DRM_IOCTL_I915_GEM_SET_CACHING +DRM_IOCTL_I915_GEM_GET_CACHING +DRM_IOCTL_I915_GEM_THROTTLE +DRM_IOCTL_I915_GEM_ENTERVT +DRM_IOCTL_I915_GEM_LEAVEVT +DRM_IOCTL_I915_GEM_CREATE +DRM_IOCTL_I915_GEM_PREAD +DRM_IOCTL_I915_GEM_PWRITE +DRM_IOCTL_I915_GEM_MMAP +DRM_IOCTL_I915_GEM_MMAP_GTT +DRM_IOCTL_I915_GEM_SET_DOMAIN +DRM_IOCTL_I915_GEM_SW_FINISH +DRM_IOCTL_I915_GEM_SET_TILING +DRM_IOCTL_I915_GEM_GET_TILING +DRM_IOCTL_I915_GEM_GET_APERTURE +DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID +DRM_IOCTL_I915_GEM_MADVISE +DRM_IOCTL_I915_OVERLAY_PUT_IMAGE +DRM_IOCTL_I915_OVERLAY_ATTRS +DRM_IOCTL_I915_SET_SPRITE_COLORKEY +DRM_IOCTL_I915_GET_SPRITE_COLORKEY +DRM_IOCTL_I915_GEM_WAIT +DRM_IOCTL_I915_GEM_CONTEXT_CREATE +DRM_IOCTL_I915_GEM_CONTEXT_DESTROY +DRM_IOCTL_I915_REG_READ +DRM_IOCTL_I915_GET_RESET_STATS +DRM_IOCTL_I915_GEM_USERPTR -- 2.1.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx