| | |
| | |
| | |
| |
|
| | #ifdef __linux__ |
| | #include <endian.h> |
| | #if __BYTE_ORDER == __LITTLE_ENDIAN |
| | #ifndef _LITTLE_ENDIAN |
| | #define _LITTLE_ENDIAN |
| | #endif |
| | #endif |
| | #endif |
| |
|
| | #include <sys/dtrace.h> |
| | #include <sys/types.h> |
| | #include <sys/mman.h> |
| |
|
| | #include <stdlib.h> |
| | #include <errno.h> |
| | #include <string.h> |
| | #include <fcntl.h> |
| | #include <unistd.h> |
| | #include <stdint.h> |
| | #include <assert.h> |
| |
|
| | #define FUNC_SIZE 32 |
| |
|
| | #include "usdt.h" |
| |
|
| | extern void usdt_tracepoint_isenabled(void); |
| | extern void usdt_tracepoint_probe(void); |
| | extern void usdt_tracepoint_end(void); |
| | extern void usdt_probe_args(void *, int, void**); |
| |
|
| | uint32_t usdt_probe_offset(usdt_probe_t *probe, char *dof, uint8_t argc); |
| | uint32_t usdt_is_enabled_offset(usdt_probe_t *probe, char *dof); |
| | int usdt_create_tracepoints(usdt_probe_t *probe); |
| | void usdt_free_tracepoints(usdt_probe_t *probe); |
| |
|
| | typedef struct usdt_dof_section { |
| | dof_secidx_t index; |
| | uint32_t type; |
| | uint32_t flags; |
| | uint32_t align; |
| | uint64_t offset; |
| | uint64_t size; |
| | uint32_t entsize; |
| | size_t pad; |
| | struct usdt_dof_section *next; |
| | char *data; |
| | } usdt_dof_section_t; |
| |
|
| | int usdt_dof_section_init(usdt_dof_section_t *section, |
| | uint32_t type, dof_secidx_t index); |
| | int usdt_dof_section_add_data(usdt_dof_section_t *section, |
| | void *data, size_t length); |
| | void usdt_dof_section_free(usdt_dof_section_t *section); |
| |
|
| | typedef struct usdt_strtab { |
| | dof_secidx_t index; |
| | uint32_t type; |
| | uint32_t flags; |
| | uint32_t align; |
| | uint64_t offset; |
| | uint64_t size; |
| | uint32_t entsize; |
| | size_t pad; |
| | int strindex; |
| | char *data; |
| | } usdt_strtab_t; |
| |
|
| | int usdt_strtab_init(usdt_strtab_t *strtab, dof_secidx_t index); |
| | dof_stridx_t usdt_strtab_add(usdt_strtab_t *strtab, const char *string); |
| | char *usdt_strtab_header(usdt_strtab_t *strtab); |
| | size_t usdt_strtab_size(usdt_strtab_t *strtab); |
| |
|
| | size_t usdt_provider_dof_size(usdt_provider_t *provider, usdt_strtab_t *strtab); |
| |
|
| | typedef struct usdt_dof_file { |
| | char *dof; |
| | int gen; |
| | size_t size; |
| | usdt_dof_section_t *sections; |
| | } usdt_dof_file_t; |
| |
|
| | usdt_dof_file_t *usdt_dof_file_init(usdt_provider_t *provider, size_t size); |
| | void usdt_dof_file_append_section(usdt_dof_file_t *file, usdt_dof_section_t *section); |
| | void usdt_dof_file_generate(usdt_dof_file_t *file, usdt_strtab_t *strtab); |
| | int usdt_dof_file_load(usdt_dof_file_t *file, const char *module); |
| | int usdt_dof_file_unload(usdt_dof_file_t *file); |
| | void usdt_dof_file_free(usdt_dof_file_t *file); |
| |
|
| | int usdt_dof_probes_sect(usdt_dof_section_t *probes, |
| | usdt_provider_t *provider, usdt_strtab_t *strtab); |
| | int usdt_dof_prargs_sect(usdt_dof_section_t *prargs, |
| | usdt_provider_t *provider); |
| | int usdt_dof_proffs_sect(usdt_dof_section_t *proffs, |
| | usdt_provider_t *provider, char *dof); |
| | int usdt_dof_prenoffs_sect(usdt_dof_section_t *prenoffs, |
| | usdt_provider_t *provider, char *dof); |
| | int usdt_dof_provider_sect(usdt_dof_section_t *provider_s, |
| | usdt_provider_t *provider); |
| |
|
| |
|