18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include "event-parse.h"
88c2ecf20Sopenharmony_ci#include "event-parse-local.h"
98c2ecf20Sopenharmony_ci#include "event-utils.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/**
128c2ecf20Sopenharmony_ci * tep_get_event - returns the event with the given index
138c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
148c2ecf20Sopenharmony_ci * @index: index of the requested event, in the range 0 .. nr_events
158c2ecf20Sopenharmony_ci *
168c2ecf20Sopenharmony_ci * This returns pointer to the element of the events array with the given index
178c2ecf20Sopenharmony_ci * If @tep is NULL, or @index is not in the range 0 .. nr_events, NULL is returned.
188c2ecf20Sopenharmony_ci */
198c2ecf20Sopenharmony_cistruct tep_event *tep_get_event(struct tep_handle *tep, int index)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci	if (tep && tep->events && index < tep->nr_events)
228c2ecf20Sopenharmony_ci		return tep->events[index];
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	return NULL;
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci/**
288c2ecf20Sopenharmony_ci * tep_get_first_event - returns the first event in the events array
298c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
308c2ecf20Sopenharmony_ci *
318c2ecf20Sopenharmony_ci * This returns pointer to the first element of the events array
328c2ecf20Sopenharmony_ci * If @tep is NULL, NULL is returned.
338c2ecf20Sopenharmony_ci */
348c2ecf20Sopenharmony_cistruct tep_event *tep_get_first_event(struct tep_handle *tep)
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	return tep_get_event(tep, 0);
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci/**
408c2ecf20Sopenharmony_ci * tep_get_events_count - get the number of defined events
418c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
428c2ecf20Sopenharmony_ci *
438c2ecf20Sopenharmony_ci * This returns number of elements in event array
448c2ecf20Sopenharmony_ci * If @tep is NULL, 0 is returned.
458c2ecf20Sopenharmony_ci */
468c2ecf20Sopenharmony_ciint tep_get_events_count(struct tep_handle *tep)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	if (tep)
498c2ecf20Sopenharmony_ci		return tep->nr_events;
508c2ecf20Sopenharmony_ci	return 0;
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci/**
548c2ecf20Sopenharmony_ci * tep_set_flag - set event parser flag
558c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
568c2ecf20Sopenharmony_ci * @flag: flag, or combination of flags to be set
578c2ecf20Sopenharmony_ci * can be any combination from enum tep_flag
588c2ecf20Sopenharmony_ci *
598c2ecf20Sopenharmony_ci * This sets a flag or combination of flags from enum tep_flag
608c2ecf20Sopenharmony_ci */
618c2ecf20Sopenharmony_civoid tep_set_flag(struct tep_handle *tep, int flag)
628c2ecf20Sopenharmony_ci{
638c2ecf20Sopenharmony_ci	if (tep)
648c2ecf20Sopenharmony_ci		tep->flags |= flag;
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci/**
688c2ecf20Sopenharmony_ci * tep_clear_flag - clear event parser flag
698c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
708c2ecf20Sopenharmony_ci * @flag: flag to be cleared
718c2ecf20Sopenharmony_ci *
728c2ecf20Sopenharmony_ci * This clears a tep flag
738c2ecf20Sopenharmony_ci */
748c2ecf20Sopenharmony_civoid tep_clear_flag(struct tep_handle *tep, enum tep_flag flag)
758c2ecf20Sopenharmony_ci{
768c2ecf20Sopenharmony_ci	if (tep)
778c2ecf20Sopenharmony_ci		tep->flags &= ~flag;
788c2ecf20Sopenharmony_ci}
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci/**
818c2ecf20Sopenharmony_ci * tep_test_flag - check the state of event parser flag
828c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
838c2ecf20Sopenharmony_ci * @flag: flag to be checked
848c2ecf20Sopenharmony_ci *
858c2ecf20Sopenharmony_ci * This returns the state of the requested tep flag.
868c2ecf20Sopenharmony_ci * Returns: true if the flag is set, false otherwise.
878c2ecf20Sopenharmony_ci */
888c2ecf20Sopenharmony_cibool tep_test_flag(struct tep_handle *tep, enum tep_flag flag)
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	if (tep)
918c2ecf20Sopenharmony_ci		return tep->flags & flag;
928c2ecf20Sopenharmony_ci	return false;
938c2ecf20Sopenharmony_ci}
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci__hidden unsigned short data2host2(struct tep_handle *tep, unsigned short data)
968c2ecf20Sopenharmony_ci{
978c2ecf20Sopenharmony_ci	unsigned short swap;
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci	if (!tep || tep->host_bigendian == tep->file_bigendian)
1008c2ecf20Sopenharmony_ci		return data;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	swap = ((data & 0xffULL) << 8) |
1038c2ecf20Sopenharmony_ci		((data & (0xffULL << 8)) >> 8);
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	return swap;
1068c2ecf20Sopenharmony_ci}
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci__hidden unsigned int data2host4(struct tep_handle *tep, unsigned int data)
1098c2ecf20Sopenharmony_ci{
1108c2ecf20Sopenharmony_ci	unsigned int swap;
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	if (!tep || tep->host_bigendian == tep->file_bigendian)
1138c2ecf20Sopenharmony_ci		return data;
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	swap = ((data & 0xffULL) << 24) |
1168c2ecf20Sopenharmony_ci		((data & (0xffULL << 8)) << 8) |
1178c2ecf20Sopenharmony_ci		((data & (0xffULL << 16)) >> 8) |
1188c2ecf20Sopenharmony_ci		((data & (0xffULL << 24)) >> 24);
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	return swap;
1218c2ecf20Sopenharmony_ci}
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci__hidden  unsigned long long
1248c2ecf20Sopenharmony_cidata2host8(struct tep_handle *tep, unsigned long long data)
1258c2ecf20Sopenharmony_ci{
1268c2ecf20Sopenharmony_ci	unsigned long long swap;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	if (!tep || tep->host_bigendian == tep->file_bigendian)
1298c2ecf20Sopenharmony_ci		return data;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	swap = ((data & 0xffULL) << 56) |
1328c2ecf20Sopenharmony_ci		((data & (0xffULL << 8)) << 40) |
1338c2ecf20Sopenharmony_ci		((data & (0xffULL << 16)) << 24) |
1348c2ecf20Sopenharmony_ci		((data & (0xffULL << 24)) << 8) |
1358c2ecf20Sopenharmony_ci		((data & (0xffULL << 32)) >> 8) |
1368c2ecf20Sopenharmony_ci		((data & (0xffULL << 40)) >> 24) |
1378c2ecf20Sopenharmony_ci		((data & (0xffULL << 48)) >> 40) |
1388c2ecf20Sopenharmony_ci		((data & (0xffULL << 56)) >> 56);
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	return swap;
1418c2ecf20Sopenharmony_ci}
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci/**
1448c2ecf20Sopenharmony_ci * tep_get_header_page_size - get size of the header page
1458c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
1468c2ecf20Sopenharmony_ci *
1478c2ecf20Sopenharmony_ci * This returns size of the header page
1488c2ecf20Sopenharmony_ci * If @tep is NULL, 0 is returned.
1498c2ecf20Sopenharmony_ci */
1508c2ecf20Sopenharmony_ciint tep_get_header_page_size(struct tep_handle *tep)
1518c2ecf20Sopenharmony_ci{
1528c2ecf20Sopenharmony_ci	if (tep)
1538c2ecf20Sopenharmony_ci		return tep->header_page_size_size;
1548c2ecf20Sopenharmony_ci	return 0;
1558c2ecf20Sopenharmony_ci}
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci/**
1588c2ecf20Sopenharmony_ci * tep_get_header_timestamp_size - get size of the timestamp in the header page
1598c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
1608c2ecf20Sopenharmony_ci *
1618c2ecf20Sopenharmony_ci * This returns size of the timestamp in the header page
1628c2ecf20Sopenharmony_ci * If @tep is NULL, 0 is returned.
1638c2ecf20Sopenharmony_ci */
1648c2ecf20Sopenharmony_ciint tep_get_header_timestamp_size(struct tep_handle *tep)
1658c2ecf20Sopenharmony_ci{
1668c2ecf20Sopenharmony_ci	if (tep)
1678c2ecf20Sopenharmony_ci		return tep->header_page_ts_size;
1688c2ecf20Sopenharmony_ci	return 0;
1698c2ecf20Sopenharmony_ci}
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci/**
1728c2ecf20Sopenharmony_ci * tep_get_cpus - get the number of CPUs
1738c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
1748c2ecf20Sopenharmony_ci *
1758c2ecf20Sopenharmony_ci * This returns the number of CPUs
1768c2ecf20Sopenharmony_ci * If @tep is NULL, 0 is returned.
1778c2ecf20Sopenharmony_ci */
1788c2ecf20Sopenharmony_ciint tep_get_cpus(struct tep_handle *tep)
1798c2ecf20Sopenharmony_ci{
1808c2ecf20Sopenharmony_ci	if (tep)
1818c2ecf20Sopenharmony_ci		return tep->cpus;
1828c2ecf20Sopenharmony_ci	return 0;
1838c2ecf20Sopenharmony_ci}
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci/**
1868c2ecf20Sopenharmony_ci * tep_set_cpus - set the number of CPUs
1878c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
1888c2ecf20Sopenharmony_ci *
1898c2ecf20Sopenharmony_ci * This sets the number of CPUs
1908c2ecf20Sopenharmony_ci */
1918c2ecf20Sopenharmony_civoid tep_set_cpus(struct tep_handle *tep, int cpus)
1928c2ecf20Sopenharmony_ci{
1938c2ecf20Sopenharmony_ci	if (tep)
1948c2ecf20Sopenharmony_ci		tep->cpus = cpus;
1958c2ecf20Sopenharmony_ci}
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci/**
1988c2ecf20Sopenharmony_ci * tep_get_long_size - get the size of a long integer on the traced machine
1998c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2008c2ecf20Sopenharmony_ci *
2018c2ecf20Sopenharmony_ci * This returns the size of a long integer on the traced machine
2028c2ecf20Sopenharmony_ci * If @tep is NULL, 0 is returned.
2038c2ecf20Sopenharmony_ci */
2048c2ecf20Sopenharmony_ciint tep_get_long_size(struct tep_handle *tep)
2058c2ecf20Sopenharmony_ci{
2068c2ecf20Sopenharmony_ci	if (tep)
2078c2ecf20Sopenharmony_ci		return tep->long_size;
2088c2ecf20Sopenharmony_ci	return 0;
2098c2ecf20Sopenharmony_ci}
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci/**
2128c2ecf20Sopenharmony_ci * tep_set_long_size - set the size of a long integer on the traced machine
2138c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2148c2ecf20Sopenharmony_ci * @size: size, in bytes, of a long integer
2158c2ecf20Sopenharmony_ci *
2168c2ecf20Sopenharmony_ci * This sets the size of a long integer on the traced machine
2178c2ecf20Sopenharmony_ci */
2188c2ecf20Sopenharmony_civoid tep_set_long_size(struct tep_handle *tep, int long_size)
2198c2ecf20Sopenharmony_ci{
2208c2ecf20Sopenharmony_ci	if (tep)
2218c2ecf20Sopenharmony_ci		tep->long_size = long_size;
2228c2ecf20Sopenharmony_ci}
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci/**
2258c2ecf20Sopenharmony_ci * tep_get_page_size - get the size of a memory page on the traced machine
2268c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2278c2ecf20Sopenharmony_ci *
2288c2ecf20Sopenharmony_ci * This returns the size of a memory page on the traced machine
2298c2ecf20Sopenharmony_ci * If @tep is NULL, 0 is returned.
2308c2ecf20Sopenharmony_ci */
2318c2ecf20Sopenharmony_ciint tep_get_page_size(struct tep_handle *tep)
2328c2ecf20Sopenharmony_ci{
2338c2ecf20Sopenharmony_ci	if (tep)
2348c2ecf20Sopenharmony_ci		return tep->page_size;
2358c2ecf20Sopenharmony_ci	return 0;
2368c2ecf20Sopenharmony_ci}
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci/**
2398c2ecf20Sopenharmony_ci * tep_set_page_size - set the size of a memory page on the traced machine
2408c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2418c2ecf20Sopenharmony_ci * @_page_size: size of a memory page, in bytes
2428c2ecf20Sopenharmony_ci *
2438c2ecf20Sopenharmony_ci * This sets the size of a memory page on the traced machine
2448c2ecf20Sopenharmony_ci */
2458c2ecf20Sopenharmony_civoid tep_set_page_size(struct tep_handle *tep, int _page_size)
2468c2ecf20Sopenharmony_ci{
2478c2ecf20Sopenharmony_ci	if (tep)
2488c2ecf20Sopenharmony_ci		tep->page_size = _page_size;
2498c2ecf20Sopenharmony_ci}
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci/**
2528c2ecf20Sopenharmony_ci * tep_is_file_bigendian - return the endian of the file
2538c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2548c2ecf20Sopenharmony_ci *
2558c2ecf20Sopenharmony_ci * This returns true if the file is in big endian order
2568c2ecf20Sopenharmony_ci * If @tep is NULL, false is returned.
2578c2ecf20Sopenharmony_ci */
2588c2ecf20Sopenharmony_cibool tep_is_file_bigendian(struct tep_handle *tep)
2598c2ecf20Sopenharmony_ci{
2608c2ecf20Sopenharmony_ci	if (tep)
2618c2ecf20Sopenharmony_ci		return (tep->file_bigendian == TEP_BIG_ENDIAN);
2628c2ecf20Sopenharmony_ci	return false;
2638c2ecf20Sopenharmony_ci}
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci/**
2668c2ecf20Sopenharmony_ci * tep_set_file_bigendian - set if the file is in big endian order
2678c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2688c2ecf20Sopenharmony_ci * @endian: non zero, if the file is in big endian order
2698c2ecf20Sopenharmony_ci *
2708c2ecf20Sopenharmony_ci * This sets if the file is in big endian order
2718c2ecf20Sopenharmony_ci */
2728c2ecf20Sopenharmony_civoid tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian)
2738c2ecf20Sopenharmony_ci{
2748c2ecf20Sopenharmony_ci	if (tep)
2758c2ecf20Sopenharmony_ci		tep->file_bigendian = endian;
2768c2ecf20Sopenharmony_ci}
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci/**
2798c2ecf20Sopenharmony_ci * tep_is_local_bigendian - return the endian of the saved local machine
2808c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2818c2ecf20Sopenharmony_ci *
2828c2ecf20Sopenharmony_ci * This returns true if the saved local machine in @tep is big endian.
2838c2ecf20Sopenharmony_ci * If @tep is NULL, false is returned.
2848c2ecf20Sopenharmony_ci */
2858c2ecf20Sopenharmony_cibool tep_is_local_bigendian(struct tep_handle *tep)
2868c2ecf20Sopenharmony_ci{
2878c2ecf20Sopenharmony_ci	if (tep)
2888c2ecf20Sopenharmony_ci		return (tep->host_bigendian == TEP_BIG_ENDIAN);
2898c2ecf20Sopenharmony_ci	return 0;
2908c2ecf20Sopenharmony_ci}
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci/**
2938c2ecf20Sopenharmony_ci * tep_set_local_bigendian - set the stored local machine endian order
2948c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
2958c2ecf20Sopenharmony_ci * @endian: non zero, if the local host has big endian order
2968c2ecf20Sopenharmony_ci *
2978c2ecf20Sopenharmony_ci * This sets the endian order for the local machine.
2988c2ecf20Sopenharmony_ci */
2998c2ecf20Sopenharmony_civoid tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian)
3008c2ecf20Sopenharmony_ci{
3018c2ecf20Sopenharmony_ci	if (tep)
3028c2ecf20Sopenharmony_ci		tep->host_bigendian = endian;
3038c2ecf20Sopenharmony_ci}
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci/**
3068c2ecf20Sopenharmony_ci * tep_is_old_format - get if an old kernel is used
3078c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
3088c2ecf20Sopenharmony_ci *
3098c2ecf20Sopenharmony_ci * This returns true, if an old kernel is used to generate the tracing events or
3108c2ecf20Sopenharmony_ci * false if a new kernel is used. Old kernels did not have header page info.
3118c2ecf20Sopenharmony_ci * If @tep is NULL, false is returned.
3128c2ecf20Sopenharmony_ci */
3138c2ecf20Sopenharmony_cibool tep_is_old_format(struct tep_handle *tep)
3148c2ecf20Sopenharmony_ci{
3158c2ecf20Sopenharmony_ci	if (tep)
3168c2ecf20Sopenharmony_ci		return tep->old_format;
3178c2ecf20Sopenharmony_ci	return false;
3188c2ecf20Sopenharmony_ci}
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci/**
3218c2ecf20Sopenharmony_ci * tep_set_test_filters - set a flag to test a filter string
3228c2ecf20Sopenharmony_ci * @tep: a handle to the tep_handle
3238c2ecf20Sopenharmony_ci * @test_filters: the new value of the test_filters flag
3248c2ecf20Sopenharmony_ci *
3258c2ecf20Sopenharmony_ci * This sets a flag to test a filter string. If this flag is set, when
3268c2ecf20Sopenharmony_ci * tep_filter_add_filter_str() API as called,it will print the filter string
3278c2ecf20Sopenharmony_ci * instead of adding it.
3288c2ecf20Sopenharmony_ci */
3298c2ecf20Sopenharmony_civoid tep_set_test_filters(struct tep_handle *tep, int test_filters)
3308c2ecf20Sopenharmony_ci{
3318c2ecf20Sopenharmony_ci	if (tep)
3328c2ecf20Sopenharmony_ci		tep->test_filters = test_filters;
3338c2ecf20Sopenharmony_ci}
334