Added COLLECTOR for HPUX; added support for INSTANTIATE_TEMPLATES
[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.8  1994/11/12 17:32:12  rbi
8  * removed /dev/kmem warning messages
9  *
10  * Revision 1.7  1994/11/11  10:39:10  markc
11  * Commented out non-emergency printfs
12  *
13  * Revision 1.6  1994/09/20  18:25:00  hollings
14  * removed call to getcmd since it was causing a SS-5 slow down.
15  *
16  * Revision 1.5  1994/07/14  23:34:08  hollings
17  * added include of kludges.h
18  *
19  * Revision 1.4  1994/07/05  03:25:10  hollings
20  * obsereved cost model.
21  *
22  * Revision 1.3  1994/02/02  00:46:12  hollings
23  * Changes to make it compile with the new tree.
24  *
25  * Revision 1.2  1993/12/13  19:47:52  hollings
26  * corrected rindex parameter error
27  *
28  * Revision 1.1  1993/08/26  19:43:28  hollings
29  * Initial revision
30  *
31  * Revision 1.1  1993/07/02  21:49:35  hollings
32  * Initial revision
33  *
34  *
35  */
36 #include <stdio.h>
37 #include <string.h>
38 #include <sys/time.h>
39 #include <sys/resource.h>
40 #include <sys/user.h>
41 #include <sys/proc.h>
42 #include <machine/vmparam.h>
43 #include <sys/mman.h>
44 #include <fcntl.h>
45 #include <assert.h>
46 #include <unistd.h>
47 #include <kvm.h>
48 #include <errno.h>
49
50 #include "kludges.h"
51 #include "../h/rtinst.h"
52
53 int DYNINSTmappedUarea;
54 int *_p_1, *_p_2;
55 static int _kmem = -1;
56
57 /*
58  * find out if the uarea is safe for mapping.
59  *    If it is, return the address of the uarea.
60  *
61  */
62 caddr_t DYNINSTprobeUarea()
63 {
64      int pid;
65      char *cmd;
66      kvm_t *kd;
67      char **args;
68      struct user *u;
69      struct proc *p;
70
71      kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
72      if (!kd) {
73          perror("kvm_open");
74          return(0);
75      }
76      pid = getpid();
77      p = kvm_getproc(kd, pid);
78      if (!p) {
79          return(0);
80          perror("kvm_getproc");
81      }
82      u = kvm_getu(kd, p);
83      if (!u) {
84          perror("kvm_getu");
85          return(0);
86      }
87
88 #ifdef notdef
89      /* removed this call since is seems to cause a 10% slow down of the
90      application on SS-5 programs (I have no idea why) -- jkh 9/18/94 */
91      kvm_getcmd(kd, p, u, &args, NULL);
92      cmd = (char *) rindex(args[0], '/');
93      if (cmd) {
94          cmd++;
95      } else {
96          cmd = args[0];
97      }
98 #endif
99 #ifdef notdef
100      if (strcmp(cmd, u->u_comm)) {
101          printf("cmd = %s, u_comm = %s\n", cmd, u->u_comm);
102          perror("no cmd");
103          return(0);
104      }
105 #endif
106      kvm_close(kd);
107
108      return((caddr_t)p->p_uarea);
109 }
110
111 int DYNINSTmapUarea()
112 {
113     int ret;
114     caddr_t uAddr;
115     static struct user *u;
116
117     uAddr = DYNINSTprobeUarea();
118
119     if (!uAddr) {
120 /*
121  *  commented out to avoid dirty looks during SC94   -rbi 11/11/94
122  *
123  *   printf("WARNING: program compiled for wrong version of SPARC chip.\n");
124  *   printf(" using getrusage for times, this may slow your program down\n");
125  *   printf(" by a factor of ten or more.\n");
126  *   printf("\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\n"); 
127  *   fflush(stdout);
128  */
129         return(0);
130     }
131
132     _kmem = open("/dev/kmem", O_RDONLY, 0);
133     if (_kmem < 0) {
134         return(0);
135     }
136
137     ret = (int) mmap((caddr_t) 0, sizeof(struct user), PROT_READ, 
138         MAP_SHARED, _kmem, (off_t) uAddr);
139     if (ret == -1) {
140         return(0);
141     }
142     u = (struct user *) ret;
143     _p_1 = (int *) &(u->u_ru.ru_utime.tv_sec);
144     _p_2 = (int *) &(u->u_ru.ru_utime.tv_usec);
145
146     return(1);
147 }
148
149 /*
150  * Run a nop loop to estimate clock frequency.
151  *
152  */
153
154 #define LOOP_LIMIT      50000
155 #define MILLION         1000000
156
157 float DYNINSTgetClock()
158 {
159
160   int i;
161   float elapsed;
162   float clockSpeed;
163   time64 startF, endF;
164
165   startF = DYNINSTgetCPUtime();
166   for (i=0; i < LOOP_LIMIT; i++) {
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     asm("nop");
417     asm("nop");
418     asm("nop");
419     asm("nop");
420     asm("nop");
421     asm("nop");
422     asm("nop");
423   }
424   endF = DYNINSTgetCPUtime();
425
426   elapsed = (endF-startF)/((double) MILLION);
427   clockSpeed = (256*LOOP_LIMIT)/elapsed/MILLION;
428
429   /* printf("elapsed = %f\n", elapsed); */
430   /* printf("clockSpeed = %f\n", clockSpeed); */
431
432   return(clockSpeed);
433 }