linux/arch/mips/include/asm/ftrace.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive for
   4 * more details.
   5 *
   6 * Copyright (C) 2009 DSLab, Lanzhou University, China
   7 * Author: Wu Zhangjin <wuzhangjin@gmail.com>
   8 */
   9
  10#ifndef _ASM_MIPS_FTRACE_H
  11#define _ASM_MIPS_FTRACE_H
  12
  13#ifdef CONFIG_FUNCTION_TRACER
  14
  15#define MCOUNT_ADDR ((unsigned long)(_mcount))
  16#define MCOUNT_INSN_SIZE 4              /* sizeof mcount call */
  17
  18#ifndef __ASSEMBLY__
  19extern void _mcount(void);
  20#define mcount _mcount
  21
  22#define safe_load(load, src, dst, error)                \
  23do {                                                    \
  24        asm volatile (                                  \
  25                "1: " load " %[tmp_dst], 0(%[tmp_src])\n"       \
  26                "   li %[tmp_err], 0\n"                 \
  27                "2: .insn\n"                            \
  28                                                        \
  29                ".section .fixup, \"ax\"\n"             \
  30                "3: li %[tmp_err], 1\n"                 \
  31                "   j 2b\n"                             \
  32                ".previous\n"                           \
  33                                                        \
  34                ".section\t__ex_table,\"a\"\n\t"        \
  35                STR(PTR) "\t1b, 3b\n\t"                 \
  36                ".previous\n"                           \
  37                                                        \
  38                : [tmp_dst] "=&r" (dst), [tmp_err] "=r" (error)\
  39                : [tmp_src] "r" (src)                   \
  40                : "memory"                              \
  41        );                                              \
  42} while (0)
  43
  44#define safe_store(store, src, dst, error)      \
  45do {                                            \
  46        asm volatile (                          \
  47                "1: " store " %[tmp_src], 0(%[tmp_dst])\n"\
  48                "   li %[tmp_err], 0\n"         \
  49                "2: .insn\n"                    \
  50                                                \
  51                ".section .fixup, \"ax\"\n"     \
  52                "3: li %[tmp_err], 1\n"         \
  53                "   j 2b\n"                     \
  54                ".previous\n"                   \
  55                                                \
  56                ".section\t__ex_table,\"a\"\n\t"\
  57                STR(PTR) "\t1b, 3b\n\t"         \
  58                ".previous\n"                   \
  59                                                \
  60                : [tmp_err] "=r" (error)        \
  61                : [tmp_dst] "r" (dst), [tmp_src] "r" (src)\
  62                : "memory"                      \
  63        );                                      \
  64} while (0)
  65
  66#define safe_load_code(dst, src, error) \
  67        safe_load(STR(lw), src, dst, error)
  68#define safe_store_code(src, dst, error) \
  69        safe_store(STR(sw), src, dst, error)
  70
  71#define safe_load_stack(dst, src, error) \
  72        safe_load(STR(PTR_L), src, dst, error)
  73
  74#define safe_store_stack(src, dst, error) \
  75        safe_store(STR(PTR_S), src, dst, error)
  76
  77
  78#ifdef CONFIG_DYNAMIC_FTRACE
  79static inline unsigned long ftrace_call_adjust(unsigned long addr)
  80{
  81        return addr;
  82}
  83
  84struct dyn_arch_ftrace {
  85};
  86
  87#endif /*  CONFIG_DYNAMIC_FTRACE */
  88#endif /* __ASSEMBLY__ */
  89#endif /* CONFIG_FUNCTION_TRACER */
  90#endif /* _ASM_MIPS_FTRACE_H */
  91