⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drm_ioc32.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
			  &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 + -