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