📄 drm_ioc32.c
字号:
&d->request_indices) || __put_user((int __user *)(unsigned long)d32.request_sizes, &d->request_sizes)) return -EFAULT; err = drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_DMA, (unsigned long)d); if (err) return err; if (__get_user(d32.request_size, &d->request_size) || __get_user(d32.granted_count, &d->granted_count) || __put_user(d32.request_size, &argp->request_size) || __put_user(d32.granted_count, &argp->granted_count)) return -EFAULT; return 0;}#if __OS_HAS_AGPtypedef struct drm_agp_mode32 { u32 mode; /**< AGP mode */} drm_agp_mode32_t;static int compat_drm_agp_enable(struct file *file, unsigned int cmd, unsigned long arg){ drm_agp_mode32_t __user *argp = (void __user *)arg; drm_agp_mode32_t m32; drm_agp_mode_t __user *mode; if (get_user(m32.mode, &argp->mode)) return -EFAULT; mode = compat_alloc_user_space(sizeof(*mode)); if (put_user(m32.mode, &mode->mode)) return -EFAULT; return drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_ENABLE, (unsigned long)mode);}typedef struct drm_agp_info32 { int agp_version_major; int agp_version_minor; u32 mode; u32 aperture_base; /* physical address */ u32 aperture_size; /* bytes */ u32 memory_allowed; /* bytes */ u32 memory_used; /* PCI information */ unsigned short id_vendor; unsigned short id_device;} drm_agp_info32_t;static int compat_drm_agp_info(struct file *file, unsigned int cmd, unsigned long arg){ drm_agp_info32_t __user *argp = (void __user *)arg; drm_agp_info32_t i32; drm_agp_info_t __user *info; int err; info = compat_alloc_user_space(sizeof(*info)); if (!access_ok(VERIFY_WRITE, info, sizeof(*info))) return -EFAULT; err = drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_INFO, (unsigned long)info); if (err) return err; if (__get_user(i32.agp_version_major, &info->agp_version_major) || __get_user(i32.agp_version_minor, &info->agp_version_minor) || __get_user(i32.mode, &info->mode) || __get_user(i32.aperture_base, &info->aperture_base) || __get_user(i32.aperture_size, &info->aperture_size) || __get_user(i32.memory_allowed, &info->memory_allowed) || __get_user(i32.memory_used, &info->memory_used) || __get_user(i32.id_vendor, &info->id_vendor) || __get_user(i32.id_device, &info->id_device)) return -EFAULT; if (copy_to_user(argp, &i32, sizeof(i32))) return -EFAULT; return 0;}typedef struct drm_agp_buffer32 { u32 size; /**< In bytes -- will round to page boundary */ u32 handle; /**< Used for binding / unbinding */ u32 type; /**< Type of memory to allocate */ u32 physical; /**< Physical used by i810 */} drm_agp_buffer32_t;static int compat_drm_agp_alloc(struct file *file, unsigned int cmd, unsigned long arg){ drm_agp_buffer32_t __user *argp = (void __user *)arg; drm_agp_buffer32_t req32; drm_agp_buffer_t __user *request; int err; if (copy_from_user(&req32, argp, sizeof(req32))) return -EFAULT; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || __put_user(req32.size, &request->size) || __put_user(req32.type, &request->type)) return -EFAULT; err = drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_ALLOC, (unsigned long)request); if (err) return err; if (__get_user(req32.handle, &request->handle) || __get_user(req32.physical, &request->physical) || copy_to_user(argp, &req32, sizeof(req32))) { drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_FREE, (unsigned long)request); return -EFAULT; } return 0;}static int compat_drm_agp_free(struct file *file, unsigned int cmd, unsigned long arg){ drm_agp_buffer32_t __user *argp = (void __user *)arg; drm_agp_buffer_t __user *request; u32 handle; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || get_user(handle, &argp->handle) || __put_user(handle, &request->handle)) return -EFAULT; return drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_FREE, (unsigned long)request);}typedef struct drm_agp_binding32 { u32 handle; /**< From drm_agp_buffer */ u32 offset; /**< In bytes -- will round to page boundary */} drm_agp_binding32_t;static int compat_drm_agp_bind(struct file *file, unsigned int cmd, unsigned long arg){ drm_agp_binding32_t __user *argp = (void __user *)arg; drm_agp_binding32_t req32; drm_agp_binding_t __user *request; if (copy_from_user(&req32, argp, sizeof(req32))) return -EFAULT; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || __put_user(req32.handle, &request->handle) || __put_user(req32.offset, &request->offset)) return -EFAULT; return drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_BIND, (unsigned long)request);}static int compat_drm_agp_unbind(struct file *file, unsigned int cmd, unsigned long arg){ drm_agp_binding32_t __user *argp = (void __user *)arg; drm_agp_binding_t __user *request; u32 handle; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || get_user(handle, &argp->handle) || __put_user(handle, &request->handle)) return -EFAULT; return drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_AGP_UNBIND, (unsigned long)request);}#endif /* __OS_HAS_AGP */typedef struct drm_scatter_gather32 { u32 size; /**< In bytes -- will round to page boundary */ u32 handle; /**< Used for mapping / unmapping */} drm_scatter_gather32_t;static int compat_drm_sg_alloc(struct file *file, unsigned int cmd, unsigned long arg){ drm_scatter_gather32_t __user *argp = (void __user *)arg; drm_scatter_gather_t __user *request; int err; unsigned long x; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) || __get_user(x, &argp->size) || __put_user(x, &request->size)) return -EFAULT; err = drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_SG_ALLOC, (unsigned long)request); if (err) return err; /* XXX not sure about the handle conversion here... */ if (__get_user(x, &request->handle) || __put_user(x >> PAGE_SHIFT, &argp->handle)) return -EFAULT; return 0;}static int compat_drm_sg_free(struct file *file, unsigned int cmd, unsigned long arg){ drm_scatter_gather32_t __user *argp = (void __user *)arg; drm_scatter_gather_t __user *request; unsigned long x; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) || __get_user(x, &argp->handle) || __put_user(x << PAGE_SHIFT, &request->handle)) return -EFAULT; return drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_SG_FREE, (unsigned long)request);}struct drm_wait_vblank_request32 { drm_vblank_seq_type_t type; unsigned int sequence; u32 signal;};struct drm_wait_vblank_reply32 { drm_vblank_seq_type_t type; unsigned int sequence; s32 tval_sec; s32 tval_usec;};typedef union drm_wait_vblank32 { struct drm_wait_vblank_request32 request; struct drm_wait_vblank_reply32 reply;} drm_wait_vblank32_t;static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, unsigned long arg){ drm_wait_vblank32_t __user *argp = (void __user *)arg; drm_wait_vblank32_t req32; drm_wait_vblank_t __user *request; int err; if (copy_from_user(&req32, argp, sizeof(req32))) return -EFAULT; request = compat_alloc_user_space(sizeof(*request)); if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || __put_user(req32.request.type, &request->request.type) || __put_user(req32.request.sequence, &request->request.sequence) || __put_user(req32.request.signal, &request->request.signal)) return -EFAULT; err = drm_ioctl(file->f_dentry->d_inode, file, DRM_IOCTL_WAIT_VBLANK, (unsigned long)request); if (err) return err; if (__get_user(req32.reply.type, &request->reply.type) || __get_user(req32.reply.sequence, &request->reply.sequence) || __get_user(req32.reply.tval_sec, &request->reply.tval_sec) || __get_user(req32.reply.tval_usec, &request->reply.tval_usec)) return -EFAULT; if (copy_to_user(argp, &req32, sizeof(req32))) return -EFAULT; return 0;}drm_ioctl_compat_t *drm_compat_ioctls[] = { [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, [DRM_IOCTL_NR(DRM_IOCTL_GET_MAP32)] = compat_drm_getmap, [DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT32)] = compat_drm_getclient, [DRM_IOCTL_NR(DRM_IOCTL_GET_STATS32)] = compat_drm_getstats, [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE32)] = compat_drm_setunique, [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP32)] = compat_drm_addmap, [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS32)] = compat_drm_addbufs, [DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS32)] = compat_drm_markbufs, [DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS32)] = compat_drm_infobufs, [DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS32)] = compat_drm_mapbufs, [DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS32)] = compat_drm_freebufs, [DRM_IOCTL_NR(DRM_IOCTL_RM_MAP32)] = compat_drm_rmmap, [DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX32)] = compat_drm_setsareactx, [DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX32)] = compat_drm_getsareactx, [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX32)] = compat_drm_resctx, [DRM_IOCTL_NR(DRM_IOCTL_DMA32)] = compat_drm_dma,#if __OS_HAS_AGP [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE32)] = compat_drm_agp_enable, [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO32)] = compat_drm_agp_info, [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC32)] = compat_drm_agp_alloc, [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE32)] = compat_drm_agp_free, [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND32)] = compat_drm_agp_bind, [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND32)] = compat_drm_agp_unbind,#endif [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC32)] = compat_drm_sg_alloc, [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE32)] = compat_drm_sg_free, [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank,};/** * Called whenever a 32-bit process running under a 64-bit kernel * performs an ioctl on /dev/drm. * * \param filp file pointer. * \param cmd command. * \param arg user argument. * \return zero on success or negative number on failure. */long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ unsigned int nr = DRM_IOCTL_NR(cmd); drm_ioctl_compat_t *fn; int ret; if (nr >= DRM_ARRAY_SIZE(drm_compat_ioctls)) return -ENOTTY; fn = drm_compat_ioctls[nr]; lock_kernel(); /* XXX for now */ if (fn != NULL) ret = (*fn) (filp, cmd, arg); else ret = drm_ioctl(filp->f_dentry->d_inode, filp, cmd, arg); unlock_kernel(); return ret;}EXPORT_SYMBOL(drm_compat_ioctl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -