|
@@ -7,26 +7,11 @@
|
|
|
|
|
|
#include <linux/linkage.h>
|
|
|
|
|
|
-#include <asm/ptrace.h>
|
|
|
-#include <asm/thread_info.h>
|
|
|
-
|
|
|
/*
|
|
|
* This is the main variant and is called by C code. GCC's -pg option
|
|
|
* automatically instruments every C function with a call to this.
|
|
|
*/
|
|
|
|
|
|
-#ifdef CONFIG_STACK_DEBUG
|
|
|
-
|
|
|
-#define OVSTACKSIZE 4096 /* lets hope this is enough */
|
|
|
-
|
|
|
- .data
|
|
|
- .align 8
|
|
|
-panicstring:
|
|
|
- .asciz "Stack overflow\n"
|
|
|
- .align 8
|
|
|
-ovstack:
|
|
|
- .skip OVSTACKSIZE
|
|
|
-#endif
|
|
|
.text
|
|
|
.align 32
|
|
|
.globl _mcount
|
|
@@ -35,84 +20,48 @@ ovstack:
|
|
|
.type mcount,#function
|
|
|
_mcount:
|
|
|
mcount:
|
|
|
-#ifdef CONFIG_STACK_DEBUG
|
|
|
- /*
|
|
|
- * Check whether %sp is dangerously low.
|
|
|
- */
|
|
|
- ldub [%g6 + TI_FPDEPTH], %g1
|
|
|
- srl %g1, 1, %g3
|
|
|
- add %g3, 1, %g3
|
|
|
- sllx %g3, 8, %g3 ! each fpregs frame is 256b
|
|
|
- add %g3, 192, %g3
|
|
|
- add %g6, %g3, %g3 ! where does task_struct+frame end?
|
|
|
- sub %g3, STACK_BIAS, %g3
|
|
|
- cmp %sp, %g3
|
|
|
- bg,pt %xcc, 1f
|
|
|
- nop
|
|
|
- lduh [%g6 + TI_CPU], %g1
|
|
|
- sethi %hi(hardirq_stack), %g3
|
|
|
- or %g3, %lo(hardirq_stack), %g3
|
|
|
- sllx %g1, 3, %g1
|
|
|
- ldx [%g3 + %g1], %g7
|
|
|
- sub %g7, STACK_BIAS, %g7
|
|
|
- cmp %sp, %g7
|
|
|
- bleu,pt %xcc, 2f
|
|
|
- sethi %hi(THREAD_SIZE), %g3
|
|
|
- add %g7, %g3, %g7
|
|
|
- cmp %sp, %g7
|
|
|
- blu,pn %xcc, 1f
|
|
|
-2: sethi %hi(softirq_stack), %g3
|
|
|
- or %g3, %lo(softirq_stack), %g3
|
|
|
- ldx [%g3 + %g1], %g7
|
|
|
- sub %g7, STACK_BIAS, %g7
|
|
|
- cmp %sp, %g7
|
|
|
- bleu,pt %xcc, 3f
|
|
|
- sethi %hi(THREAD_SIZE), %g3
|
|
|
- add %g7, %g3, %g7
|
|
|
- cmp %sp, %g7
|
|
|
- blu,pn %xcc, 1f
|
|
|
- nop
|
|
|
- /* If we are already on ovstack, don't hop onto it
|
|
|
- * again, we are already trying to output the stack overflow
|
|
|
- * message.
|
|
|
- */
|
|
|
-3: sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough
|
|
|
- or %g7, %lo(ovstack), %g7
|
|
|
- add %g7, OVSTACKSIZE, %g3
|
|
|
- sub %g3, STACK_BIAS + 192, %g3
|
|
|
- sub %g7, STACK_BIAS, %g7
|
|
|
- cmp %sp, %g7
|
|
|
- blu,pn %xcc, 2f
|
|
|
- cmp %sp, %g3
|
|
|
- bleu,pn %xcc, 1f
|
|
|
- nop
|
|
|
-2: mov %g3, %sp
|
|
|
- sethi %hi(panicstring), %g3
|
|
|
- call prom_printf
|
|
|
- or %g3, %lo(panicstring), %o0
|
|
|
- call prom_halt
|
|
|
- nop
|
|
|
-1:
|
|
|
-#endif
|
|
|
#ifdef CONFIG_FUNCTION_TRACER
|
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
|
- mov %o7, %o0
|
|
|
- .globl mcount_call
|
|
|
-mcount_call:
|
|
|
- call ftrace_stub
|
|
|
- mov %o0, %o7
|
|
|
+ /* Do nothing, the retl/nop below is all we need. */
|
|
|
#else
|
|
|
- sethi %hi(ftrace_trace_function), %g1
|
|
|
+ sethi %hi(function_trace_stop), %g1
|
|
|
+ lduw [%g1 + %lo(function_trace_stop)], %g2
|
|
|
+ brnz,pn %g2, 2f
|
|
|
+ sethi %hi(ftrace_trace_function), %g1
|
|
|
sethi %hi(ftrace_stub), %g2
|
|
|
ldx [%g1 + %lo(ftrace_trace_function)], %g1
|
|
|
or %g2, %lo(ftrace_stub), %g2
|
|
|
cmp %g1, %g2
|
|
|
be,pn %icc, 1f
|
|
|
- mov %i7, %o1
|
|
|
- jmpl %g1, %g0
|
|
|
- mov %o7, %o0
|
|
|
+ mov %i7, %g3
|
|
|
+ save %sp, -128, %sp
|
|
|
+ mov %g3, %o1
|
|
|
+ jmpl %g1, %o7
|
|
|
+ mov %i7, %o0
|
|
|
+ ret
|
|
|
+ restore
|
|
|
/* not reached */
|
|
|
1:
|
|
|
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
|
+ sethi %hi(ftrace_graph_return), %g1
|
|
|
+ ldx [%g1 + %lo(ftrace_graph_return)], %g3
|
|
|
+ cmp %g2, %g3
|
|
|
+ bne,pn %xcc, 5f
|
|
|
+ sethi %hi(ftrace_graph_entry_stub), %g2
|
|
|
+ sethi %hi(ftrace_graph_entry), %g1
|
|
|
+ or %g2, %lo(ftrace_graph_entry_stub), %g2
|
|
|
+ ldx [%g1 + %lo(ftrace_graph_entry)], %g1
|
|
|
+ cmp %g1, %g2
|
|
|
+ be,pt %xcc, 2f
|
|
|
+ nop
|
|
|
+5: mov %i7, %g2
|
|
|
+ mov %fp, %g3
|
|
|
+ save %sp, -128, %sp
|
|
|
+ mov %g2, %l0
|
|
|
+ ba,pt %xcc, ftrace_graph_caller
|
|
|
+ mov %g3, %l1
|
|
|
+#endif
|
|
|
+2:
|
|
|
#endif
|
|
|
#endif
|
|
|
retl
|
|
@@ -131,14 +80,50 @@ ftrace_stub:
|
|
|
.globl ftrace_caller
|
|
|
.type ftrace_caller,#function
|
|
|
ftrace_caller:
|
|
|
- mov %i7, %o1
|
|
|
- mov %o7, %o0
|
|
|
+ sethi %hi(function_trace_stop), %g1
|
|
|
+ mov %i7, %g2
|
|
|
+ lduw [%g1 + %lo(function_trace_stop)], %g1
|
|
|
+ brnz,pn %g1, ftrace_stub
|
|
|
+ mov %fp, %g3
|
|
|
+ save %sp, -128, %sp
|
|
|
+ mov %g2, %o1
|
|
|
+ mov %g2, %l0
|
|
|
+ mov %g3, %l1
|
|
|
.globl ftrace_call
|
|
|
ftrace_call:
|
|
|
call ftrace_stub
|
|
|
- mov %o0, %o7
|
|
|
- retl
|
|
|
+ mov %i7, %o0
|
|
|
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
|
+ .globl ftrace_graph_call
|
|
|
+ftrace_graph_call:
|
|
|
+ call ftrace_stub
|
|
|
nop
|
|
|
+#endif
|
|
|
+ ret
|
|
|
+ restore
|
|
|
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
|
+ .size ftrace_graph_call,.-ftrace_graph_call
|
|
|
+#endif
|
|
|
+ .size ftrace_call,.-ftrace_call
|
|
|
.size ftrace_caller,.-ftrace_caller
|
|
|
#endif
|
|
|
#endif
|
|
|
+
|
|
|
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
|
+ENTRY(ftrace_graph_caller)
|
|
|
+ mov %l0, %o0
|
|
|
+ mov %i7, %o1
|
|
|
+ call prepare_ftrace_return
|
|
|
+ mov %l1, %o2
|
|
|
+ ret
|
|
|
+ restore %o0, -8, %i7
|
|
|
+END(ftrace_graph_caller)
|
|
|
+
|
|
|
+ENTRY(return_to_handler)
|
|
|
+ save %sp, -128, %sp
|
|
|
+ call ftrace_return_to_handler
|
|
|
+ mov %fp, %o0
|
|
|
+ jmpl %o0 + 8, %g0
|
|
|
+ restore
|
|
|
+END(return_to_handler)
|
|
|
+#endif
|