xref: /aosp_15_r20/external/libtraceevent/Documentation/libtraceevent-kvm-plugin.txt (revision 436bf2bcd5202612ffffe471bbcc1f277cc8d28e)
1*436bf2bcSAndroid Build Coastguard Workerlibtraceevent(3)
2*436bf2bcSAndroid Build Coastguard Worker================
3*436bf2bcSAndroid Build Coastguard Worker
4*436bf2bcSAndroid Build Coastguard WorkerNAME
5*436bf2bcSAndroid Build Coastguard Worker----
6*436bf2bcSAndroid Build Coastguard Workertep_plugin_kvm_get_func, tep_plugin_kvm_put_func - Add function name for instruction pointer of kvm plugin
7*436bf2bcSAndroid Build Coastguard Worker
8*436bf2bcSAndroid Build Coastguard WorkerSYNOPSIS
9*436bf2bcSAndroid Build Coastguard Worker--------
10*436bf2bcSAndroid Build Coastguard Worker[verse]
11*436bf2bcSAndroid Build Coastguard Worker--
12*436bf2bcSAndroid Build Coastguard Worker*#include <event-parse.h>*
13*436bf2bcSAndroid Build Coastguard Worker
14*436bf2bcSAndroid Build Coastguard Workerconst char pass:[*]*tep_plugin_kvm_get_func*(struct tep_event pass:[*]event,
15*436bf2bcSAndroid Build Coastguard Worker				    struct tep_record pass:[*]record,
16*436bf2bcSAndroid Build Coastguard Worker				    unsigned long long pass:[*]paddr);
17*436bf2bcSAndroid Build Coastguard Workervoid *tep_plugin_kvm_put_func*(const char pass:[*]func);
18*436bf2bcSAndroid Build Coastguard Worker--
19*436bf2bcSAndroid Build Coastguard Worker
20*436bf2bcSAndroid Build Coastguard WorkerDESCRIPTION
21*436bf2bcSAndroid Build Coastguard Worker-----------
22*436bf2bcSAndroid Build Coastguard WorkerThe functions *tep_plugin_kvm_get_func()* and *tep_plugin_kvm_put_func()*
23*436bf2bcSAndroid Build Coastguard Workerare not to be called by an application, but instead are to be defined by
24*436bf2bcSAndroid Build Coastguard Workeran application.
25*436bf2bcSAndroid Build Coastguard Worker
26*436bf2bcSAndroid Build Coastguard WorkerCertain events (like kvm_exit and kvm_entry) have the instruction pointer
27*436bf2bcSAndroid Build Coastguard Workerof where in the guest the context changed from guest to host. As the host
28*436bf2bcSAndroid Build Coastguard Workeronly knows the instruction pointer and does not have information about what
29*436bf2bcSAndroid Build Coastguard Workerfunction in the guest that instruction pointer belongs to, it can only print
30*436bf2bcSAndroid Build Coastguard Workerthe address.
31*436bf2bcSAndroid Build Coastguard Worker
32*436bf2bcSAndroid Build Coastguard WorkerBut the application may have more information about the guest, and know where
33*436bf2bcSAndroid Build Coastguard Workerthe guest was when the exit occurred, and also even know the function name
34*436bf2bcSAndroid Build Coastguard Workerof that address.
35*436bf2bcSAndroid Build Coastguard Worker
36*436bf2bcSAndroid Build Coastguard WorkerThe KVM plugin for libtraceevent is called on these events, and then calls
37*436bf2bcSAndroid Build Coastguard Worker*tep_plugin_kvm_get_func()* to see if that function can resolve the instruction
38*436bf2bcSAndroid Build Coastguard Workerpointer address to a real function name. If the return is non NULL, it will
39*436bf2bcSAndroid Build Coastguard Workerprint the function in the output for that event.
40*436bf2bcSAndroid Build Coastguard Worker
41*436bf2bcSAndroid Build Coastguard WorkerThese functions are currently defined as weak functions within the plugin, as
42*436bf2bcSAndroid Build Coastguard Workerto not require them to be defined elsewhere. For an application to override
43*436bf2bcSAndroid Build Coastguard Workerthe weak function, it will need to define the function in a file that gets
44*436bf2bcSAndroid Build Coastguard Workercompiled with *-rdynamic*. That will tell the dynamic linker to examine that
45*436bf2bcSAndroid Build Coastguard Workerobject file and use function names to resolve weak functions in other shared
46*436bf2bcSAndroid Build Coastguard Workerobjects (in this case the KVM plugin shared object).
47*436bf2bcSAndroid Build Coastguard Worker
48*436bf2bcSAndroid Build Coastguard WorkerIf the application defines *tep_plugin_kvm_get_func()*, it must use the above
49*436bf2bcSAndroid Build Coastguard Workerprototype. The _event_ will hold the KVM event that has the instruction pointer
50*436bf2bcSAndroid Build Coastguard Workerfield. The _record_ will be the instance of that event. The application's function
51*436bf2bcSAndroid Build Coastguard Workerdoes not need to use these parameters, but they may be useful for finding the
52*436bf2bcSAndroid Build Coastguard Workerfunction name for the address. The _paddr_ is a pointer to a 64 bit value (where
53*436bf2bcSAndroid Build Coastguard Workeronly 32 bits may be used on 32 bit machines). This value is the instruction
54*436bf2bcSAndroid Build Coastguard Workerpointer to look up. If the application knows the start address of the function
55*436bf2bcSAndroid Build Coastguard Workeras well, it can set _paddr_ to that address, and the KVM plugin will also
56*436bf2bcSAndroid Build Coastguard Workerappend a "+offset" to the function name where the offset is the original
57*436bf2bcSAndroid Build Coastguard Workervalue in _paddr_ minus the value in _paddr_ when it is called. Finally,
58*436bf2bcSAndroid Build Coastguard Workerthe application should return the function name as a nul terminated string
59*436bf2bcSAndroid Build Coastguard Workerif one is found.
60*436bf2bcSAndroid Build Coastguard Worker
61*436bf2bcSAndroid Build Coastguard WorkerIf the returned string of *tep_plugin_kvm_get_func()* was allocated, the KVM plugin
62*436bf2bcSAndroid Build Coastguard Workerwill call *tep_plugin_kvm_put_func()* when it is through with it, passing the
63*436bf2bcSAndroid Build Coastguard Workervalue returned by *tep_plugin_kvm_get_func()* as _func_. This allows the application
64*436bf2bcSAndroid Build Coastguard Workerto free it if necessary.
65*436bf2bcSAndroid Build Coastguard Worker
66*436bf2bcSAndroid Build Coastguard WorkerRETURN VALUE
67*436bf2bcSAndroid Build Coastguard Worker------------
68*436bf2bcSAndroid Build Coastguard WorkerThe *tep_plugin_kvm_get_func()* is not to be called by the application but instead
69*436bf2bcSAndroid Build Coastguard Workeris to be defined by the application. It should return a nul terminated string representing
70*436bf2bcSAndroid Build Coastguard Workerthe function for the given instruction pointer passed to it by reference in _paddr_. It
71*436bf2bcSAndroid Build Coastguard Workercan then optionally update the _paddr_ to a value that holds the start of the function.
72*436bf2bcSAndroid Build Coastguard WorkerThe string returned may be freed by the *tep_plugin_kvm_put_func()* that the application
73*436bf2bcSAndroid Build Coastguard Workershould define to clean up the string.
74*436bf2bcSAndroid Build Coastguard Worker
75*436bf2bcSAndroid Build Coastguard WorkerThe below example needs to be compiled with the *-rdynamic* flag so that the dynamic
76*436bf2bcSAndroid Build Coastguard Workerlinker can resolve the *tep_plugin_kvm_get_func()* and *tep_plugin_kvm_put_func()* functions.
77*436bf2bcSAndroid Build Coastguard Worker
78*436bf2bcSAndroid Build Coastguard WorkerWhen run against a trace.dat file produced by *trace-cmd(1)* recording the kvm_exit and
79*436bf2bcSAndroid Build Coastguard Workerkvm_entry events on a guest, and then the guest's /proc/kallsyms file is passed as the
80*436bf2bcSAndroid Build Coastguard Workersecond parameter, the output produced will look something like:
81*436bf2bcSAndroid Build Coastguard Worker
82*436bf2bcSAndroid Build Coastguard Worker[source,c]
83*436bf2bcSAndroid Build Coastguard Worker--
84*436bf2bcSAndroid Build Coastguard WorkerCPU 0/KVM-20407 83156.177626 [000] kvm_exit     reason APIC_ACCESS rip 0xffffffffb0056ee2 exit native_apic_mem_write+0x2 info 10b0 0
85*436bf2bcSAndroid Build Coastguard WorkerCPU 0/KVM-20407 83156.177632 [000] kvm_entry     vcpu 0 rip 0xffffffffb0056ee8 enter native_apic_mem_write+0x8
86*436bf2bcSAndroid Build Coastguard Worker--
87*436bf2bcSAndroid Build Coastguard Worker
88*436bf2bcSAndroid Build Coastguard WorkerBut without those callbacks, it would look like:
89*436bf2bcSAndroid Build Coastguard Worker
90*436bf2bcSAndroid Build Coastguard Worker[source,c]
91*436bf2bcSAndroid Build Coastguard Worker--
92*436bf2bcSAndroid Build Coastguard WorkerCPU 0/KVM-20407 83156.177626 [000] kvm_exit     reason APIC_ACCESS rip 0xffffffffb0056ee2 info 10b0 0
93*436bf2bcSAndroid Build Coastguard WorkerCPU 0/KVM-20407 83156.177632 [000] kvm_entry     vcpu 0 rip 0xffffffffb0056ee8
94*436bf2bcSAndroid Build Coastguard Worker--
95*436bf2bcSAndroid Build Coastguard Worker
96*436bf2bcSAndroid Build Coastguard WorkerEXAMPLE
97*436bf2bcSAndroid Build Coastguard Worker-------
98*436bf2bcSAndroid Build Coastguard Worker[source,c]
99*436bf2bcSAndroid Build Coastguard Worker--
100*436bf2bcSAndroid Build Coastguard Worker#include <stdio.h>
101*436bf2bcSAndroid Build Coastguard Worker#include <stdlib.h>
102*436bf2bcSAndroid Build Coastguard Worker#include <event-parse.h>
103*436bf2bcSAndroid Build Coastguard Worker#include <trace-cmd.h>
104*436bf2bcSAndroid Build Coastguard Worker#include <sys/stat.h>
105*436bf2bcSAndroid Build Coastguard Worker
106*436bf2bcSAndroid Build Coastguard Workerstatic struct tep_handle *tep;
107*436bf2bcSAndroid Build Coastguard Worker
108*436bf2bcSAndroid Build Coastguard Workerconst char *tep_plugin_kvm_get_func(struct tep_event *event, struct tep_record *record,
109*436bf2bcSAndroid Build Coastguard Worker				    unsigned long long *paddr)
110*436bf2bcSAndroid Build Coastguard Worker{
111*436bf2bcSAndroid Build Coastguard Worker	const char *func;
112*436bf2bcSAndroid Build Coastguard Worker	char *event_func;
113*436bf2bcSAndroid Build Coastguard Worker	char *ename;
114*436bf2bcSAndroid Build Coastguard Worker
115*436bf2bcSAndroid Build Coastguard Worker	func = tep_find_function(tep, *paddr);
116*436bf2bcSAndroid Build Coastguard Worker	if (!func)
117*436bf2bcSAndroid Build Coastguard Worker		return NULL;
118*436bf2bcSAndroid Build Coastguard Worker
119*436bf2bcSAndroid Build Coastguard Worker	if (strcmp(event->name, "kvm_exit") == 0)
120*436bf2bcSAndroid Build Coastguard Worker		ename = "exit";
121*436bf2bcSAndroid Build Coastguard Worker	else
122*436bf2bcSAndroid Build Coastguard Worker		ename = "enter";
123*436bf2bcSAndroid Build Coastguard Worker
124*436bf2bcSAndroid Build Coastguard Worker	/*
125*436bf2bcSAndroid Build Coastguard Worker	 * Normally, passing back func directly is sufficient and then
126*436bf2bcSAndroid Build Coastguard Worker	 * tep_plugin_kvm_put_func() would not be required. But this example
127*436bf2bcSAndroid Build Coastguard Worker	 * is showing how to handle allocation of the returned string.
128*436bf2bcSAndroid Build Coastguard Worker	 */
129*436bf2bcSAndroid Build Coastguard Worker	event_func = malloc(strlen(ename) + strlen(func) + 2);
130*436bf2bcSAndroid Build Coastguard Worker	if (!event_func)
131*436bf2bcSAndroid Build Coastguard Worker		return NULL;
132*436bf2bcSAndroid Build Coastguard Worker	sprintf(event_func, "%s %s", ename, func);
133*436bf2bcSAndroid Build Coastguard Worker
134*436bf2bcSAndroid Build Coastguard Worker	*paddr = tep_find_function_address(tep, *paddr);
135*436bf2bcSAndroid Build Coastguard Worker
136*436bf2bcSAndroid Build Coastguard Worker	return event_func;
137*436bf2bcSAndroid Build Coastguard Worker}
138*436bf2bcSAndroid Build Coastguard Worker
139*436bf2bcSAndroid Build Coastguard Workervoid tep_plugin_kvm_put_func(const char *func)
140*436bf2bcSAndroid Build Coastguard Worker{
141*436bf2bcSAndroid Build Coastguard Worker	char *f = (char *)func;
142*436bf2bcSAndroid Build Coastguard Worker
143*436bf2bcSAndroid Build Coastguard Worker	free(f);
144*436bf2bcSAndroid Build Coastguard Worker}
145*436bf2bcSAndroid Build Coastguard Worker
146*436bf2bcSAndroid Build Coastguard Workerstatic int show_event(struct tracecmd_input *handle, struct tep_event *event,
147*436bf2bcSAndroid Build Coastguard Worker		      struct tep_record *record, int cpu, void *data)
148*436bf2bcSAndroid Build Coastguard Worker{
149*436bf2bcSAndroid Build Coastguard Worker	static struct trace_seq seq;
150*436bf2bcSAndroid Build Coastguard Worker	tep = data;
151*436bf2bcSAndroid Build Coastguard Worker
152*436bf2bcSAndroid Build Coastguard Worker	if (!seq.buffer)
153*436bf2bcSAndroid Build Coastguard Worker		trace_seq_init(&seq);
154*436bf2bcSAndroid Build Coastguard Worker
155*436bf2bcSAndroid Build Coastguard Worker	trace_seq_reset(&seq);
156*436bf2bcSAndroid Build Coastguard Worker	tep_print_event(tracecmd_get_tep(handle), &seq, record,
157*436bf2bcSAndroid Build Coastguard Worker			"%s-%d\t%6.1000d [%03d] %s\t%s\n",
158*436bf2bcSAndroid Build Coastguard Worker			TEP_PRINT_COMM, TEP_PRINT_PID,
159*436bf2bcSAndroid Build Coastguard Worker			TEP_PRINT_TIME, TEP_PRINT_CPU,
160*436bf2bcSAndroid Build Coastguard Worker			TEP_PRINT_NAME, TEP_PRINT_INFO);
161*436bf2bcSAndroid Build Coastguard Worker	trace_seq_terminate(&seq);
162*436bf2bcSAndroid Build Coastguard Worker	trace_seq_do_printf(&seq);
163*436bf2bcSAndroid Build Coastguard Worker	return 0;
164*436bf2bcSAndroid Build Coastguard Worker}
165*436bf2bcSAndroid Build Coastguard Worker
166*436bf2bcSAndroid Build Coastguard Workerint main(int argc, char **argv)
167*436bf2bcSAndroid Build Coastguard Worker{
168*436bf2bcSAndroid Build Coastguard Worker	struct tracecmd_input *handle;
169*436bf2bcSAndroid Build Coastguard Worker	struct tep_handle *guest_tep;
170*436bf2bcSAndroid Build Coastguard Worker	struct stat st;
171*436bf2bcSAndroid Build Coastguard Worker	FILE *fp;
172*436bf2bcSAndroid Build Coastguard Worker	char *buf;
173*436bf2bcSAndroid Build Coastguard Worker
174*436bf2bcSAndroid Build Coastguard Worker	if (argc < 3) {
175*436bf2bcSAndroid Build Coastguard Worker		printf("usage: trace.dat guest_kallsyms_file\n");
176*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
177*436bf2bcSAndroid Build Coastguard Worker	}
178*436bf2bcSAndroid Build Coastguard Worker
179*436bf2bcSAndroid Build Coastguard Worker	handle = tracecmd_open(argv[1], 0);
180*436bf2bcSAndroid Build Coastguard Worker	if (!handle) {
181*436bf2bcSAndroid Build Coastguard Worker		perror(argv[1]);
182*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
183*436bf2bcSAndroid Build Coastguard Worker	}
184*436bf2bcSAndroid Build Coastguard Worker
185*436bf2bcSAndroid Build Coastguard Worker	/* Just for kallsyms parsing */
186*436bf2bcSAndroid Build Coastguard Worker	guest_tep = tep_alloc();
187*436bf2bcSAndroid Build Coastguard Worker	if (!guest_tep)
188*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
189*436bf2bcSAndroid Build Coastguard Worker
190*436bf2bcSAndroid Build Coastguard Worker	if (stat(argv[2], &st) < 0) {
191*436bf2bcSAndroid Build Coastguard Worker		perror(argv[2]);
192*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
193*436bf2bcSAndroid Build Coastguard Worker	}
194*436bf2bcSAndroid Build Coastguard Worker
195*436bf2bcSAndroid Build Coastguard Worker	buf = malloc(st.st_size + 1);
196*436bf2bcSAndroid Build Coastguard Worker	if (!buf)
197*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
198*436bf2bcSAndroid Build Coastguard Worker
199*436bf2bcSAndroid Build Coastguard Worker	fp = fopen(argv[2], "r");
200*436bf2bcSAndroid Build Coastguard Worker	if (!fp) {
201*436bf2bcSAndroid Build Coastguard Worker		perror(argv[2]);
202*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
203*436bf2bcSAndroid Build Coastguard Worker	}
204*436bf2bcSAndroid Build Coastguard Worker
205*436bf2bcSAndroid Build Coastguard Worker	if (fread(buf, st.st_size, 1, fp) < 0) {
206*436bf2bcSAndroid Build Coastguard Worker		perror(argv[2]);
207*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
208*436bf2bcSAndroid Build Coastguard Worker	}
209*436bf2bcSAndroid Build Coastguard Worker
210*436bf2bcSAndroid Build Coastguard Worker	buf[st.st_size] = '\0';
211*436bf2bcSAndroid Build Coastguard Worker
212*436bf2bcSAndroid Build Coastguard Worker	if (tep_parse_kallsyms(guest_tep, buf) < 0) {
213*436bf2bcSAndroid Build Coastguard Worker		printf("Failed to parse %s\n", argv[2]);
214*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
215*436bf2bcSAndroid Build Coastguard Worker	}
216*436bf2bcSAndroid Build Coastguard Worker	free(buf);
217*436bf2bcSAndroid Build Coastguard Worker
218*436bf2bcSAndroid Build Coastguard Worker	tracecmd_follow_event(handle, "kvm", "kvm_exit", show_event, guest_tep);
219*436bf2bcSAndroid Build Coastguard Worker	tracecmd_follow_event(handle, "kvm", "kvm_entry", show_event, guest_tep);
220*436bf2bcSAndroid Build Coastguard Worker
221*436bf2bcSAndroid Build Coastguard Worker	tracecmd_iterate_events(handle, NULL, 0, NULL, NULL);
222*436bf2bcSAndroid Build Coastguard Worker
223*436bf2bcSAndroid Build Coastguard Worker	tep_free(guest_tep);
224*436bf2bcSAndroid Build Coastguard Worker	tracecmd_close(handle);
225*436bf2bcSAndroid Build Coastguard Worker}
226*436bf2bcSAndroid Build Coastguard Worker--
227*436bf2bcSAndroid Build Coastguard Worker
228*436bf2bcSAndroid Build Coastguard WorkerFILES
229*436bf2bcSAndroid Build Coastguard Worker-----
230*436bf2bcSAndroid Build Coastguard Worker[verse]
231*436bf2bcSAndroid Build Coastguard Worker--
232*436bf2bcSAndroid Build Coastguard Worker*event-parse.h*
233*436bf2bcSAndroid Build Coastguard Worker	Header file to include in order to have access to the library APIs.
234*436bf2bcSAndroid Build Coastguard Worker*-ltraceevent*
235*436bf2bcSAndroid Build Coastguard Worker	Linker switch to add when building a program that uses the library.
236*436bf2bcSAndroid Build Coastguard Worker--
237*436bf2bcSAndroid Build Coastguard Worker
238*436bf2bcSAndroid Build Coastguard WorkerSEE ALSO
239*436bf2bcSAndroid Build Coastguard Worker--------
240*436bf2bcSAndroid Build Coastguard Worker*libtraceevent*(3), *trace-cmd*(1)
241*436bf2bcSAndroid Build Coastguard Worker
242*436bf2bcSAndroid Build Coastguard WorkerREPORTING BUGS
243*436bf2bcSAndroid Build Coastguard Worker--------------
244*436bf2bcSAndroid Build Coastguard WorkerReport bugs to  <[email protected]>
245*436bf2bcSAndroid Build Coastguard Worker
246*436bf2bcSAndroid Build Coastguard WorkerLICENSE
247*436bf2bcSAndroid Build Coastguard Worker-------
248*436bf2bcSAndroid Build Coastguard Workerlibtraceevent is Free Software licensed under the GNU LGPL 2.1
249*436bf2bcSAndroid Build Coastguard Worker
250*436bf2bcSAndroid Build Coastguard WorkerRESOURCES
251*436bf2bcSAndroid Build Coastguard Worker---------
252*436bf2bcSAndroid Build Coastguard Workerhttps://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/
253