Added filtering and resource discovery.
[dyninst.git] / rtinst / src / RTfuncs.c
1 /*
2  * This file contains the implementation of runtime dynamic instrumentation
3  *   functions for a SUNOS SPARC processor.
4  *
5  * $Log: RTfuncs.c,v $
6  * Revision 1.3  1993/10/01 18:15:53  hollings
7  * Added filtering and resource discovery.
8  *
9  * Revision 1.2  1993/08/26  19:43:58  hollings
10  * new include syntax.
11  *
12  * Revision 1.1  1993/07/02  21:49:35  hollings
13  * Initial revision
14  *
15  *
16  */
17 #include <sys/signal.h>
18
19 /*
20  * Now our include files.
21  *
22  */
23 #include <h/trace.h>
24 #include <h/rtinst.h>
25
26 /* This marks the end of user code in the text file. */
27 /* This is to prevent system libraries with symbols compiled into them
28  *    from adding extranious material to our inst. environment.
29  */
30 DYNINSTendUserCode()
31 {
32 }
33
34 char DYNINSTdata[SYN_INST_BUF_SIZE];
35 char DYNINSTglobalData[SYN_INST_BUF_SIZE];
36 int DYNINSTnumSampled;
37
38 void DYNINSTincrementCounter(intCounter *counter)
39 {
40     if (counter->trigger && (counter->trigger->value <= 0)) return;
41     counter->value++;
42 }
43
44 void DYNINSTdecrementCounter(intCounter *counter)
45 {
46     if (counter->trigger && (counter->trigger->value <= 0)) return;
47     counter->value--;
48 }
49
50 void DYNINSTclearCounter(intCounter *counter)
51 {
52     counter->value = 0;
53 }
54
55 void DYNINSTreportCounter(intCounter *counter)
56 {
57     traceSample sample;
58
59     sample.value = counter->value;
60     sample.id = counter->id;
61
62     DYNINSTgenerateTraceRecord(0, TR_SAMPLE, sizeof(sample), &sample);
63 }
64
65 void DYNINSTsimplePrint()
66 {
67     printf("inside dynamic inst function\n");
68 }
69
70 void DYNINSTentryPrint(int arg)
71 {
72     printf("enter %d\n", arg);
73 }
74
75 void DYNINSTcallFrom(int arg)
76 {
77     printf("call from %d\n", arg);
78 }
79
80 void DYNINSTcallReturn(int arg)
81 {
82     printf("return to %d\n", arg);
83 }
84
85 void DYNINSTexitPrint(int arg)
86 {
87     printf("exit %d\n", arg);
88 }
89
90 /*
91  * For testing filter code.
92  *
93  */
94 void DYNINSTtoyFilter(filterArgs *filt, parameters *params)
95 {
96     if (filt->filterData == params->arg1) {
97         filt->toCall(filt->callData, params);
98     }
99 }
100
101 /*
102  * This is a function that should be called when we want to sample the
103  *   timers and counters.  The code to do the sampling is added as func
104  *   entry dynamic instrumentation.
105  *
106  */
107 void DYNINSTsampleValues()
108 {
109     DYNINSTnumSampled++;
110 }
111
112 void DYNINSTalarmExpire()
113 {
114     static int inSample;
115
116     /* should use atomic test and set for this */
117     if (inSample) return;
118
119     inSample = 1;
120
121     DYNINSTsampleValues();
122
123     inSample = 0;
124 }
125