diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-03 21:33:26 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-07-04 13:16:28 -0400 |
commit | aeba03903063e9fea885d32318e1546d9b7e83a8 (patch) | |
tree | 32d451fc92112d3c3a108d5516d11d70c2385b36 | |
parent | ff32d39b158a27b6a0f1bd6207ad31946c7043e0 (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.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/mga/mga_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/mga/mga_ioc32.c | 149 | ||||
-rw-r--r-- | drivers/gpu/drm/mga/mga_state.c | 2 |
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 | } |
722 | EXPORT_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); |
160 | extern int mga_dma_init(struct drm_device *dev, void *data, | 160 | extern int mga_dma_init(struct drm_device *dev, void *data, |
161 | struct drm_file *file_priv); | 161 | struct drm_file *file_priv); |
162 | extern int mga_getparam(struct drm_device *dev, void *data, | ||
163 | struct drm_file *file_priv); | ||
162 | extern int mga_dma_flush(struct drm_device *dev, void *data, | 164 | extern int mga_dma_flush(struct drm_device *dev, void *data, |
163 | struct drm_file *file_priv); | 165 | struct drm_file *file_priv); |
164 | extern int mga_dma_reset(struct drm_device *dev, void *data, | 166 | extern 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 | ||
106 | typedef struct drm_mga_getparam32 { | 85 | typedef 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 | ||
130 | typedef struct drm_mga_drm_bootstrap32 { | 104 | typedef 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 | ||
193 | drm_ioctl_compat_t *mga_compat_ioctls[] = { | 152 | static 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[] = { | |||
208 | long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | 171 | long 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 | ||
1008 | static int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv) | 1008 | int 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; |