linux/kernel/trace/trace_probe.h
<<
>>
Prefs
   1/*
   2 * Common header file for probe-based Dynamic events.
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public License
  14 * along with this program; if not, write to the Free Software
  15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  16 *
  17 * This code was copied from kernel/trace/trace_kprobe.h written by
  18 * Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
  19 *
  20 * Updates to make this generic:
  21 * Copyright (C) IBM Corporation, 2010-2011
  22 * Author:     Srikar Dronamraju
  23 */
  24
  25#include <linux/seq_file.h>
  26#include <linux/slab.h>
  27#include <linux/smp.h>
  28#include <linux/tracefs.h>
  29#include <linux/types.h>
  30#include <linux/string.h>
  31#include <linux/ctype.h>
  32#include <linux/ptrace.h>
  33#include <linux/perf_event.h>
  34#include <linux/kprobes.h>
  35#include <linux/stringify.h>
  36#include <linux/limits.h>
  37#include <linux/uaccess.h>
  38#include <asm/bitsperlong.h>
  39
  40#include "trace.h"
  41#include "trace_output.h"
  42
  43#define MAX_TRACE_ARGS          128
  44#define MAX_ARGSTR_LEN          63
  45#define MAX_STRING_SIZE         PATH_MAX
  46
  47/* Reserved field names */
  48#define FIELD_STRING_IP         "__probe_ip"
  49#define FIELD_STRING_RETIP      "__probe_ret_ip"
  50#define FIELD_STRING_FUNC       "__probe_func"
  51
  52#undef DEFINE_FIELD
  53#define DEFINE_FIELD(type, item, name, is_signed)                       \
  54        do {                                                            \
  55                ret = trace_define_field(event_call, #type, name,       \
  56                                         offsetof(typeof(field), item), \
  57                                         sizeof(field.item), is_signed, \
  58                                         FILTER_OTHER);                 \
  59                if (ret)                                                \
  60                        return ret;                                     \
  61        } while (0)
  62
  63
  64/* Flags for trace_probe */
  65#define TP_FLAG_TRACE           1
  66#define TP_FLAG_PROFILE         2
  67#define TP_FLAG_REGISTERED      4
  68
  69
  70/* data_rloc: data relative location, compatible with u32 */
  71#define make_data_rloc(len, roffs)      \
  72        (((u32)(len) << 16) | ((u32)(roffs) & 0xffff))
  73#define get_rloc_len(dl)                ((u32)(dl) >> 16)
  74#define get_rloc_offs(dl)               ((u32)(dl) & 0xffff)
  75
  76/*
  77 * Convert data_rloc to data_loc:
  78 *  data_rloc stores the offset from data_rloc itself, but data_loc
  79 *  stores the offset from event entry.
  80 */
  81#define convert_rloc_to_loc(dl, offs)   ((u32)(dl) + (offs))
  82
  83static nokprobe_inline void *get_rloc_data(u32 *dl)
  84{
  85        return (u8 *)dl + get_rloc_offs(*dl);
  86}
  87
  88/* For data_loc conversion */
  89static nokprobe_inline void *get_loc_data(u32 *dl, void *ent)
  90{
  91        return (u8 *)ent + get_rloc_offs(*dl);
  92}
  93
  94/* Data fetch function type */
  95typedef void (*fetch_func_t)(struct pt_regs *, void *, void *);
  96/* Printing function type */
  97typedef int (*print_type_func_t)(struct trace_seq *, const char *, void *, void *);
  98
  99/* Fetch types */
 100enum {
 101        FETCH_MTD_reg = 0,
 102        FETCH_MTD_stack,
 103        FETCH_MTD_retval,
 104        FETCH_MTD_comm,
 105        FETCH_MTD_memory,
 106        FETCH_MTD_symbol,
 107        FETCH_MTD_deref,
 108        FETCH_MTD_bitfield,
 109        FETCH_MTD_file_offset,
 110        FETCH_MTD_END,
 111};
 112
 113/* Fetch type information table */
 114struct fetch_type {
 115        const char              *name;          /* Name of type */
 116        size_t                  size;           /* Byte size of type */
 117        int                     is_signed;      /* Signed flag */
 118        print_type_func_t       print;          /* Print functions */
 119        const char              *fmt;           /* Fromat string */
 120        const char              *fmttype;       /* Name in format file */
 121        /* Fetch functions */
 122        fetch_func_t            fetch[FETCH_MTD_END];
 123};
 124
 125struct fetch_param {
 126        fetch_func_t            fn;
 127        void                    *data;
 128};
 129
 130/* For defining macros, define string/string_size types */
 131typedef u32 string;
 132typedef u32 string_size;
 133
 134#define PRINT_TYPE_FUNC_NAME(type)      print_type_##type
 135#define PRINT_TYPE_FMT_NAME(type)       print_type_format_##type
 136
 137/* Printing  in basic type function template */
 138#define DECLARE_BASIC_PRINT_TYPE_FUNC(type)                             \
 139int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s, const char *name,   \
 140                                void *data, void *ent);                 \
 141extern const char PRINT_TYPE_FMT_NAME(type)[]
 142
 143DECLARE_BASIC_PRINT_TYPE_FUNC(u8);
 144DECLARE_BASIC_PRINT_TYPE_FUNC(u16);
 145DECLARE_BASIC_PRINT_TYPE_FUNC(u32);
 146DECLARE_BASIC_PRINT_TYPE_FUNC(u64);
 147DECLARE_BASIC_PRINT_TYPE_FUNC(s8);
 148DECLARE_BASIC_PRINT_TYPE_FUNC(s16);
 149DECLARE_BASIC_PRINT_TYPE_FUNC(s32);
 150DECLARE_BASIC_PRINT_TYPE_FUNC(s64);
 151DECLARE_BASIC_PRINT_TYPE_FUNC(x8);
 152DECLARE_BASIC_PRINT_TYPE_FUNC(x16);
 153DECLARE_BASIC_PRINT_TYPE_FUNC(x32);
 154DECLARE_BASIC_PRINT_TYPE_FUNC(x64);
 155
 156DECLARE_BASIC_PRINT_TYPE_FUNC(string);
 157
 158#define FETCH_FUNC_NAME(method, type)   fetch_##method##_##type
 159
 160/* Declare macro for basic types */
 161#define DECLARE_FETCH_FUNC(method, type)                                \
 162extern void FETCH_FUNC_NAME(method, type)(struct pt_regs *regs,         \
 163                                          void *data, void *dest)
 164
 165#define DECLARE_BASIC_FETCH_FUNCS(method)       \
 166DECLARE_FETCH_FUNC(method, u8);                 \
 167DECLARE_FETCH_FUNC(method, u16);                \
 168DECLARE_FETCH_FUNC(method, u32);                \
 169DECLARE_FETCH_FUNC(method, u64)
 170
 171DECLARE_BASIC_FETCH_FUNCS(reg);
 172#define fetch_reg_string                        NULL
 173#define fetch_reg_string_size                   NULL
 174
 175DECLARE_BASIC_FETCH_FUNCS(retval);
 176#define fetch_retval_string                     NULL
 177#define fetch_retval_string_size                NULL
 178
 179DECLARE_BASIC_FETCH_FUNCS(symbol);
 180DECLARE_FETCH_FUNC(symbol, string);
 181DECLARE_FETCH_FUNC(symbol, string_size);
 182
 183DECLARE_BASIC_FETCH_FUNCS(deref);
 184DECLARE_FETCH_FUNC(deref, string);
 185DECLARE_FETCH_FUNC(deref, string_size);
 186
 187DECLARE_BASIC_FETCH_FUNCS(bitfield);
 188#define fetch_bitfield_string                   NULL
 189#define fetch_bitfield_string_size              NULL
 190
 191/* comm only makes sense as a string */
 192#define fetch_comm_u8           NULL
 193#define fetch_comm_u16          NULL
 194#define fetch_comm_u32          NULL
 195#define fetch_comm_u64          NULL
 196DECLARE_FETCH_FUNC(comm, string);
 197DECLARE_FETCH_FUNC(comm, string_size);
 198
 199/*
 200 * Define macro for basic types - we don't need to define s* types, because
 201 * we have to care only about bitwidth at recording time.
 202 */
 203#define DEFINE_BASIC_FETCH_FUNCS(method) \
 204DEFINE_FETCH_##method(u8)               \
 205DEFINE_FETCH_##method(u16)              \
 206DEFINE_FETCH_##method(u32)              \
 207DEFINE_FETCH_##method(u64)
 208
 209/* Default (unsigned long) fetch type */
 210#define __DEFAULT_FETCH_TYPE(t) x##t
 211#define _DEFAULT_FETCH_TYPE(t) __DEFAULT_FETCH_TYPE(t)
 212#define DEFAULT_FETCH_TYPE _DEFAULT_FETCH_TYPE(BITS_PER_LONG)
 213#define DEFAULT_FETCH_TYPE_STR __stringify(DEFAULT_FETCH_TYPE)
 214
 215#define ASSIGN_FETCH_FUNC(method, type) \
 216        [FETCH_MTD_##method] = FETCH_FUNC_NAME(method, type)
 217
 218#define __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, _fmttype) \
 219        {.name = _name,                         \
 220         .size = _size,                                 \
 221         .is_signed = sign,                             \
 222         .print = PRINT_TYPE_FUNC_NAME(ptype),          \
 223         .fmt = PRINT_TYPE_FMT_NAME(ptype),             \
 224         .fmttype = _fmttype,                           \
 225         .fetch = {                                     \
 226ASSIGN_FETCH_FUNC(reg, ftype),                          \
 227ASSIGN_FETCH_FUNC(stack, ftype),                        \
 228ASSIGN_FETCH_FUNC(retval, ftype),                       \
 229ASSIGN_FETCH_FUNC(comm, ftype),                         \
 230ASSIGN_FETCH_FUNC(memory, ftype),                       \
 231ASSIGN_FETCH_FUNC(symbol, ftype),                       \
 232ASSIGN_FETCH_FUNC(deref, ftype),                        \
 233ASSIGN_FETCH_FUNC(bitfield, ftype),                     \
 234ASSIGN_FETCH_FUNC(file_offset, ftype),                  \
 235          }                                             \
 236        }
 237
 238#define ASSIGN_FETCH_TYPE(ptype, ftype, sign)                   \
 239        __ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, #ptype)
 240
 241/* If ptype is an alias of atype, use this macro (show atype in format) */
 242#define ASSIGN_FETCH_TYPE_ALIAS(ptype, atype, ftype, sign)              \
 243        __ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, #atype)
 244
 245#define ASSIGN_FETCH_TYPE_END {}
 246
 247#define FETCH_TYPE_STRING       0
 248#define FETCH_TYPE_STRSIZE      1
 249
 250#ifdef CONFIG_KPROBE_EVENTS
 251struct symbol_cache;
 252unsigned long update_symbol_cache(struct symbol_cache *sc);
 253void free_symbol_cache(struct symbol_cache *sc);
 254struct symbol_cache *alloc_symbol_cache(const char *sym, long offset);
 255bool trace_kprobe_on_func_entry(struct trace_event_call *call);
 256bool trace_kprobe_error_injectable(struct trace_event_call *call);
 257#else
 258/* uprobes do not support symbol fetch methods */
 259#define fetch_symbol_u8                 NULL
 260#define fetch_symbol_u16                NULL
 261#define fetch_symbol_u32                NULL
 262#define fetch_symbol_u64                NULL
 263#define fetch_symbol_string             NULL
 264#define fetch_symbol_string_size        NULL
 265
 266struct symbol_cache {
 267};
 268static inline unsigned long __used update_symbol_cache(struct symbol_cache *sc)
 269{
 270        return 0;
 271}
 272
 273static inline void __used free_symbol_cache(struct symbol_cache *sc)
 274{
 275}
 276
 277static inline struct symbol_cache * __used
 278alloc_symbol_cache(const char *sym, long offset)
 279{
 280        return NULL;
 281}
 282
 283static inline bool trace_kprobe_on_func_entry(struct trace_event_call *call)
 284{
 285        return false;
 286}
 287
 288static inline bool trace_kprobe_error_injectable(struct trace_event_call *call)
 289{
 290        return false;
 291}
 292#endif /* CONFIG_KPROBE_EVENTS */
 293
 294struct probe_arg {
 295        struct fetch_param      fetch;
 296        struct fetch_param      fetch_size;
 297        unsigned int            offset; /* Offset from argument entry */
 298        const char              *name;  /* Name of this argument */
 299        const char              *comm;  /* Command of this argument */
 300        const struct fetch_type *type;  /* Type of this argument */
 301};
 302
 303struct trace_probe {
 304        unsigned int                    flags;  /* For TP_FLAG_* */
 305        struct trace_event_class        class;
 306        struct trace_event_call         call;
 307        struct list_head                files;
 308        ssize_t                         size;   /* trace entry size */
 309        unsigned int                    nr_args;
 310        struct probe_arg                args[];
 311};
 312
 313struct event_file_link {
 314        struct trace_event_file         *file;
 315        struct list_head                list;
 316};
 317
 318static inline bool trace_probe_is_enabled(struct trace_probe *tp)
 319{
 320        return !!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE));
 321}
 322
 323static inline bool trace_probe_is_registered(struct trace_probe *tp)
 324{
 325        return !!(tp->flags & TP_FLAG_REGISTERED);
 326}
 327
 328static nokprobe_inline void call_fetch(struct fetch_param *fprm,
 329                                 struct pt_regs *regs, void *dest)
 330{
 331        return fprm->fn(regs, fprm->data, dest);
 332}
 333
 334/* Check the name is good for event/group/fields */
 335static inline bool is_good_name(const char *name)
 336{
 337        if (!isalpha(*name) && *name != '_')
 338                return false;
 339        while (*++name != '\0') {
 340                if (!isalpha(*name) && !isdigit(*name) && *name != '_')
 341                        return false;
 342        }
 343        return true;
 344}
 345
 346static inline struct event_file_link *
 347find_event_file_link(struct trace_probe *tp, struct trace_event_file *file)
 348{
 349        struct event_file_link *link;
 350
 351        list_for_each_entry(link, &tp->files, list)
 352                if (link->file == file)
 353                        return link;
 354
 355        return NULL;
 356}
 357
 358extern int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
 359                   struct probe_arg *parg, bool is_return, bool is_kprobe,
 360                   const struct fetch_type *ftbl);
 361
 362extern int traceprobe_conflict_field_name(const char *name,
 363                               struct probe_arg *args, int narg);
 364
 365extern void traceprobe_update_arg(struct probe_arg *arg);
 366extern void traceprobe_free_probe_arg(struct probe_arg *arg);
 367
 368extern int traceprobe_split_symbol_offset(char *symbol, long *offset);
 369
 370/* Sum up total data length for dynamic arraies (strings) */
 371static nokprobe_inline int
 372__get_data_size(struct trace_probe *tp, struct pt_regs *regs)
 373{
 374        int i, ret = 0;
 375        u32 len;
 376
 377        for (i = 0; i < tp->nr_args; i++)
 378                if (unlikely(tp->args[i].fetch_size.fn)) {
 379                        call_fetch(&tp->args[i].fetch_size, regs, &len);
 380                        ret += len;
 381                }
 382
 383        return ret;
 384}
 385
 386/* Store the value of each argument */
 387static nokprobe_inline void
 388store_trace_args(int ent_size, struct trace_probe *tp, struct pt_regs *regs,
 389                 u8 *data, int maxlen)
 390{
 391        int i;
 392        u32 end = tp->size;
 393        u32 *dl;        /* Data (relative) location */
 394
 395        for (i = 0; i < tp->nr_args; i++) {
 396                if (unlikely(tp->args[i].fetch_size.fn)) {
 397                        /*
 398                         * First, we set the relative location and
 399                         * maximum data length to *dl
 400                         */
 401                        dl = (u32 *)(data + tp->args[i].offset);
 402                        *dl = make_data_rloc(maxlen, end - tp->args[i].offset);
 403                        /* Then try to fetch string or dynamic array data */
 404                        call_fetch(&tp->args[i].fetch, regs, dl);
 405                        /* Reduce maximum length */
 406                        end += get_rloc_len(*dl);
 407                        maxlen -= get_rloc_len(*dl);
 408                        /* Trick here, convert data_rloc to data_loc */
 409                        *dl = convert_rloc_to_loc(*dl,
 410                                 ent_size + tp->args[i].offset);
 411                } else
 412                        /* Just fetching data normally */
 413                        call_fetch(&tp->args[i].fetch, regs,
 414                                   data + tp->args[i].offset);
 415        }
 416}
 417
 418extern int set_print_fmt(struct trace_probe *tp, bool is_return);
 419
 420#ifdef CONFIG_PERF_EVENTS
 421extern struct trace_event_call *
 422create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
 423                          bool is_return);
 424extern void destroy_local_trace_kprobe(struct trace_event_call *event_call);
 425
 426extern struct trace_event_call *
 427create_local_trace_uprobe(char *name, unsigned long offs, bool is_return);
 428extern void destroy_local_trace_uprobe(struct trace_event_call *event_call);
 429#endif
 430