File: dist.readme-missing.html

package info (click to toggle)
valgrind 1%3A3.14.0-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 156,980 kB
  • sloc: ansic: 728,128; exp: 26,134; xml: 22,268; cpp: 7,638; asm: 7,312; makefile: 6,102; perl: 5,910; sh: 5,717
file content (275 lines) | stat: -rw-r--r-- 12,735 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>5.README_MISSING_SYSCALL_OR_IOCTL</title>
<link rel="stylesheet" type="text/css" href="vg_basic.css">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="index.html" title="Valgrind Documentation">
<link rel="up" href="dist.html" title="Valgrind Distribution Documents">
<link rel="prev" href="dist.readme.html" title="4.README">
<link rel="next" href="dist.readme-developers.html" title="6.README_DEVELOPERS">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div><table class="nav" width="100%" cellspacing="3" cellpadding="3" border="0" summary="Navigation header"><tr>
<td width="22px" align="center" valign="middle"><a accesskey="p" href="dist.readme.html"><img src="images/prev.png" width="18" height="21" border="0" alt="Prev"></a></td>
<td width="25px" align="center" valign="middle"><a accesskey="u" href="dist.html"><img src="images/up.png" width="21" height="18" border="0" alt="Up"></a></td>
<td width="31px" align="center" valign="middle"><a accesskey="h" href="index.html"><img src="images/home.png" width="27" height="20" border="0" alt="Up"></a></td>
<th align="center" valign="middle">Valgrind Distribution Documents</th>
<td width="22px" align="center" valign="middle"><a accesskey="n" href="dist.readme-developers.html"><img src="images/next.png" width="18" height="21" border="0" alt="Next"></a></td>
</tr></table></div>
<div class="chapter">
<div class="titlepage"><div><div><h1 class="title">
<a name="dist.readme-missing"></a>5.README_MISSING_SYSCALL_OR_IOCTL</h1></div></div></div>
<div class="literallayout"><p><br>
<br>
DealingwithmissingsystemcallorioctlwrappersinValgrind<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
You'reprobablyreadingthisbecauseValgrindbombedoutwhilst<br>
runningyourprogram,andadvisedyoutoreadthisfile.Thegood<br>
newsisthat,ingeneral,it'seasytowritethemissingsyscallor<br>
ioctlwrappersyouneed,sothatyoucancontinueyourdebugging.If<br>
yousendtheresultingpatchestome,thenyou'llbedoingafavourto<br>
allfutureValgrinduserstoo.<br>
<br>
Notethatan"ioctl"isjustaspecialkindofsystemcall,really;so<br>
there'snotalotofneedtodistinguishthem(atleastconceptually)<br>
inthediscussionthatfollows.<br>
<br>
Allthismachineryisincoregrind/m_syswrap.<br>
<br>
<br>
Whataresyscall/ioctlwrappers?Whatdotheydo?<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
Valgrinddoeswhatitdoes,inpart,bykeepingtrackofeverythingyour<br>
programdoes.Whenasystemcallhappens,forexamplearequesttoread<br>
partofafile,controlpassestotheLinuxkernel,whichfulfillsthe<br>
request,andreturnscontroltoyourprogram.Theproblemisthatthe<br>
kernelwilloftenchangethestatusofsomepartofyourprogram'smemory<br>
asaresult,andtools(instrumentationplug-ins)mayneedtoknowabout<br>
this.<br>
<br>
Syscallandioctlwrappershavetwojobs:<br>
<br>
1.Tellatoolwhat'sabouttohappen,beforethesyscalltakesplace.A<br>
toolcouldperformchecksbeforehand,eg.ifmemoryabouttobewritten<br>
isactuallywriteable.Thispartisuseful,butnotstrictly<br>
essential.<br>
<br>
2.Tellatoolwhatjusthappened,afterasyscalltakesplace.Thisis<br>
soitcanupdateitsviewoftheprogram'sstate,eg.thatmemoryhas<br>
justbeenwrittento.Thisstepisessential.<br>
<br>
The"happenings"mostlyinvolvereading/writingofmemory.<br>
<br>
So,let'slookatanexampleofawrapperforasystemcallwhich<br>
shouldbefamiliartomanyUnixprogrammers.<br>
<br>
<br>
Thesyscallwrapperfortime()<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
Thewrapperforthetimesystemcalllookslikethis:<br>
<br>
PRE(sys_time)<br>
{<br>
/*time_ttime(time_t*t);*/<br>
PRINT("sys_time(%p)",ARG1);<br>
PRE_REG_READ1(long,"time",int*,t);<br>
if(ARG1!=0){<br>
PRE_MEM_WRITE("time(t)",ARG1,sizeof(vki_time_t));<br>
}<br>
}<br>
<br>
POST(sys_time)<br>
{<br>
if(ARG1!=0){<br>
POST_MEM_WRITE(ARG1,sizeof(vki_time_t));<br>
}<br>
}<br>
<br>
Thefirstthingwedohappensbeforethesyscalloccurs,inthePRE()function.<br>
ThePRE()functiontypicallystartswithinvokingtothePRINT()macro.This<br>
PRINT()macroimplementssupportforthe--trace-syscallscommandlineoption.<br>
Next,thetoolistoldthereturntypeofthesyscall,thatthesyscallhas<br>
oneargument,thetypeofthesyscallargumentandthattheargumentisbeing<br>
readfromaregister:<br>
<br>
PRE_REG_READ1(long,"time",int*,t);<br>
<br>
Next,ifanon-NULLbufferispassedinastheargument,tellthetoolthatthe<br>
bufferisabouttobewrittento:<br>
<br>
if(ARG1!=0){<br>
PRE_MEM_WRITE("time",ARG1,sizeof(vki_time_t));<br>
}<br>
<br>
Finally,thereallyimportantbit,afterthesyscalloccurs,inthePOST()<br>
function:if,andonlyif,thesystemcallwassuccessful,tellthetoolthat<br>
thememorywaswritten:<br>
<br>
if(ARG1!=0){<br>
POST_MEM_WRITE(ARG1,sizeof(vki_time_t));<br>
}<br>
<br>
ThePOST()functionwon'tbecalledifthesyscallfailed,soyou<br>
don'tneedtoworryaboutcheckingthatinthePOST()function.<br>
(Note:thisissometimesabug;somesyscallsdoreturnresultswhen<br>
they"fail"-forexample,nanosleepreturnstheamountofunslept<br>
timeifinterrupted.TODO:addanotherper-syscallflagforthis<br>
case.)<br>
<br>
Notethatweusethetype'vki_time_t'.Thisisacopyofthekernel<br>
type,with'vki_'prefixed.Ourcopiesofsuchtypesarekeptinthe<br>
appropriatevki*.hfile(s).Wedon'tincludekernelheadersorglibcheaders<br>
directly.<br>
<br>
<br>
Writingyourownsyscallwrappers(seebelowforioctlwrappers)<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
IfValgrindtellsyouthatsystemcallNNNisunimplemented,dothe<br>
following:<br>
<br>
1.Findoutthenameofthesystemcall:<br>
<br>
grepNNN/usr/include/asm/unistd*.h<br>
<br>
Thisshouldtellyousomethinglike__NR_mysyscallname.<br>
Copythisentrytoinclude/vki/vki-scnums-$(VG_PLATFORM).h.<br>
<br>
<br>
2.Do'man2mysyscallname'togetsomeideaofwhatthesyscall<br>
does.Notethattheactualkernelinterfacecandifferfromthis,<br>
soyoumightalsowanttocheckaversionoftheLinuxkernel<br>
source.<br>
<br>
NOTE:anysyscallwhichhassomethingtodowithsignalsor<br>
threadsisprobably"special",andneedsmorecarefulhandling.<br>
Postsomethingtovalgrind-developersifyouaren'tsure.<br>
<br>
<br>
3.Addacasetothealready-hugecollectionofwrappersin<br>
thecoregrind/m_syswrap/syswrap-*.cfiles.<br>
Foreachin-memoryparameterwhichisreadorwrittenby<br>
thesyscall,dooneof<br>
<br>
PRE_MEM_READ(...)<br>
PRE_MEM_RASCIIZ(...)<br>
PRE_MEM_WRITE(...)<br>
<br>
forthatparameter.Thendothesyscall.Then,ifthesyscall<br>
succeeds,issuesuitablePOST_MEM_WRITE(...)calls.<br>
(There'snoneedforPOST_MEM_READcalls.)<br>
<br>
Also,addittothesyscall_table[]array;useoneofGENX_,GENXY<br>
LINX_,LINXY,PLAX_,PLAXY.<br>
GEN*forgenericsyscalls(insyswrap-generic.c),LIN*forlinux<br>
specificones(insyswrap-linux.c)andPLA*fortheplatform<br>
dependentones(insyswrap-$(PLATFORM)-linux.c).<br>
The*XYvariantifitrequiresaPRE()andPOST()function,and<br>
the*X_variantifitonlyrequiresaPRE()<br>
function.<br>
<br>
Ifyoufindthisdifficult,readthewrappersforothersyscalls<br>
forideas.Agoodtipistolookforthewrapperforasyscall<br>
whichhasasimilarbehaviourtoyours,anduseitasa<br>
startingpoint.<br>
<br>
Ifyouneedstructuredefinitionsand/orconstantsforyoursyscall,<br>
copythemfromthekernelheadersintoinclude/vki.handco.,with<br>
theappropriatevki_*/VKI_*namemangling.Don't#includeany<br>
kernelheaders.Andcertainlydon't#includeanyglibcheaders.<br>
<br>
Testit.<br>
<br>
NotethatacommonerroristocallPOST_MEM_WRITE(...)<br>
with0(NULL)asthefirst(address)argument.Thisusuallymeans<br>
yourlogicisslightlyinadequate.It'sasufficientlycommonbug<br>
thatthere'sabuilt-incheckforit,andyou'llgeta"probably<br>
sanitycheckfailure"forthesyscallwrapperyoujustmade,ifthis<br>
isthecase.<br>
<br>
<br>
4.Oncehappy,sendusthepatch.Prettyplease.<br>
<br>
<br>
<br>
<br>
Writingyourownioctlwrappers<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
<br>
Isprettymuchthesameaswritingsyscallwrappers,exceptthatall<br>
theactionhappenswithinPRE(ioctl)andPOST(ioctl).<br>
<br>
There'sadefaultcase,sometimesitisn'tcorrectandyouhavetowritea<br>
morespecificcasetogettherightbehaviour.<br>
<br>
Asabove,pleasecreateabugreportandattachthepatchasdescribed<br>
onhttp://www.valgrind.org.<br>
<br>
<br>
Writingyourowndoorcallwrappers(Solarisonly)<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
<br>
Unlikesyscallsorioctls,doorcallstransferdatabetweentwouserspace<br>
programs,albeitthroughakernelinterface.Programsmayusecompletely<br>
proprietarysemanticsinthedatabufferspassedbetweenthem.<br>
Thereforeitmaynotbepossibletocapturethesesemanticswithin<br>
aValgrinddoorcallordoorreturnwrapper.<br>
<br>
Nevertheless,forsystemorwell-knowndoorservicesitwouldbebeneficial<br>
tohaveadoorcallandadoorreturnwrapper.Writingsuchwrapperispretty<br>
muchthesameaswritingioctlwrappers.Pleasetakeafewmomentstostudy<br>
thefollowingpicturedepictinghowadoorclientandadoorserverinteract<br>
throughthekernelinterfaceinatypicalscenario:<br>
<br>
<br>
doorclientthreadkerneldoorserverthread<br>
invokesdoor_call()invokesdoor_return()<br>
-------------------------------------------------------------------<br>
&lt;----PRE(sys_door,DOOR_RETURN)<br>
PRE(sys_door,DOOR_CALL)---&gt;<br>
----&gt;POST(sys_door,DOOR_RETURN)<br>
----&gt;server_procedure()<br>
&lt;----<br>
&lt;----PRE(sys_door,DOOR_RETURN)<br>
POST(sys_door,DOOR_CALL)&lt;---<br>
<br>
ThefirstPRE(sys_door,DOOR_RETURN)isinvokedwithdata_ptr=NULL<br>
anddata_size=0.That'sbecauseithasnotreceivedanydatafrom<br>
adoorcall,yet.<br>
<br>
Semanticsaredescribedbythefollowingfunctions<br>
incoregring/m_syswrap/syswrap-solaris.cmodule:<br>
oForadoorcallwrapperthefollowingattributesof'params'argument:<br>
-data_ptr(andassociateddata_size)asinputbuffer(request);<br>
describedindoor_call_pre_mem_params_data()<br>
-rbuf(andassociatedrsize)asoutputbuffer(response);<br>
describedindoor_call_post_mem_params_rbuf()<br>
oForadoorreturnwrapperthefollowingparameters:<br>
-data_ptr(andassociateddata_size)asinputbuffer(request);<br>
describedindoor_return_post_mem_data()<br>
-data_ptr(andassociateddata_size)asoutputbuffer(response);<br>
describedindoor_return_pre_mem_data()<br>
<br>
There'sadefaultcasewhichmaynotbecorrectandyouhavetowritea<br>
morespecificcasetogettherightbehaviour.UnlessValgrind'soption<br>
'--sim-hints=lax-doors'isspecified,thedefaultcasealsospitsawarning.<br>
<br>
Asabove,pleasecreateabugreportandattachthepatchasdescribed<br>
onhttp://www.valgrind.org.<br>
<br>
</p></div>
</div>
<div>
<br><table class="nav" width="100%" cellspacing="3" cellpadding="2" border="0" summary="Navigation footer">
<tr>
<td rowspan="2" width="40%" align="left">
<a accesskey="p" href="dist.readme.html">&lt;&lt;4.README</a></td>
<td width="20%" align="center"><a accesskey="u" href="dist.html">Up</a></td>
<td rowspan="2" width="40%" align="right"><a accesskey="n" href="dist.readme-developers.html">6.README_DEVELOPERS&gt;&gt;</a>
</td>
</tr>
<tr><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td></tr>
</table>
</div>
</body>
</html>