2019-05-27 09:55:05 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* 32 bit - > 64 bit ioctl wrapper for hwdep API
* Copyright ( c ) by Takashi Iwai < tiwai @ suse . de >
*/
/* This file is included from hwdep.c */
# include <linux/compat.h>
2005-11-17 15:58:21 +03:00
struct snd_hwdep_dsp_image32 {
2005-04-17 02:20:36 +04:00
u32 index ;
unsigned char name [ 64 ] ;
u32 image ; /* pointer */
u32 length ;
u32 driver_data ;
} /* don't set packed attribute here */ ;
2005-11-17 15:58:21 +03:00
static int snd_hwdep_dsp_load_compat ( struct snd_hwdep * hw ,
struct snd_hwdep_dsp_image32 __user * src )
2005-04-17 02:20:36 +04:00
{
2020-09-18 12:56:19 +03:00
struct snd_hwdep_dsp_image info = { } ;
2005-04-17 02:20:36 +04:00
compat_caddr_t ptr ;
2020-09-18 12:56:19 +03:00
if ( copy_from_user ( & info , src , 4 + 64 ) | |
get_user ( ptr , & src - > image ) | |
get_user ( info . length , & src - > length ) | |
get_user ( info . driver_data , & src - > driver_data ) )
2005-04-17 02:20:36 +04:00
return - EFAULT ;
2020-09-18 12:56:19 +03:00
info . image = compat_ptr ( ptr ) ;
2005-04-17 02:20:36 +04:00
2020-09-18 12:56:19 +03:00
return snd_hwdep_dsp_load ( hw , & info ) ;
2005-04-17 02:20:36 +04:00
}
enum {
2005-11-17 15:58:21 +03:00
SNDRV_HWDEP_IOCTL_DSP_LOAD32 = _IOW ( ' H ' , 0x03 , struct snd_hwdep_dsp_image32 )
2005-04-17 02:20:36 +04:00
} ;
2005-11-17 15:58:21 +03:00
static long snd_hwdep_ioctl_compat ( struct file * file , unsigned int cmd ,
unsigned long arg )
2005-04-17 02:20:36 +04:00
{
2005-11-17 15:58:21 +03:00
struct snd_hwdep * hw = file - > private_data ;
2005-04-17 02:20:36 +04:00
void __user * argp = compat_ptr ( arg ) ;
switch ( cmd ) {
case SNDRV_HWDEP_IOCTL_PVERSION :
case SNDRV_HWDEP_IOCTL_INFO :
case SNDRV_HWDEP_IOCTL_DSP_STATUS :
return snd_hwdep_ioctl ( file , cmd , ( unsigned long ) argp ) ;
case SNDRV_HWDEP_IOCTL_DSP_LOAD32 :
return snd_hwdep_dsp_load_compat ( hw , argp ) ;
}
if ( hw - > ops . ioctl_compat )
return hw - > ops . ioctl_compat ( hw , file , cmd , arg ) ;
return - ENOIOCTLCMD ;
}