linux/arch/sparc/lib/mcount.S
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
   3 *
   4 * This file implements mcount(), which is used to collect profiling data.
   5 * This can also be tweaked for kernel stack overflow detection.
   6 */
   7
   8#include <linux/linkage.h>
   9
  10/*
  11 * This is the main variant and is called by C code.  GCC's -pg option
  12 * automatically instruments every C function with a call to this.
  13 */
  14
  15        .text
  16        .align          32
  17        .globl          _mcount
  18        .type           _mcount,#function
  19        .globl          mcount
  20        .type           mcount,#function
  21_mcount:
  22mcount:
  23#ifdef CONFIG_FUNCTION_TRACER
  24#ifdef CONFIG_DYNAMIC_FTRACE
  25        /* Do nothing, the retl/nop below is all we need.  */
  26#else
  27        sethi           %hi(function_trace_stop), %g1
  28        lduw            [%g1 + %lo(function_trace_stop)], %g2
  29        brnz,pn         %g2, 2f
  30         sethi          %hi(ftrace_trace_function), %g1
  31        sethi           %hi(ftrace_stub), %g2
  32        ldx             [%g1 + %lo(ftrace_trace_function)], %g1
  33        or              %g2, %lo(ftrace_stub), %g2
  34        cmp             %g1, %g2
  35        be,pn           %icc, 1f
  36         mov            %i7, %g3
  37        save            %sp, -176, %sp
  38        mov             %g3, %o1
  39        jmpl            %g1, %o7
  40         mov            %i7, %o0
  41        ret
  42         restore
  43        /* not reached */
  441:
  45#ifdef CONFIG_FUNCTION_GRAPH_TRACER
  46        sethi           %hi(ftrace_graph_return), %g1
  47        ldx             [%g1 + %lo(ftrace_graph_return)], %g3
  48        cmp             %g2, %g3
  49        bne,pn          %xcc, 5f
  50         sethi          %hi(ftrace_graph_entry_stub), %g2
  51        sethi           %hi(ftrace_graph_entry), %g1
  52        or              %g2, %lo(ftrace_graph_entry_stub), %g2
  53        ldx             [%g1 + %lo(ftrace_graph_entry)], %g1
  54        cmp             %g1, %g2
  55        be,pt           %xcc, 2f
  56         nop
  575:      mov             %i7, %g2
  58        mov             %fp, %g3
  59        save            %sp, -176, %sp
  60        mov             %g2, %l0
  61        ba,pt           %xcc, ftrace_graph_caller
  62         mov            %g3, %l1
  63#endif
  642:
  65#endif
  66#endif
  67        retl
  68         nop
  69        .size           _mcount,.-_mcount
  70        .size           mcount,.-mcount
  71
  72#ifdef CONFIG_FUNCTION_TRACER
  73        .globl          ftrace_stub
  74        .type           ftrace_stub,#function
  75ftrace_stub:
  76        retl
  77         nop
  78        .size           ftrace_stub,.-ftrace_stub
  79#ifdef CONFIG_DYNAMIC_FTRACE
  80        .globl          ftrace_caller
  81        .type           ftrace_caller,#function
  82ftrace_caller:
  83        sethi           %hi(function_trace_stop), %g1
  84        mov             %i7, %g2
  85        lduw            [%g1 + %lo(function_trace_stop)], %g1
  86        brnz,pn         %g1, ftrace_stub
  87         mov            %fp, %g3
  88        save            %sp, -176, %sp
  89        mov             %g2, %o1
  90        mov             %g2, %l0
  91        mov             %g3, %l1
  92        .globl          ftrace_call
  93ftrace_call:
  94        call            ftrace_stub
  95         mov            %i7, %o0
  96#ifdef CONFIG_FUNCTION_GRAPH_TRACER
  97        .globl          ftrace_graph_call
  98ftrace_graph_call:
  99        call            ftrace_stub
 100         nop
 101#endif
 102        ret
 103         restore
 104#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 105        .size           ftrace_graph_call,.-ftrace_graph_call
 106#endif
 107        .size           ftrace_call,.-ftrace_call
 108        .size           ftrace_caller,.-ftrace_caller
 109#endif
 110#endif
 111
 112#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 113ENTRY(ftrace_graph_caller)
 114        mov             %l0, %o0
 115        mov             %i7, %o1
 116        call            prepare_ftrace_return
 117         mov            %l1, %o2
 118        ret
 119         restore        %o0, -8, %i7
 120END(ftrace_graph_caller)
 121
 122ENTRY(return_to_handler)
 123        save            %sp, -176, %sp
 124        call            ftrace_return_to_handler
 125         mov            %fp, %o0
 126        jmpl            %o0 + 8, %g0
 127         restore
 128END(return_to_handler)
 129#endif
 130