Initial revision
[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.1  1993/08/26 19:43:28  hollings
8  * Initial revision
9  *
10  * Revision 1.1  1993/07/02  21:49:35  hollings
11  * Initial revision
12  *
13  *
14  */
15 #include <stdio.h>
16 #include <string.h>
17 #include <sys/time.h>
18 #include <sys/resource.h>
19 #include <sys/user.h>
20 #include <sys/proc.h>
21 #include <machine/vmparam.h>
22 #include <sys/mman.h>
23 #include <fcntl.h>
24 #include <assert.h>
25 #include <kvm.h>
26
27 int DYNINSTmappedUarea;
28 int *_p_1, *_p_2;
29 static int _kmem = -1;
30
31 /*
32  * find out if the uarea is safe for mapping.
33  *    If it is, return the address of the uarea.
34  *
35  */
36 caddr_t DYNINSTprobeUarea()
37 {
38      int pid;
39      char *cmd;
40      kvm_t *kd;
41      char **args;
42      struct user *u;
43      struct proc *p;
44
45      kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
46      if (!kd) return(0);
47      pid = getpid();
48      p = kvm_getproc(kd, pid);
49      if (!p) return(0);
50      u = kvm_getu(kd, p);
51      if (!u) return(0);
52
53      kvm_getcmd(kd, p, u, &args, NULL);
54      if (cmd = (char *) rindex(args[0], "/")) {
55          cmd++;
56      } else {
57          cmd = args[0];
58      }
59      if (strcmp(cmd, u->u_comm)) {
60          return(0);
61      }
62      kvm_close(kd);
63
64      return((caddr_t)p->p_uarea);
65 }
66
67 int DYNINSTmapUarea()
68 {
69     int ret;
70     caddr_t uAddr;
71     static struct user *u;
72
73     uAddr = DYNINSTprobeUarea();
74
75     if (!uAddr) {
76         printf("WARNING: program compiled for wrong version of SPARC chip.\n");
77         printf(" using getrusage for times, this may slow your program down\n");
78         printf(" by a factor of ten or more.\n");
79         return(0);
80     }
81
82     _kmem = open("/dev/kmem", O_RDONLY, 0);
83     if (_kmem < 0) {
84         return(0);
85     }
86
87     ret = (int) mmap((caddr_t) 0, sizeof(struct user), PROT_READ, 
88         MAP_SHARED, _kmem, (off_t) uAddr);
89     if (ret == -1) {
90         return(0);
91     }
92     u = (struct user *) ret;
93     _p_1 = (int *) &(u->u_ru.ru_utime.tv_sec);
94     _p_2 = (int *) &(u->u_ru.ru_utime.tv_usec);
95
96     return(1);
97 }