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