Commented out non-emergency printfs
[dyninst.git] / rtinst / src / RTsparc.c
1
2 /*
3  * This file contains the implementation of runtime dynamic instrumentation
4  *   functions for a normal Sparc with SUNOS.
5  *
6  * $Log: RTsparc.c,v $
7  * Revision 1.7  1994/11/11 10:39:10  markc
8  * Commented out non-emergency printfs
9  *
10  * Revision 1.6  1994/09/20  18:25:00  hollings
11  * removed call to getcmd since it was causing a SS-5 slow down.
12  *
13  * Revision 1.5  1994/07/14  23:34:08  hollings
14  * added include of kludges.h
15  *
16  * Revision 1.4  1994/07/05  03:25:10  hollings
17  * obsereved cost model.
18  *
19  * Revision 1.3  1994/02/02  00:46:12  hollings
20  * Changes to make it compile with the new tree.
21  *
22  * Revision 1.2  1993/12/13  19:47:52  hollings
23  * corrected rindex parameter error
24  *
25  * Revision 1.1  1993/08/26  19:43:28  hollings
26  * Initial revision
27  *
28  * Revision 1.1  1993/07/02  21:49:35  hollings
29  * Initial revision
30  *
31  *
32  */
33 #include <stdio.h>
34 #include <string.h>
35 #include <sys/time.h>
36 #include <sys/resource.h>
37 #include <sys/user.h>
38 #include <sys/proc.h>
39 #include <machine/vmparam.h>
40 #include <sys/mman.h>
41 #include <fcntl.h>
42 #include <assert.h>
43 #include <unistd.h>
44 #include <kvm.h>
45 #include <errno.h>
46
47 #include "kludges.h"
48 #include "../h/rtinst.h"
49
50 int DYNINSTmappedUarea;
51 int *_p_1, *_p_2;
52 static int _kmem = -1;
53
54 /*
55  * find out if the uarea is safe for mapping.
56  *    If it is, return the address of the uarea.
57  *
58  */
59 caddr_t DYNINSTprobeUarea()
60 {
61      int pid;
62      char *cmd;
63      kvm_t *kd;
64      char **args;
65      struct user *u;
66      struct proc *p;
67
68      kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
69      if (!kd) {
70          perror("kvm_open");
71          return(0);
72      }
73      pid = getpid();
74      p = kvm_getproc(kd, pid);
75      if (!p) {
76          return(0);
77          perror("kvm_getproc");
78      }
79      u = kvm_getu(kd, p);
80      if (!u) {
81          perror("kvm_getu");
82          return(0);
83      }
84
85 #ifdef notdef
86      /* removed this call since is seems to cause a 10% slow down of the
87      application on SS-5 programs (I have no idea why) -- jkh 9/18/94 */
88      kvm_getcmd(kd, p, u, &args, NULL);
89      cmd = (char *) rindex(args[0], '/');
90      if (cmd) {
91          cmd++;
92      } else {
93          cmd = args[0];
94      }
95 #endif
96 #ifdef notdef
97      if (strcmp(cmd, u->u_comm)) {
98          printf("cmd = %s, u_comm = %s\n", cmd, u->u_comm);
99          perror("no cmd");
100          return(0);
101      }
102 #endif
103      kvm_close(kd);
104
105      return((caddr_t)p->p_uarea);
106 }
107
108 int DYNINSTmapUarea()
109 {
110     int ret;
111     caddr_t uAddr;
112     static struct user *u;
113
114     uAddr = DYNINSTprobeUarea();
115
116     if (!uAddr) {
117         printf("WARNING: program compiled for wrong version of SPARC chip.\n");
118         printf(" using getrusage for times, this may slow your program down\n");
119         printf(" by a factor of ten or more.\n");
120         printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\n");
121         fflush(stdout);
122         return(0);
123     }
124
125     _kmem = open("/dev/kmem", O_RDONLY, 0);
126     if (_kmem < 0) {
127         return(0);
128     }
129
130     ret = (int) mmap((caddr_t) 0, sizeof(struct user), PROT_READ, 
131         MAP_SHARED, _kmem, (off_t) uAddr);
132     if (ret == -1) {
133         return(0);
134     }
135     u = (struct user *) ret;
136     _p_1 = (int *) &(u->u_ru.ru_utime.tv_sec);
137     _p_2 = (int *) &(u->u_ru.ru_utime.tv_usec);
138
139     return(1);
140 }
141
142 /*
143  * Run a nop loop to estimate clock frequency.
144  *
145  */
146
147 #define LOOP_LIMIT      50000
148 #define MILLION         1000000
149
150 float DYNINSTgetClock()
151 {
152
153   int i;
154   float elapsed;
155   float clockSpeed;
156   time64 startF, endF;
157
158   startF = DYNINSTgetCPUtime();
159   for (i=0; i < LOOP_LIMIT; i++) {
160     asm("nop");
161     asm("nop");
162     asm("nop");
163     asm("nop");
164     asm("nop");
165     asm("nop");
166     asm("nop");
167     asm("nop");
168     asm("nop");
169     asm("nop");
170     asm("nop");
171     asm("nop");
172     asm("nop");
173     asm("nop");
174     asm("nop");
175     asm("nop");
176     asm("nop");
177     asm("nop");
178     asm("nop");
179     asm("nop");
180     asm("nop");
181     asm("nop");
182     asm("nop");
183     asm("nop");
184     asm("nop");
185     asm("nop");
186     asm("nop");
187     asm("nop");
188     asm("nop");
189     asm("nop");
190     asm("nop");
191     asm("nop");
192     asm("nop");
193     asm("nop");
194     asm("nop");
195     asm("nop");
196     asm("nop");
197     asm("nop");
198     asm("nop");
199     asm("nop");
200     asm("nop");
201     asm("nop");
202     asm("nop");
203     asm("nop");
204     asm("nop");
205     asm("nop");
206     asm("nop");
207     asm("nop");
208     asm("nop");
209     asm("nop");
210     asm("nop");
211     asm("nop");
212     asm("nop");
213     asm("nop");
214     asm("nop");
215     asm("nop");
216     asm("nop");
217     asm("nop");
218     asm("nop");
219     asm("nop");
220     asm("nop");
221     asm("nop");
222     asm("nop");
223     asm("nop");
224     asm("nop");
225     asm("nop");
226     asm("nop");
227     asm("nop");
228     asm("nop");
229     asm("nop");
230     asm("nop");
231     asm("nop");
232     asm("nop");
233     asm("nop");
234     asm("nop");
235     asm("nop");
236     asm("nop");
237     asm("nop");
238     asm("nop");
239     asm("nop");
240     asm("nop");
241     asm("nop");
242     asm("nop");
243     asm("nop");
244     asm("nop");
245     asm("nop");
246     asm("nop");
247     asm("nop");
248     asm("nop");
249     asm("nop");
250     asm("nop");
251     asm("nop");
252     asm("nop");
253     asm("nop");
254     asm("nop");
255     asm("nop");
256     asm("nop");
257     asm("nop");
258     asm("nop");
259     asm("nop");
260     asm("nop");
261     asm("nop");
262     asm("nop");
263     asm("nop");
264     asm("nop");
265     asm("nop");
266     asm("nop");
267     asm("nop");
268     asm("nop");
269     asm("nop");
270     asm("nop");
271     asm("nop");
272     asm("nop");
273     asm("nop");
274     asm("nop");
275     asm("nop");
276     asm("nop");
277     asm("nop");
278     asm("nop");
279     asm("nop");
280     asm("nop");
281     asm("nop");
282     asm("nop");
283     asm("nop");
284     asm("nop");
285     asm("nop");
286     asm("nop");
287     asm("nop");
288     asm("nop");
289     asm("nop");
290     asm("nop");
291     asm("nop");
292     asm("nop");
293     asm("nop");
294     asm("nop");
295     asm("nop");
296     asm("nop");
297     asm("nop");
298     asm("nop");
299     asm("nop");
300     asm("nop");
301     asm("nop");
302     asm("nop");
303     asm("nop");
304     asm("nop");
305     asm("nop");
306     asm("nop");
307     asm("nop");
308     asm("nop");
309     asm("nop");
310     asm("nop");
311     asm("nop");
312     asm("nop");
313     asm("nop");
314     asm("nop");
315     asm("nop");
316     asm("nop");
317     asm("nop");
318     asm("nop");
319     asm("nop");
320     asm("nop");
321     asm("nop");
322     asm("nop");
323     asm("nop");
324     asm("nop");
325     asm("nop");
326     asm("nop");
327     asm("nop");
328     asm("nop");
329     asm("nop");
330     asm("nop");
331     asm("nop");
332     asm("nop");
333     asm("nop");
334     asm("nop");
335     asm("nop");
336     asm("nop");
337     asm("nop");
338     asm("nop");
339     asm("nop");
340     asm("nop");
341     asm("nop");
342     asm("nop");
343     asm("nop");
344     asm("nop");
345     asm("nop");
346     asm("nop");
347     asm("nop");
348     asm("nop");
349     asm("nop");
350     asm("nop");
351     asm("nop");
352     asm("nop");
353     asm("nop");
354     asm("nop");
355     asm("nop");
356     asm("nop");
357     asm("nop");
358     asm("nop");
359     asm("nop");
360     asm("nop");
361     asm("nop");
362     asm("nop");
363     asm("nop");
364     asm("nop");
365     asm("nop");
366     asm("nop");
367     asm("nop");
368     asm("nop");
369     asm("nop");
370     asm("nop");
371     asm("nop");
372     asm("nop");
373     asm("nop");
374     asm("nop");
375     asm("nop");
376     asm("nop");
377     asm("nop");
378     asm("nop");
379     asm("nop");
380     asm("nop");
381     asm("nop");
382     asm("nop");
383     asm("nop");
384     asm("nop");
385     asm("nop");
386     asm("nop");
387     asm("nop");
388     asm("nop");
389     asm("nop");
390     asm("nop");
391     asm("nop");
392     asm("nop");
393     asm("nop");
394     asm("nop");
395     asm("nop");
396     asm("nop");
397     asm("nop");
398     asm("nop");
399     asm("nop");
400     asm("nop");
401     asm("nop");
402     asm("nop");
403     asm("nop");
404     asm("nop");
405     asm("nop");
406     asm("nop");
407     asm("nop");
408     asm("nop");
409     asm("nop");
410     asm("nop");
411     asm("nop");
412     asm("nop");
413     asm("nop");
414     asm("nop");
415     asm("nop");
416   }
417   endF = DYNINSTgetCPUtime();
418
419   elapsed = (endF-startF)/((double) MILLION);
420   clockSpeed = (256*LOOP_LIMIT)/elapsed/MILLION;
421
422   /* printf("elapsed = %f\n", elapsed); */
423   /* printf("clockSpeed = %f\n", clockSpeed); */
424
425   return(clockSpeed);
426 }