root/arch/microblaze/kernel/mcount.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /*
   2  * Low-level ftrace handling
   3  *
   4  * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
   5  * Copyright (C) 2009 PetaLogix
   6  *
   7  * This file is subject to the terms and conditions of the GNU General
   8  * Public License. See the file COPYING in the main directory of this
   9  * archive for more details.
  10  */
  11 
  12 #include <linux/linkage.h>
  13 
  14 #define NOALIGN_ENTRY(name)     .globl name; name:
  15 
  16 /* FIXME MS: I think that I don't need to save all regs */
  17 #define SAVE_REGS               \
  18         addik   r1, r1, -120;   \
  19         swi     r2, r1, 4;      \
  20         swi     r3, r1, 8;      \
  21         swi     r4, r1, 12;     \
  22         swi     r5, r1, 116;    \
  23         swi     r6, r1, 16;     \
  24         swi     r7, r1, 20;     \
  25         swi     r8, r1, 24;     \
  26         swi     r9, r1, 28;     \
  27         swi     r10, r1, 32;    \
  28         swi     r11, r1, 36;    \
  29         swi     r12, r1, 40;    \
  30         swi     r13, r1, 44;    \
  31         swi     r14, r1, 48;    \
  32         swi     r16, r1, 52;    \
  33         swi     r17, r1, 56;    \
  34         swi     r18, r1, 60;    \
  35         swi     r19, r1, 64;    \
  36         swi     r20, r1, 68;    \
  37         swi     r21, r1, 72;    \
  38         swi     r22, r1, 76;    \
  39         swi     r23, r1, 80;    \
  40         swi     r24, r1, 84;    \
  41         swi     r25, r1, 88;    \
  42         swi     r26, r1, 92;    \
  43         swi     r27, r1, 96;    \
  44         swi     r28, r1, 100;   \
  45         swi     r29, r1, 104;   \
  46         swi     r30, r1, 108;   \
  47         swi     r31, r1, 112;
  48 
  49 #define RESTORE_REGS            \
  50         lwi     r2, r1, 4;      \
  51         lwi     r3, r1, 8;      \
  52         lwi     r4, r1, 12;     \
  53         lwi     r5, r1, 116;    \
  54         lwi     r6, r1, 16;     \
  55         lwi     r7, r1, 20;     \
  56         lwi     r8, r1, 24;     \
  57         lwi     r9, r1, 28;     \
  58         lwi     r10, r1, 32;    \
  59         lwi     r11, r1, 36;    \
  60         lwi     r12, r1, 40;    \
  61         lwi     r13, r1, 44;    \
  62         lwi     r14, r1, 48;    \
  63         lwi     r16, r1, 52;    \
  64         lwi     r17, r1, 56;    \
  65         lwi     r18, r1, 60;    \
  66         lwi     r19, r1, 64;    \
  67         lwi     r20, r1, 68;    \
  68         lwi     r21, r1, 72;    \
  69         lwi     r22, r1, 76;    \
  70         lwi     r23, r1, 80;    \
  71         lwi     r24, r1, 84;    \
  72         lwi     r25, r1, 88;    \
  73         lwi     r26, r1, 92;    \
  74         lwi     r27, r1, 96;    \
  75         lwi     r28, r1, 100;   \
  76         lwi     r29, r1, 104;   \
  77         lwi     r30, r1, 108;   \
  78         lwi     r31, r1, 112;   \
  79         addik   r1, r1, 120;
  80 
  81 ENTRY(ftrace_stub)
  82         rtsd    r15, 8;
  83         nop;
  84 
  85 ENTRY(_mcount)
  86 #ifdef CONFIG_DYNAMIC_FTRACE
  87 ENTRY(ftrace_caller)
  88         /* MS: It is just barrier which is removed from C code */
  89         rtsd    r15, 8
  90         nop
  91 #endif /* CONFIG_DYNAMIC_FTRACE */
  92         SAVE_REGS
  93         swi     r15, r1, 0;
  94 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  95 #ifndef CONFIG_DYNAMIC_FTRACE
  96         lwi     r5, r0, ftrace_graph_return;
  97         addik   r6, r0, ftrace_stub; /* asm implementation */
  98         cmpu    r5, r5, r6; /* ftrace_graph_return != ftrace_stub */
  99         beqid   r5, end_graph_tracer;
 100         nop;
 101 
 102         lwi     r6, r0, ftrace_graph_entry;
 103         addik   r5, r0, ftrace_graph_entry_stub; /* implemented in C */
 104         cmpu    r5, r5, r6; /* ftrace_graph_entry != ftrace_graph_entry_stub */
 105         beqid   r5, end_graph_tracer;
 106         nop;
 107 #else /* CONFIG_DYNAMIC_FTRACE */
 108 NOALIGN_ENTRY(ftrace_call_graph)
 109         /* MS: jump over graph function - replaced from C code */
 110         bri     end_graph_tracer
 111 #endif /* CONFIG_DYNAMIC_FTRACE */
 112         addik   r5, r1, 120; /* MS: load parent addr */
 113         addik   r6, r15, 0; /* MS: load current function addr */
 114         bralid  r15, prepare_ftrace_return;
 115         nop;
 116         /* MS: graph was taken that's why - can jump over function trace */
 117         brid    end;
 118         nop;
 119 end_graph_tracer:
 120 #endif /* CONFIG_FUNCTION_GRAPH_TRACER */
 121 #ifndef CONFIG_DYNAMIC_FTRACE
 122         /* MS: test function trace if is taken or not */
 123         lwi     r20, r0, ftrace_trace_function;
 124         addik   r6, r0, ftrace_stub;
 125         cmpu    r5, r20, r6; /* ftrace_trace_function != ftrace_stub */
 126         beqid   r5, end; /* MS: not taken -> jump over */
 127         nop;
 128 #else /* CONFIG_DYNAMIC_FTRACE */
 129 NOALIGN_ENTRY(ftrace_call)
 130 /* instruction for setup imm FUNC_part1, addik r20, r0, FUNC_part2 */
 131         nop
 132         nop
 133 #endif /* CONFIG_DYNAMIC_FTRACE */
 134 /* static normal trace */
 135         lwi     r6, r1, 120; /* MS: load parent addr */
 136         addik   r5, r15, -4; /* MS: load current function addr */
 137         /* MS: here is dependency on previous code */
 138         brald   r15, r20; /* MS: jump to ftrace handler */
 139         nop;
 140 end:
 141         lwi     r15, r1, 0;
 142         RESTORE_REGS
 143 
 144         rtsd    r15, 8; /* MS: jump back */
 145         nop;
 146 
 147 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 148 ENTRY(return_to_handler)
 149         nop; /* MS: just barrier for rtsd r15, 8 */
 150         nop;
 151         SAVE_REGS
 152         swi     r15, r1, 0;
 153 
 154         /* MS: find out returning address */
 155         bralid  r15, ftrace_return_to_handler;
 156         nop;
 157 
 158         /* MS: return value from ftrace_return_to_handler is my returning addr
 159          * must be before restore regs because I have to restore r3 content */
 160         addik   r15, r3, 0;
 161         RESTORE_REGS
 162 
 163         rtsd    r15, 8; /* MS: jump back */
 164         nop;
 165 #endif  /* CONFIG_FUNCTION_TRACER */

/* [<][>][^][v][top][bottom][index][help] */