2 * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
4 * This file implements mcount(), which is used to collect profiling data.
5 * This can also be tweaked for kernel stack overflow detection.
8 #include <linux/linkage.h>
10 #include <asm/ptrace.h>
11 #include <asm/thread_info.h>
14 * This is the main variant and is called by C code. GCC's -pg option
15 * automatically instruments every C function with a call to this.
18 #ifdef CONFIG_STACK_DEBUG
20 #define OVSTACKSIZE 4096 /* lets hope this is enough */
25 .asciz "Stack overflow\n"
33 .type _mcount,#function
35 .type mcount,#function
38 #ifdef CONFIG_STACK_DEBUG
40 * Check whether %sp is dangerously low.
42 ldub [%g6 + TI_FPDEPTH], %g1
45 sllx %g3, 8, %g3 ! each fpregs frame is 256b
47 add %g6, %g3, %g3 ! where does task_struct+frame end?
48 sub %g3, STACK_BIAS, %g3
51 sethi %hi(panicstring), %g3
52 sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough
53 or %g7, %lo(ovstack), %g7
54 add %g7, OVSTACKSIZE, %g7
55 sub %g7, STACK_BIAS, %g7
58 or %g3, %lo(panicstring), %o0
64 #ifdef CONFIG_DYNAMIC_FTRACE
71 sethi %hi(ftrace_trace_function), %g1
72 sethi %hi(ftrace_stub), %g2
73 ldx [%g1 + %lo(ftrace_trace_function)], %g1
74 or %g2, %lo(ftrace_stub), %g2
86 .size _mcount,.-_mcount
91 .type ftrace_stub,#function
95 .size ftrace_stub,.-ftrace_stub
96 #ifdef CONFIG_DYNAMIC_FTRACE
98 .type ftrace_caller,#function
108 .size ftrace_caller,.-ftrace_caller