mirror of https://gitee.com/openkylin/linux.git
[PATCH] fbdev: move ioctl32 code to fbmem.c
The frame buffer layer already had some code dealing with compat ioctls, this patch moves over the remaining code from fs/compat_ioctl.c Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
01a16fae8e
commit
c7f82d9c49
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
#include <linux/compat.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
@ -933,18 +934,154 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
|
struct fb_fix_screeninfo32 {
|
||||||
|
char id[16];
|
||||||
|
compat_caddr_t smem_start;
|
||||||
|
u32 smem_len;
|
||||||
|
u32 type;
|
||||||
|
u32 type_aux;
|
||||||
|
u32 visual;
|
||||||
|
u16 xpanstep;
|
||||||
|
u16 ypanstep;
|
||||||
|
u16 ywrapstep;
|
||||||
|
u32 line_length;
|
||||||
|
compat_caddr_t mmio_start;
|
||||||
|
u32 mmio_len;
|
||||||
|
u32 accel;
|
||||||
|
u16 reserved[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fb_cmap32 {
|
||||||
|
u32 start;
|
||||||
|
u32 len;
|
||||||
|
compat_caddr_t red;
|
||||||
|
compat_caddr_t green;
|
||||||
|
compat_caddr_t blue;
|
||||||
|
compat_caddr_t transp;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int fb_getput_cmap(struct inode *inode, struct file *file,
|
||||||
|
unsigned int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
struct fb_cmap_user __user *cmap;
|
||||||
|
struct fb_cmap32 __user *cmap32;
|
||||||
|
__u32 data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
cmap = compat_alloc_user_space(sizeof(*cmap));
|
||||||
|
cmap32 = compat_ptr(arg);
|
||||||
|
|
||||||
|
if (copy_in_user(&cmap->start, &cmap32->start, 2 * sizeof(__u32)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (get_user(data, &cmap32->red) ||
|
||||||
|
put_user(compat_ptr(data), &cmap->red) ||
|
||||||
|
get_user(data, &cmap32->green) ||
|
||||||
|
put_user(compat_ptr(data), &cmap->green) ||
|
||||||
|
get_user(data, &cmap32->blue) ||
|
||||||
|
put_user(compat_ptr(data), &cmap->blue) ||
|
||||||
|
get_user(data, &cmap32->transp) ||
|
||||||
|
put_user(compat_ptr(data), &cmap->transp))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
err = fb_ioctl(inode, file, cmd, (unsigned long) cmap);
|
||||||
|
|
||||||
|
if (!err) {
|
||||||
|
if (copy_in_user(&cmap32->start,
|
||||||
|
&cmap->start,
|
||||||
|
2 * sizeof(__u32)))
|
||||||
|
err = -EFAULT;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_fscreeninfo_to_user(struct fb_fix_screeninfo *fix,
|
||||||
|
struct fb_fix_screeninfo32 __user *fix32)
|
||||||
|
{
|
||||||
|
__u32 data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = copy_to_user(&fix32->id, &fix->id, sizeof(fix32->id));
|
||||||
|
|
||||||
|
data = (__u32) (unsigned long) fix->smem_start;
|
||||||
|
err |= put_user(data, &fix32->smem_start);
|
||||||
|
|
||||||
|
err |= put_user(fix->smem_len, &fix32->smem_len);
|
||||||
|
err |= put_user(fix->type, &fix32->type);
|
||||||
|
err |= put_user(fix->type_aux, &fix32->type_aux);
|
||||||
|
err |= put_user(fix->visual, &fix32->visual);
|
||||||
|
err |= put_user(fix->xpanstep, &fix32->xpanstep);
|
||||||
|
err |= put_user(fix->ypanstep, &fix32->ypanstep);
|
||||||
|
err |= put_user(fix->ywrapstep, &fix32->ywrapstep);
|
||||||
|
err |= put_user(fix->line_length, &fix32->line_length);
|
||||||
|
|
||||||
|
data = (__u32) (unsigned long) fix->mmio_start;
|
||||||
|
err |= put_user(data, &fix32->mmio_start);
|
||||||
|
|
||||||
|
err |= put_user(fix->mmio_len, &fix32->mmio_len);
|
||||||
|
err |= put_user(fix->accel, &fix32->accel);
|
||||||
|
err |= copy_to_user(fix32->reserved, fix->reserved,
|
||||||
|
sizeof(fix->reserved));
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fb_get_fscreeninfo(struct inode *inode, struct file *file,
|
||||||
|
unsigned int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
mm_segment_t old_fs;
|
||||||
|
struct fb_fix_screeninfo fix;
|
||||||
|
struct fb_fix_screeninfo32 __user *fix32;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
fix32 = compat_ptr(arg);
|
||||||
|
|
||||||
|
old_fs = get_fs();
|
||||||
|
set_fs(KERNEL_DS);
|
||||||
|
err = fb_ioctl(inode, file, cmd, (unsigned long) &fix);
|
||||||
|
set_fs(old_fs);
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
err = do_fscreeninfo_to_user(&fix, fix32);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static long
|
static long
|
||||||
fb_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
fb_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
int fbidx = iminor(file->f_dentry->d_inode);
|
struct inode *inode = file->f_dentry->d_inode;
|
||||||
|
int fbidx = iminor(inode);
|
||||||
struct fb_info *info = registered_fb[fbidx];
|
struct fb_info *info = registered_fb[fbidx];
|
||||||
struct fb_ops *fb = info->fbops;
|
struct fb_ops *fb = info->fbops;
|
||||||
long ret;
|
long ret = -ENOIOCTLCMD;
|
||||||
|
|
||||||
if (fb->fb_compat_ioctl == NULL)
|
|
||||||
return -ENOIOCTLCMD;
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
ret = fb->fb_compat_ioctl(file, cmd, arg, info);
|
switch(cmd) {
|
||||||
|
case FBIOGET_VSCREENINFO:
|
||||||
|
case FBIOPUT_VSCREENINFO:
|
||||||
|
case FBIOPAN_DISPLAY:
|
||||||
|
case FBIOGET_CON2FBMAP:
|
||||||
|
case FBIOPUT_CON2FBMAP:
|
||||||
|
arg = (unsigned long) compat_ptr(arg);
|
||||||
|
case FBIOBLANK:
|
||||||
|
ret = fb_ioctl(inode, file, cmd, arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FBIOGET_FSCREENINFO:
|
||||||
|
ret = fb_get_fscreeninfo(inode, file, cmd, arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FBIOGETCMAP:
|
||||||
|
case FBIOPUTCMAP:
|
||||||
|
ret = fb_getput_cmap(inode, file, cmd, arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (fb->fb_compat_ioctl)
|
||||||
|
ret = fb->fb_compat_ioctl(file, cmd, arg, info);
|
||||||
|
break;
|
||||||
|
}
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -840,146 +840,6 @@ static int hdio_getgeo(unsigned int fd, unsigned int cmd, unsigned long arg)
|
||||||
return err ? -EFAULT : 0;
|
return err ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct fb_fix_screeninfo32 {
|
|
||||||
char id[16];
|
|
||||||
compat_caddr_t smem_start;
|
|
||||||
u32 smem_len;
|
|
||||||
u32 type;
|
|
||||||
u32 type_aux;
|
|
||||||
u32 visual;
|
|
||||||
u16 xpanstep;
|
|
||||||
u16 ypanstep;
|
|
||||||
u16 ywrapstep;
|
|
||||||
u32 line_length;
|
|
||||||
compat_caddr_t mmio_start;
|
|
||||||
u32 mmio_len;
|
|
||||||
u32 accel;
|
|
||||||
u16 reserved[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fb_cmap32 {
|
|
||||||
u32 start;
|
|
||||||
u32 len;
|
|
||||||
compat_caddr_t red;
|
|
||||||
compat_caddr_t green;
|
|
||||||
compat_caddr_t blue;
|
|
||||||
compat_caddr_t transp;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int fb_getput_cmap(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
struct fb_cmap_user __user *cmap;
|
|
||||||
struct fb_cmap32 __user *cmap32;
|
|
||||||
__u32 data;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
cmap = compat_alloc_user_space(sizeof(*cmap));
|
|
||||||
cmap32 = compat_ptr(arg);
|
|
||||||
|
|
||||||
if (copy_in_user(&cmap->start, &cmap32->start, 2 * sizeof(__u32)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
if (get_user(data, &cmap32->red) ||
|
|
||||||
put_user(compat_ptr(data), &cmap->red) ||
|
|
||||||
get_user(data, &cmap32->green) ||
|
|
||||||
put_user(compat_ptr(data), &cmap->green) ||
|
|
||||||
get_user(data, &cmap32->blue) ||
|
|
||||||
put_user(compat_ptr(data), &cmap->blue) ||
|
|
||||||
get_user(data, &cmap32->transp) ||
|
|
||||||
put_user(compat_ptr(data), &cmap->transp))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
err = sys_ioctl(fd, cmd, (unsigned long) cmap);
|
|
||||||
|
|
||||||
if (!err) {
|
|
||||||
if (copy_in_user(&cmap32->start,
|
|
||||||
&cmap->start,
|
|
||||||
2 * sizeof(__u32)))
|
|
||||||
err = -EFAULT;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int do_fscreeninfo_to_user(struct fb_fix_screeninfo *fix,
|
|
||||||
struct fb_fix_screeninfo32 __user *fix32)
|
|
||||||
{
|
|
||||||
__u32 data;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = copy_to_user(&fix32->id, &fix->id, sizeof(fix32->id));
|
|
||||||
|
|
||||||
data = (__u32) (unsigned long) fix->smem_start;
|
|
||||||
err |= put_user(data, &fix32->smem_start);
|
|
||||||
|
|
||||||
err |= put_user(fix->smem_len, &fix32->smem_len);
|
|
||||||
err |= put_user(fix->type, &fix32->type);
|
|
||||||
err |= put_user(fix->type_aux, &fix32->type_aux);
|
|
||||||
err |= put_user(fix->visual, &fix32->visual);
|
|
||||||
err |= put_user(fix->xpanstep, &fix32->xpanstep);
|
|
||||||
err |= put_user(fix->ypanstep, &fix32->ypanstep);
|
|
||||||
err |= put_user(fix->ywrapstep, &fix32->ywrapstep);
|
|
||||||
err |= put_user(fix->line_length, &fix32->line_length);
|
|
||||||
|
|
||||||
data = (__u32) (unsigned long) fix->mmio_start;
|
|
||||||
err |= put_user(data, &fix32->mmio_start);
|
|
||||||
|
|
||||||
err |= put_user(fix->mmio_len, &fix32->mmio_len);
|
|
||||||
err |= put_user(fix->accel, &fix32->accel);
|
|
||||||
err |= copy_to_user(fix32->reserved, fix->reserved,
|
|
||||||
sizeof(fix->reserved));
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fb_get_fscreeninfo(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
mm_segment_t old_fs;
|
|
||||||
struct fb_fix_screeninfo fix;
|
|
||||||
struct fb_fix_screeninfo32 __user *fix32;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
fix32 = compat_ptr(arg);
|
|
||||||
|
|
||||||
old_fs = get_fs();
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
err = sys_ioctl(fd, cmd, (unsigned long) &fix);
|
|
||||||
set_fs(old_fs);
|
|
||||||
|
|
||||||
if (!err)
|
|
||||||
err = do_fscreeninfo_to_user(&fix, fix32);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fb_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
switch (cmd) {
|
|
||||||
case FBIOGET_FSCREENINFO:
|
|
||||||
err = fb_get_fscreeninfo(fd,cmd, arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FBIOGETCMAP:
|
|
||||||
case FBIOPUTCMAP:
|
|
||||||
err = fb_getput_cmap(fd, cmd, arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
do {
|
|
||||||
static int count;
|
|
||||||
if (++count <= 20)
|
|
||||||
printk("%s: Unknown fb ioctl cmd fd(%d) "
|
|
||||||
"cmd(%08x) arg(%08lx)\n",
|
|
||||||
__FUNCTION__, fd, cmd, arg);
|
|
||||||
} while(0);
|
|
||||||
err = -ENOSYS;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
mm_segment_t old_fs = get_fs();
|
mm_segment_t old_fs = get_fs();
|
||||||
|
@ -2953,10 +2813,7 @@ HANDLE_IOCTL(BLKGETSIZE, w_long)
|
||||||
HANDLE_IOCTL(0x1260, broken_blkgetsize)
|
HANDLE_IOCTL(0x1260, broken_blkgetsize)
|
||||||
HANDLE_IOCTL(BLKFRAGET, w_long)
|
HANDLE_IOCTL(BLKFRAGET, w_long)
|
||||||
HANDLE_IOCTL(BLKSECTGET, w_long)
|
HANDLE_IOCTL(BLKSECTGET, w_long)
|
||||||
HANDLE_IOCTL(FBIOGET_FSCREENINFO, fb_ioctl_trans)
|
|
||||||
HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
|
HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
|
||||||
HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans)
|
|
||||||
HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans)
|
|
||||||
HANDLE_IOCTL(HDIO_GET_KEEPSETTINGS, hdio_ioctl_trans)
|
HANDLE_IOCTL(HDIO_GET_KEEPSETTINGS, hdio_ioctl_trans)
|
||||||
HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans)
|
HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans)
|
||||||
HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans)
|
HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans)
|
||||||
|
|
|
@ -56,13 +56,6 @@ ULONG_IOCTL(TIOCSCTTY)
|
||||||
COMPATIBLE_IOCTL(TIOCGPTN)
|
COMPATIBLE_IOCTL(TIOCGPTN)
|
||||||
COMPATIBLE_IOCTL(TIOCSPTLCK)
|
COMPATIBLE_IOCTL(TIOCSPTLCK)
|
||||||
COMPATIBLE_IOCTL(TIOCSERGETLSR)
|
COMPATIBLE_IOCTL(TIOCSERGETLSR)
|
||||||
/* Big F */
|
|
||||||
COMPATIBLE_IOCTL(FBIOBLANK)
|
|
||||||
COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO)
|
|
||||||
COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO)
|
|
||||||
COMPATIBLE_IOCTL(FBIOPAN_DISPLAY)
|
|
||||||
COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP)
|
|
||||||
COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP)
|
|
||||||
/* Little f */
|
/* Little f */
|
||||||
COMPATIBLE_IOCTL(FIOCLEX)
|
COMPATIBLE_IOCTL(FIOCLEX)
|
||||||
COMPATIBLE_IOCTL(FIONCLEX)
|
COMPATIBLE_IOCTL(FIONCLEX)
|
||||||
|
|
Loading…
Reference in New Issue