summaryrefslogtreecommitdiffstats
path: root/patches/valgrind-usbdevfs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/valgrind-usbdevfs.patch')
-rw-r--r--patches/valgrind-usbdevfs.patch133
1 files changed, 133 insertions, 0 deletions
diff --git a/patches/valgrind-usbdevfs.patch b/patches/valgrind-usbdevfs.patch
new file mode 100644
index 0000000..9287573
--- /dev/null
+++ b/patches/valgrind-usbdevfs.patch
@@ -0,0 +1,133 @@
1diff -ur -x '*~' valgrind-3.4.1/coregrind/m_syswrap/syswrap-generic.c valgrind-3.4.1-mod/coregrind/m_syswrap/syswrap-generic.c
2--- valgrind-3.4.1/coregrind/m_syswrap/syswrap-generic.c 2009-03-01 23:01:09.000000000 +0100
3+++ valgrind-3.4.1-mod/coregrind/m_syswrap/syswrap-generic.c 2009-04-29 15:44:08.000000000 +0200
4@@ -4160,23 +4160,56 @@
5 struct vki_usbdevfs_urb *vkuu = (struct vki_usbdevfs_urb *)ARG3;
6
7 /* Not the whole struct needs to be initialized */
8- PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).ep", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
9+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).endpoint", (Addr)&vkuu->endpoint, sizeof(vkuu->endpoint));
10 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).type", (Addr)&vkuu->type, sizeof(vkuu->type));
11 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).flags", (Addr)&vkuu->flags, sizeof(vkuu->flags));
12 PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)&vkuu->buffer, sizeof(vkuu->buffer));
13- PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
14- PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).usercontext", (Addr)&vkuu->usercontext, sizeof(vkuu->usercontext));
15- if (vkuu->endpoint & 0x80)
16- PRE_MEM_WRITE( "ioctl(USBDEVFS_URB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
17- else
18- PRE_MEM_READ( "ioctl(USBDEVFS_URB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
19- /* FIXME: Does not handle all cases this ioctl can do, ISOs are missing. */
20+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).signr", (Addr)&vkuu->signr, sizeof(vkuu->signr));
21+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).status", (Addr)&vkuu->status, sizeof(vkuu->status));
22+ if (vkuu->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
23+ struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)vkuu->buffer;
24+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
25+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.setup_packet", (Addr)vkusp, sizeof(*vkusp));
26+ if (vkusp->bRequestType & 0x80)
27+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
28+ else
29+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer.data", (Addr)(vkusp+1), vkuu->buffer_length - sizeof(*vkusp));
30+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
31+ } else if (vkuu->type == VKI_USBDEVFS_URB_TYPE_ISO) {
32+ int total_length = 0;
33+ int i;
34+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).number_of_packets", (Addr)&vkuu->number_of_packets, sizeof(vkuu->number_of_packets));
35+ for(i=0; i<vkuu->number_of_packets; i++) {
36+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].length", (Addr)&vkuu->iso_frame_desc[i].length, sizeof(vkuu->iso_frame_desc[i].length));
37+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].actual_length", (Addr)&vkuu->iso_frame_desc[i].actual_length, sizeof(vkuu->iso_frame_desc[i].actual_length));
38+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).iso_frame_desc[].status", (Addr)&vkuu->iso_frame_desc[i].status, sizeof(vkuu->iso_frame_desc[i].status));
39+ total_length += vkuu->iso_frame_desc[i].length;
40+ }
41+ if (vkuu->endpoint & 0x80)
42+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
43+ else
44+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, total_length);
45+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).error_count", (Addr)&vkuu->error_count, sizeof(vkuu->error_count));
46+ } else {
47+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer_length", (Addr)&vkuu->buffer_length, sizeof(vkuu->buffer_length));
48+ if (vkuu->endpoint & 0x80)
49+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
50+ else
51+ PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB).buffer", (Addr)vkuu->buffer, vkuu->buffer_length);
52+ PRE_MEM_WRITE( "ioctl(USBDEVFS_SUBMITURB).actual_length", (Addr)&vkuu->actual_length, sizeof(vkuu->actual_length));
53+ }
54 break;
55 }
56+ case VKI_USBDEVFS_DISCARDURB:
57+ break;
58 case VKI_USBDEVFS_REAPURB:
59+ if ( ARG3 ) {
60+ PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURB)", ARG3, sizeof(struct vki_usbdevfs_urb **));
61+ break;
62+ }
63 case VKI_USBDEVFS_REAPURBNDELAY:
64 if ( ARG3 ) {
65- PRE_MEM_READ( "ioctl(USBDEVFS_SUBMITURB)", ARG3, sizeof(struct vki_usbdevfs_urb *));
66+ PRE_MEM_WRITE( "ioctl(USBDEVFS_REAPURBNDELAY)", ARG3, sizeof(struct vki_usbdevfs_urb **));
67 break;
68 }
69 case VKI_USBDEVFS_CONNECTINFO:
70@@ -4986,11 +5019,31 @@
71 case VKI_USBDEVFS_REAPURBNDELAY:
72 if ( ARG3 ) {
73 struct vki_usbdevfs_urb **vkuu = (struct vki_usbdevfs_urb**)ARG3;
74+ POST_MEM_WRITE((Addr)vkuu, sizeof(*vkuu));
75 if (!*vkuu)
76 break;
77 POST_MEM_WRITE((Addr) &((*vkuu)->status),sizeof((*vkuu)->status));
78- if ((*vkuu)->endpoint & 0x80)
79- POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
80+ if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_CONTROL) {
81+ struct vki_usbdevfs_setuppacket *vkusp = (struct vki_usbdevfs_setuppacket *)(*vkuu)->buffer;
82+ if (vkusp->bRequestType & 0x80)
83+ POST_MEM_WRITE((Addr)(vkusp+1), (*vkuu)->buffer_length - sizeof(*vkusp));
84+ POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
85+ } else if ((*vkuu)->type == VKI_USBDEVFS_URB_TYPE_ISO) {
86+ char *bp = (*vkuu)->buffer;
87+ int i;
88+ for(i=0; i<(*vkuu)->number_of_packets; i++) {
89+ POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].actual_length, sizeof((*vkuu)->iso_frame_desc[i].actual_length));
90+ POST_MEM_WRITE((Addr)&(*vkuu)->iso_frame_desc[i].status, sizeof((*vkuu)->iso_frame_desc[i].status));
91+ if ((*vkuu)->endpoint & 0x80)
92+ POST_MEM_WRITE((Addr)bp, (*vkuu)->iso_frame_desc[i].actual_length);
93+ bp += (*vkuu)->iso_frame_desc[i].length; // FIXME: or actual_length??
94+ }
95+ POST_MEM_WRITE((Addr)&(*vkuu)->error_count, sizeof((*vkuu)->error_count));
96+ } else {
97+ if ((*vkuu)->endpoint & 0x80)
98+ POST_MEM_WRITE((Addr)(*vkuu)->buffer, (*vkuu)->actual_length);
99+ POST_MEM_WRITE((Addr)&(*vkuu)->actual_length, sizeof((*vkuu)->actual_length));
100+ }
101 break;
102 }
103 case VKI_USBDEVFS_CONNECTINFO:
104diff -ur -x '*~' valgrind-3.4.1/include/vki/vki-linux.h valgrind-3.4.1-mod/include/vki/vki-linux.h
105--- valgrind-3.4.1/include/vki/vki-linux.h 2009-03-01 22:46:45.000000000 +0100
106+++ valgrind-3.4.1-mod/include/vki/vki-linux.h 2009-04-29 15:42:05.000000000 +0200
107@@ -2325,11 +2325,26 @@
108 #define VKI_USBDEVFS_BULK _VKI_IOWR('U', 2, struct vki_usbdevfs_bulktransfer)
109 #define VKI_USBDEVFS_GETDRIVER _VKI_IOW('U', 8, struct vki_usbdevfs_getdriver)
110 #define VKI_USBDEVFS_SUBMITURB _VKI_IOR('U', 10, struct vki_usbdevfs_urb)
111+#define VKI_USBDEVFS_DISCARDURB _VKI_IO('U', 11)
112 #define VKI_USBDEVFS_REAPURB _VKI_IOW('U', 12, void *)
113 #define VKI_USBDEVFS_REAPURBNDELAY _VKI_IOW('U', 13, void *)
114 #define VKI_USBDEVFS_CONNECTINFO _VKI_IOW('U', 17, struct vki_usbdevfs_connectinfo)
115 #define VKI_USBDEVFS_IOCTL _VKI_IOWR('U', 18, struct vki_usbdevfs_ioctl)
116
117+#define VKI_USBDEVFS_URB_TYPE_ISO 0
118+#define VKI_USBDEVFS_URB_TYPE_INTERRUPT 1
119+#define VKI_USBDEVFS_URB_TYPE_CONTROL 2
120+#define VKI_USBDEVFS_URB_TYPE_BULK 3
121+
122+// this is missing in usbdevice_fs.h
123+struct vki_usbdevfs_setuppacket {
124+ __vki_u8 bRequestType;
125+ __vki_u8 bRequest;
126+ __vki_u16 wValue;
127+ __vki_u16 wIndex;
128+ __vki_u16 wLength;
129+};
130+
131 //----------------------------------------------------------------------
132 // From linux-2.6.20.1/include/linux/i2c.h
133 //----------------------------------------------------------------------