Implement various SNDRV_CTL_xxx ioctls.

Patch from Ivan Sorokin via BZ#334936.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14111
This commit is contained in:
Tom Hughes 2014-06-26 12:53:23 +00:00
parent 8fc646a429
commit 4ef60ef102
4 changed files with 111 additions and 1 deletions

1
NEWS
View File

@ -160,6 +160,7 @@ where XXXXXX is the bug number as listed below.
334705 sendmsg and recvmsg should guard against bogus msghdr fields.
334727 Build fails with -Werror=format-security
334788 clarify doc about --log-file initial program directory
334936 patch to fix false positives on alsa SNDRV_CTL_* ioctls
335034 Unhandled ioctl: HCIGETDEVLIST
335155 vgdb, fix error print statement.
335262 arm64: movi 8bit version is not supported

View File

@ -6104,6 +6104,39 @@ PRE(sys_ioctl)
case VKI_SNDRV_PCM_IOCTL_LINK:
/* these just take an int by value */
break;
case VKI_SNDRV_CTL_IOCTL_PVERSION:
PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_PVERSION)", (Addr)ARG3, sizeof(int) );
break;
case VKI_SNDRV_CTL_IOCTL_CARD_INFO:
PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_CARD_INFO)", (Addr)ARG3, sizeof(struct vki_snd_ctl_card_info) );
break;
case VKI_SNDRV_CTL_IOCTL_ELEM_LIST: {
struct vki_snd_ctl_elem_list *data = (struct vki_snd_ctl_elem_list *)ARG3;
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->offset, sizeof(data->offset) );
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->space, sizeof(data->space) );
PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->used, sizeof(data->used) );
PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->count, sizeof(data->count) );
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)&data->pids, sizeof(data->pids) );
if (data->pids) {
PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_ELEM_LIST)", (Addr)data->pids, sizeof(struct vki_snd_ctl_elem_id) * data->space );
}
break;
}
case VKI_SNDRV_CTL_IOCTL_TLV_READ: {
struct vki_snd_ctl_tlv *data = (struct vki_snd_ctl_tlv *)ARG3;
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_READ)", (Addr)&data->numid, sizeof(data->numid) );
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_READ)", (Addr)&data->length, sizeof(data->length) );
PRE_MEM_WRITE( "ioctl(SNDRV_CTL_IOCTL_TLV_READ)", (Addr)data->tlv, data->length );
break;
}
case VKI_SNDRV_CTL_IOCTL_TLV_WRITE:
case VKI_SNDRV_CTL_IOCTL_TLV_COMMAND: {
struct vki_snd_ctl_tlv *data = (struct vki_snd_ctl_tlv *)ARG3;
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_WRITE)", (Addr)&data->numid, sizeof(data->numid) );
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_WRITE)", (Addr)&data->length, sizeof(data->length) );
PRE_MEM_READ( "ioctl(SNDRV_CTL_IOCTL_TLV_WRITE)", (Addr)data->tlv, data->length );
break;
}
/* Real Time Clock (/dev/rtc) ioctls */
case VKI_RTC_UIE_ON:
@ -7449,6 +7482,30 @@ POST(sys_ioctl)
case VKI_SNDRV_TIMER_IOCTL_STOP:
case VKI_SNDRV_TIMER_IOCTL_CONTINUE:
case VKI_SNDRV_TIMER_IOCTL_PAUSE:
case VKI_SNDRV_CTL_IOCTL_PVERSION: {
POST_MEM_WRITE( (Addr)ARG3, sizeof(int) );
break;
}
case VKI_SNDRV_CTL_IOCTL_CARD_INFO:
POST_MEM_WRITE( (Addr)ARG3, sizeof(struct vki_snd_ctl_card_info) );
break;
case VKI_SNDRV_CTL_IOCTL_ELEM_LIST: {
struct vki_snd_ctl_elem_list *data = (struct vki_snd_ctl_elem_list *)ARG3;
POST_MEM_WRITE( (Addr)&data->used, sizeof(data->used) );
POST_MEM_WRITE( (Addr)&data->count, sizeof(data->count) );
if (data->pids) {
POST_MEM_WRITE( (Addr)data->pids, sizeof(struct vki_snd_ctl_elem_id) * data->used );
}
break;
}
case VKI_SNDRV_CTL_IOCTL_TLV_READ: {
struct vki_snd_ctl_tlv *data = (struct vki_snd_ctl_tlv *)ARG3;
POST_MEM_WRITE( (Addr)data->tlv, data->length );
break;
}
case VKI_SNDRV_CTL_IOCTL_TLV_WRITE:
case VKI_SNDRV_CTL_IOCTL_TLV_COMMAND:
break;
/* SCSI no operand */
case VKI_SCSI_IOCTL_DOORLOCK:

