56 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * 32bit -> 64bit ioctl wrapper for hwdep API4 * Copyright (c) by Takashi Iwai <tiwai@suse.de>5 */6 7/* This file is included from hwdep.c */8 9#include <linux/compat.h>10 11struct snd_hwdep_dsp_image32 {12 u32 index;13 unsigned char name[64];14 u32 image; /* pointer */15 u32 length;16 u32 driver_data;17} /* don't set packed attribute here */;18 19static int snd_hwdep_dsp_load_compat(struct snd_hwdep *hw,20 struct snd_hwdep_dsp_image32 __user *src)21{22 struct snd_hwdep_dsp_image info = {};23 compat_caddr_t ptr;24 25 if (copy_from_user(&info, src, 4 + 64) ||26 get_user(ptr, &src->image) ||27 get_user(info.length, &src->length) ||28 get_user(info.driver_data, &src->driver_data))29 return -EFAULT;30 info.image = compat_ptr(ptr);31 32 return snd_hwdep_dsp_load(hw, &info);33}34 35enum {36 SNDRV_HWDEP_IOCTL_DSP_LOAD32 = _IOW('H', 0x03, struct snd_hwdep_dsp_image32)37};38 39static long snd_hwdep_ioctl_compat(struct file * file, unsigned int cmd,40 unsigned long arg)41{42 struct snd_hwdep *hw = file->private_data;43 void __user *argp = compat_ptr(arg);44 switch (cmd) {45 case SNDRV_HWDEP_IOCTL_PVERSION:46 case SNDRV_HWDEP_IOCTL_INFO:47 case SNDRV_HWDEP_IOCTL_DSP_STATUS:48 return snd_hwdep_ioctl(file, cmd, (unsigned long)argp);49 case SNDRV_HWDEP_IOCTL_DSP_LOAD32:50 return snd_hwdep_dsp_load_compat(hw, argp);51 }52 if (hw->ops.ioctl_compat)53 return hw->ops.ioctl_compat(hw, file, cmd, arg);54 return -ENOIOCTLCMD;55}56