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 program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
/* 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
{
2006-10-11 01:45:27 +04:00
struct snd_hwdep_dsp_image __user * dst ;
2005-04-17 02:20:36 +04:00
compat_caddr_t ptr ;
u32 val ;
dst = compat_alloc_user_space ( sizeof ( * dst ) ) ;
/* index and name */
if ( copy_in_user ( dst , src , 4 + 64 ) )
return - EFAULT ;
if ( get_user ( ptr , & src - > image ) | |
put_user ( compat_ptr ( ptr ) , & dst - > image ) )
return - EFAULT ;
if ( get_user ( val , & src - > length ) | |
put_user ( val , & dst - > length ) )
return - EFAULT ;
if ( get_user ( val , & src - > driver_data ) | |
put_user ( val , & dst - > driver_data ) )
return - EFAULT ;
return snd_hwdep_dsp_load ( hw , dst ) ;
}
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 ;
}