xref: /aosp_15_r20/external/libtraceevent/Documentation/libtraceevent-kbuffer-timestamp.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 Workerkbuffer_timestamp, kbuffer_subbuf_timestamp -
7*436bf2bcSAndroid Build Coastguard WorkerFunctions that read various data of a kbuffer descriptor
8*436bf2bcSAndroid Build Coastguard Worker
9*436bf2bcSAndroid Build Coastguard WorkerSYNOPSIS
10*436bf2bcSAndroid Build Coastguard Worker--------
11*436bf2bcSAndroid Build Coastguard Worker[verse]
12*436bf2bcSAndroid Build Coastguard Worker--
13*436bf2bcSAndroid Build Coastguard Worker*#include <kbuffer.h>*
14*436bf2bcSAndroid Build Coastguard Worker
15*436bf2bcSAndroid Build Coastguard Workerunsigned long long *kbuffer_timestamp*(struct kbuffer pass:[*]_kbuf_);
16*436bf2bcSAndroid Build Coastguard Workerunsigned long long *kbuffer_subbuf_timestamp*(struct kbuffer pass:[*]_kbuf_, void pass:[*]_subbuf_);
17*436bf2bcSAndroid Build Coastguard Worker--
18*436bf2bcSAndroid Build Coastguard Worker
19*436bf2bcSAndroid Build Coastguard WorkerDESCRIPTION
20*436bf2bcSAndroid Build Coastguard Worker-----------
21*436bf2bcSAndroid Build Coastguard WorkerThe function *kbuffer_timestamp()* returns the timestamp of the current event of _kbuf_.
22*436bf2bcSAndroid Build Coastguard Worker
23*436bf2bcSAndroid Build Coastguard WorkerThe function *kbuffer_subbuf_timestamp()* returns the timestamp for the sub-buffer
24*436bf2bcSAndroid Build Coastguard Workerthat was loaded in _kbuf_. This usually is (but not guaranteed to be) the timestamp
25*436bf2bcSAndroid Build Coastguard Workerof the first event on the sub-buffer.
26*436bf2bcSAndroid Build Coastguard Worker
27*436bf2bcSAndroid Build Coastguard WorkerThe function *kbuffer_start_of_data()* returns the offset of where the delta
28*436bf2bcSAndroid Build Coastguard Worker
29*436bf2bcSAndroid Build Coastguard WorkerRETURN VALUE
30*436bf2bcSAndroid Build Coastguard Worker------------
31*436bf2bcSAndroid Build Coastguard Worker*kbuffer_read_event()* returns the event that the _kbuf_ descriptor is currently at,
32*436bf2bcSAndroid Build Coastguard Workeror NULL if the last event was passed (by *kbuffer_next_event()*).
33*436bf2bcSAndroid Build Coastguard Worker
34*436bf2bcSAndroid Build Coastguard Worker*kbuffer_next_event()* returns the next event after the current event or NULL if there
35*436bf2bcSAndroid Build Coastguard Workerare no more events.
36*436bf2bcSAndroid Build Coastguard Worker
37*436bf2bcSAndroid Build Coastguard Worker*kbuffer_read_at_offset()* returns the event at a given _offset_ from the start of
38*436bf2bcSAndroid Build Coastguard Workerthe sub-buffer stored in _kbuf_, or NULL if there exists no event. Note, _offset_
39*436bf2bcSAndroid Build Coastguard Workeronly needs to be an offset that lands on the record, or is at the start of it. It does
40*436bf2bcSAndroid Build Coastguard Workernot need to be exactly at the beginning of the record.
41*436bf2bcSAndroid Build Coastguard Worker
42*436bf2bcSAndroid Build Coastguard Worker*kbuffer_missed_events()* returns 0 if there were no missed events before loaded sub-buffer.
43*436bf2bcSAndroid Build Coastguard WorkerReturns -1 if there were an unknown number of missed events, or if the number of missed events
44*436bf2bcSAndroid Build Coastguard Workeris known, that number will be returned.
45*436bf2bcSAndroid Build Coastguard Worker
46*436bf2bcSAndroid Build Coastguard Worker*kbuffer_event_size()* returns the size of the data payload of the current event of _kbuf_.
47*436bf2bcSAndroid Build Coastguard Worker
48*436bf2bcSAndroid Build Coastguard Worker*kbuffer_curr_size()* returns the size of the entire record of the current event of _kbuf_.
49*436bf2bcSAndroid Build Coastguard WorkerThis includes the size of the meta data for that record.
50*436bf2bcSAndroid Build Coastguard Worker
51*436bf2bcSAndroid Build Coastguard Worker*kbuf_curr_offset()* returns the offset of the current record from the beginning of the _kbuf_
52*436bf2bcSAndroid Build Coastguard Workersub-buffer.
53*436bf2bcSAndroid Build Coastguard Worker
54*436bf2bcSAndroid Build Coastguard Worker*kbuf_curr_index()* returns the index of the current record from the beginning of the _kbuf_
55*436bf2bcSAndroid Build Coastguard Workerdata section.
56*436bf2bcSAndroid Build Coastguard Worker
57*436bf2bcSAndroid Build Coastguard WorkerEXAMPLE
58*436bf2bcSAndroid Build Coastguard Worker-------
59*436bf2bcSAndroid Build Coastguard Worker[source,c]
60*436bf2bcSAndroid Build Coastguard Worker--
61*436bf2bcSAndroid Build Coastguard Worker#include <stdio.h>
62*436bf2bcSAndroid Build Coastguard Worker#include <stdlib.h>
63*436bf2bcSAndroid Build Coastguard Worker#include <fcntl.h>
64*436bf2bcSAndroid Build Coastguard Worker#include <unistd.h>
65*436bf2bcSAndroid Build Coastguard Worker#include <sys/stat.h>
66*436bf2bcSAndroid Build Coastguard Worker
67*436bf2bcSAndroid Build Coastguard Worker#include <kbuffer.h>
68*436bf2bcSAndroid Build Coastguard Worker
69*436bf2bcSAndroid Build Coastguard Workerint main (int argc, char **argv)
70*436bf2bcSAndroid Build Coastguard Worker{
71*436bf2bcSAndroid Build Coastguard Worker	unsigned long long ts;
72*436bf2bcSAndroid Build Coastguard Worker	struct kbuffer *kbuf;
73*436bf2bcSAndroid Build Coastguard Worker	struct stat st;
74*436bf2bcSAndroid Build Coastguard Worker	char *buf;
75*436bf2bcSAndroid Build Coastguard Worker	void *event;
76*436bf2bcSAndroid Build Coastguard Worker	int save_offset = -1;
77*436bf2bcSAndroid Build Coastguard Worker	int record_size;
78*436bf2bcSAndroid Build Coastguard Worker	int offset;
79*436bf2bcSAndroid Build Coastguard Worker	int index;
80*436bf2bcSAndroid Build Coastguard Worker	int size;
81*436bf2bcSAndroid Build Coastguard Worker	int ret;
82*436bf2bcSAndroid Build Coastguard Worker	int fd;
83*436bf2bcSAndroid Build Coastguard Worker	int i = 0;
84*436bf2bcSAndroid Build Coastguard Worker
85*436bf2bcSAndroid Build Coastguard Worker	if (argc < 2) {
86*436bf2bcSAndroid Build Coastguard Worker		printf("usage: %s raw-subbuffer-page\n", argv[0]);
87*436bf2bcSAndroid Build Coastguard Worker		printf(" Try: dd count=1 bs=4096 if=/sys/kernel/tracing/per_cpu/cpu0/trace_pipe_raw of=/tmp/file\n");
88*436bf2bcSAndroid Build Coastguard Worker		exit(0);
89*436bf2bcSAndroid Build Coastguard Worker	}
90*436bf2bcSAndroid Build Coastguard Worker
91*436bf2bcSAndroid Build Coastguard Worker	if (stat(argv[1], &st) < 0) {
92*436bf2bcSAndroid Build Coastguard Worker		perror("stat");
93*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
94*436bf2bcSAndroid Build Coastguard Worker	}
95*436bf2bcSAndroid Build Coastguard Worker
96*436bf2bcSAndroid Build Coastguard Worker	buf = malloc(st.st_size);
97*436bf2bcSAndroid Build Coastguard Worker	if (!buf) {
98*436bf2bcSAndroid Build Coastguard Worker		perror("Allocating buffer");
99*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
100*436bf2bcSAndroid Build Coastguard Worker	}
101*436bf2bcSAndroid Build Coastguard Worker
102*436bf2bcSAndroid Build Coastguard Worker	fd = open(argv[1], O_RDONLY);
103*436bf2bcSAndroid Build Coastguard Worker	if (fd < 0) {
104*436bf2bcSAndroid Build Coastguard Worker		perror(argv[1]);
105*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
106*436bf2bcSAndroid Build Coastguard Worker	}
107*436bf2bcSAndroid Build Coastguard Worker
108*436bf2bcSAndroid Build Coastguard Worker	ret = read(fd, buf, st.st_size);
109*436bf2bcSAndroid Build Coastguard Worker	if (ret < 0) {
110*436bf2bcSAndroid Build Coastguard Worker		perror("Reading buffer");
111*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
112*436bf2bcSAndroid Build Coastguard Worker	}
113*436bf2bcSAndroid Build Coastguard Worker	close(fd);
114*436bf2bcSAndroid Build Coastguard Worker
115*436bf2bcSAndroid Build Coastguard Worker	kbuf = kbuffer_alloc(KBUFFER_ENDIAN_SAME_AS_HOST,
116*436bf2bcSAndroid Build Coastguard Worker			     KBUFFER_LSIZE_SAME_AS_HOST);
117*436bf2bcSAndroid Build Coastguard Worker	if (!kbuf) {
118*436bf2bcSAndroid Build Coastguard Worker		perror("Creating kbuffer");
119*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
120*436bf2bcSAndroid Build Coastguard Worker	}
121*436bf2bcSAndroid Build Coastguard Worker	ret = kbuffer_load_subbuffer(kbuf, buf);
122*436bf2bcSAndroid Build Coastguard Worker	if (ret < 0) {
123*436bf2bcSAndroid Build Coastguard Worker		perror("Loading sub bufer");
124*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
125*436bf2bcSAndroid Build Coastguard Worker	}
126*436bf2bcSAndroid Build Coastguard Worker
127*436bf2bcSAndroid Build Coastguard Worker	if (kbuffer_subbuffer_size(kbuf) > st.st_size) {
128*436bf2bcSAndroid Build Coastguard Worker		fprintf(stderr, "kbuffer is bigger than raw size %d > %ld\n",
129*436bf2bcSAndroid Build Coastguard Worker			kbuffer_subbuffer_size(kbuf), st.st_size);
130*436bf2bcSAndroid Build Coastguard Worker		exit(-1);
131*436bf2bcSAndroid Build Coastguard Worker	}
132*436bf2bcSAndroid Build Coastguard Worker
133*436bf2bcSAndroid Build Coastguard Worker	ret = kbuffer_missed_events(kbuf);
134*436bf2bcSAndroid Build Coastguard Worker	if (ret) {
135*436bf2bcSAndroid Build Coastguard Worker		if (ret > 0)
136*436bf2bcSAndroid Build Coastguard Worker			printf("Missed %d events before this buffer\n", ret);
137*436bf2bcSAndroid Build Coastguard Worker		else
138*436bf2bcSAndroid Build Coastguard Worker			printf("Missed unknown number of events before this buffer\n");
139*436bf2bcSAndroid Build Coastguard Worker	}
140*436bf2bcSAndroid Build Coastguard Worker	do {
141*436bf2bcSAndroid Build Coastguard Worker		event = kbuffer_read_event(kbuf, &ts);
142*436bf2bcSAndroid Build Coastguard Worker		if (event) {
143*436bf2bcSAndroid Build Coastguard Worker			record_size = kbuffer_curr_size(kbuf);
144*436bf2bcSAndroid Build Coastguard Worker			offset = kbuffer_curr_offset(kbuf);
145*436bf2bcSAndroid Build Coastguard Worker			index = kbuffer_curr_index(kbuf);
146*436bf2bcSAndroid Build Coastguard Worker			size = kbuffer_event_size(kbuf);
147*436bf2bcSAndroid Build Coastguard Worker
148*436bf2bcSAndroid Build Coastguard Worker			if (i == 20)
149*436bf2bcSAndroid Build Coastguard Worker				save_offset = offset;
150*436bf2bcSAndroid Build Coastguard Worker			printf(" event %3d ts:%lld\trecord_size:%d size:%d\tindex:%d offset:%d\n",
151*436bf2bcSAndroid Build Coastguard Worker			       i++, ts, record_size, size, index, offset);
152*436bf2bcSAndroid Build Coastguard Worker			event = kbuffer_next_event(kbuf, NULL);
153*436bf2bcSAndroid Build Coastguard Worker		}
154*436bf2bcSAndroid Build Coastguard Worker	} while (event);
155*436bf2bcSAndroid Build Coastguard Worker
156*436bf2bcSAndroid Build Coastguard Worker	if (!event)
157*436bf2bcSAndroid Build Coastguard Worker		printf("Finished sub buffer\n");
158*436bf2bcSAndroid Build Coastguard Worker
159*436bf2bcSAndroid Build Coastguard Worker	if (save_offset > 0) {
160*436bf2bcSAndroid Build Coastguard Worker		event = kbuffer_read_at_offset(kbuf, save_offset, &ts);
161*436bf2bcSAndroid Build Coastguard Worker		if (!event) {
162*436bf2bcSAndroid Build Coastguard Worker			fprintf(stderr, "Funny, can't find event 20 at offset %d\n", save_offset);
163*436bf2bcSAndroid Build Coastguard Worker			exit(-1);
164*436bf2bcSAndroid Build Coastguard Worker		}
165*436bf2bcSAndroid Build Coastguard Worker		record_size = kbuffer_curr_size(kbuf);
166*436bf2bcSAndroid Build Coastguard Worker		offset = kbuffer_curr_offset(kbuf);
167*436bf2bcSAndroid Build Coastguard Worker		index = kbuffer_curr_index(kbuf);
168*436bf2bcSAndroid Build Coastguard Worker		size = kbuffer_event_size(kbuf);
169*436bf2bcSAndroid Build Coastguard Worker
170*436bf2bcSAndroid Build Coastguard Worker		printf("\n saved event 20 ts:%lld\trecord_size:%d size:%d\tindex:%d offset:%d\n\n",
171*436bf2bcSAndroid Build Coastguard Worker		       ts, record_size, size, index, offset);
172*436bf2bcSAndroid Build Coastguard Worker	}
173*436bf2bcSAndroid Build Coastguard Worker	kbuffer_free(kbuf);
174*436bf2bcSAndroid Build Coastguard Worker
175*436bf2bcSAndroid Build Coastguard Worker	return 0;
176*436bf2bcSAndroid Build Coastguard Worker}
177*436bf2bcSAndroid Build Coastguard Worker--
178*436bf2bcSAndroid Build Coastguard WorkerFILES
179*436bf2bcSAndroid Build Coastguard Worker-----
180*436bf2bcSAndroid Build Coastguard Worker[verse]
181*436bf2bcSAndroid Build Coastguard Worker--
182*436bf2bcSAndroid Build Coastguard Worker*event-parse.h*
183*436bf2bcSAndroid Build Coastguard Worker	Header file to include in order to have access to the library APIs.
184*436bf2bcSAndroid Build Coastguard Worker*-ltraceevent*
185*436bf2bcSAndroid Build Coastguard Worker	Linker switch to add when building a program that uses the library.
186*436bf2bcSAndroid Build Coastguard Worker--
187*436bf2bcSAndroid Build Coastguard Worker
188*436bf2bcSAndroid Build Coastguard WorkerSEE ALSO
189*436bf2bcSAndroid Build Coastguard Worker--------
190*436bf2bcSAndroid Build Coastguard Worker*libtraceevent*(3), *trace-cmd*(1)
191*436bf2bcSAndroid Build Coastguard Worker
192*436bf2bcSAndroid Build Coastguard WorkerAUTHOR
193*436bf2bcSAndroid Build Coastguard Worker------
194*436bf2bcSAndroid Build Coastguard Worker[verse]
195*436bf2bcSAndroid Build Coastguard Worker--
196*436bf2bcSAndroid Build Coastguard Worker*Steven Rostedt* <[email protected]>, author of *libtraceevent*.
197*436bf2bcSAndroid Build Coastguard Worker--
198*436bf2bcSAndroid Build Coastguard WorkerREPORTING BUGS
199*436bf2bcSAndroid Build Coastguard Worker--------------
200*436bf2bcSAndroid Build Coastguard WorkerReport bugs to  <[email protected]>
201*436bf2bcSAndroid Build Coastguard Worker
202*436bf2bcSAndroid Build Coastguard WorkerLICENSE
203*436bf2bcSAndroid Build Coastguard Worker-------
204*436bf2bcSAndroid Build Coastguard Workerlibtraceevent is Free Software licensed under the GNU LGPL 2.1
205*436bf2bcSAndroid Build Coastguard Worker
206*436bf2bcSAndroid Build Coastguard WorkerRESOURCES
207*436bf2bcSAndroid Build Coastguard Worker---------
208*436bf2bcSAndroid Build Coastguard Workerhttps://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/
209