One Level Up
Top Level
include/ktap_types.h - ktap
Data types defined
Functions defined
Macros defined
Source code
- #ifndef __KTAP_TYPES_H__
- #define __KTAP_TYPES_H__
- #ifdef __KERNEL__
- #include <linux/perf_event.h>
- #else
- typedef char u8;
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdint.h>
- typedef int ptrdiff_t;
- #endif
- #include "../include/ktap_bc.h"
- #define KP_MAX_MEMPOOL_SIZE 10000
- #define KP_MAX_STR 512
- #define KP_MAX_STRNUM 9999
- #define KP_MAX_STRTAB (1<<26)
- #define KP_MAX_HBITS 26
- #define KP_MAX_ABITS 28
- #define KP_MAX_ASIZE ((1<<(KP_MAX_ABITS-1))+1)
- #define KP_MAX_COLOSIZE 16
- #define KP_MAX_LINE 1000
- #define KP_MAX_XLEVEL 200
- #define KP_MAX_BCINS (1<<26)
- #define KP_MAX_SLOTS 250
- #define KP_MAX_LOCVAR 200
- #define KP_MAX_UPVAL 60
- #define KP_MAX_CACHED_CFUNCTION 128
- #define KP_MAX_STACK_DEPTH 50
- typedef struct ktap_eventdesc {
- int nr;
- int *id_arr;
- char *filter;
- } ktap_eventdesc_t;
- typedef struct ktap_option {
- char *trunk;
- int trunk_len;
- int argc;
- char **argv;
- int verbose;
- int trace_pid;
- int workload;
- int trace_cpu;
- int print_timestamp;
- int quiet;
- int dry_run;
- } ktap_option_t;
- #define KTAP_CMD_IOC_VERSION ('$' + 0)
- #define KTAP_CMD_IOC_RUN ('$' + 1)
- #define KTAP_CMD_IOC_EXIT ('$' + 3)
- #define KTAP_VERSION_MAJOR "0"
- #define KTAP_VERSION_MINOR "4"
- #define KTAP_VERSION "ktap " KTAP_VERSION_MAJOR "." KTAP_VERSION_MINOR
- #define KTAP_AUTHOR "Jovi Zhangwei <jovi.zhangwei@gmail.com>"
- #define KTAP_COPYRIGHT KTAP_VERSION " Copyright (C) 2012-2014, " KTAP_AUTHOR
- #define MYINT(s) (s[0] - '0')
- #define VERSION (MYINT(KTAP_VERSION_MAJOR) * 16 + MYINT(KTAP_VERSION_MINOR))
- typedef long ktap_number;
- typedef int ktap_instr_t;
- typedef union ktap_obj ktap_obj_t;
- struct ktap_state;
- typedef int (*ktap_cfunction) (struct ktap_state *ks);
- typedef struct ktap_val {
- union {
- ktap_obj_t *gc;
- void *p;
- ktap_cfunction f;
- ktap_number n;
- struct {
- uint16_t depth;
- uint16_t skip;
- } stack;
- } val;
- union {
- int type;
- const unsigned int *pcr;
- };
- } ktap_val_t;
- typedef ktap_val_t *StkId;
- #define GCHeader ktap_obj_t *nextgc; u8 gct;
- typedef struct ktap_str {
- GCHeader;
- u8 reserved;
- u8 extra;
- unsigned int hash;
- int len;
- } ktap_str_t;
- typedef struct ktap_upval {
- GCHeader;
- uint8_t closed;
- uint8_t immutable;
- union {
- ktap_val_t tv;
- struct {
- struct ktap_upval *prev;
- struct ktap_upval *next;
- };
- };
- ktap_val_t *v;
- } ktap_upval_t;
- typedef struct ktap_func {
- GCHeader;
- u8 nupvalues;
- BCIns *pc;
- struct ktap_proto *p;
- struct ktap_upval *upvals[1];
- } ktap_func_t;
- typedef struct ktap_proto {
- GCHeader;
- uint8_t numparams;
- uint8_t framesize;
- int sizebc;
- ktap_obj_t *gclist;
- void *k;
- void *uv;
- int sizekgc;
- int sizekn;
- int sizept;
- uint8_t sizeuv;
- uint8_t flags;
-
- ktap_str_t *chunkname;
- BCLine firstline;
- BCLine numline;
- void *lineinfo;
- void *uvinfo;
- void *varinfo;
- } ktap_proto_t;
- #define PROTO_CHILD 0x01
- #define PROTO_VARARG 0x02
- #define PROTO_FFI 0x04
- #define PROTO_NOJIT 0x08
- #define PROTO_ILOOP 0x10
- #define PROTO_HAS_RETURN 0x20
- #define PROTO_FIXUP_RETURN 0x40
- #define PROTO_CLCOUNT 0x20
- #define PROTO_CLC_BITS 3
- #define PROTO_CLC_POLY (3*PROTO_CLCOUNT)
- #define PROTO_UV_LOCAL 0x8000
- #define PROTO_UV_IMMUTABLE 0x4000
- #define proto_kgc(pt, idx) (((ktap_obj_t *)(pt)->k)[idx])
- #define proto_bc(pt) ((BCIns *)((char *)(pt) + sizeof(ktap_proto_t)))
- #define proto_bcpos(pt, pc) ((BCPos)((pc) - proto_bc(pt)))
- #define proto_uv(pt) ((uint16_t *)(pt)->uv)
- #define proto_chunkname(pt) ((pt)->chunkname)
- #define proto_lineinfo(pt) ((const void *)(pt)->lineinfo)
- #define proto_uvinfo(pt) ((const uint8_t *)(pt)->uvinfo)
- #define proto_varinfo(pt) ((const uint8_t *)(pt)->varinfo)
- typedef struct ktap_node_t {
- ktap_val_t val;
- ktap_val_t key;
- struct ktap_node_t *next;
- } ktap_node_t;
- typedef struct ktap_tab {
- GCHeader;
- #ifdef __KERNEL__
- arch_spinlock_t lock;
- #endif
- ktap_val_t *array;
- ktap_node_t *node;
- ktap_node_t *freetop;
- uint32_t asize;
- uint32_t hmask;
- uint32_t hnum;
- ktap_obj_t *gclist;
- } ktap_tab_t;
- #ifdef CONFIG_KTAP_FFI
- typedef int csymbol_id;
- typedef uint64_t cdata_number;
- typedef struct csymbol csymbol;
- typedef struct ffi_state {
- ktap_tab_t *ctable;
- int csym_nr;
- csymbol *csym_arr;
- } ffi_state;
- typedef struct ktap_cdata {
- GCHeader;
- csymbol_id id;
- union {
- cdata_number i;
- struct {
- void *addr;
- int nmemb;
- } p;
- void *rec;
- } u;
- } ktap_cdata_t;
- #endif
- typedef struct ktap_stats {
- int mem_allocated;
- int nr_mem_allocate;
- int events_hits;
- int events_missed;
- } ktap_stats_t;
- #define KTAP_STATS(ks) this_cpu_ptr(G(ks)->stats)
- #define KTAP_RUNNING 0
- #define KTAP_TRACE_END 1
- #define KTAP_EXIT 2
- #define KTAP_ERROR 3
- typedef struct ktap_global_state {
- void *mempool;
- void *mp_freepos;
- int mp_size;
- #ifdef __KERNEL__
- arch_spinlock_t mp_lock;
- #endif
- ktap_str_t **strhash;
- int strmask;
- int strnum;
- #ifdef __KERNEL__
- arch_spinlock_t str_lock;
- #endif
- ktap_val_t registry;
- ktap_tab_t *gtab;
- ktap_obj_t *allgc;
- ktap_upval_t uvhead;
- struct ktap_state *mainthread;
- int state;
- #ifdef __KERNEL__
-
- void __percpu *percpu_state[PERF_NR_CONTEXTS];
- void __percpu *percpu_print_buffer[PERF_NR_CONTEXTS];
- void __percpu *percpu_temp_buffer[PERF_NR_CONTEXTS];
-
- int __percpu *recursion_context[PERF_NR_CONTEXTS];
- ktap_option_t *parm;
- pid_t trace_pid;
- struct task_struct *trace_task;
- cpumask_var_t cpumask;
- struct ring_buffer *buffer;
- struct dentry *trace_pipe_dentry;
- struct task_struct *task;
- int trace_enabled;
- int wait_user;
- struct list_head timers;
- struct ktap_stats __percpu *stats;
- struct list_head events_head;
- ktap_func_t *trace_end_closure;
- #ifdef CONFIG_KTAP_FFI
- ffi_state ffis;
- #endif
-
- int nr_builtin_cfunction;
- ktap_cfunction gfunc_tbl[KP_MAX_CACHED_CFUNCTION];
- #endif
- } ktap_global_state_t;
- typedef struct ktap_state {
- ktap_global_state_t *g;
- int stop;
- StkId top;
- StkId func;
- StkId stack_last;
- StkId stack;
- ktap_upval_t *openupval;
- #ifdef __KERNEL__
-
- struct ktap_event_data *current_event;
- #endif
- } ktap_state_t;
- #define G(ks) (ks->g)
- typedef struct ktap_rawobj {
- GCHeader;
- void *v;
- } ktap_rawobj;
- union ktap_obj {
- struct { GCHeader } gch;
- struct ktap_str ts;
- struct ktap_func fn;
- struct ktap_tab h;
- struct ktap_proto pt;
- struct ktap_upval uv;
- struct ktap_state th;
- struct ktap_rawobj rawobj;
- #ifdef CONFIG_KTAP_FFI
- struct ktap_cdata cd;
- #endif
- };
- #define gch(o) (&(o)->gch)
- #define gco2ts(o) (&((o)->ts))
- #define gco2uv(o) (&((o)->uv))
- #define obj2gco(v) ((ktap_obj_t *)(v))
- #define KTAP_RIDX_GLOBALS 1
- #define KTAP_RIDX_LAST KTAP_RIDX_GLOBALS
- #define KTAP_TNIL (~0u)
- #define KTAP_TFALSE (~1u)
- #define KTAP_TTRUE (~2u)
- #define KTAP_TNUM (~3u)
- #define KTAP_TLIGHTUD (~4u)
- #define KTAP_TSTR (~5u)
- #define KTAP_TUPVAL (~6u)
- #define KTAP_TTHREAD (~7u)
- #define KTAP_TPROTO (~8u)
- #define KTAP_TFUNC (~9u)
- #define KTAP_TCFUNC (~10u)
- #define KTAP_TCDATA (~11u)
- #define KTAP_TTAB (~12u)
- #define KTAP_TUDATA (~13u)
- #define KTAP_TEVENTSTR (~14u)
- #define KTAP_TKSTACK (~15u)
- #define KTAP_TKIP (~16u)
- #define KTAP_TUIP (~17u)
- #define KTAP_TNUMX (~18u)
- #define itype(o) ((o)->type)
- #define setitype(o, t) ((o)->type = (t))
- #define val_(o) ((o)->val)
- #define gcvalue(o) (val_(o).gc)
- #define nvalue(o) (val_(o).n)
- #define boolvalue(o) (KTAP_TFALSE - (o)->type)
- #define hvalue(o) (&val_(o).gc->h)
- #define phvalue(o) (&val_(o).gc->ph)
- #define clvalue(o) (&val_(o).gc->fn)
- #define ptvalue(o) (&val_(o).gc->pt)
- #define getstr(ts) (const char *)((ts) + 1)
- #define rawtsvalue(o) (&val_(o).gc->ts)
- #define svalue(o) getstr(rawtsvalue(o))
- #define pvalue(o) (&val_(o).p)
- #define fvalue(o) (val_(o).f)
- #ifdef CONFIG_KTAP_FFI
- #define cdvalue(o) (&val_(o).gc->cd)
- #endif
- #define is_nil(o) (itype(o) == KTAP_TNIL)
- #define is_false(o) (itype(o) == KTAP_TFALSE)
- #define is_true(o) (itype(o) == KTAP_TTRUE)
- #define is_bool(o) (is_false(o) || is_true(o))
- #define is_string(o) (itype(o) == KTAP_TSTR)
- #define is_number(o) (itype(o) == KTAP_TNUM)
- #define is_table(o) (itype(o) == KTAP_TTAB)
- #define is_proto(o) (itype(o) == KTAP_TPROTO)
- #define is_function(o) (itype(o) == KTAP_TFUNC)
- #define is_cfunc(o) (itype(o) == KTAP_TCFUNC)
- #define is_eventstr(o) (itype(o) == KTAP_TEVENTSTR)
- #define is_kip(o) (itype(o) == KTAP_TKIP)
- #define is_btrace(o) (itype(o) == KTAP_TBTRACE)
- #ifdef CONFIG_KTAP_FFI
- #define is_cdata(o) (itype(o) == KTAP_TCDATA)
- #endif
- #define set_nil(o) ((o)->type = KTAP_TNIL)
- #define set_bool(o, x) ((o)->type = KTAP_TFALSE-(uint32_t)(x))
- static inline void set_number(ktap_val_t *o, ktap_number n)
- {
- setitype(o, KTAP_TNUM);
- o->val.n = n;
- }
- static inline void set_string(ktap_val_t *o, const ktap_str_t *str)
- {
- setitype(o, KTAP_TSTR);
- o->val.gc = (ktap_obj_t *)str;
- }
- static inline void set_table(ktap_val_t *o, ktap_tab_t *tab)
- {
- setitype(o, KTAP_TTAB);
- o->val.gc = (ktap_obj_t *)tab;
- }
- static inline void set_proto(ktap_val_t *o, ktap_proto_t *pt)
- {
- setitype(o, KTAP_TPROTO);
- o->val.gc = (ktap_obj_t *)pt;
- }
- static inline void set_kstack(ktap_val_t *o, uint16_t depth, uint16_t skip)
- {
- setitype(o, KTAP_TKSTACK);
- o->val.stack.depth = depth;
- o->val.stack.skip = skip;
- }
- static inline void set_func(ktap_val_t *o, ktap_func_t *fn)
- {
- setitype(o, KTAP_TFUNC);
- o->val.gc = (ktap_obj_t *)fn;
- }
- static inline void set_cfunc(ktap_val_t *o, ktap_cfunction fn)
- {
- setitype(o, KTAP_TCFUNC);
- o->val.f = fn;
- }
- static inline void set_eventstr(ktap_val_t *o)
- {
- setitype(o, KTAP_TEVENTSTR);
- }
- static inline void set_ip(ktap_val_t *o, unsigned long addr)
- {
- setitype(o, KTAP_TKIP);
- o->val.n = addr;
- }
- #ifdef CONFIG_KTAP_FFI
- #define set_cdata(o, x) { setitype(o, KTAP_TCDATA); (o)->val.gc = x; }
- #endif
- #define set_obj(o1, o2) { *(o1) = *(o2); }
- #define incr_top(ks) {ks->top++;}
- #define KTAP_QL(x) "'" x "'"
- #define KTAP_QS KTAP_QL("%s")
- #endif
One Level Up
Top Level