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