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#include <asm/ptrace.h> 11#include <asm/thread_info.h> 12 13/* 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. 16 */ 17 18#ifdef CONFIG_STACK_DEBUG 19 20#define OVSTACKSIZE 4096 /* lets hope this is enough */ 21 22 .data 23 .align 8 24panicstring: 25 .asciz "Stack overflow\n" 26 .align 8 27ovstack: 28 .skip OVSTACKSIZE 29#endif 30 .text 31 .align 32 32 .globl mcount, _mcount 33mcount: 34_mcount: 35#ifdef CONFIG_STACK_DEBUG 36 /* 37 * Check whether %sp is dangerously low. 38 */ 39 ldub [%g6 + TI_FPDEPTH], %g1 40 srl %g1, 1, %g3 41 add %g3, 1, %g3 42 sllx %g3, 8, %g3 ! each fpregs frame is 256b 43 add %g3, 192, %g3 44 add %g6, %g3, %g3 ! where does task_struct+frame end? 45 sub %g3, STACK_BIAS, %g3 46 cmp %sp, %g3 47 bg,pt %xcc, 1f 48 sethi %hi(panicstring), %g3 49 sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough 50 or %g7, %lo(ovstack), %g7 51 add %g7, OVSTACKSIZE, %g7 52 sub %g7, STACK_BIAS, %g7 53 mov %g7, %sp 54 call prom_printf 55 or %g3, %lo(panicstring), %o0 56 call prom_halt 57 nop 58#endif 591: retl 60 nop 61