Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mga: switch compat ioctls to drm_ioctl_kernel()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro aeba0390 ff32d39b

+61 -87
+1
drivers/gpu/drm/drm_ioctl.c
··· 719 719 } 720 720 return retcode; 721 721 } 722 + EXPORT_SYMBOL(drm_ioctl_kernel); 722 723 723 724 /** 724 725 * drm_ioctl - ioctl callback implementation for DRM drivers
+2
drivers/gpu/drm/mga/mga_drv.h
··· 159 159 struct drm_file *file_priv); 160 160 extern int mga_dma_init(struct drm_device *dev, void *data, 161 161 struct drm_file *file_priv); 162 + extern int mga_getparam(struct drm_device *dev, void *data, 163 + struct drm_file *file_priv); 162 164 extern int mga_dma_flush(struct drm_device *dev, void *data, 163 165 struct drm_file *file_priv); 164 166 extern int mga_dma_reset(struct drm_device *dev, void *data,
+57 -86
drivers/gpu/drm/mga/mga_ioc32.c
··· 61 61 unsigned long arg) 62 62 { 63 63 drm_mga_init32_t init32; 64 - drm_mga_init_t __user *init; 65 - int err = 0, i; 64 + drm_mga_init_t init; 66 65 67 66 if (copy_from_user(&init32, (void __user *)arg, sizeof(init32))) 68 67 return -EFAULT; 69 68 70 - init = compat_alloc_user_space(sizeof(*init)); 71 - if (!access_ok(VERIFY_WRITE, init, sizeof(*init)) 72 - || __put_user(init32.func, &init->func) 73 - || __put_user(init32.sarea_priv_offset, &init->sarea_priv_offset) 74 - || __put_user(init32.chipset, &init->chipset) 75 - || __put_user(init32.sgram, &init->sgram) 76 - || __put_user(init32.maccess, &init->maccess) 77 - || __put_user(init32.fb_cpp, &init->fb_cpp) 78 - || __put_user(init32.front_offset, &init->front_offset) 79 - || __put_user(init32.front_pitch, &init->front_pitch) 80 - || __put_user(init32.back_offset, &init->back_offset) 81 - || __put_user(init32.back_pitch, &init->back_pitch) 82 - || __put_user(init32.depth_cpp, &init->depth_cpp) 83 - || __put_user(init32.depth_offset, &init->depth_offset) 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; 69 + init.func = init32.func; 70 + init.sarea_priv_offset = init32.sarea_priv_offset; 71 + memcpy(&init.chipset, &init32.chipset, 72 + offsetof(drm_mga_init_t, fb_offset) - 73 + offsetof(drm_mga_init_t, chipset)); 74 + init.fb_offset = init32.fb_offset; 75 + init.mmio_offset = init32.mmio_offset; 76 + init.status_offset = init32.status_offset; 77 + init.warp_offset = init32.warp_offset; 78 + init.primary_offset = init32.primary_offset; 79 + init.buffers_offset = init32.buffers_offset; 92 80 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); 81 + return drm_ioctl_kernel(file, mga_dma_init, &init, 82 + DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY); 104 83 } 105 84 106 85 typedef struct drm_mga_getparam32 { ··· 91 112 unsigned long arg) 92 113 { 93 114 drm_mga_getparam32_t getparam32; 94 - drm_mga_getparam_t __user *getparam; 115 + drm_mga_getparam_t getparam; 95 116 96 117 if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32))) 97 118 return -EFAULT; 98 119 99 - getparam = compat_alloc_user_space(sizeof(*getparam)); 100 - if (!access_ok(VERIFY_WRITE, getparam, sizeof(*getparam)) 101 - || __put_user(getparam32.param, &getparam->param) 102 - || __put_user((void __user *)(unsigned long)getparam32.value, 103 - &getparam->value)) 104 - return -EFAULT; 105 - 106 - return drm_ioctl(file, DRM_IOCTL_MGA_GETPARAM, (unsigned long)getparam); 120 + getparam.param = getparam32.param; 121 + getparam.value = compat_ptr(getparam32.value); 122 + return drm_ioctl_kernel(file, mga_getparam, &getparam, DRM_AUTH); 107 123 } 108 124 109 125 typedef struct drm_mga_drm_bootstrap32 { ··· 115 141 unsigned long arg) 116 142 { 117 143 drm_mga_dma_bootstrap32_t dma_bootstrap32; 118 - drm_mga_dma_bootstrap_t __user *dma_bootstrap; 144 + drm_mga_dma_bootstrap_t __user dma_bootstrap; 119 145 int err; 120 146 121 147 if (copy_from_user(&dma_bootstrap32, (void __user *)arg, 122 148 sizeof(dma_bootstrap32))) 123 149 return -EFAULT; 124 150 125 - dma_bootstrap = compat_alloc_user_space(sizeof(*dma_bootstrap)); 126 - if (!access_ok(VERIFY_WRITE, dma_bootstrap, sizeof(*dma_bootstrap)) 127 - || __put_user(dma_bootstrap32.texture_handle, 128 - &dma_bootstrap->texture_handle) 129 - || __put_user(dma_bootstrap32.texture_size, 130 - &dma_bootstrap->texture_size) 131 - || __put_user(dma_bootstrap32.primary_size, 132 - &dma_bootstrap->primary_size) 133 - || __put_user(dma_bootstrap32.secondary_bin_count, 134 - &dma_bootstrap->secondary_bin_count) 135 - || __put_user(dma_bootstrap32.secondary_bin_size, 136 - &dma_bootstrap->secondary_bin_size) 137 - || __put_user(dma_bootstrap32.agp_mode, &dma_bootstrap->agp_mode) 138 - || __put_user(dma_bootstrap32.agp_size, &dma_bootstrap->agp_size)) 139 - return -EFAULT; 151 + dma_bootstrap.texture_handle = dma_bootstrap32.texture_handle; 152 + dma_bootstrap.texture_size = dma_bootstrap32.texture_size; 153 + dma_bootstrap.primary_size = dma_bootstrap32.primary_size; 154 + dma_bootstrap.secondary_bin_count = dma_bootstrap32.secondary_bin_count; 155 + dma_bootstrap.secondary_bin_size = dma_bootstrap32.secondary_bin_size; 156 + dma_bootstrap.agp_mode = dma_bootstrap32.agp_mode; 157 + dma_bootstrap.agp_size = dma_bootstrap32.agp_size; 140 158 141 - err = drm_ioctl(file, DRM_IOCTL_MGA_DMA_BOOTSTRAP, 142 - (unsigned long)dma_bootstrap); 159 + err = drm_ioctl_kernel(file, mga_dma_bootstrap, &dma_bootstrap, 160 + DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY); 143 161 if (err) 144 162 return err; 145 163 146 - if (__get_user(dma_bootstrap32.texture_handle, 147 - &dma_bootstrap->texture_handle) 148 - || __get_user(dma_bootstrap32.texture_size, 149 - &dma_bootstrap->texture_size) 150 - || __get_user(dma_bootstrap32.primary_size, 151 - &dma_bootstrap->primary_size) 152 - || __get_user(dma_bootstrap32.secondary_bin_count, 153 - &dma_bootstrap->secondary_bin_count) 154 - || __get_user(dma_bootstrap32.secondary_bin_size, 155 - &dma_bootstrap->secondary_bin_size) 156 - || __get_user(dma_bootstrap32.agp_mode, &dma_bootstrap->agp_mode) 157 - || __get_user(dma_bootstrap32.agp_size, &dma_bootstrap->agp_size)) 158 - return -EFAULT; 159 - 164 + dma_bootstrap32.texture_handle = dma_bootstrap.texture_handle; 165 + dma_bootstrap32.texture_size = dma_bootstrap.texture_size; 166 + dma_bootstrap32.primary_size = dma_bootstrap.primary_size; 167 + dma_bootstrap32.secondary_bin_count = dma_bootstrap.secondary_bin_count; 168 + dma_bootstrap32.secondary_bin_size = dma_bootstrap.secondary_bin_size; 169 + dma_bootstrap32.agp_mode = dma_bootstrap.agp_mode; 170 + dma_bootstrap32.agp_size = dma_bootstrap.agp_size; 160 171 if (copy_to_user((void __user *)arg, &dma_bootstrap32, 161 172 sizeof(dma_bootstrap32))) 162 173 return -EFAULT; ··· 149 190 return 0; 150 191 } 151 192 152 - drm_ioctl_compat_t *mga_compat_ioctls[] = { 153 - [DRM_MGA_INIT] = compat_mga_init, 154 - [DRM_MGA_GETPARAM] = compat_mga_getparam, 155 - [DRM_MGA_DMA_BOOTSTRAP] = compat_mga_dma_bootstrap, 193 + static struct { 194 + drm_ioctl_compat_t *fn; 195 + char *name; 196 + } mga_compat_ioctls[] = { 197 + #define DRM_IOCTL32_DEF(n, f)[DRM_##n] = {.fn = f, .name = #n} 198 + DRM_IOCTL32_DEF(MGA_INIT, compat_mga_init), 199 + DRM_IOCTL32_DEF(MGA_GETPARAM, compat_mga_getparam), 200 + DRM_IOCTL32_DEF(MGA_DMA_BOOTSTRAP, compat_mga_dma_bootstrap), 156 201 }; 157 202 158 203 /** ··· 171 208 long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 172 209 { 173 210 unsigned int nr = DRM_IOCTL_NR(cmd); 211 + struct drm_file *file_priv = filp->private_data; 174 212 drm_ioctl_compat_t *fn = NULL; 175 213 int ret; 176 214 177 215 if (nr < DRM_COMMAND_BASE) 178 216 return drm_compat_ioctl(filp, cmd, arg); 179 217 180 - if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls)) 181 - fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE]; 218 + if (nr >= DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls)) 219 + return drm_ioctl(filp, cmd, arg); 182 220 183 - if (fn != NULL) 184 - ret = (*fn) (filp, cmd, arg); 185 - else 186 - ret = drm_ioctl(filp, cmd, arg); 221 + fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE].fn; 222 + if (!fn) 223 + return drm_ioctl(filp, cmd, arg); 187 224 225 + DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n", 226 + task_pid_nr(current), 227 + (long)old_encode_dev(file_priv->minor->kdev->devt), 228 + file_priv->authenticated, 229 + mga_compat_ioctls[nr - DRM_COMMAND_BASE].name); 230 + ret = (*fn) (filp, cmd, arg); 231 + if (ret) 232 + DRM_DEBUG("ret = %d\n", ret); 188 233 return ret; 189 234 }
+1 -1
drivers/gpu/drm/mga/mga_state.c
··· 1005 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 1010 drm_mga_private_t *dev_priv = dev->dev_private; 1011 1011 drm_mga_getparam_t *param = data;