]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement various SNDRV_CTL_xxx ioctls.
authorTom Hughes <tom@compton.nu>
Thu, 26 Jun 2014 12:53:23 +0000 (12:53 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 26 Jun 2014 12:53:23 +0000 (12:53 +0000)
Patch from Ivan Sorokin via BZ#334936.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14111

NEWS
coregrind/m_syswrap/syswrap-linux.c
docs/internals/3_9_BUGSTATUS.txt
include/vki/vki-linux.h

diff --git a/NEWS b/NEWS
index a693111c5bf20c32ba07f547b264046969fd97c4..22e62503937f53d8dcc45cd4b9bed3051af38c90 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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
index e1157e95a887ac8864598f9d9a0cb3d4c32629c7..ed10584298577169c32ca34cb470f364ffff9b03 100644 (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:
index 9e779c38237aba61d537388365e190ec0cab2d50..d972bae0536bc2bb105912f48120519f9a5384cf 100644 (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
index 9123e24720c9e7808254d0aebc6b7d702e2ab501..9ee8603535dc6b5e441ad362089052977a9f0281 100644 (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
 //----------------------------------------------------------------------