View File

@ -168,7 +168,6 @@ For bugs reported before this time, see 3_8_BUGSTATUS.txt
========================================================================
========================================================================
334936 patch to fix false positives on alsa SNDRV_CTL_* ioctls
333628 Out of tree build (is fixed, but needs to land)
335143 Capabilities not supported
197259 (wine) Unsupported arch_prtctl option

View File

@ -2312,6 +2312,59 @@ enum {
VKI_SNDRV_TIMER_IOCTL_PAUSE = _VKI_IO('T', 0xa3),
};
struct vki_snd_ctl_card_info {
int card; /* card number */
int pad; /* reserved for future (was type) */
unsigned char id[16]; /* ID of card (user selectable) */
unsigned char driver[16]; /* Driver name */
unsigned char name[32]; /* Short name of soundcard */
unsigned char longname[80]; /* name + info text about soundcard */
unsigned char reserved_[16]; /* reserved for future (was ID of mixer) */
unsigned char mixername[80]; /* visual mixer identification */
unsigned char components[128]; /* card components / fine identification, delimited with one space (AC97 etc..) */
};
typedef int vki_snd_ctl_elem_iface_t;
#define VKI_SNDRV_CTL_ELEM_IFACE_CARD ((vki_snd_ctl_elem_iface_t) 0) /* global control */
#define VKI_SNDRV_CTL_ELEM_IFACE_HWDEP ((vki_snd_ctl_elem_iface_t) 1) /* hardware dependent device */
#define VKI_SNDRV_CTL_ELEM_IFACE_MIXER ((vki_snd_ctl_elem_iface_t) 2) /* virtual mixer device */
#define VKI_SNDRV_CTL_ELEM_IFACE_PCM ((vki_snd_ctl_elem_iface_t) 3) /* PCM device */
#define VKI_SNDRV_CTL_ELEM_IFACE_RAWMIDI ((vki_snd_ctl_elem_iface_t) 4) /* RawMidi device */
#define VKI_SNDRV_CTL_ELEM_IFACE_TIMER ((vki_snd_ctl_elem_iface_t) 5) /* timer device */
#define VKI_SNDRV_CTL_ELEM_IFACE_SEQUENCER ((vki_snd_ctl_elem_iface_t) 6) /* sequencer client */
#define VKI_SNDRV_CTL_ELEM_IFACE_LAST VKI_SNDRV_CTL_ELEM_IFACE_SEQUENCER
struct vki_snd_ctl_elem_id {
unsigned int numid; /* numeric identifier, zero = invalid */
vki_snd_ctl_elem_iface_t iface; /* interface identifier */
unsigned int device; /* device/client number */
unsigned int subdevice; /* subdevice (substream) number */
unsigned char name[44]; /* ASCII name of item */
unsigned int index; /* index of item */
};
struct vki_snd_ctl_elem_list {
unsigned int offset; /* W: first element ID to get */
unsigned int space; /* W: count of element IDs to get */
unsigned int used; /* R: count of element IDs set */
unsigned int count; /* R: count of all elements */
struct vki_snd_ctl_elem_id __user *pids; /* R: IDs */
unsigned char reserved[50];
};
struct vki_snd_ctl_tlv {
unsigned int numid; /* control element numeric identification */
unsigned int length; /* in bytes aligned to 4 */
unsigned int tlv[0]; /* first TLV */
};
#define VKI_SNDRV_CTL_IOCTL_PVERSION _VKI_IOR('U', 0x00, int)
#define VKI_SNDRV_CTL_IOCTL_CARD_INFO _VKI_IOR('U', 0x01, struct vki_snd_ctl_card_info)
#define VKI_SNDRV_CTL_IOCTL_ELEM_LIST _VKI_IOWR('U', 0x10, struct vki_snd_ctl_elem_list)
#define VKI_SNDRV_CTL_IOCTL_TLV_READ _VKI_IOWR('U', 0x1a, struct vki_snd_ctl_tlv)
#define VKI_SNDRV_CTL_IOCTL_TLV_WRITE _VKI_IOWR('U', 0x1b, struct vki_snd_ctl_tlv)
#define VKI_SNDRV_CTL_IOCTL_TLV_COMMAND _VKI_IOWR('U', 0x1c, struct vki_snd_ctl_tlv)
//----------------------------------------------------------------------
// From linux-2.6.15.4/include/linux/serial.h
//----------------------------------------------------------------------