aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-06-03 21:33:26 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-07-04 13:16:28 -0400
commitaeba03903063e9fea885d32318e1546d9b7e83a8 (patch)
tree32d451fc92112d3c3a108d5516d11d70c2385b36
parentff32d39b158a27b6a0f1bd6207ad31946c7043e0 (diff)
mga: switch compat ioctls to drm_ioctl_kernel()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--drivers/gpu/drm/drm_ioctl.c1
-rw-r--r--drivers/gpu/drm/mga/mga_drv.h2
-rw-r--r--drivers/gpu/drm/mga/mga_ioc32.c149
-rw-r--r--drivers/gpu/drm/mga/mga_state.c2
4 files changed, 64 insertions, 90 deletions
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 8a8b3075b8b2..335821153776 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -719,6 +719,7 @@ long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata,
719 } 719 }
720 return retcode; 720 return retcode;
721} 721}
722EXPORT_SYMBOL(drm_ioctl_kernel);
722 723
723/** 724/**
724 * drm_ioctl - ioctl callback implementation for DRM drivers 725 * drm_ioctl - ioctl callback implementation for DRM drivers
diff --git a/drivers/gpu/drm/mga/mga_drv.h b/drivers/gpu/drm/mga/mga_drv.h
index 45cf363d25ad..a45bb22275a7 100644
--- a/drivers/gpu/drm/mga/mga_drv.h
+++ b/drivers/gpu/drm/mga/mga_drv.h
@@ -159,6 +159,8 @@ extern int mga_dma_bootstrap(struct drm_device *dev, void *data,
159 struct drm_file *file_priv); 159 struct drm_file *file_priv);
160extern int mga_dma_init(struct drm_device *dev, void *data, 160extern int mga_dma_init(struct drm_device *dev, void *data,
161 struct drm_file *file_priv); 161 struct drm_file *file_priv);
162extern int mga_getparam(struct drm_device *dev, void *data,
163 struct drm_file *file_priv);
162extern int mga_dma_flush(struct drm_device *dev, void *data, 164extern int mga_dma_flush(struct drm_device *dev, void *data,
163 struct drm_file *file_priv); 165 struct drm_file *file_priv);
164extern int mga_dma_reset(struct drm_device *dev, void *data, 166extern int mga_dma_reset(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/mga/mga_ioc32.c b/drivers/gpu/drm/mga/mga_ioc32.c
index 729bfd56b55f..85f1a9cd3f85 100644
--- a/drivers/gpu/drm/mga/mga_ioc32.c
+++ b/drivers/gpu/drm/mga/mga_ioc32.c
@@ -61,46 +61,25 @@ static int compat_mga_init(struct file *file, unsigned int cmd,
61 unsigned long arg) 61 unsigned long arg)
62{ 62{
63 drm_mga_init32_t init32; 63 drm_mga_init32_t init32;
64 drm_mga_init_t __user *init; 64 drm_mga_init_t init;
65 int err = 0, i;
66 65
67 if (copy_from_user(&init32, (void __user *)arg, sizeof(init32))) 66 if (copy_from_user(&init32, (void __user *)arg, sizeof(init32)))
68 return -EFAULT; 67 return -EFAULT;
69 68
70 init = compat_alloc_user_space(sizeof(*init)); 69 init.func = init32.func;
71 if (!access_ok(VERIFY_WRITE, init, sizeof(*init)) 70 init.sarea_priv_offset = init32.sarea_priv_offset;
72 || __put_user(init32.func, &init->func) 71 memcpy(&init.chipset, &init32.chipset,
73 || __put_user(init32.sarea_priv_offset, &init->sarea_priv_offset) 72 offsetof(drm_mga_init_t, fb_offset) -
74 || __put_user(init32.chipset, &init->chipset) 73 offsetof(drm_mga_init_t, chipset));
75 || __put_user(init32.sgram, &init->sgram) 74 init.fb_offset = init32.fb_offset;
76 || __put_user(init32.maccess, &init->maccess) 75 init.mmio_offset = init32.mmio_offset;
77 || __put_user(init32.fb_cpp, &init->fb_cpp) 76 init.status_offset = init32.status_offset;
78 || __put_user(init32.front_offset, &init->front_offset) 77 init.warp_offset = init32.warp_offset;
79 || __put_user(init32.front_pitch, &init->front_pitch) 78 init.primary_offset = init32.primary_offset;
80 || __put_user(init32.back_offset, &init->back_offset) 79 init.buffers_offset = init32.buffers_offset;
81 || __put_user(init32.back_pitch, &init->back_pitch) 80
82 || __put_user(init32.depth_cpp, &init->depth_cpp) 81 return drm_ioctl_kernel(file, mga_dma_init, &init,
83 || __put_user(init32.depth_offset, &init->depth_offset) 82 DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
84 || __put_user(init32.depth_pitch, &init->depth_pitch)
85 || __put_user(init32.fb_offset, &init->fb_offset)
86 || __put_user(init32.mmio_offset, &init->mmio_offset)
87 || __put_user(init32.status_offset, &init->status_offset)
88 || __put_user(init32.warp_offset, &init->warp_offset)
89 || __put_user(init32.primary_offset, &init->primary_offset)
90 || __put_user(init32.buffers_offset, &init->buffers_offset))
91 return -EFAULT;
92
93 for (i = 0; i < MGA_NR_TEX_HEAPS; i++) {
94 err |=
95 __put_user(init32.texture_offset[i],
96 &init->texture_offset[i]);
97 err |=
98 __put_user(init32.texture_size[i], &init->texture_size[i]);
99 }
100 if (err)
101 return -EFAULT;
102
103 return drm_ioctl(file, DRM_IOCTL_MGA_INIT, (unsigned long)init);
104} 83}
105 84
106typedef struct drm_mga_getparam32 { 85typedef struct drm_mga_getparam32 {
@@ -112,19 +91,14 @@ static int compat_mga_getparam(struct file *file, unsigned int cmd,
112 unsigned long arg) 91 unsigned long arg)
113{ 92{
114 drm_mga_getparam32_t getparam32; 93 drm_mga_getparam32_t getparam32;
115 drm_mga_getparam_t __user *getparam; 94 drm_mga_getparam_t getparam;
116 95
117 if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32))) 96 if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32)))
118 return -EFAULT; 97 return -EFAULT;
119 98
120 getparam = compat_alloc_user_space(sizeof(*getparam)); 99 getparam.param = getparam32.param;
121 if (!access_ok(VERIFY_WRITE, getparam, sizeof(*getparam)) 100 getparam.value = compat_ptr(getparam32.value);
122 || __put_user(getparam32.param, &getparam->param) 101 return drm_ioctl_kernel(file, mga_getparam, &getparam, DRM_AUTH);
123 || __put_user((void __user *)(unsigned long)getparam32.value,
124 &getparam->value))
125 return -EFAULT;
126
127 return drm_ioctl(file, DRM_IOCTL_MGA_GETPARAM, (unsigned long)getparam);
128} 102}
129 103
130typedef struct drm_mga_drm_bootstrap32 { 104typedef struct drm_mga_drm_bootstrap32 {
@@ -141,48 +115,33 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
141 unsigned long arg) 115 unsigned long arg)
142{ 116{
143 drm_mga_dma_bootstrap32_t dma_bootstrap32; 117 drm_mga_dma_bootstrap32_t dma_bootstrap32;
144 drm_mga_dma_bootstrap_t __user *dma_bootstrap; 118 drm_mga_dma_bootstrap_t __user dma_bootstrap;
145 int err; 119 int err;
146 120
147 if (copy_from_user(&dma_bootstrap32, (void __user *)arg, 121 if (copy_from_user(&dma_bootstrap32, (void __user *)arg,
148 sizeof(dma_bootstrap32))) 122 sizeof(dma_bootstrap32)))
149 return -EFAULT; 123 return -EFAULT;
150 124
151 dma_bootstrap = compat_alloc_user_space(sizeof(*dma_bootstrap)); 125 dma_bootstrap.texture_handle = dma_bootstrap32.texture_handle;
152 if (!access_ok(VERIFY_WRITE, dma_bootstrap, sizeof(*dma_bootstrap)) 126 dma_bootstrap.texture_size = dma_bootstrap32.texture_size;
153 || __put_user(dma_bootstrap32.texture_handle, 127 dma_bootstrap.primary_size = dma_bootstrap32.primary_size;
154 &dma_bootstrap->texture_handle) 128 dma_bootstrap.secondary_bin_count = dma_bootstrap32.secondary_bin_count;
155 || __put_user(dma_bootstrap32.texture_size, 129 dma_bootstrap.secondary_bin_size = dma_bootstrap32.secondary_bin_size;
156 &dma_bootstrap->texture_size) 130 dma_bootstrap.agp_mode = dma_bootstrap32.agp_mode;
157 || __put_user(dma_bootstrap32.primary_size, 131 dma_bootstrap.agp_size = dma_bootstrap32.agp_size;
158 &dma_bootstrap->primary_size)
159 || __put_user(dma_bootstrap32.secondary_bin_count,
160 &dma_bootstrap->secondary_bin_count)
161 || __put_user(dma_bootstrap32.secondary_bin_size,
162 &dma_bootstrap->secondary_bin_size)
163 || __put_user(dma_bootstrap32.agp_mode, &dma_bootstrap->agp_mode)
164 || __put_user(dma_bootstrap32.agp_size, &dma_bootstrap->agp_size))
165 return -EFAULT;
166 132
167 err = drm_ioctl(file, DRM_IOCTL_MGA_DMA_BOOTSTRAP, 133 err = drm_ioctl_kernel(file, mga_dma_bootstrap, &dma_bootstrap,
168 (unsigned long)dma_bootstrap); 134 DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
169 if (err) 135 if (err)
170 return err; 136 return err;
171 137
172 if (__get_user(dma_bootstrap32.texture_handle, 138 dma_bootstrap32.texture_handle = dma_bootstrap.texture_handle;
173 &dma_bootstrap->texture_handle) 139 dma_bootstrap32.texture_size = dma_bootstrap.texture_size;
174 || __get_user(dma_bootstrap32.texture_size, 140 dma_bootstrap32.primary_size = dma_bootstrap.primary_size;
175 &dma_bootstrap->texture_size) 141 dma_bootstrap32.secondary_bin_count = dma_bootstrap.secondary_bin_count;
176 || __get_user(dma_bootstrap32.primary_size, 142 dma_bootstrap32.secondary_bin_size = dma_bootstrap.secondary_bin_size;
177 &dma_bootstrap->primary_size) 143 dma_bootstrap32.agp_mode = dma_bootstrap.agp_mode;
178 || __get_user(dma_bootstrap32.secondary_bin_count, 144 dma_bootstrap32.agp_size = dma_bootstrap.agp_size;
179 &dma_bootstrap->secondary_bin_count)
180 || __get_user(dma_bootstrap32.secondary_bin_size,
181 &dma_bootstrap->secondary_bin_size)
182 || __get_user(dma_bootstrap32.agp_mode, &dma_bootstrap->agp_mode)
183 || __get_user(dma_bootstrap32.agp_size, &dma_bootstrap->agp_size))
184 return -EFAULT;
185
186 if (copy_to_user((void __user *)arg, &dma_bootstrap32, 145 if (copy_to_user((void __user *)arg, &dma_bootstrap32,
187 sizeof(dma_bootstrap32))) 146 sizeof(dma_bootstrap32)))
188 return -EFAULT; 147 return -EFAULT;
@@ -190,10 +149,14 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
190 return 0; 149 return 0;
191} 150}
192 151
193drm_ioctl_compat_t *mga_compat_ioctls[] = { 152static struct {
194 [DRM_MGA_INIT] = compat_mga_init, 153 drm_ioctl_compat_t *fn;
195 [DRM_MGA_GETPARAM] = compat_mga_getparam, 154 char *name;
196 [DRM_MGA_DMA_BOOTSTRAP] = compat_mga_dma_bootstrap, 155} mga_compat_ioctls[] = {
156#define DRM_IOCTL32_DEF(n, f)[DRM_##n] = {.fn = f, .name = #n}
157 DRM_IOCTL32_DEF(MGA_INIT, compat_mga_init),
158 DRM_IOCTL32_DEF(MGA_GETPARAM, compat_mga_getparam),
159 DRM_IOCTL32_DEF(MGA_DMA_BOOTSTRAP, compat_mga_dma_bootstrap),
197}; 160};
198 161
199/** 162/**
@@ -208,19 +171,27 @@ drm_ioctl_compat_t *mga_compat_ioctls[] = {
208long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 171long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
209{ 172{
210 unsigned int nr = DRM_IOCTL_NR(cmd); 173 unsigned int nr = DRM_IOCTL_NR(cmd);
174 struct drm_file *file_priv = filp->private_data;
211 drm_ioctl_compat_t *fn = NULL; 175 drm_ioctl_compat_t *fn = NULL;
212 int ret; 176 int ret;
213 177
214 if (nr < DRM_COMMAND_BASE) 178 if (nr < DRM_COMMAND_BASE)
215 return drm_compat_ioctl(filp, cmd, arg); 179 return drm_compat_ioctl(filp, cmd, arg);
216 180
217 if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls)) 181 if (nr >= DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
218 fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE]; 182 return drm_ioctl(filp, cmd, arg);
219 183
220 if (fn != NULL) 184 fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE].fn;
221 ret = (*fn) (filp, cmd, arg); 185 if (!fn)
222 else 186 return drm_ioctl(filp, cmd, arg);
223 ret = drm_ioctl(filp, cmd, arg); 187
224 188 DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
189 task_pid_nr(current),
190 (long)old_encode_dev(file_priv->minor->kdev->devt),
191 file_priv->authenticated,
192 mga_compat_ioctls[nr - DRM_COMMAND_BASE].name);
193 ret = (*fn) (filp, cmd, arg);
194 if (ret)
195 DRM_DEBUG("ret = %d\n", ret);
225 return ret; 196 return ret;
226} 197}
diff --git a/drivers/gpu/drm/mga/mga_state.c b/drivers/gpu/drm/mga/mga_state.c
index 792f924496fc..e5f6b735f575 100644
--- a/drivers/gpu/drm/mga/mga_state.c
+++ b/drivers/gpu/drm/mga/mga_state.c
@@ -1005,7 +1005,7 @@ static int mga_dma_blit(struct drm_device *dev, void *data, struct drm_file *fil
1005 return 0; 1005 return 0;
1006} 1006}
1007 1007
1008static int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv) 1008int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
1009{ 1009{
1010 drm_mga_private_t *dev_priv = dev->dev_private; 1010 drm_mga_private_t *dev_priv = dev->dev_private;
1011 drm_mga_getparam_t *param = data; 1011 drm_mga_getparam_t *param = data;