diff options
Diffstat (limited to 'lib/trace-cmd/include/private/trace-cmd-private.h')
-rw-r--r-- | lib/trace-cmd/include/private/trace-cmd-private.h | 635 |
1 files changed, 635 insertions, 0 deletions
diff --git a/lib/trace-cmd/include/private/trace-cmd-private.h b/lib/trace-cmd/include/private/trace-cmd-private.h new file mode 100644 index 00000000..3cc3e9dd --- /dev/null +++ b/lib/trace-cmd/include/private/trace-cmd-private.h @@ -0,0 +1,635 @@ +/* SPDX-License-Identifier: LGPL-2.1 */ +/* + * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> + * + */ +#ifndef _TRACE_CMD_PRIVATE_H +#define _TRACE_CMD_PRIVATE_H + +#include <fcntl.h> /* for iovec */ +#include <sys/types.h> +#include "event-parse.h" +#include "trace-cmd/trace-cmd.h" + +#define __packed __attribute__((packed)) +#define __hidden __attribute__((visibility ("hidden"))) + +#define TRACECMD_MAGIC { 23, 8, 68 } + +#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0])) +#define __weak __attribute__((weak)) +#define __noreturn __attribute__((noreturn)) + +#define TRACECMD_ERR_MSK ((unsigned long)(-1) & ~((1UL << 14) - 1)) +#define TRACECMD_ISERR(ptr) ((unsigned long)(ptr) > TRACECMD_ERR_MSK) +#define TRACECMD_ERROR(ret) ((void *)((unsigned long)(ret) | TRACECMD_ERR_MSK)) +#define TRACECMD_PTR2ERR(ptr) ((unisgned long)(ptr) & ~TRACECMD_ERR_MSK) + +#define TSCNSEC_CLOCK "tsc2nsec" + +struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep, int flags); + +int *tracecmd_add_id(int *list, int id, int len); + +#define FILE_VERSION_MIN 6 +#define FILE_VERSION_MAX 7 + +#define FILE_VERSION_SECTIONS 7 +#define FILE_VERSION_COMPRESSION 7 + +enum { + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +/* Can be overridden */ +void tracecmd_debug(const char *fmt, ...); + +void tracecmd_record_ref(struct tep_record *record); + +void tracecmd_set_debug(bool set_debug); +bool tracecmd_get_debug(void); + +bool tracecmd_is_version_supported(unsigned int version); +int tracecmd_default_file_version(void); + +struct tracecmd_output; +struct tracecmd_recorder; +struct hook_list; + +/* --- tracecmd plugins --- */ + +enum tracecmd_context { + TRACECMD_INPUT, + TRACECMD_OUTPUT, +}; + +enum tracecmd_plugin_flag { + TRACECMD_DISABLE_SYS_PLUGINS = 1, + TRACECMD_DISABLE_PLUGINS = 1 << 1, +}; + +struct trace_plugin_context; + +struct trace_plugin_context * +tracecmd_plugin_context_create(enum tracecmd_context context, void *data); + +void tracecmd_plugin_set_flag(struct trace_plugin_context *context, + enum tracecmd_plugin_flag flag); + +#define TRACECMD_PLUGIN_LOADER tracecmd_plugin_loader +#define TRACECMD_PLUGIN_UNLOADER tracecmd_plugin_unloader +#define TRACECMD_PLUGIN_ALIAS tracecmd_plugin_alias +#define _MAKE_STR(x) #x +#define MAKE_STR(x) _MAKE_STR(x) +#define TRACECMD_PLUGIN_LOADER_NAME MAKE_STR(TRACECMD_PLUGIN_LOADER) +#define TRACECMD_PLUGIN_UNLOADER_NAME MAKE_STR(TRACECMD_PLUGIN_UNLOADER) +#define TRACECMD_PLUGIN_ALIAS_NAME MAKE_STR(TRACECMD_PLUGIN_ALIAS) + +typedef int (*tracecmd_plugin_load_func)(struct trace_plugin_context *trace); +typedef int (*tracecmd_plugin_unload_func)(struct trace_plugin_context *trace); + +struct tracecmd_input * +tracecmd_plugin_context_input(struct trace_plugin_context *trace_context); +struct tracecmd_output * +tracecmd_plugin_context_output(struct trace_plugin_context *trace_context); + +void tracecmd_set_quiet(struct tracecmd_output *handle, bool set_quiet); +bool tracecmd_get_quiet(struct tracecmd_output *handle); +void tracecmd_set_out_clock(struct tracecmd_output *handle, const char *clock); +const char *tracecmd_get_trace_clock(struct tracecmd_input *handle); + +const char *tracecmd_get_cpustats(struct tracecmd_input *handle); +const char *tracecmd_get_uname(struct tracecmd_input *handle); +const char *tracecmd_get_version(struct tracecmd_input *handle); +off64_t tracecmd_get_cpu_file_size(struct tracecmd_input *handle, int cpu); + +static inline int tracecmd_host_bigendian(void) +{ + unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; + unsigned int *ptr; + + ptr = (unsigned int *)str; + return *ptr == 0x01020304; +} + +/* --- Opening and Reading the trace.dat file --- */ + +enum tracecmd_file_states { + TRACECMD_FILE_ALLOCATED = 0, + TRACECMD_FILE_INIT, + TRACECMD_FILE_HEADERS, + TRACECMD_FILE_FTRACE_EVENTS, + TRACECMD_FILE_ALL_EVENTS, + TRACECMD_FILE_KALLSYMS, + TRACECMD_FILE_PRINTK, + TRACECMD_FILE_CMD_LINES, + TRACECMD_FILE_CPU_COUNT, + TRACECMD_FILE_OPTIONS, + TRACECMD_FILE_CPU_LATENCY, + TRACECMD_FILE_CPU_FLYRECORD, +}; + +enum { + TRACECMD_OPTION_DONE, + TRACECMD_OPTION_DATE, + TRACECMD_OPTION_CPUSTAT, + TRACECMD_OPTION_BUFFER, + TRACECMD_OPTION_TRACECLOCK, + TRACECMD_OPTION_UNAME, + TRACECMD_OPTION_HOOK, + TRACECMD_OPTION_OFFSET, + TRACECMD_OPTION_CPUCOUNT, + TRACECMD_OPTION_VERSION, + TRACECMD_OPTION_PROCMAPS, + TRACECMD_OPTION_TRACEID, + TRACECMD_OPTION_TIME_SHIFT, + TRACECMD_OPTION_GUEST, + TRACECMD_OPTION_TSC2NSEC, + TRACECMD_OPTION_STRINGS, + TRACECMD_OPTION_HEADER_INFO, + TRACECMD_OPTION_FTRACE_EVENTS, + TRACECMD_OPTION_EVENT_FORMATS, + TRACECMD_OPTION_KALLSYMS, + TRACECMD_OPTION_PRINTK, + TRACECMD_OPTION_CMDLINES, + TRACECMD_OPTION_BUFFER_TEXT, + TRACECMD_OPTION_MAX, +}; + +enum { + TRACECMD_FL_IGNORE_DATE = (1 << 0), + TRACECMD_FL_BUFFER_INSTANCE = (1 << 1), + TRACECMD_FL_IN_USECS = (1 << 2), + TRACECMD_FL_RAW_TS = (1 << 3), + TRACECMD_FL_SECTIONED = (1 << 4), + TRACECMD_FL_COMPRESSION = (1 << 5), +}; + +struct tracecmd_ftrace { + struct tracecmd_input *handle; + struct tep_event *fgraph_ret_event; + int fgraph_ret_id; + int long_size; +}; + +struct tracecmd_proc_addr_map { + unsigned long long start; + unsigned long long end; + char *lib_name; +}; + +typedef void (*tracecmd_show_data_func)(struct tracecmd_input *handle, + struct tep_record *record); +typedef void (*tracecmd_handle_init_func)(struct tracecmd_input *handle, + struct hook_list *hook, int global); + +struct tracecmd_input *tracecmd_alloc(const char *file, int flags); +struct tracecmd_input *tracecmd_alloc_fd(int fd, int flags); +void tracecmd_ref(struct tracecmd_input *handle); +int tracecmd_read_headers(struct tracecmd_input *handle, + enum tracecmd_file_states state); +int tracecmd_get_parsing_failures(struct tracecmd_input *handle); +int tracecmd_long_size(struct tracecmd_input *handle); +int tracecmd_page_size(struct tracecmd_input *handle); +int tracecmd_cpus(struct tracecmd_input *handle); +int tracecmd_copy_headers(struct tracecmd_input *in_handle, + struct tracecmd_output *out_handle, + enum tracecmd_file_states start_state, + enum tracecmd_file_states end_state); +int tracecmd_copy_buffer_descr(struct tracecmd_input *in_handle, + struct tracecmd_output *out_handle); +int tracecmd_copy_options(struct tracecmd_input *in_handle, + struct tracecmd_output *out_handle); +int tracecmd_copy_trace_data(struct tracecmd_input *in_handle, + struct tracecmd_output *out_handle); +void tracecmd_set_flag(struct tracecmd_input *handle, int flag); +void tracecmd_clear_flag(struct tracecmd_input *handle, int flag); +unsigned long tracecmd_get_flags(struct tracecmd_input *handle); +enum tracecmd_file_states tracecmd_get_file_state(struct tracecmd_input *handle); +int tracecmd_enable_tsync(struct tracecmd_input *handle, bool enable); + +void tracecmd_parse_trace_clock(struct tracecmd_input *handle, char *file, int size); + +int tracecmd_make_pipe(struct tracecmd_input *handle, int cpu, int fd, int cpus); + +int tracecmd_is_buffer_instance(struct tracecmd_input *handle); + +void tracecmd_set_ts_offset(struct tracecmd_input *handle, long long offset); +void tracecmd_set_ts2secs(struct tracecmd_input *handle, unsigned long long hz); + +void tracecmd_print_events(struct tracecmd_input *handle, const char *regex); + +struct hook_list *tracecmd_hooks(struct tracecmd_input *handle); + +void tracecmd_print_stats(struct tracecmd_input *handle); +void tracecmd_print_uname(struct tracecmd_input *handle); +void tracecmd_print_version(struct tracecmd_input *handle); + +struct tep_record * +tracecmd_peek_data(struct tracecmd_input *handle, int cpu); + +static inline struct tep_record * +tracecmd_peek_data_ref(struct tracecmd_input *handle, int cpu) +{ + struct tep_record *rec = tracecmd_peek_data(handle, cpu); + if (rec) + rec->ref_count++; + return rec; +} + +int tracecmd_latency_data_read(struct tracecmd_input *handle, char **buf, size_t *size); + +struct tep_record * +tracecmd_read_prev(struct tracecmd_input *handle, struct tep_record *record); + +struct tep_record * +tracecmd_read_next_data(struct tracecmd_input *handle, int *rec_cpu); + +struct tep_record * +tracecmd_peek_next_data(struct tracecmd_input *handle, int *rec_cpu); + +struct tep_record * +tracecmd_translate_data(struct tracecmd_input *handle, + void *ptr, int size); +struct tep_record * +tracecmd_read_cpu_last(struct tracecmd_input *handle, int cpu); +int tracecmd_refresh_record(struct tracecmd_input *handle, + struct tep_record *record); + +int tracecmd_set_cpu_to_timestamp(struct tracecmd_input *handle, + int cpu, unsigned long long ts); +void +tracecmd_set_all_cpus_to_timestamp(struct tracecmd_input *handle, + unsigned long long time); + +int tracecmd_set_cursor(struct tracecmd_input *handle, + int cpu, unsigned long long offset); +unsigned long long +tracecmd_get_cursor(struct tracecmd_input *handle, int cpu); + +unsigned long tracecmd_get_in_file_version(struct tracecmd_input *handle); +size_t tracecmd_get_options_offset(struct tracecmd_input *handle); +int tracecmd_get_file_compress_proto(struct tracecmd_input *handle, + const char **name, const char **version); + +int tracecmd_ftrace_overrides(struct tracecmd_input *handle, struct tracecmd_ftrace *finfo); +bool tracecmd_get_use_trace_clock(struct tracecmd_input *handle); +tracecmd_show_data_func +tracecmd_get_show_data_func(struct tracecmd_input *handle); +void tracecmd_set_show_data_func(struct tracecmd_input *handle, + tracecmd_show_data_func func); + +int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct tep_record *record); +unsigned long long tracecmd_page_ts(struct tracecmd_input *handle, + struct tep_record *record); +unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle, + struct tep_record *record); + +struct tracecmd_proc_addr_map * +tracecmd_search_task_map(struct tracecmd_input *handle, + int pid, unsigned long long addr); +#ifndef SWIG +/* hack for function graph work around */ +extern __thread struct tracecmd_input *tracecmd_curr_thread_handle; +#endif + + +/* --- Creating and Writing the trace.dat file --- */ + +struct tracecmd_event_list { + struct tracecmd_event_list *next; + const char *glob; +}; + +struct tracecmd_option; +struct tracecmd_msg_handle; + +int tracecmd_output_set_msg(struct tracecmd_output *handle, + struct tracecmd_msg_handle *msg_handle); +int tracecmd_output_set_trace_dir(struct tracecmd_output *handle, const char *tracing_dir); +int tracecmd_output_set_kallsyms(struct tracecmd_output *handle, const char *kallsyms); +int tracecmd_output_set_from_input(struct tracecmd_output *handle, struct tracecmd_input *ihandle); +int tracecmd_output_set_version(struct tracecmd_output *handle, int file_version); +int tracecmd_output_set_compression(struct tracecmd_output *handle, const char *compression); +int tracecmd_output_write_headers(struct tracecmd_output *handle, + struct tracecmd_event_list *list); + +struct tracecmd_output *tracecmd_output_create(const char *output_file); +struct tracecmd_output *tracecmd_output_create_fd(int fd); +struct tracecmd_output *tracecmd_create_file_latency(const char *output_file, int cpus, + int file_version, const char *compression); + +struct tracecmd_option *tracecmd_add_option(struct tracecmd_output *handle, + unsigned short id, int size, + const void *data); +struct tracecmd_option * +tracecmd_add_option_v(struct tracecmd_output *handle, + unsigned short id, const struct iovec *vector, int count); + +int tracecmd_add_buffer_info(struct tracecmd_output *handle, const char *name, int cpus); +int tracecmd_write_buffer_info(struct tracecmd_output *handle); + +int tracecmd_write_cpus(struct tracecmd_output *handle, int cpus); +int tracecmd_write_cmdlines(struct tracecmd_output *handle); +int tracecmd_write_options(struct tracecmd_output *handle); +int tracecmd_write_meta_strings(struct tracecmd_output *handle); +int tracecmd_append_options(struct tracecmd_output *handle); +void tracecmd_output_close(struct tracecmd_output *handle); +void tracecmd_output_free(struct tracecmd_output *handle); +struct tracecmd_output *tracecmd_copy(struct tracecmd_input *ihandle, const char *file, + enum tracecmd_file_states state, int file_version, + const char *compression); + +int tracecmd_write_cpu_data(struct tracecmd_output *handle, + int cpus, char * const *cpu_data_files, const char *buff_name); +int tracecmd_append_cpu_data(struct tracecmd_output *handle, + int cpus, char * const *cpu_data_files); +int tracecmd_append_buffer_cpu_data(struct tracecmd_output *handle, + const char *name, int cpus, char * const *cpu_data_files); +struct tracecmd_output *tracecmd_get_output_handle_fd(int fd); +unsigned long tracecmd_get_out_file_version(struct tracecmd_output *handle); +unsigned long long tracecmd_get_out_file_offset(struct tracecmd_output *handle); + +/* --- Reading the Fly Recorder Trace --- */ + +enum { + TRACECMD_RECORD_NOSPLICE = (1 << 0), /* Use read instead of splice */ + TRACECMD_RECORD_SNAPSHOT = (1 << 1), /* Extract from snapshot */ + TRACECMD_RECORD_BLOCK_SPLICE = (1 << 2), /* Block on splice write */ + TRACECMD_RECORD_NOBRASS = (1 << 3), /* Splice directly without a brass pipe */ + TRACECMD_RECORD_POLL = (1 << 4), /* Use O_NONBLOCK, poll trace buffers */ +}; + +void tracecmd_free_recorder(struct tracecmd_recorder *recorder); +struct tracecmd_recorder *tracecmd_create_recorder(const char *file, int cpu, unsigned flags); +struct tracecmd_recorder *tracecmd_create_recorder_fd(int fd, int cpu, unsigned flags); +struct tracecmd_recorder *tracecmd_create_recorder_virt(const char *file, int cpu, unsigned flags, int trace_fd); +struct tracecmd_recorder *tracecmd_create_recorder_maxkb(const char *file, int cpu, unsigned flags, int maxkb); +struct tracecmd_recorder *tracecmd_create_buffer_recorder_fd(int fd, int cpu, unsigned flags, const char *buffer); +struct tracecmd_recorder *tracecmd_create_buffer_recorder(const char *file, int cpu, unsigned flags, const char *buffer); +struct tracecmd_recorder *tracecmd_create_buffer_recorder_maxkb(const char *file, int cpu, unsigned flags, const char *buffer, int maxkb); + +int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long sleep); +void tracecmd_stop_recording(struct tracecmd_recorder *recorder); +long tracecmd_flush_recording(struct tracecmd_recorder *recorder); + +enum tracecmd_msg_flags { + TRACECMD_MSG_FL_USE_TCP = 1 << 0, + TRACECMD_MSG_FL_USE_VSOCK = 1 << 1, +}; + +/* for both client and server */ +#ifdef __ANDROID__ +#define MSG_CACHE_FILE "/data/local/tmp/trace_msg_cacheXXXXXX" +#else /* !__ANDROID__ */ +#define MSG_CACHE_FILE "/tmp/trace_msg_cacheXXXXXX" +#endif /* __ANDROID__ */ + +struct tracecmd_msg_handle { + int fd; + short cpu_count; + short version; /* Current protocol version */ + unsigned long flags; + bool done; + bool cache; + int cfd; + char cfile[sizeof(MSG_CACHE_FILE)]; +}; + +struct tracecmd_tsync_protos { + char **names; +}; + +struct tracecmd_msg_handle * +tracecmd_msg_handle_alloc(int fd, unsigned long flags); +int tracecmd_msg_handle_cache(struct tracecmd_msg_handle *msg_handle); + +/* Closes the socket and frees the handle */ +void tracecmd_msg_handle_close(struct tracecmd_msg_handle *msg_handle); + +/* for clients */ +int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle, + unsigned int **client_ports); +int tracecmd_msg_data_send(struct tracecmd_msg_handle *msg_handle, + const char *buf, int size); +int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_send_close_resp_msg(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_wait_close(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle); + +/* for server */ +int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle); +int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle, + unsigned *ports); +int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd); +int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd); +bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle); +void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle); + +int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, + int argc, char **argv, bool use_fifos, + unsigned long long trace_id, + struct tracecmd_tsync_protos *protos); +int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, + int *argc, char ***argv, bool *use_fifos, + unsigned long long *trace_id, + struct tracecmd_tsync_protos **protos); + +int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, + int nr_cpus, int page_size, + unsigned int *ports, bool use_fifos, + unsigned long long trace_id, + const char *tsync_proto, unsigned int tsync_port); +int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, + int *nr_cpus, int *page_size, + unsigned int **ports, bool *use_fifos, + unsigned long long *trace_id, + char **tsync_proto, + unsigned int *tsync_port); + +int tracecmd_msg_send_time_sync(struct tracecmd_msg_handle *msg_handle, + char *sync_protocol, unsigned int sync_msg_id, + unsigned int payload_size, char *payload); +int tracecmd_msg_recv_time_sync(struct tracecmd_msg_handle *msg_handle, + char *sync_protocol, + unsigned int *sync_msg_id, + unsigned int *payload_size, char **payload); + +enum tracecmd_clocks { + TRACECMD_CLOCK_UNKNOWN = 0, + TRACECMD_CLOCK_LOCAL = 1, + TRACECMD_CLOCK_GLOBAL = 1 << 1, + TRACECMD_CLOCK_COUNTER = 1 << 2, + TRACECMD_CLOCK_UPTIME = 1 << 3, + TRACECMD_CLOCK_PERF = 1 << 4, + TRACECMD_CLOCK_MONO = 1 << 5, + TRACECMD_CLOCK_MONO_RAW = 1 << 6, + TRACECMD_CLOCK_BOOT = 1 << 7, + TRACECMD_CLOCK_X86_TSC = 1 << 8 +}; + +enum tracecmd_clocks tracecmd_clock_str2id(const char *clock); +const char *tracecmd_clock_id2str(enum tracecmd_clocks clock); + +/* --- Timestamp synchronization --- */ + +struct tracecmd_time_sync; +#define TRACECMD_TSYNC_PNAME_LENGTH 16 +#define TRACECMD_TSYNC_PROTO_NONE "none" + +enum{ + TRACECMD_TIME_SYNC_CMD_PROBE = 1, + TRACECMD_TIME_SYNC_CMD_STOP = 2, +}; + +enum tracecmd_time_sync_role { + TRACECMD_TIME_SYNC_ROLE_HOST = (1 << 0), + TRACECMD_TIME_SYNC_ROLE_GUEST = (1 << 1), + TRACECMD_TIME_SYNC_ROLE_CLIENT = (1 << 2), + TRACECMD_TIME_SYNC_ROLE_SERVER = (1 << 3), +}; + +/* Timestamp synchronization flags */ +#define TRACECMD_TSYNC_FLAG_INTERPOLATE 0x1 + +void tracecmd_tsync_init(void); +int tracecmd_tsync_proto_getall(struct tracecmd_tsync_protos **protos, const char *clock, int role); +bool tsync_proto_is_supported(const char *proto_name); +struct tracecmd_time_sync * +tracecmd_tsync_with_host(int fd, + const struct tracecmd_tsync_protos *tsync_protos, + const char *clock, int remote_id, int local_id); +int tracecmd_tsync_with_host_stop(struct tracecmd_time_sync *tsync); +struct tracecmd_time_sync * +tracecmd_tsync_with_guest(unsigned long long trace_id, int loop_interval, + unsigned int fd, int guest_pid, + int guest_cpus, const char *proto_name, const char *clock); +int tracecmd_tsync_with_guest_stop(struct tracecmd_time_sync *tsync); +int tracecmd_tsync_get_offsets(struct tracecmd_time_sync *tsync, int cpu, + int *count, long long **ts, + long long **offsets, long long **scalings, long long **frac); +int tracecmd_tsync_get_selected_proto(struct tracecmd_time_sync *tsync, + char **selected_proto); +void tracecmd_tsync_free(struct tracecmd_time_sync *tsync); +int tracecmd_write_guest_time_shift(struct tracecmd_output *handle, + struct tracecmd_time_sync *tsync); + +/* --- Compression --- */ +struct tracecmd_compress_chunk { + unsigned int size; + unsigned int zsize; + off64_t zoffset; + off64_t offset; +}; +struct tracecmd_compression; +struct tracecmd_compression_proto { + int weight; + const char *name; + const char *version; + int (*compress)(void *ctx, const void *in, int in_bytes, void *out, int out_bytes); + int (*uncompress)(void *ctx, const void *in, int in_bytes, void *out, int out_bytes); + unsigned int (*compress_size)(void *ctx, unsigned int bytes); + bool (*is_supported)(const char *name, const char *version); + void *(*new_context)(void); + void (*free_context)(void *ctx); +}; + +struct tracecmd_compression *tracecmd_compress_alloc(const char *name, const char *version, + int fd, struct tep_handle *tep, + struct tracecmd_msg_handle *msg_handle); +void tracecmd_compress_destroy(struct tracecmd_compression *handle); +int tracecmd_compress_block(struct tracecmd_compression *handle); +int tracecmd_uncompress_block(struct tracecmd_compression *handle); +void tracecmd_compress_reset(struct tracecmd_compression *handle); +int tracecmd_compress_buffer_read(struct tracecmd_compression *handle, char *dst, int len); +int tracecmd_compress_pread(struct tracecmd_compression *handle, char *dst, int len, off_t offset); +int tracecmd_compress_buffer_write(struct tracecmd_compression *handle, + const void *data, unsigned long long size); +off64_t tracecmd_compress_lseek(struct tracecmd_compression *handle, off64_t offset, int whence); +int tracecmd_compress_proto_get_name(struct tracecmd_compression *compress, + const char **name, const char **version); +bool tracecmd_compress_is_supported(const char *name, const char *version); +int tracecmd_compress_protos_get(char ***names, char ***versions); +int tracecmd_compress_proto_register(struct tracecmd_compression_proto *proto); +int tracecmd_compress_copy_from(struct tracecmd_compression *handle, int fd, int chunk_size, + unsigned long long *read_size, unsigned long long *write_size); +int tracecmd_uncompress_copy_to(struct tracecmd_compression *handle, int fd, + unsigned long long *read_size, unsigned long long *write_size); +int tracecmd_uncompress_chunk(struct tracecmd_compression *handle, + struct tracecmd_compress_chunk *chunk, char *data); +int tracecmd_load_chunks_info(struct tracecmd_compression *handle, + struct tracecmd_compress_chunk **chunks_info); +/* --- Plugin handling --- */ +extern struct tep_plugin_option trace_ftrace_options[]; + +char **trace_util_find_plugin_files(const char *suffix); +void trace_util_free_plugin_files(char **files); + +/* Used for trace-cmd list */ +void tracecmd_ftrace_load_options(void); + +/* event hooks */ + +struct hook_list { + struct hook_list *next; + struct buffer_instance *instance; + const char *hook; + char *str; + char *start_system; + char *start_event; + char *start_match; + char *end_system; + char *end_event; + char *end_match; + char *pid; + int migrate; + int global; + int stack; +}; + +struct hook_list *tracecmd_create_event_hook(const char *arg); +void tracecmd_free_hooks(struct hook_list *hooks); + +void tracecmd_plog(const char *fmt, ...); +void tracecmd_plog_error(const char *fmt, ...); +int tracecmd_set_logfile(char *logfile); + +/* --- System --- */ +unsigned long long tracecmd_generate_traceid(void); +int tracecmd_count_cpus(void); + +/* --- Hack! --- */ +int tracecmd_blk_hack(struct tracecmd_input *handle); + +/* --- Stack tracer functions --- */ +int tracecmd_stack_tracer_status(int *status); + +/* --- Debugging --- */ +struct kbuffer *tracecmd_record_kbuf(struct tracecmd_input *handle, + struct tep_record *record); +void *tracecmd_record_page(struct tracecmd_input *handle, + struct tep_record *record); +void *tracecmd_record_offset(struct tracecmd_input *handle, + struct tep_record *record); +#ifdef PERF + +#include <linux/perf_event.h> + +/* trace-cmd Perf */ +struct trace_perf { + int fd; + int cpu; + int pid; + int pages; + struct perf_event_attr pe; + struct perf_event_mmap_page *mmap; +}; +int trace_perf_init(struct trace_perf *perf, int pages, int cpu, int pid); +int trace_perf_open(struct trace_perf *perf); +void trace_perf_close(struct trace_perf *perf); +#endif + +#endif /* _TRACE_CMD_PRIVATE_H */ |